diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_ueg_crash1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_ueg_crash1.dmm deleted file mode 100644 index 6881cdcbb9d..00000000000 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_ueg_crash1.dmm +++ /dev/null @@ -1,102 +0,0 @@ -"aa" = (/turf/template_noop,/area/template_noop) -"ab" = (/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors) -"ac" = (/turf/closed/mineral/volcanic/lava_land_surface,/area/lavaland/surface/outdoors) -"ad" = (/turf/closed/wall/mineral/plastitanium{desc = "An wall of plasma and titanium."},/area/lavaland/surface/outdoors) -"ae" = (/turf/open/floor/plating,/area/lavaland/surface/outdoors) -"af" = (/turf/open/floor/plating/lava/smooth/lava_land_surface,/area/lavaland/surface/outdoors) -"ag" = (/obj/machinery/door/airlock/hatch{name = "Assault Pods"; req_access_txt = "205"},/obj/machinery/door/poddoor/preopen{desc = "A anti-breach blast door that has been forced open."; name = "anti-breach blast door"},/turf/open/floor/plasteel/vault{dir = 5},/area/ruin/powered) -"ah" = (/obj/machinery/door/poddoor{name = "anti-breach blast door"},/turf/open/floor/plasteel/vault{dir = 5},/area/ruin/powered) -"ai" = (/turf/closed/wall/mineral/plastitanium{desc = "An wall of plasma and titanium."},/area/ruin/powered) -"aj" = (/obj/structure/sign/poster/official/safety_internals,/turf/closed/wall/mineral/plastitanium{desc = "An wall of plasma and titanium."},/area/ruin/powered) -"ak" = (/obj/effect/decal/cleanable/blood/gibs/body,/obj/item/weapon/pickaxe/drill,/turf/open/floor/plasteel/vault{dir = 5},/area/ruin/powered) -"al" = (/obj/item/stack/sheet/metal,/turf/open/floor/plasteel/black,/area/ruin/powered) -"am" = (/obj/effect/decal/cleanable/blood,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/open/floor/plasteel/vault{dir = 5},/area/ruin/powered) -"an" = (/obj/item/weapon/rack_parts,/obj/item/weapon/survivalcapsule,/turf/open/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/ruin/powered) -"ao" = (/obj/effect/decal/cleanable/robot_debris,/obj/machinery/light{dir = 1},/turf/open/floor/plating,/area/ruin/powered) -"ap" = (/turf/open/floor/plasteel/black,/area/ruin/powered) -"aq" = (/obj/effect/decal/cleanable/vomit,/turf/open/floor/plasteel/vault{dir = 5},/area/ruin/powered) -"ar" = (/obj/machinery/portable_atmospherics/canister/oxygen{maximum_pressure = 1019.25},/turf/open/floor/plasteel/black,/area/ruin/powered) -"as" = (/turf/open/floor/plating,/area/ruin/powered) -"at" = (/obj/item/ammo_box/magazine/carbine,/turf/open/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/ruin/powered) -"au" = (/obj/effect/decal/cleanable/blood,/turf/open/floor/plasteel/vault{dir = 5},/area/ruin/powered) -"av" = (/obj/item/clothing/mask/breath,/turf/open/floor/plasteel/black,/area/ruin/powered) -"aw" = (/obj/effect/decal/cleanable/blood/gibs/body,/turf/open/floor/plasteel/vault{dir = 5},/area/ruin/powered) -"ax" = (/obj/machinery/door/airlock/hatch{name = "Delta Squad Armoury"; req_access_txt = "205"},/turf/open/floor/plasteel/vault{dir = 8},/area/ruin/powered) -"ay" = (/turf/open/floor/plasteel/vault{dir = 5},/area/ruin/powered) -"az" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/open/floor/plating,/area/ruin/powered) -"aA" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/open/floor/plasteel/black,/area/ruin/powered) -"aB" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/open/floor/plasteel/black,/area/ruin/powered) -"aC" = (/obj/item/clothing/glasses/meson,/turf/open/floor/plasteel/vault{dir = 5},/area/ruin/powered) -"aD" = (/obj/structure/rack,/obj/item/weapon/storage/firstaid/tactical,/obj/item/device/flashlight/seclite{desc = "A robust flashlight used by the military."; name = "combat flashlight"},/obj/item/weapon/kitchen/knife/combat/survival{name = "military knife"},/obj/item/weapon/survivalcapsule,/obj/item/ammo_box/magazine/carbine,/obj/item/ammo_box/magazine/carbine,/obj/item/weapon/gun/ballistic/automatic/carbine,/turf/open/floor/plating,/area/ruin/powered) -"aE" = (/obj/machinery/suit_storage_unit/ueg{name = "Marine Armour Storage Unit"},/obj/machinery/light,/turf/open/floor/plating,/area/ruin/powered) -"aF" = (/turf/open/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/lavaland/surface/outdoors) -"aG" = (/obj/machinery/door/airlock/hatch{name = "Armoury"; req_access_txt = "205"},/turf/open/floor/plasteel/black,/area/ruin/powered) -"aH" = (/turf/open/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/ruin/powered) -"aI" = (/obj/effect/decal/cleanable/blood/gibs/body,/obj/machinery/light{dir = 1},/turf/open/floor/plasteel/vault{dir = 5},/area/ruin/powered) -"aJ" = (/obj/effect/decal/cleanable/robot_debris,/turf/open/floor/plating,/area/ruin/powered) -"aK" = (/turf/open/floor/plasteel/vault{dir = 5},/area/lavaland/surface/outdoors) -"aL" = (/turf/open/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/lavaland/surface/outdoors) -"aM" = (/obj/structure/sign/poster/official/help_others,/turf/closed/wall/mineral/plastitanium{desc = "An wall of plasma and titanium."},/area/ruin/powered) -"aN" = (/obj/effect/decal/cleanable/vomit,/turf/open/floor/plating,/area/ruin/powered) -"aO" = (/turf/open/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/ruin/powered) -"aP" = (/turf/open/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/lavaland/surface/outdoors) -"aQ" = (/obj/effect/decal/cleanable/blood/old,/turf/open/floor/plasteel/vault{dir = 5},/area/ruin/powered) -"aR" = (/obj/structure/closet,/obj/item/toy/prize/honk,/turf/open/floor/plasteel/vault{dir = 5},/area/lavaland/surface/outdoors) -"aS" = (/obj/structure/sign/poster/contraband/clown,/turf/closed/wall/mineral/plastitanium{desc = "An wall of plasma and titanium."},/area/lavaland/surface/outdoors) -"aT" = (/turf/open/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/ruin/powered) -"aU" = (/obj/structure/sign/poster/official/walk,/turf/closed/wall/mineral/plastitanium{desc = "An wall of plasma and titanium."},/area/ruin/powered) -"aV" = (/obj/machinery/light{dir = 1},/turf/open/floor/plasteel/vault{dir = 5},/area/ruin/powered) -"aW" = (/obj/effect/decal/cleanable/oil,/turf/open/floor/plasteel/vault{dir = 5},/area/ruin/powered) -"aX" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/open/floor/plasteel/vault{dir = 5},/area/ruin/powered) -"aY" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/open/floor/plasteel/vault{dir = 5},/area/ruin/powered) -"aZ" = (/obj/machinery/door/airlock/hatch{name = "Personal Quarters D"; req_access_txt = "205"},/turf/open/floor/plasteel/vault{dir = 5},/area/ruin/powered) -"ba" = (/obj/structure/sign/poster/official/enlist{desc = "Enlist in the marine corps today!"},/turf/closed/wall/mineral/plastitanium{desc = "An wall of plasma and titanium."},/area/ruin/powered) -"bb" = (/obj/effect/decal/cleanable/robot_debris,/turf/open/floor/plasteel/black,/area/ruin/powered) -"bc" = (/obj/effect/decal/cleanable/blood,/obj/structure/closet,/obj/item/weapon/storage/box/donkpockets,/turf/open/floor/plasteel/vault{dir = 5},/area/ruin/powered) -"bd" = (/turf/open/floor/plasteel/vault{dir = 5},/turf/open/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/ruin/powered) -"be" = (/obj/structure/closet,/obj/item/clothing/shoes/combat,/obj/item/clothing/under/syndicate/camo,/obj/item/weapon/storage/box/donkpockets,/obj/item/clothing/gloves/combat,/obj/item/weapon/storage/backpack/explorer{name = "marine bag"},/obj/item/weapon/card/id/marine,/turf/open/floor/plasteel/vault{dir = 5},/area/ruin/powered) -"bf" = (/obj/structure/dresser,/turf/open/floor/plasteel/vault{dir = 5},/area/ruin/powered) -"bg" = (/obj/effect/decal/cleanable/blood/gibs/body,/turf/open/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/ruin/powered) -"bh" = (/obj/effect/decal/cleanable/blood/gibs,/turf/open/floor/plasteel/vault{dir = 5},/area/ruin/powered) -"bi" = (/obj/structure/girder,/turf/open/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/ruin/powered) -"bj" = (/obj/structure/sign/poster/contraband/space_cola,/turf/closed/wall/mineral/plastitanium{desc = "An wall of plasma and titanium."},/area/ruin/powered) -"bk" = (/obj/structure/table_frame,/turf/open/floor/plasteel/vault{dir = 5},/area/ruin/powered) -"bl" = (/obj/effect/mob_spawn/human/marine,/turf/open/floor/plasteel/vault{dir = 5},/area/ruin/powered) -"bm" = (/obj/machinery/light,/turf/open/floor/plasteel/vault{dir = 5},/area/ruin/powered) -"bn" = (/obj/structure/table,/obj/effect/holodeck_effect/cards,/turf/open/floor/plasteel/vault{dir = 5},/area/ruin/powered) - -(1,1,1) = {" -aaaaaaaaabaaaaaaaaaaaaaaabaaaaaaaaaaababacacaaaaaaaaaaaa -aaaaaaabababaaaaababababababaaaaaaabababacacacaaabababaa -aaaaabababababababababababababababababababacacacabababaa -aaaaababababadaeabababababababacacababababababababababaa -acacabababababaeababababababababacababababababababacaaaa -acababacababababadadabadababababacababababababababacaaaa -abababacababababadaeabaeabaeababababababababababababaaaa -acababacabababababababaeabadababababababababababababaaaa -aaababababadaeabacacacababaeababaeadafabababababacababaa -aaaaabababadaeacacagahahaiaiaiaiadadafababababababababaa -aaaaabababababacajakalamaianaoaiaeafafafabababacabababaa -aaaaabababababaeaiapaqaraiasataiahahaiafabababababababaa -aaaaabababafafaeahauavawaxayayayayauazafafababababababaa -acacabafafafafafaiaAayaBaiayayaiahahaiafafabafafafababaa -acacafafafafafaeaiaCapayaiaDaEaiaFaeafafafafafafafafaaaa -acacafafafafadadaiaGazaGaiaiaiaiaiadadafafafafafafafafaa -abacafafafafaeaeaiayapayaiaHaIaJaiaKaLafafafafafafafafaa -ababafafafafafaeaiaAayaBaMasaNaOaiaeaFaPafafafafafafafaa -ababafafafafafaeaiayapaQaiauaHaOaiaRaeaeaSabafafafafaaaa -acabafafafafaFadaiapayapaiaiaiaTaUaiaiahaiabafafafafafaa -acabafafafaeaeaLahayapayapasaHaOapaVapayazababafafafaaaa -acabafafafaFaPaFahapaWapayapayasayapayapazababafafafafaa -acabafafafafaeaeaiaXapaYaiaiaiahaiaiaiaZaiababafafafafaa -acabafafafafafafbabbayapaibcbdayaibebfayaiabafafafafafaa -acabafafafafafafaiahahahaiaHbgbhbiayayaybjabafafafafafaa -acacafafafafafafafaeaPaeaiaJaubkaiblbmbnaiabafafafafafaa -aaafafafafafafafafaeaeafaiaiaiaiaiaiaiaiaiabafafafafafaa -aaafafafafafafafafafafafafafafafafaeaeadababafafafafafaa -aaafafafafafabababafafafafafafafafafafadafafafafafafafaa -aaafafafafafababababababafafafafafafafafafafafafafafafaa -aaafafabababaeabadabababababababafafafafafafafafafafafaa -aaafafafababaPabaLadabababaaaaaaaaaaaaaaaaafafafafafafaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -"} diff --git a/_maps/RandomRuins/SpaceRuins/deepstorage.dmm b/_maps/RandomRuins/SpaceRuins/deepstorage.dmm index 785d2e9456b..43258deaf81 100644 --- a/_maps/RandomRuins/SpaceRuins/deepstorage.dmm +++ b/_maps/RandomRuins/SpaceRuins/deepstorage.dmm @@ -1,6741 +1,421 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aa" = ( -/turf/template_noop, -/area/template_noop) -"ab" = ( -/turf/closed/mineral/random/low_chance, -/area/ruin/unpowered) -"ac" = ( -/turf/closed/wall/mineral/iron, -/area/ruin/deepstorage) -"ad" = ( -/obj/structure/closet/cardboard, -/obj/item/stack/sheet/mineral/silver, -/obj/item/stack/sheet/mineral/gold, -/obj/item/stack/sheet/mineral/silver, -/obj/item/stack/sheet/mineral/silver, -/obj/item/stack/sheet/mineral/gold, -/obj/item/stack/sheet/mineral/gold, -/turf/open/floor/plasteel/floorgrime, -/area/ruin/deepstorage) -"ae" = ( -/obj/structure/closet/cardboard, -/obj/item/weapon/storage/box/monkeycubes, -/obj/item/weapon/storage/box/monkeycubes, -/obj/item/weapon/storage/box/monkeycubes, -/obj/item/weapon/storage/toolbox/drone, -/obj/item/weapon/storage/toolbox/drone, -/turf/open/floor/plasteel/floorgrime, -/area/ruin/deepstorage) -"af" = ( -/obj/structure/closet/cardboard, -/obj/item/stack/sheet/cardboard, -/obj/item/stack/cable_coil, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/packageWrap, -/turf/open/floor/plasteel/floorgrime, -/area/ruin/deepstorage) -"ag" = ( -/obj/structure/closet/cardboard, -/obj/item/weapon/storage/box/mousetraps, -/obj/item/weapon/storage/box/mousetraps, -/obj/item/weapon/storage/box/drinkingglasses, -/obj/item/weapon/storage/box/zipties, -/obj/item/weapon/switchblade, -/turf/open/floor/plasteel/floorgrime, -/area/ruin/deepstorage) -"ah" = ( -/obj/structure/closet/cardboard, -/obj/item/stack/sheet/metal{ - amount = 50; - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/stack/sheet/metal{ - amount = 50; - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/stack/sheet/metal{ - amount = 50; - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/stack/sheet/metal{ - amount = 50; - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/stack/rods{ - amount = 50 - }, -/obj/item/stack/rods{ - amount = 50 - }, -/obj/item/stack/rods{ - amount = 50 - }, -/obj/item/stack/rods{ - amount = 50 - }, -/turf/open/floor/plasteel/floorgrime, -/area/ruin/deepstorage) -"ai" = ( -/obj/structure/closet/cardboard, -/obj/item/stack/sheet/glass{ - amount = 50 - }, -/obj/item/stack/sheet/glass{ - amount = 50 - }, -/obj/item/stack/sheet/glass{ - amount = 50 - }, -/obj/item/stack/sheet/glass{ - amount = 50 - }, -/obj/item/stack/sheet/plasteel{ - amount = 10 - }, -/obj/item/stack/sheet/plasteel{ - amount = 10 - }, -/obj/item/stack/sheet/plasteel{ - amount = 10 - }, -/obj/item/stack/sheet/plasteel{ - amount = 10 - }, -/obj/item/clothing/shoes/combat, -/obj/item/clothing/shoes/combat, -/turf/open/floor/plasteel/floorgrime, -/area/ruin/deepstorage) -"aj" = ( -/obj/structure/closet/cardboard, -/obj/machinery/light{ - icon_state = "tube1"; - dir = 8 - }, -/obj/item/device/flashlight/flare, -/obj/item/device/flashlight/flare, -/obj/item/device/flashlight/flare, -/obj/item/device/flashlight/flare, -/obj/item/device/flashlight/flare, -/obj/item/device/flashlight/flare, -/obj/item/device/flashlight, -/obj/item/device/flashlight, -/obj/item/device/flashlight, -/obj/item/weapon/shovel, -/obj/item/weapon/pickaxe/drill, -/obj/item/weapon/pickaxe/drill, -/obj/item/weapon/pickaxe/drill, -/turf/open/floor/plasteel/floorgrime, -/area/ruin/deepstorage) -"ak" = ( -/obj/structure/closet/cardboard, -/obj/item/device/flashlight/lantern, -/obj/item/device/flashlight/lantern, -/obj/item/device/flashlight/lantern, -/obj/item/device/tape/random, -/obj/item/device/tape/random, -/obj/item/device/tape/random, -/obj/item/weapon/storage/box/rxglasses, -/obj/item/weapon/extinguisher, -/obj/item/weapon/extinguisher, -/obj/item/clothing/glasses/night, -/obj/item/clothing/glasses/night, -/turf/open/floor/plasteel/floorgrime, -/area/ruin/deepstorage) -"al" = ( -/obj/structure/closet/cardboard, -/obj/item/weapon/storage/box/syringes, -/obj/item/weapon/storage/box/syringes, -/obj/item/weapon/storage/box/beakers, -/obj/item/weapon/storage/box/beakers, -/obj/item/weapon/storage/box/matches, -/obj/item/weapon/storage/box/bodybags, -/obj/item/clothing/glasses/meson/engine, -/obj/item/clothing/glasses/meson/engine, -/turf/open/floor/plasteel/floorgrime, -/area/ruin/deepstorage) -"am" = ( -/obj/structure/closet/cardboard, -/obj/item/weapon/kitchen/knife, -/obj/item/weapon/kitchen/knife, -/obj/item/weapon/cultivator, -/obj/item/weapon/hatchet, -/obj/item/weapon/kitchen/rollingpin, -/turf/open/floor/plasteel/floorgrime, -/area/ruin/deepstorage) -"an" = ( -/obj/structure/closet/cardboard, -/obj/item/weapon/defibrillator, -/obj/item/weapon/storage/box/medipens, -/turf/open/floor/plasteel/floorgrime, -/area/ruin/deepstorage) -"ao" = ( -/obj/structure/closet/cardboard, -/obj/machinery/light{ - dir = 4; - icon_state = "tube1" - }, -/obj/item/ammo_box/c9mm, -/obj/item/ammo_box/c9mm, -/obj/item/ammo_box/c9mm, -/obj/item/ammo_box/c9mm, -/obj/item/ammo_box/c9mm, -/obj/item/ammo_box/c9mm, -/turf/open/floor/plasteel/floorgrime, -/area/ruin/deepstorage) -"ap" = ( -/obj/structure/closet/crate/freezer, -/obj/item/weapon/reagent_containers/blood/OMinus, -/obj/item/weapon/reagent_containers/blood/OMinus, -/obj/item/weapon/reagent_containers/blood/OMinus, -/obj/item/weapon/reagent_containers/blood/OMinus, -/obj/item/weapon/reagent_containers/blood/OMinus, -/obj/item/weapon/reagent_containers/blood/random, -/obj/item/weapon/reagent_containers/blood/random, -/obj/item/weapon/reagent_containers/blood/random, -/obj/item/weapon/reagent_containers/blood/random, -/obj/item/weapon/reagent_containers/blood/random, -/obj/item/weapon/reagent_containers/blood/random, -/turf/open/floor/plasteel/floorgrime, -/area/ruin/deepstorage) -"aq" = ( -/obj/machinery/iv_drip, -/turf/open/floor/plasteel/floorgrime, -/area/ruin/deepstorage) -"ar" = ( -/turf/open/floor/plasteel/floorgrime, -/area/ruin/deepstorage) -"as" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, -/turf/open/floor/plasteel/floorgrime, -/area/ruin/deepstorage) -"at" = ( -/obj/machinery/portable_atmospherics/canister/air, -/turf/open/floor/plasteel/floorgrime, -/area/ruin/deepstorage) -"au" = ( -/obj/machinery/door/airlock/highsecurity{ - name = "Bunker" - }, -/turf/open/floor/plasteel, -/area/ruin/deepstorage) -"av" = ( -/obj/structure/toilet{ - dir = 4 - }, -/turf/open/floor/plasteel/freezer, -/area/ruin/deepstorage) -"aw" = ( -/obj/structure/mirror{ - pixel_x = 30 - }, -/obj/structure/sink{ - dir = 4; - icon_state = "sink"; - pixel_x = 11; - pixel_y = 0 - }, -/turf/open/floor/plasteel/freezer, -/area/ruin/deepstorage) -"ax" = ( -/obj/structure/table, -/obj/item/weapon/storage/toolbox/drone, -/obj/item/device/flashlight, -/obj/item/device/flashlight, -/turf/open/floor/plasteel, -/area/ruin/deepstorage) -"ay" = ( -/obj/structure/table, -/obj/item/weapon/gun/ballistic/automatic/wt550{ - pixel_x = -3; - pixel_y = 6 - }, -/obj/item/weapon/gun/ballistic/automatic/wt550{ - pixel_x = 2; - pixel_y = 0 - }, -/obj/structure/reagent_dispensers/peppertank{ - pixel_y = 30 - }, -/turf/open/floor/plasteel/floorgrime, -/area/ruin/deepstorage) -"az" = ( -/obj/structure/table, -/obj/item/weapon/storage/backpack/dufflebag/sec{ - contents = newlist(/obj/item/weapon/scalpel,/obj/item/weapon/hemostat,/obj/item/weapon/retractor,/obj/item/weapon/cautery,/obj/item/weapon/circular_saw,/obj/item/weapon/surgical_drapes,/obj/item/clothing/mask/surgical); - desc = "A large dufflebag for holding extra supplies - this one has a material inlay with space for various sharp-looking tools."; - name = "dufflebag"; - pixel_y = 5 - }, -/turf/open/floor/plasteel, -/area/ruin/deepstorage) -"aA" = ( -/obj/structure/table, -/obj/item/device/radio{ - pixel_x = -4 - }, -/obj/item/device/radio, -/obj/item/device/radio{ - pixel_x = 4 - }, -/turf/open/floor/plasteel, -/area/ruin/deepstorage) -"aB" = ( -/obj/structure/table, -/obj/item/stack/sheet/metal{ - amount = 50; - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/stack/rods{ - amount = 50 - }, -/obj/item/stack/cable_coil, -/obj/item/stack/cable_coil, -/turf/open/floor/plasteel, -/area/ruin/deepstorage) -"aC" = ( -/obj/structure/table, -/obj/item/weapon/storage/firstaid/brute{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/weapon/storage/firstaid/brute, -/turf/open/floor/plasteel, -/area/ruin/deepstorage) -"aD" = ( -/obj/structure/table, -/obj/item/weapon/storage/firstaid/regular{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/weapon/storage/firstaid/regular, -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/ruin/deepstorage) -"aE" = ( -/obj/structure/closet/crate/radiation, -/turf/open/floor/plasteel, -/area/ruin/deepstorage) -"aF" = ( -/obj/structure/closet/cardboard, -/obj/item/weapon/reagent_containers/food/snacks/beans, -/obj/item/weapon/reagent_containers/food/snacks/beans, -/obj/item/weapon/reagent_containers/food/snacks/beans, -/obj/item/weapon/reagent_containers/food/snacks/beans, -/obj/item/weapon/reagent_containers/food/snacks/beans, -/turf/open/floor/plasteel/floorgrime, -/area/ruin/deepstorage) -"aG" = ( -/obj/structure/closet/cardboard, -/obj/item/weapon/reagent_containers/food/snacks/beans, -/obj/item/weapon/reagent_containers/food/snacks/beans, -/obj/item/weapon/reagent_containers/food/snacks/beans, -/obj/machinery/light{ - dir = 4; - icon_state = "tube1" - }, -/obj/item/weapon/reagent_containers/food/snacks/beans, -/obj/item/weapon/reagent_containers/food/snacks/beans, -/turf/open/floor/plasteel/floorgrime, -/area/ruin/deepstorage) -"aH" = ( -/obj/structure/closet/cardboard, -/obj/item/weapon/reagent_containers/glass/beaker/waterbottle/large, -/obj/item/weapon/reagent_containers/glass/beaker/waterbottle/large, -/obj/item/weapon/reagent_containers/glass/beaker/waterbottle/large, -/obj/item/weapon/reagent_containers/glass/beaker/waterbottle/large, -/obj/item/weapon/reagent_containers/glass/beaker/waterbottle/large, -/turf/open/floor/plasteel, -/area/ruin/deepstorage) -"aI" = ( -/obj/machinery/vending/clothing, -/turf/open/floor/wood, -/area/ruin/deepstorage) -"aJ" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken3" - }, -/area/ruin/deepstorage) -"aK" = ( -/obj/structure/bed, -/turf/open/floor/wood, -/area/ruin/deepstorage) -"aL" = ( -/turf/open/floor/plasteel/freezer, -/area/ruin/deepstorage) -"aM" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/plasteel/freezer, -/area/ruin/deepstorage) -"aN" = ( -/obj/structure/table, -/obj/item/clothing/gloves/combat{ - pixel_x = -3; - pixel_y = 4 - }, -/obj/item/clothing/gloves/combat{ - pixel_x = 3; - pixel_y = -2 - }, -/obj/item/clothing/mask/gas, -/obj/item/clothing/mask/gas, -/obj/item/clothing/mask/gas, -/turf/open/floor/plasteel/floorgrime, -/area/ruin/deepstorage) -"aO" = ( -/turf/open/floor/plasteel, -/area/ruin/deepstorage) -"aP" = ( -/obj/structure/table, -/obj/item/device/mass_spectrometer/adv, -/obj/item/device/mass_spectrometer/adv, -/obj/item/device/healthanalyzer, -/obj/item/device/healthanalyzer, -/obj/item/stack/medical/gauze, -/obj/item/stack/medical/gauze, -/turf/open/floor/plasteel/floorgrime, -/area/ruin/deepstorage) -"aQ" = ( -/obj/structure/closet/radiation, -/obj/machinery/light{ - icon_state = "tube1"; - dir = 8 - }, -/turf/open/floor/plasteel, -/area/ruin/deepstorage) -"aR" = ( -/obj/structure/closet/cardboard, -/obj/item/weapon/reagent_containers/food/snacks/beans, -/obj/item/weapon/reagent_containers/food/snacks/beans, -/obj/item/weapon/reagent_containers/food/snacks/beans, -/obj/item/weapon/reagent_containers/food/snacks/beans, -/obj/item/weapon/reagent_containers/food/snacks/beans, -/turf/open/floor/plasteel, -/area/ruin/deepstorage) -"aS" = ( -/obj/structure/closet/cardboard, -/obj/item/weapon/reagent_containers/glass/beaker/waterbottle/large, -/obj/item/weapon/reagent_containers/glass/beaker/waterbottle/large, -/obj/item/weapon/reagent_containers/glass/beaker/waterbottle/large, -/obj/item/weapon/reagent_containers/glass/beaker/waterbottle/large, -/obj/item/weapon/reagent_containers/glass/beaker/waterbottle/large, -/turf/open/floor/plasteel/floorgrime, -/area/ruin/deepstorage) -"aT" = ( -/obj/structure/closet/wardrobe/pink, -/turf/open/floor/wood{ - icon_state = "wood-broken" - }, -/area/ruin/deepstorage) -"aU" = ( -/turf/open/floor/wood, -/area/ruin/deepstorage) -"aV" = ( -/obj/structure/bed, -/turf/open/floor/wood{ - icon_state = "wood-broken7" - }, -/area/ruin/deepstorage) -"aW" = ( -/obj/machinery/shower{ - dir = 4 - }, -/turf/open/floor/plasteel/freezer, -/area/ruin/deepstorage) -"aX" = ( -/obj/machinery/shower{ - dir = 8 - }, -/turf/open/floor/plasteel/freezer, -/area/ruin/deepstorage) -"aY" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/obj/structure/table, -/obj/item/weapon/storage/firstaid/toxin{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/weapon/storage/firstaid/toxin, -/obj/item/weapon/storage/pill_bottle/charcoal, -/turf/open/floor/plasteel, -/area/ruin/deepstorage) -"aZ" = ( -/obj/structure/table, -/obj/item/device/flashlight/flare, -/obj/item/device/flashlight/flare, -/obj/item/device/flashlight/flare, -/obj/item/device/flashlight/flare{ - pixel_y = 6 - }, -/obj/item/device/flashlight/flare, -/obj/item/weapon/crowbar/red, -/turf/open/floor/plasteel, -/area/ruin/deepstorage) -"ba" = ( -/obj/machinery/suit_storage_unit/standard_unit, -/turf/open/floor/plasteel, -/area/ruin/deepstorage) -"bb" = ( -/obj/structure/closet/wardrobe/pjs, -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/wood, -/area/ruin/deepstorage) -"bc" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken4" - }, -/area/ruin/deepstorage) -"bd" = ( -/obj/structure/bed, -/turf/open/floor/wood{ - icon_state = "wood-broken3" - }, -/area/ruin/deepstorage) -"be" = ( -/obj/machinery/shower{ - dir = 4 - }, -/obj/item/weapon/soap, -/turf/open/floor/plasteel/freezer, -/area/ruin/deepstorage) -"bf" = ( -/obj/structure/grille, -/obj/structure/window/reinforced/fulltile, -/turf/open/floor/plating, -/area/ruin/deepstorage) -"bg" = ( -/obj/structure/closet/cardboard, -/obj/item/weapon/storage/box/donkpockets, -/obj/item/weapon/storage/box/donkpockets, -/obj/item/weapon/storage/box/donkpockets, -/obj/item/weapon/storage/box/donkpockets, -/obj/item/weapon/storage/box/donkpockets, -/turf/open/floor/plasteel/floorgrime, -/area/ruin/deepstorage) -"bh" = ( -/obj/structure/closet/cardboard, -/obj/item/weapon/storage/box/donkpockets, -/obj/item/weapon/storage/box/donkpockets, -/obj/item/weapon/storage/box/donkpockets, -/obj/item/weapon/storage/box/donkpockets, -/obj/item/weapon/storage/box/donkpockets, -/turf/open/floor/plasteel, -/area/ruin/deepstorage) -"bi" = ( -/obj/machinery/door/airlock/highsecurity{ - name = "Bunker" - }, -/turf/open/floor/wood, -/area/ruin/deepstorage) -"bj" = ( -/obj/machinery/door/airlock/highsecurity{ - name = "Bunker" - }, -/turf/open/floor/plasteel/freezer, -/area/ruin/deepstorage) -"bk" = ( -/obj/structure/fireaxecabinet{ - pixel_y = 30 - }, -/turf/open/floor/plasteel, -/area/ruin/deepstorage) -"bl" = ( -/obj/machinery/sleeper{ - icon_state = "sleeper-open"; - dir = 4 - }, -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/plasteel/floorgrime, -/area/ruin/deepstorage) -"bm" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/plasteel/floorgrime, -/area/ruin/deepstorage) -"bn" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/plasteel/floorgrime, -/area/ruin/deepstorage) -"bo" = ( -/obj/machinery/sleeper{ - icon_state = "sleeper-open"; - dir = 4 - }, -/turf/open/floor/plasteel/floorgrime, -/area/ruin/deepstorage) -"bp" = ( -/obj/machinery/door/airlock/highsecurity{ - name = "Bunker" - }, -/turf/open/floor/plasteel/floorgrime, -/area/ruin/deepstorage) -"bq" = ( -/obj/machinery/processor{ - name = "processor" - }, -/turf/open/floor/plasteel, -/area/ruin/deepstorage) -"br" = ( -/obj/structure/table, -/obj/item/weapon/storage/box/matches, -/turf/open/floor/plasteel, -/area/ruin/deepstorage) -"bs" = ( -/obj/structure/table, -/obj/machinery/reagentgrinder, -/turf/open/floor/plasteel/floorgrime, -/area/ruin/deepstorage) -"bt" = ( -/obj/structure/table, -/obj/machinery/recharger, -/turf/open/floor/plasteel/floorgrime, -/area/ruin/deepstorage) -"bu" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/hydroponics/constructable, -/turf/open/floor/light, -/area/ruin/deepstorage) -"bv" = ( -/obj/machinery/hydroponics/constructable, -/turf/open/floor/light, -/area/ruin/deepstorage) -"bw" = ( -/obj/machinery/blackbox_recorder, -/turf/open/floor/plasteel, -/area/ruin/deepstorage) -"bx" = ( -/obj/structure/cable{ - icon_state = "0-4"; - d2 = 4 - }, -/obj/machinery/power/port_gen/pacman, -/turf/open/floor/plasteel, -/area/ruin/deepstorage) -"by" = ( -/obj/machinery/power/smes/magical{ - desc = "A high-capacity superconducting magnetic energy storage (SMES) unit."; - name = "power storage unit" - }, -/obj/structure/cable, -/obj/structure/cable{ - icon_state = "0-2"; - pixel_y = 1; - d2 = 2 - }, -/obj/structure/cable{ - d1 = 2; - d2 = 8; - icon_state = "2-8" - }, -/turf/open/floor/plasteel/floorgrime, -/area/ruin/deepstorage) -"bz" = ( -/obj/machinery/telecomms/relay/preset/telecomms, -/turf/open/floor/plasteel, -/area/ruin/deepstorage) -"bA" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/obj/structure/tank_dispenser/oxygen, -/turf/open/floor/plasteel, -/area/ruin/deepstorage) -"bB" = ( -/obj/machinery/biogenerator, -/turf/open/floor/plasteel, -/area/ruin/deepstorage) -"bC" = ( -/obj/machinery/light, -/obj/machinery/hydroponics/constructable, -/turf/open/floor/light, -/area/ruin/deepstorage) -"bD" = ( -/obj/machinery/autolathe, -/turf/open/floor/plasteel, -/area/ruin/deepstorage) -"bE" = ( -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2" - }, -/obj/machinery/power/terminal{ - icon_state = "term"; - dir = 1 - }, -/turf/open/floor/plasteel, -/area/ruin/deepstorage) -"bF" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plasteel/floorgrime, -/area/ruin/deepstorage) -"bG" = ( -/obj/structure/table, -/obj/machinery/microwave, -/turf/open/floor/plasteel/bar, -/area/ruin/deepstorage) -"bH" = ( -/turf/open/floor/plasteel/bar, -/area/ruin/deepstorage) -"bI" = ( -/obj/structure/table, -/obj/item/weapon/storage/box/donkpockets, -/turf/open/floor/plasteel/bar, -/area/ruin/deepstorage) -"bJ" = ( -/obj/structure/table, -/obj/item/weapon/reagent_containers/food/snacks/beans, -/turf/open/floor/plasteel/bar, -/area/ruin/deepstorage) -"bK" = ( -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/plasteel/bar, -/area/ruin/deepstorage) -"bL" = ( -/obj/machinery/seed_extractor, -/turf/open/floor/plasteel, -/area/ruin/deepstorage) -"bM" = ( -/obj/machinery/power/apc{ - dir = 8; - name = "Bunker APC"; - pixel_x = -24; - pixel_y = 0 - }, -/obj/structure/cable{ - icon_state = "0-4"; - d2 = 4 - }, -/turf/open/floor/plasteel/floorgrime, -/area/ruin/deepstorage) -"bN" = ( -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8"; - pixel_y = 0; - tag = "" - }, -/turf/open/floor/plasteel, -/area/ruin/deepstorage) -"bO" = ( -/obj/structure/cable{ - d1 = 1; - d2 = 8; - icon_state = "1-8"; - tag = "" - }, -/turf/open/floor/plasteel, -/area/ruin/deepstorage) -"bP" = ( -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/plasteel/floorgrime, -/area/ruin/deepstorage) -"bQ" = ( -/obj/structure/table, -/obj/item/weapon/kitchen/knife, -/turf/open/floor/plasteel/bar, -/area/ruin/deepstorage) -"bR" = ( -/obj/structure/table, -/turf/open/floor/plasteel/bar, -/area/ruin/deepstorage) -"bS" = ( -/obj/structure/table, -/obj/item/weapon/kitchen/fork, -/turf/open/floor/plasteel/bar, -/area/ruin/deepstorage) -"bT" = ( -/obj/machinery/vending/hydronutrients, -/turf/open/floor/plasteel, -/area/ruin/deepstorage) -"bU" = ( -/obj/machinery/space_heater, -/turf/open/floor/plasteel/floorgrime, -/area/ruin/deepstorage) -"bV" = ( -/obj/structure/chair/office/dark{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/ruin/deepstorage) -"bW" = ( -/obj/structure/table/reinforced, -/turf/open/floor/plasteel, -/area/ruin/deepstorage) -"bX" = ( -/obj/machinery/smartfridge, -/turf/open/floor/plasteel/bar, -/area/ruin/deepstorage) -"bY" = ( -/obj/machinery/light/small, -/turf/open/floor/plasteel/bar, -/area/ruin/deepstorage) -"bZ" = ( -/obj/machinery/vending/hydroseeds{ - slogan_delay = 700 - }, -/turf/open/floor/plasteel, -/area/ruin/deepstorage) -"ca" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/plasteel/floorgrime, -/area/ruin/deepstorage) -"cb" = ( -/obj/structure/chair/office/dark, -/turf/open/floor/plasteel/floorgrime, -/area/ruin/deepstorage) -"cc" = ( -/obj/structure/frame/computer, -/turf/open/floor/plasteel, -/area/ruin/deepstorage) -"cd" = ( -/obj/structure/table/reinforced, -/obj/machinery/computer/security/telescreen{ - dir = 1; - name = "Bunker Entrance"; - network = list("Bunker1"); - pixel_x = 0; - pixel_y = 2 - }, -/turf/open/floor/plasteel, -/area/ruin/deepstorage) -"ce" = ( -/obj/structure/table/reinforced, -/obj/machinery/button/door{ - id = "bunker1"; - name = "Inner Doors"; - pixel_y = 6 - }, -/obj/machinery/button/door{ - id = "bunker2"; - name = "Outer Doors"; - pixel_y = -4 - }, -/turf/open/floor/plasteel/floorgrime, -/area/ruin/deepstorage) -"cf" = ( -/obj/machinery/door/poddoor{ - id = "bunker1"; - name = "Bunker Door"; - tag = "inner" - }, -/turf/open/floor/plating, -/area/ruin/deepstorage) -"cg" = ( -/turf/open/floor/plating, -/area/ruin/deepstorage) -"ch" = ( -/obj/machinery/camera{ - network = list("Bunker1") - }, -/turf/open/floor/plating, -/area/ruin/deepstorage) -"ci" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ruin/deepstorage) -"cj" = ( -/obj/machinery/door/poddoor{ - id = "bunker2"; - name = "Bunker Door"; - tag = "outer" - }, -/turf/open/floor/plating, -/area/ruin/deepstorage) -"ck" = ( -/turf/open/floor/plating/asteroid/airless, -/area/ruin/deepstorage) +"aa" = (/turf/template_noop,/area/template_noop) +"ab" = (/turf/closed/mineral/random/low_chance,/area/template_noop) +"ac" = (/turf/open/floor/plating/asteroid/airless,/area/template_noop) +"ad" = (/turf/closed/mineral/random/low_chance,/area/asteroid/cave{name = "Asteroid - Space"}) +"ae" = (/turf/open/floor/plating/asteroid/airless,/area/asteroid/cave{name = "Asteroid - Space"}) +"af" = (/turf/closed/wall/mineral/iron{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/kitchen) +"ag" = (/turf/closed/wall/mineral/iron{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/crusher) +"ah" = (/obj/structure/kitchenspike,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/kitchen) +"ai" = (/obj/structure/closet/secure_closet/freezer/meat,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/kitchen) +"aj" = (/obj/machinery/light/small{dir = 8},/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/crusher) +"ak" = (/obj/machinery/conveyor{dir = 4; id = "bunkerrecycle"},/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/crusher) +"al" = (/obj/machinery/conveyor{dir = 4; id = "bunkerrecycle"},/obj/structure/window/reinforced/highpressure,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/crusher) +"am" = (/obj/machinery/recycler/deathtrap,/obj/machinery/conveyor{dir = 4; id = "bunkerrecycle"},/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/crusher) +"an" = (/obj/machinery/conveyor{dir = 1; id = "bunkerrecycle"; movedir = 2},/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/crusher) +"ao" = (/obj/machinery/atmospherics/components/unary/vent_pump{dir = 4; on = 1},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/kitchen) +"ap" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{icon_state = "intact"; dir = 10},/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/kitchen) +"aq" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/kitchen) +"ar" = (/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/reagent_dispensers/beerkeg,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/kitchen) +"as" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/emergency,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/crusher) +"at" = (/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/crusher) +"au" = (/obj/machinery/conveyor_switch{id = "bunkerrecycle"},/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/crusher) +"av" = (/obj/structure/window/reinforced/highpressure{tag = "icon-rwindow (WEST)"; icon_state = "rwindow"; dir = 8},/obj/machinery/conveyor{dir = 1; id = "bunkerrecycle"; movedir = 2},/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/crusher) +"aw" = (/turf/closed/wall/mineral/iron{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/storage) +"ax" = (/obj/machinery/processor{name = "processor"},/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/kitchen) +"ay" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/kitchen) +"az" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/kitchen) +"aA" = (/obj/machinery/gibber,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/kitchen) +"aB" = (/obj/structure/table,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/crusher) +"aC" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/crusher) +"aD" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/crusher) +"aE" = (/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 2; name = "Recycling APC"; pixel_x = 0; pixel_y = -24},/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/crusher) +"aF" = (/obj/machinery/conveyor{dir = 1; id = "bunkerrecycle"; movedir = 2},/obj/machinery/light/small{dir = 4},/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/crusher) +"aG" = (/obj/structure/closet/cardboard,/obj/item/stack/sheet/mineral/silver,/obj/item/stack/sheet/mineral/gold,/obj/item/stack/sheet/mineral/silver,/obj/item/stack/sheet/mineral/silver,/obj/item/stack/sheet/mineral/gold,/obj/item/stack/sheet/mineral/gold,/obj/effect/turf_decal/delivery,/obj/machinery/light{dir = 1},/turf/open/floor/plasteel/floorgrime,/area/ruin/deepstorage/storage) +"aH" = (/obj/structure/closet/cardboard,/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/toolbox/drone,/obj/item/weapon/storage/toolbox/drone,/obj/effect/turf_decal/delivery,/turf/open/floor/plasteel/floorgrime,/area/ruin/deepstorage/storage) +"aI" = (/obj/structure/closet/cardboard,/obj/item/stack/sheet/cardboard,/obj/item/stack/cable_coil,/obj/item/stack/sheet/mineral/wood,/obj/item/stack/sheet/mineral/wood,/obj/item/stack/packageWrap,/obj/effect/turf_decal/delivery,/turf/open/floor/plasteel/floorgrime,/area/ruin/deepstorage/storage) +"aJ" = (/obj/structure/closet/cardboard,/obj/item/weapon/storage/box/mousetraps,/obj/item/weapon/storage/box/mousetraps,/obj/item/weapon/storage/box/drinkingglasses,/obj/item/weapon/storage/box/zipties,/obj/item/weapon/switchblade,/obj/effect/turf_decal/delivery,/obj/item/device/gps{gpstag = "DEEP"},/turf/open/floor/plasteel/floorgrime,/area/ruin/deepstorage/storage) +"aK" = (/obj/structure/closet/cardboard,/obj/item/stack/sheet/metal{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/sheet/metal{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/sheet/metal{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/sheet/metal{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/rods{amount = 50},/obj/item/stack/rods{amount = 50},/obj/item/stack/rods{amount = 50},/obj/item/stack/rods{amount = 50},/obj/effect/turf_decal/delivery,/turf/open/floor/plasteel/floorgrime,/area/ruin/deepstorage/storage) +"aL" = (/obj/structure/closet/cardboard,/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/plasteel{amount = 10},/obj/item/stack/sheet/plasteel{amount = 10},/obj/item/stack/sheet/plasteel{amount = 10},/obj/item/stack/sheet/plasteel{amount = 10},/obj/item/clothing/shoes/combat,/obj/item/clothing/shoes/combat,/obj/effect/turf_decal/delivery,/obj/machinery/light{dir = 1},/turf/open/floor/plasteel/floorgrime,/area/ruin/deepstorage/storage) +"aM" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,/turf/closed/wall/mineral/iron{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/kitchen) +"aN" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/airlock{name = "Freezer"},/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/kitchen) +"aO" = (/obj/machinery/door/airlock/highsecurity{name = "Recycling Room"; req_access_txt = "200"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/crusher) +"aP" = (/obj/machinery/door/airlock/highsecurity{name = "Recycling Room"; req_access_txt = "200"},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/crusher) +"aQ" = (/turf/closed/wall/mineral/iron{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/hydroponics) +"aR" = (/obj/structure/closet/cardboard,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/weapon/shovel,/obj/item/weapon/pickaxe/drill,/obj/item/weapon/pickaxe/drill,/obj/item/weapon/pickaxe/drill,/obj/effect/turf_decal/delivery,/turf/open/floor/plasteel/floorgrime,/area/ruin/deepstorage/storage) +"aS" = (/obj/structure/closet/cardboard,/obj/item/device/flashlight/lantern,/obj/item/device/flashlight/lantern,/obj/item/device/flashlight/lantern,/obj/item/device/tape/random,/obj/item/device/tape/random,/obj/item/device/tape/random,/obj/item/weapon/storage/box/rxglasses,/obj/item/weapon/extinguisher,/obj/item/weapon/extinguisher,/obj/item/clothing/glasses/night,/obj/item/clothing/glasses/night,/obj/effect/turf_decal/delivery,/turf/open/floor/plasteel/floorgrime,/area/ruin/deepstorage/storage) +"aT" = (/obj/structure/closet/cardboard,/obj/item/weapon/storage/box/syringes,/obj/item/weapon/storage/box/syringes,/obj/item/weapon/storage/box/beakers,/obj/item/weapon/storage/box/beakers,/obj/item/weapon/storage/box/matches,/obj/item/weapon/storage/box/bodybags,/obj/item/clothing/glasses/meson/engine,/obj/item/clothing/glasses/meson/engine,/obj/effect/turf_decal/delivery,/turf/open/floor/plasteel/floorgrime,/area/ruin/deepstorage/storage) +"aU" = (/obj/structure/closet/cardboard,/obj/item/weapon/kitchen/knife,/obj/item/weapon/kitchen/knife,/obj/item/weapon/cultivator,/obj/item/weapon/hatchet,/obj/item/weapon/kitchen/rollingpin,/obj/effect/turf_decal/delivery,/turf/open/floor/plasteel/floorgrime,/area/ruin/deepstorage/storage) +"aV" = (/obj/structure/closet/cardboard,/obj/item/weapon/defibrillator,/obj/item/weapon/storage/box/medipens,/obj/effect/turf_decal/delivery,/turf/open/floor/plasteel/floorgrime,/area/ruin/deepstorage/storage) +"aW" = (/obj/structure/closet/cardboard,/obj/item/ammo_box/c9mm,/obj/item/ammo_box/c9mm,/obj/item/ammo_box/c9mm,/obj/item/ammo_box/c9mm,/obj/item/ammo_box/c9mm,/obj/item/ammo_box/c9mm,/obj/effect/turf_decal/delivery,/turf/open/floor/plasteel/floorgrime,/area/ruin/deepstorage/storage) +"aX" = (/obj/structure/table,/obj/machinery/light{dir = 1},/obj/item/weapon/storage/box/cups,/obj/item/weapon/reagent_containers/glass/beaker,/turf/open/floor/plasteel/cafeteria{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/kitchen) +"aY" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/enzyme,/obj/item/weapon/reagent_containers/food/condiment/soysauce{pixel_x = 4},/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{icon_state = "intact"; dir = 6},/obj/machinery/firealarm{pixel_y = 24},/turf/open/floor/plasteel/cafeteria{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/kitchen) +"aZ" = (/obj/structure/table,/obj/machinery/reagentgrinder,/obj/machinery/airalarm{frequency = 1439; locked = 0; pixel_y = 23},/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{icon_state = "intact"; dir = 4},/turf/open/floor/plasteel/cafeteria{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/kitchen) +"ba" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/peppermill,/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = 4; pixel_y = 4},/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{icon_state = "intact"; dir = 9},/obj/item/weapon/kitchen/knife,/turf/open/floor/plasteel/cafeteria{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/kitchen) +"bb" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/open/floor/plasteel/cafeteria{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/kitchen) +"bc" = (/obj/structure/sink/kitchen{pixel_y = 24},/turf/open/floor/plasteel/cafeteria{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/kitchen) +"bd" = (/obj/structure/table,/obj/machinery/microwave,/turf/open/floor/plasteel/cafeteria{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/kitchen) +"be" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/components/unary/vent_pump{dir = 4; on = 1},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"bf" = (/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{tag = "icon-manifold (NORTH)"; icon_state = "manifold"; dir = 1},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"bg" = (/obj/structure/grille,/obj/structure/window/reinforced/highpressure{tag = "icon-rwindow (NORTH)"; icon_state = "rwindow"; dir = 1},/obj/structure/window/reinforced/highpressure{tag = "icon-rwindow (EAST)"; icon_state = "rwindow"; dir = 4},/obj/structure/window/reinforced/highpressure{tag = "icon-rwindow (WEST)"; icon_state = "rwindow"; dir = 8},/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{icon_state = "intact"; dir = 4},/obj/machinery/door/firedoor,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/hydroponics) +"bh" = (/obj/structure/table,/obj/item/weapon/storage/bag/plants/portaseeder,/obj/item/weapon/storage/bag/plants,/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{icon_state = "intact"; dir = 4},/turf/open/floor/plasteel/hydrofloor{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/hydroponics) +"bi" = (/obj/machinery/vending/hydronutrients,/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{icon_state = "intact"; dir = 4},/obj/machinery/firealarm{pixel_y = 24},/turf/open/floor/plasteel/hydrofloor{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/hydroponics) +"bj" = (/obj/machinery/vending/hydroseeds{slogan_delay = 700},/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{icon_state = "intact"; dir = 4},/turf/open/floor/plasteel/hydrofloor{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/hydroponics) +"bk" = (/obj/machinery/hydroponics/constructable,/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{icon_state = "intact"; dir = 4},/turf/open/floor/light{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/hydroponics) +"bl" = (/obj/machinery/hydroponics/constructable,/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{icon_state = "intact"; dir = 10},/obj/machinery/light{dir = 1},/turf/open/floor/light{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/hydroponics) +"bm" = (/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 4; on = 1},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/storage) +"bn" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/storage) +"bo" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/storage) +"bp" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{icon_state = "intact"; dir = 6},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/storage) +"bq" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{icon_state = "intact"; dir = 4},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/storage) +"br" = (/obj/machinery/atmospherics/components/unary/vent_pump{dir = 8; on = 1},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/storage) +"bs" = (/obj/structure/closet/secure_closet/freezer/kitchen{req_access = null},/obj/machinery/atmospherics/components/unary/vent_pump{dir = 4; on = 1},/obj/item/weapon/storage/box/drinkingglasses,/turf/open/floor/plasteel/cafeteria{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/kitchen) +"bt" = (/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{tag = "icon-manifold (EAST)"; icon_state = "manifold"; dir = 4},/turf/open/floor/plasteel/cafeteria{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/kitchen) +"bu" = (/turf/open/floor/plasteel/cafeteria{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/kitchen) +"bv" = (/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 4; on = 1},/turf/open/floor/plasteel/cafeteria{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/kitchen) +"bw" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4},/turf/open/floor/plasteel/cafeteria{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/kitchen) +"bx" = (/obj/structure/table,/obj/machinery/microwave,/obj/structure/extinguisher_cabinet{dir = 4; pixel_x = 24; pixel_y = 0},/turf/open/floor/plasteel/cafeteria{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/kitchen) +"by" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"bz" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"bA" = (/obj/structure/grille,/obj/structure/window/reinforced/highpressure{tag = "icon-rwindow (EAST)"; icon_state = "rwindow"; dir = 4},/obj/structure/window/reinforced/highpressure,/obj/structure/window/reinforced/highpressure{tag = "icon-rwindow (WEST)"; icon_state = "rwindow"; dir = 8},/obj/machinery/door/firedoor,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/hydroponics) +"bB" = (/obj/structure/table,/obj/item/weapon/cultivator,/obj/item/weapon/hatchet,/turf/open/floor/plasteel/hydrofloor{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/hydroponics) +"bC" = (/turf/open/floor/plasteel/hydrofloor{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/hydroponics) +"bD" = (/obj/machinery/atmospherics/components/unary/vent_pump{dir = 1; on = 1},/obj/structure/extinguisher_cabinet{dir = 4; pixel_x = 24; pixel_y = 0},/turf/open/floor/plasteel/hydrofloor{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/hydroponics) +"bE" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/airalarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/tank_dispenser/oxygen,/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/storage) +"bF" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/storage) +"bG" = (/obj/structure/reagent_dispensers/fueltank,/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/storage) +"bH" = (/obj/structure/reagent_dispensers/watertank/high,/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/storage) +"bI" = (/obj/structure/closet/secure_closet/freezer/fridge,/obj/item/weapon/storage/box/ingredients/wildcard,/obj/item/weapon/storage/box/ingredients/wildcard,/obj/item/weapon/storage/box/ingredients/wildcard,/turf/open/floor/plasteel/cafeteria{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/kitchen) +"bJ" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/open/floor/plasteel/cafeteria{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/kitchen) +"bK" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/open/floor/plasteel/cafeteria{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/kitchen) +"bL" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/open/floor/plasteel/cafeteria{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/kitchen) +"bM" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/open/floor/plasteel/cafeteria{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/kitchen) +"bN" = (/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 2; name = "Kitchen APC"; pixel_x = 0; pixel_y = -24},/turf/open/floor/plasteel/cafeteria{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/kitchen) +"bO" = (/obj/machinery/light,/obj/machinery/vending/dinnerware,/turf/open/floor/plasteel/cafeteria{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/kitchen) +"bP" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"bQ" = (/obj/machinery/door/airlock/glass{name = "Hydroponics"},/turf/open/floor/plasteel/hydrofloor{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/hydroponics) +"bR" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/open/floor/plasteel/hydrofloor{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/hydroponics) +"bS" = (/obj/machinery/hydroponics/constructable,/turf/open/floor/light{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/hydroponics) +"bT" = (/obj/effect/turf_decal/delivery,/obj/structure/closet/crate{name = "food crate"},/obj/item/weapon/reagent_containers/food/snacks/beans,/obj/item/weapon/reagent_containers/food/snacks/beans,/obj/item/weapon/reagent_containers/food/snacks/beans,/obj/item/weapon/reagent_containers/food/snacks/beans,/obj/item/weapon/reagent_containers/food/snacks/beans,/obj/item/weapon/reagent_containers/food/snacks/beans,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/storage) +"bU" = (/obj/effect/turf_decal/delivery,/obj/structure/closet/crate{name = "food crate"},/obj/item/weapon/reagent_containers/food/snacks/beans,/obj/item/weapon/reagent_containers/food/snacks/beans,/obj/item/weapon/reagent_containers/food/snacks/beans,/obj/item/weapon/reagent_containers/food/snacks/beans,/obj/item/weapon/reagent_containers/food/snacks/beans,/obj/item/weapon/reagent_containers/food/snacks/beans,/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/storage) +"bV" = (/obj/machinery/atmospherics/components/unary/vent_pump{dir = 2; on = 1},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/storage) +"bW" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/closed/wall/mineral/iron{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/storage) +"bX" = (/obj/machinery/door/airlock/highsecurity{name = "General Storage"; req_access_txt = "200"},/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/storage) +"bY" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Kitchen"},/turf/open/floor/plasteel/cafeteria{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/kitchen) +"bZ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/smartfridge,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/kitchen) +"ca" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/components/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"cb" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"cc" = (/obj/structure/grille,/obj/structure/window/reinforced/highpressure{tag = "icon-rwindow (NORTH)"; icon_state = "rwindow"; dir = 1},/obj/structure/window/reinforced/highpressure{tag = "icon-rwindow (EAST)"; icon_state = "rwindow"; dir = 4},/obj/structure/window/reinforced/highpressure{tag = "icon-rwindow (WEST)"; icon_state = "rwindow"; dir = 8},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/door/firedoor,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/hydroponics) +"cd" = (/obj/structure/table,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/open/floor/plasteel/hydrofloor{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/hydroponics) +"ce" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/open/floor/plasteel/hydrofloor{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/hydroponics) +"cf" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/atmospherics/components/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/open/floor/plasteel/hydrofloor{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/hydroponics) +"cg" = (/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{cell_type = 5000; dir = 4; name = "Hydroponics APC"; pixel_x = 24; pixel_y = 0},/turf/open/floor/plasteel/hydrofloor{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/hydroponics) +"ch" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,/obj/machinery/airalarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/storage) +"ci" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"cj" = (/obj/structure/noticeboard{pixel_y = 32},/obj/item/weapon/paper{info = "To whoever keeps it up with the long, hot showers: you're going on the next ice-mining trip. If you feel the need to use up all the damn water during your 'relaxation' time, you sure as hell are gonna work for all that water!"; name = "water concerns"},/obj/item/weapon/paper{info = "Hydroponics is our life and blood here, if it dies then so do we. Keep the damn plants watered!"; name = "hydroponics notice"},/obj/item/weapon/paper{info = "Please make sure to throw all excess waste into the crusher in the back! It's amazing what you can get out of what others consider 'garbage' if you run it through a giant crusher enough times."; name = "recycling notice"},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"ck" = (/obj/structure/chair{tag = "icon-chair (EAST)"; icon_state = "chair"; dir = 4},/obj/structure/sign/barsign{pixel_y = 32},/turf/open/floor/plasteel/bar{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"cl" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/light{dir = 1},/turf/open/floor/plasteel/bar{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"cm" = (/obj/structure/table,/obj/machinery/airalarm{frequency = 1439; locked = 0; pixel_y = 23},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/open/floor/plasteel/bar{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"cn" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/open/floor/plasteel/bar{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"co" = (/obj/structure/closet/crate/bin,/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4},/turf/open/floor/plasteel/bar{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"cp" = (/turf/closed/wall/mineral/iron{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"cq" = (/obj/machinery/shower{dir = 4},/obj/item/weapon/soap,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"cr" = (/obj/machinery/light{dir = 1},/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"cs" = (/obj/machinery/atmospherics/components/unary/vent_pump{dir = 2; on = 1},/obj/machinery/airalarm{frequency = 1439; locked = 0; pixel_y = 23},/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"ct" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"cu" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"cv" = (/obj/structure/grille,/obj/structure/window/reinforced/highpressure{tag = "icon-rwindow (EAST)"; icon_state = "rwindow"; dir = 4},/obj/structure/window/reinforced/highpressure,/obj/structure/window/reinforced/highpressure{tag = "icon-rwindow (WEST)"; icon_state = "rwindow"; dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/door/firedoor,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/hydroponics) +"cw" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/light,/obj/item/weapon/reagent_containers/glass/bucket{pixel_x = 4; pixel_y = 4},/obj/item/weapon/reagent_containers/glass/bucket,/turf/open/floor/plasteel/hydrofloor{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/hydroponics) +"cx" = (/obj/machinery/seed_extractor,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/airalarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/open/floor/plasteel/hydrofloor{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/hydroponics) +"cy" = (/obj/machinery/biogenerator,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/item/weapon/reagent_containers/glass/beaker/large,/turf/open/floor/plasteel/hydrofloor{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/hydroponics) +"cz" = (/obj/machinery/hydroponics/constructable,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/open/floor/light{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/hydroponics) +"cA" = (/obj/machinery/hydroponics/constructable,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/open/floor/light{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/hydroponics) +"cB" = (/obj/effect/turf_decal/delivery,/obj/structure/closet/crate{name = "food crate"},/obj/item/weapon/reagent_containers/glass/beaker/waterbottle/large,/obj/item/weapon/reagent_containers/glass/beaker/waterbottle/large,/obj/item/weapon/reagent_containers/glass/beaker/waterbottle/large,/obj/item/weapon/reagent_containers/glass/beaker/waterbottle/large,/obj/item/weapon/reagent_containers/glass/beaker/waterbottle/large,/obj/item/weapon/reagent_containers/glass/beaker/waterbottle/large,/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/storage) +"cC" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{icon_state = "intact"; dir = 5},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/storage) +"cD" = (/obj/machinery/door/airlock/highsecurity{name = "Provisions Storage"; req_access_txt = "200"},/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{icon_state = "intact"; dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/storage) +"cE" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"cF" = (/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden,/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"cG" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{icon_state = "intact"; dir = 10},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"cH" = (/obj/structure/chair{tag = "icon-chair (EAST)"; icon_state = "chair"; dir = 4},/turf/open/floor/plasteel/bar{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"cI" = (/obj/structure/table,/turf/open/floor/plasteel/bar{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"cJ" = (/obj/structure/table,/obj/item/weapon/kitchen/fork,/turf/open/floor/plasteel/bar{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"cK" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/open/floor/plasteel/bar{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"cL" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/vending/coffee,/turf/open/floor/plasteel/bar{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"cM" = (/obj/machinery/shower{dir = 4},/obj/structure/window/reinforced/highpressure,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"cN" = (/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"cO" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/mirror{pixel_x = 24},/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"cP" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"cQ" = (/obj/structure/cable/yellow,/obj/machinery/power/apc{cell_type = 5000; dir = 4; name = "Storage APC"; pixel_x = 24; pixel_y = 0},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/storage) +"cR" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/computer/arcade,/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"cS" = (/obj/structure/chair/stool,/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"cT" = (/turf/open/floor/plasteel/bar{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"cU" = (/obj/structure/chair{tag = "icon-chair (NORTH)"; icon_state = "chair"; dir = 1},/obj/machinery/atmospherics/components/unary/vent_pump{dir = 4; on = 1},/turf/open/floor/plasteel/bar{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"cV" = (/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{tag = "icon-manifold (EAST)"; icon_state = "manifold"; dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/open/floor/plasteel/bar{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"cW" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/vending/cigarette,/obj/structure/extinguisher_cabinet{dir = 4; pixel_x = 24; pixel_y = 0},/turf/open/floor/plasteel/bar{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"cX" = (/obj/structure/toilet{dir = 4},/obj/structure/curtain,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"cY" = (/obj/machinery/atmospherics/components/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"cZ" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"da" = (/obj/structure/grille,/obj/structure/window/reinforced/highpressure{tag = "icon-rwindow (WEST)"; icon_state = "rwindow"; dir = 8},/obj/structure/window/reinforced/highpressure{tag = "icon-rwindow (EAST)"; icon_state = "rwindow"; dir = 4},/obj/structure/window/reinforced/highpressure{tag = "icon-rwindow (NORTH)"; icon_state = "rwindow"; dir = 1},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/door/firedoor,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/armory) +"db" = (/obj/structure/table,/obj/item/device/mass_spectrometer/adv,/obj/item/device/mass_spectrometer/adv,/obj/item/device/healthanalyzer,/obj/item/device/healthanalyzer,/obj/item/stack/medical/gauze,/obj/item/stack/medical/gauze,/turf/open/floor/plasteel/black{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/armory) +"dc" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 4; pixel_y = 4},/obj/item/weapon/storage/firstaid/regular,/turf/open/floor/plasteel/black{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/armory) +"dd" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/brute{pixel_x = 4; pixel_y = 4},/obj/item/weapon/storage/firstaid/brute,/obj/machinery/light{dir = 1},/turf/open/floor/plasteel/black{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/armory) +"de" = (/turf/closed/wall/mineral/iron{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/armory) +"df" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/storage) +"dg" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/closed/wall/mineral/iron{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/storage) +"dh" = (/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden,/obj/structure/cable/yellow{icon_state = "1-4"; d1 = 1; d2 = 4},/obj/machinery/computer/arcade,/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"di" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/structure/chair/stool,/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"dj" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"dk" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"dl" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"dm" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"dn" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"do" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"dp" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/closed/wall/mineral/iron{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"dq" = (/obj/machinery/door/airlock{name = "Showers"},/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"dr" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"ds" = (/obj/structure/grille,/obj/structure/window/reinforced/highpressure{tag = "icon-rwindow (WEST)"; icon_state = "rwindow"; dir = 8},/obj/structure/window/reinforced/highpressure{tag = "icon-rwindow (EAST)"; icon_state = "rwindow"; dir = 4},/obj/structure/window/reinforced/highpressure,/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/door/firedoor,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/armory) +"dt" = (/turf/open/floor/plasteel/black{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/armory) +"du" = (/obj/machinery/atmospherics/components/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/open/floor/plasteel/black{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/armory) +"dv" = (/obj/structure/table,/obj/item/stack/sheet/metal{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/rods{amount = 50},/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/open/floor/plasteel/black{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/armory) +"dw" = (/obj/effect/turf_decal/delivery,/obj/structure/closet/crate{name = "food crate"},/obj/item/weapon/storage/box/donkpockets,/obj/item/weapon/storage/box/donkpockets,/obj/item/weapon/storage/box/donkpockets,/obj/item/weapon/storage/box/donkpockets,/obj/item/weapon/storage/box/donkpockets,/obj/item/weapon/storage/box/donkpockets,/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/item/weapon/vending_refill/coffee,/obj/item/weapon/vending_refill/cigarette,/obj/item/weapon/vending_refill/cigarette,/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/storage) +"dx" = (/obj/effect/turf_decal/delivery,/obj/structure/closet/crate{name = "food crate"},/obj/item/weapon/storage/box/donkpockets,/obj/item/weapon/storage/box/donkpockets,/obj/item/weapon/storage/box/donkpockets,/obj/item/weapon/storage/box/donkpockets,/obj/item/weapon/storage/box/donkpockets,/obj/item/weapon/storage/box/donkpockets,/obj/item/weapon/vending_refill/coffee,/obj/item/weapon/vending_refill/cigarette,/obj/item/weapon/vending_refill/cigarette,/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/storage) +"dy" = (/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 1; icon_state = "scrub_map"; on = 1; tag = "icon-scrub_map (NORTH)"},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/storage) +"dz" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/closed/wall/mineral/iron{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/storage) +"dA" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/closed/wall/mineral/iron{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/dorm) +"dB" = (/turf/closed/wall/mineral/iron{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/dorm) +"dC" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"dD" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"dE" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"dF" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"dG" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"dH" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"dI" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/light{dir = 1},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"dJ" = (/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden,/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"dK" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/door/firedoor,/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"dL" = (/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"dM" = (/obj/machinery/door/airlock/highsecurity{name = "Secure Storage"; req_access_txt = "200"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/open/floor/plasteel/black{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/armory) +"dN" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/open/floor/plasteel/black{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/armory) +"dO" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/open/floor/plasteel/black{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/armory) +"dP" = (/obj/structure/table,/obj/item/device/radio{pixel_x = -4},/obj/item/device/radio,/obj/item/device/radio{pixel_x = 4},/obj/machinery/airalarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/open/floor/plasteel/black{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/armory) +"dQ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/closed/wall/mineral/iron{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/dorm) +"dR" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{icon_state = "intact"; dir = 6},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/dorm) +"dS" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{icon_state = "intact"; dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Dorms"},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/dorm) +"dT" = (/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"dU" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{icon_state = "intact"; dir = 4},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"dV" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{icon_state = "intact"; dir = 4},/obj/structure/cable/yellow,/obj/machinery/power/apc{dir = 2; name = "Main Area APC"; pixel_x = 0; pixel_y = -24},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"dW" = (/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden,/obj/structure/cable/yellow{icon_state = "1-4"; d1 = 1; d2 = 4},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"dX" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{icon_state = "intact"; dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"dY" = (/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{tag = "icon-manifold (NORTH)"; icon_state = "manifold"; dir = 1},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"dZ" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"ea" = (/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"eb" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{icon_state = "intact"; dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/door/firedoor,/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"ec" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"ed" = (/obj/machinery/atmospherics/pipe/manifold4w/supplymain/hidden,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"ee" = (/obj/machinery/door/airlock/highsecurity{name = "Secure Storage"; req_access_txt = "200"},/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{icon_state = "intact"; dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/open/floor/plasteel/black{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/armory) +"ef" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{icon_state = "intact"; dir = 10},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/open/floor/plasteel/black{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/armory) +"eg" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/open/floor/plasteel/black{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/armory) +"eh" = (/obj/structure/table,/obj/item/weapon/storage/backpack/dufflebag/sec{contents = newlist(/obj/item/weapon/scalpel,/obj/item/weapon/hemostat,/obj/item/weapon/retractor,/obj/item/weapon/cautery,/obj/item/weapon/circular_saw,/obj/item/weapon/surgical_drapes,/obj/item/clothing/mask/surgical); desc = "A large dufflebag for holding extra supplies - this one has a material inlay with space for various sharp-looking tools."; name = "dufflebag"; pixel_y = 5},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{cell_type = 5000; dir = 4; name = "Armory APC"; pixel_x = 24; pixel_y = 0},/turf/open/floor/plasteel/black{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/armory) +"ei" = (/obj/structure/dresser,/turf/open/floor/wood{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/dorm) +"ej" = (/obj/structure/table/wood,/obj/item/device/flashlight/lamp,/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 4; on = 1},/turf/open/floor/wood{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/dorm) +"ek" = (/obj/structure/bed,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/item/weapon/bedsheet,/turf/open/floor/wood{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/dorm) +"el" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4},/turf/closed/wall/mineral/iron{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/dorm) +"em" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/dorm) +"en" = (/obj/machinery/door/airlock/highsecurity{name = "Canister Storage"; req_access_txt = "200"},/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"eo" = (/obj/machinery/door/poddoor{id = "bunkerinterior"},/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"ep" = (/obj/machinery/door/poddoor{id = "bunkerinterior"},/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"eq" = (/turf/closed/wall/mineral/iron{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/airlock) +"er" = (/obj/machinery/door/airlock/highsecurity{name = "Airlock Control"; req_access_txt = "200"},/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/airlock) +"es" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/closed/wall/mineral/iron{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/airlock) +"et" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"eu" = (/obj/structure/grille,/obj/structure/window/reinforced/highpressure{tag = "icon-rwindow (WEST)"; icon_state = "rwindow"; dir = 8},/obj/structure/window/reinforced/highpressure{tag = "icon-rwindow (EAST)"; icon_state = "rwindow"; dir = 4},/obj/structure/window/reinforced/highpressure{tag = "icon-rwindow (NORTH)"; icon_state = "rwindow"; dir = 1},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/door/firedoor,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/armory) +"ev" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{icon_state = "intact"; dir = 5},/turf/open/floor/plasteel/black{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/armory) +"ew" = (/obj/machinery/atmospherics/components/unary/vent_pump{dir = 8; on = 1},/turf/open/floor/plasteel/black{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/armory) +"ex" = (/obj/structure/table,/obj/item/weapon/gun/ballistic/automatic/wt550{pixel_x = -3; pixel_y = 6},/obj/item/weapon/gun/ballistic/automatic/wt550{pixel_x = 2; pixel_y = 0},/obj/structure/reagent_dispensers/peppertank{pixel_x = 32},/turf/open/floor/plasteel/black{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/armory) +"ey" = (/obj/structure/closet/cabinet,/obj/item/weapon/card/id/away{desc = "A specialized ID meant for accessing some sort of specific door."; icon_state = "centcom"; name = "bunker access ID"},/turf/open/floor/wood{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/dorm) +"ez" = (/obj/structure/chair/stool,/obj/machinery/atmospherics/components/unary/vent_pump{dir = 4; on = 1},/obj/machinery/light/small,/turf/open/floor/wood{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/dorm) +"eA" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{icon_state = "intact"; dir = 4},/turf/open/floor/wood{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/dorm) +"eB" = (/obj/machinery/door/airlock{name = "Personal Dorm"},/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/open/floor/wood{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/dorm) +"eC" = (/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{tag = "icon-manifold (EAST)"; icon_state = "manifold"; dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/dorm) +"eD" = (/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"eE" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/machinery/light/small{dir = 4},/obj/effect/turf_decal/delivery,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"eF" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,/obj/machinery/light/small{dir = 8},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"eG" = (/obj/machinery/atmospherics/pipe/simple/orange/hidden{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"eH" = (/obj/machinery/atmospherics/pipe/simple/orange/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/closed/wall/mineral/iron{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/airlock) +"eI" = (/obj/structure/table,/obj/machinery/button/door{id = "bunkerexterior"; name = "exterior blastdoor access"; pixel_x = -24; pixel_y = -8; req_access_txt = "200"},/obj/machinery/button/door{id = "bunkerinterior"; name = "interior blastdoor access"; pixel_x = -24; pixel_y = 0; req_access_txt = "200"},/obj/machinery/button/door{id = "bunkershutter"; name = "hallway shutter toggle"; pixel_x = -24; pixel_y = 8; req_access_txt = "200"},/obj/machinery/atmospherics/pipe/simple/orange/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/computer/security/telescreen{dir = 1; name = "Bunker Entrance"; network = list("Bunker1"); pixel_x = 0; pixel_y = 2},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/airlock) +"eJ" = (/obj/machinery/atmospherics/pipe/simple/orange/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{icon_state = "1-4"; d1 = 1; d2 = 4},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/airlock) +"eK" = (/obj/machinery/atmospherics/pipe/simple/orange/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/firealarm{pixel_y = 24},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/airlock) +"eL" = (/obj/machinery/atmospherics/pipe/simple/orange/hidden{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 1; name = "Airlock Control APC"; pixel_x = 0; pixel_y = 24},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/airlock) +"eM" = (/obj/structure/grille,/obj/structure/window/reinforced/highpressure{tag = "icon-rwindow (WEST)"; icon_state = "rwindow"; dir = 8},/obj/structure/window/reinforced/highpressure{tag = "icon-rwindow (EAST)"; icon_state = "rwindow"; dir = 4},/obj/structure/window/reinforced/highpressure,/obj/structure/cable/yellow,/obj/machinery/door/firedoor,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/armory) +"eN" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/toxin{pixel_x = 4; pixel_y = 4},/obj/item/weapon/storage/firstaid/toxin,/obj/item/weapon/storage/pill_bottle/charcoal,/obj/machinery/light,/turf/open/floor/plasteel/black{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/armory) +"eO" = (/obj/structure/table,/obj/item/clothing/gloves/combat{pixel_x = -3; pixel_y = 4},/obj/item/clothing/gloves/combat{pixel_x = 3; pixel_y = -2},/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/turf/open/floor/plasteel/black{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/armory) +"eP" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/drone,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare{pixel_y = 6},/obj/item/device/flashlight/flare{pixel_y = 6},/obj/item/device/flashlight/flare{pixel_y = 6},/turf/open/floor/plasteel/black{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/armory) +"eQ" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/dorm) +"eR" = (/obj/machinery/portable_atmospherics/canister/air,/obj/effect/turf_decal/delivery,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"eS" = (/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 1; icon_state = "scrub_map"; on = 1; tag = "icon-scrub_map (NORTH)"},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"eT" = (/obj/structure/grille,/obj/structure/window/reinforced/highpressure{tag = "icon-rwindow (EAST)"; icon_state = "rwindow"; dir = 4},/obj/structure/window/reinforced/highpressure{tag = "icon-rwindow (NORTH)"; icon_state = "rwindow"; dir = 1},/obj/structure/window/reinforced/highpressure{tag = "icon-rwindow (WEST)"; icon_state = "rwindow"; dir = 8},/obj/machinery/door/poddoor/shutters/preopen{id = "bunkershutter"},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/door/firedoor,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/airlock) +"eU" = (/obj/structure/chair{dir = 8},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/airlock) +"eV" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/components/unary/vent_pump{dir = 1; on = 1},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/airlock) +"eW" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/airlock) +"eX" = (/obj/machinery/atmospherics/components/binary/valve{name = "Hall Siphon to Port"},/obj/structure/extinguisher_cabinet{dir = 4; pixel_x = 24; pixel_y = 0},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/airlock) +"eY" = (/obj/machinery/door/airlock/highsecurity{name = "Atmospherics and Power Storage"; req_access_txt = "200"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"eZ" = (/obj/machinery/door/airlock/highsecurity{name = "Atmospherics and Power Storage"; req_access_txt = "200"},/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"fa" = (/obj/machinery/atmospherics/pipe/simple/green/visible{dir = 6},/turf/closed/wall/mineral/iron{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/armory) +"fb" = (/obj/machinery/atmospherics/pipe/simple/green/visible{dir = 4},/turf/closed/wall/mineral/iron{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/armory) +"fc" = (/obj/machinery/atmospherics/pipe/simple/green/visible{dir = 4},/turf/closed/wall/mineral/iron{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"fd" = (/obj/machinery/atmospherics/components/unary/outlet_injector/on{dir = 8},/turf/open/floor/plating/airless/astplate{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"fe" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/extinguisher_cabinet{dir = 4; pixel_x = 24; pixel_y = 0},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/dorm) +"ff" = (/obj/machinery/portable_atmospherics/canister/nitrous_oxide,/obj/effect/turf_decal/delivery,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"fg" = (/obj/machinery/atmospherics/components/unary/vent_pump{on = 1},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"fh" = (/obj/structure/grille,/obj/structure/window/reinforced/highpressure{tag = "icon-rwindow (EAST)"; icon_state = "rwindow"; dir = 4},/obj/structure/window/reinforced/highpressure,/obj/structure/window/reinforced/highpressure{tag = "icon-rwindow (WEST)"; icon_state = "rwindow"; dir = 8},/obj/machinery/door/poddoor/shutters/preopen{id = "bunkershutter"},/obj/structure/cable/yellow,/obj/machinery/door/firedoor,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/airlock) +"fi" = (/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/airlock) +"fj" = (/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 1; on = 1},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/airlock) +"fk" = (/obj/machinery/atmospherics/components/unary/portables_connector/visible{tag = "icon-connector_map (NORTH)"; icon_state = "connector_map"; dir = 1},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/airlock) +"fl" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"fm" = (/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{icon_state = "manifold"; dir = 8},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"fn" = (/obj/machinery/atmospherics/pipe/simple/green/visible,/obj/machinery/atmospherics/pipe/simple/supplymain/visible{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/firealarm{pixel_y = 24},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"fo" = (/obj/machinery/atmospherics/components/unary/vent_pump{dir = 8; on = 1},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"fp" = (/turf/closed/wall/mineral/iron{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"fq" = (/obj/machinery/portable_atmospherics/canister/nitrous_oxide,/obj/machinery/light/small{dir = 4},/obj/effect/turf_decal/delivery,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"fr" = (/obj/machinery/atmospherics/pipe/simple/yellow/hidden{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/obj/machinery/light/small{dir = 4},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"fs" = (/obj/machinery/atmospherics/pipe/simple/yellow/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/closed/wall/mineral/iron{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/airlock) +"ft" = (/obj/machinery/atmospherics/pipe/simple/yellow/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/airalarm{dir = 4; icon_state = "alarm0"; pixel_x = -24; tag = "icon-alarm0 (EAST)"},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/airlock) +"fu" = (/obj/machinery/atmospherics/pipe/simple/yellow/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/light,/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/airlock) +"fv" = (/obj/machinery/atmospherics/components/binary/valve{dir = 4; icon_state = "mvalve_map"; name = "Port To Hall"; tag = "icon-mvalve_map (EAST)"},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/airlock) +"fw" = (/obj/machinery/portable_atmospherics/canister/nitrous_oxide,/obj/machinery/atmospherics/components/unary/portables_connector/visible{tag = "icon-connector_map (WEST)"; icon_state = "connector_map"; dir = 8},/obj/item/weapon/wrench,/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/airlock) +"fx" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{dir = 8; name = "Power and Atmospherics APC"; pixel_x = -25; pixel_y = 1},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"fy" = (/obj/machinery/atmospherics/components/trinary/mixer{dir = 1; icon_state = "mixer_off"; node1_concentration = 0.2; node2_concentration = 0.8; on = 1; tag = "icon-mixer_off (NORTH)"},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"fz" = (/obj/machinery/atmospherics/pipe/simple/green/visible,/obj/machinery/atmospherics/pipe/simple/supplymain/visible{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"fA" = (/obj/machinery/atmospherics/pipe/simple/supplymain/visible{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"fB" = (/obj/structure/grille,/obj/structure/window/reinforced/highpressure{tag = "icon-rwindow (EAST)"; icon_state = "rwindow"; dir = 4},/obj/structure/window/reinforced/highpressure{tag = "icon-rwindow (NORTH)"; icon_state = "rwindow"; dir = 1},/obj/structure/window/reinforced/highpressure{tag = "icon-rwindow (WEST)"; icon_state = "rwindow"; dir = 8},/obj/machinery/atmospherics/pipe/simple/supplymain/visible{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/door/firedoor,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"fC" = (/obj/machinery/atmospherics/components/unary/vent_pump{dir = 8; external_pressure_bound = 0; frequency = 1441; id_tag = "o2_out_bunker"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/open/floor/plating/airless{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"fD" = (/turf/open/floor/plating/airless{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"fE" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,/obj/structure/cable/yellow,/obj/machinery/power/apc{cell_type = 5000; dir = 4; name = "Dormory APC"; pixel_x = 24; pixel_y = 0},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/dorm) +"fF" = (/obj/machinery/door/poddoor{id = "bunkerexterior"},/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"fG" = (/obj/machinery/door/poddoor{id = "bunkerexterior"},/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"fH" = (/obj/machinery/atmospherics/pipe/simple/supplymain/visible,/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"fI" = (/obj/machinery/atmospherics/pipe/simple/green/visible,/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"fJ" = (/obj/machinery/computer/atmos_control/tank{frequency = 1441; input_tag = "o2_in_bunker"; name = "Oxygen Supply Control"; output_tag = "o2_out_bunker"; sensors = list("o2_sensor_bunker" = "Tank")},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"fK" = (/obj/structure/grille,/obj/structure/window/reinforced/highpressure{tag = "icon-rwindow (EAST)"; icon_state = "rwindow"; dir = 4},/obj/structure/window/reinforced/highpressure{tag = "icon-rwindow (WEST)"; icon_state = "rwindow"; dir = 8},/obj/machinery/door/firedoor,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"fL" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "o2_sensor_bunker"},/turf/open/floor/plating/airless{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"fM" = (/obj/machinery/atmospherics/miner/oxygen,/obj/machinery/light/small{dir = 4},/turf/open/floor/plating/airless{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"fN" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,/turf/closed/wall/mineral/iron{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/dorm) +"fO" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/dorm) +"fP" = (/obj/structure/closet/wardrobe/pjs,/obj/machinery/airalarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/dorm) +"fQ" = (/obj/machinery/atmospherics/components/unary/vent_pump{dir = 4; on = 1},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"fR" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{icon_state = "intact"; dir = 4},/obj/machinery/light/small{dir = 1},/obj/structure/sign/securearea{pixel_y = 32},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"fS" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{icon_state = "intact"; dir = 9},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"fT" = (/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"fU" = (/obj/machinery/camera{network = list("Bunker1")},/obj/structure/sign/securearea{pixel_y = 32},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"fV" = (/obj/structure/closet/emcloset,/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"fW" = (/obj/machinery/power/smes/engineering,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/open/floor/plating/airless{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"fX" = (/obj/machinery/power/terminal{tag = "icon-term (WEST)"; icon_state = "term"; dir = 8},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/effect/turf_decal/stripes/end{tag = "icon-warn_end (EAST)"; icon_state = "warn_end"; dir = 4},/turf/open/floor/plating/airless{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"fY" = (/obj/machinery/airalarm{frequency = 1439; locked = 0; pixel_y = 23},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"fZ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"ga" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 1; filter_type = "o2"; on = 1},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"gb" = (/obj/machinery/atmospherics/pipe/simple/green/visible{dir = 4},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"gc" = (/obj/structure/grille,/obj/structure/window/reinforced/highpressure{tag = "icon-rwindow (EAST)"; icon_state = "rwindow"; dir = 4},/obj/structure/window/reinforced/highpressure,/obj/structure/window/reinforced/highpressure{tag = "icon-rwindow (WEST)"; icon_state = "rwindow"; dir = 8},/obj/machinery/atmospherics/pipe/simple/green/visible{dir = 4},/obj/machinery/door/firedoor,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"gd" = (/obj/machinery/atmospherics/components/unary/outlet_injector/on{dir = 8; frequency = 1441; id = "n2_in_bunker"},/turf/open/floor/plating/airless{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"ge" = (/obj/machinery/door/airlock{name = "Personal Dorm"},/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{icon_state = "intact"; dir = 4},/turf/open/floor/wood{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/dorm) +"gf" = (/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{tag = "icon-manifold (EAST)"; icon_state = "manifold"; dir = 4},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/dorm) +"gg" = (/obj/machinery/washing_machine,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/dorm) +"gh" = (/obj/machinery/power/smes/engineering,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/open/floor/plating/airless{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"gi" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"gj" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"gk" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/extinguisher_cabinet{dir = 4; pixel_x = 24; pixel_y = 0},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"gl" = (/obj/machinery/atmospherics/components/unary/vent_pump{dir = 1; on = 1},/obj/effect/turf_decal/stripes/line,/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/dorm) +"gm" = (/obj/effect/turf_decal/stripes/line,/obj/structure/closet/crate/bin{name = "laundry bin"},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/dorm) +"gn" = (/obj/machinery/light/small,/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"go" = (/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 4; on = 1},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"gp" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/closed/wall/mineral/iron{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"gq" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{dir = 4},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/sign/electricshock{pixel_x = -32},/obj/machinery/suit_storage_unit/syndicate,/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"gr" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/light,/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"gs" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"gt" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{dir = 4},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"gu" = (/obj/machinery/atmospherics/pipe/simple/supplymain/visible{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"gv" = (/obj/machinery/atmospherics/components/unary/vent_pump{dir = 8; external_pressure_bound = 0; frequency = 1441; id_tag = "n2_out_bunker"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/open/floor/plating/airless{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"gw" = (/obj/machinery/sleeper{dir = 4; icon_state = "sleeper-open"},/turf/open/floor/plasteel/white{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/dorm) +"gx" = (/turf/open/floor/plasteel/white{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/dorm) +"gy" = (/obj/structure/closet/crate/freezer,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/turf/open/floor/plasteel/white{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/dorm) +"gz" = (/obj/machinery/door/airlock/highsecurity{desc = "Nothing to see here, folks, just an inconspicuous airlock. Now go away!"; name = "Inconspicuous Airlock"; req_access_txt = "200"},/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"gA" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"gB" = (/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"gC" = (/obj/machinery/computer/atmos_control/tank{frequency = 1441; input_tag = "n2_in_bunker"; name = "Nitrogen Supply Control"; output_tag = "n2_out_bunker"; sensors = list("n2_sensor_bunker" = "Tank")},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"gD" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "n2_sensor_bunker"},/turf/open/floor/plating/airless{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"gE" = (/obj/machinery/atmospherics/miner/nitrogen,/obj/machinery/light/small{dir = 4},/turf/open/floor/plating/airless{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"gF" = (/obj/machinery/light/small,/turf/open/floor/plasteel/white{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/dorm) +"gG" = (/obj/machinery/iv_drip,/turf/open/floor/plasteel/white{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/dorm) +"gH" = (/obj/machinery/light/small{dir = 8},/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"gI" = (/obj/machinery/light/small{dir = 4},/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"gJ" = (/obj/machinery/light/small{dir = 8},/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"gK" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"gL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/door/airlock/highsecurity{name = "RTG Observation"; req_access_txt = "200"},/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"gM" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"gN" = (/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"gO" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 1; filter_type = "n2o"; on = 1},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"gP" = (/obj/machinery/atmospherics/components/unary/outlet_injector/on{dir = 8; frequency = 1441; id = "o2_in_bunker"},/turf/open/floor/plating/airless{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"gQ" = (/obj/machinery/door/airlock/highsecurity{desc = "Nothing to see here, folks, just an inconspicuous airlock. Now go away!"; name = "Inconspicuous Airlock"; req_access_txt = "200"},/obj/structure/fans/tiny,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage) +"gR" = (/obj/structure/grille,/obj/structure/window/reinforced/highpressure,/obj/structure/window/reinforced/highpressure{tag = "icon-rwindow (NORTH)"; icon_state = "rwindow"; dir = 1},/obj/structure/window/reinforced/highpressure{tag = "icon-rwindow (WEST)"; icon_state = "rwindow"; dir = 8},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/door/firedoor,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"gS" = (/obj/structure/grille,/obj/structure/window/reinforced/highpressure,/obj/structure/window/reinforced/highpressure{tag = "icon-rwindow (NORTH)"; icon_state = "rwindow"; dir = 1},/obj/structure/window/reinforced/highpressure{tag = "icon-rwindow (EAST)"; icon_state = "rwindow"; dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/door/firedoor,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"gT" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{dir = 5},/obj/machinery/autolathe,/obj/structure/sign/radiation{pixel_x = -32},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"gU" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{dir = 4},/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"gV" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{dir = 9},/obj/structure/table,/obj/item/weapon/storage/toolbox/electrical{pixel_x = 4; pixel_y = 4},/obj/item/weapon/storage/toolbox/electrical,/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"gW" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = 4; pixel_y = 4},/obj/item/weapon/storage/toolbox/mechanical,/turf/open/floor/plasteel/floorgrime{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"gX" = (/obj/machinery/power/rtg/advanced,/obj/structure/cable,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"gY" = (/obj/machinery/door/airlock/highsecurity{name = "Telecomms"; req_access_txt = "200"},/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"gZ" = (/obj/machinery/power/rtg/advanced,/obj/structure/cable,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"ha" = (/obj/machinery/power/rtg/advanced,/obj/structure/cable,/obj/machinery/light/small,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"hb" = (/obj/machinery/blackbox_recorder,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"hc" = (/obj/machinery/light/small,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) +"hd" = (/obj/machinery/telecomms/relay/preset/telecomms,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/airless},/area/ruin/deepstorage/power) (1,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(2,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(3,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(4,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(5,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(6,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(7,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(8,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(9,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -"} -(10,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -"} -(11,1,1) = {" -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -"} -(12,1,1) = {" -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(13,1,1) = {" -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -"} -(14,1,1) = {" -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -"} -(15,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -"} -(16,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -"} -(17,1,1) = {" -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -"} -(18,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(19,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(20,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(21,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(22,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(23,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ck -ck -ck -ab -ab -ab -ab -ab -"} -(24,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -ck -ck -ck -ck -ck -ck -ck -ck -ab -ab -ab -"} -(25,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -bl -bo -ac -bw -bD -bM -bU -ca -ar -cf -cg -cg -ac -ck -ck -ck -ck -ck -ck -ck -ck -ck -ck -ab -ab -"} -(26,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ar -ar -ac -bx -ar -bN -ar -aO -ar -cf -cg -cg -ac -ck -ck -ck -ck -ck -ck -ck -ck -ck -ck -ck -ck -"} -(27,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -bp -ac -by -bE -bO -aO -ar -aO -ac -cg -cg -ac -ck -ck -ck -ck -ck -ck -ck -ck -ck -ck -ck -ck -"} -(28,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -aI -aT -bb -ac -ar -aO -ac -bz -aO -aO -ar -aO -cd -ac -ch -cg -cj -ck -ck -ck -ck -ab -ab -ab -ck -ck -ck -ck -ck -"} -(29,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -aJ -aU -bc -bi -ar -ar -ac -aO -ar -aO -ar -cb -cc -ac -ci -cg -cj -ck -ck -ck -ck -ab -ab -ab -ab -ck -ck -ck -ck -"} -(30,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -aK -aV -bd -ac -ar -aO -au -ar -ar -aO -bV -aO -ce -ac -ac -ac -ac -ck -ck -ab -ab -ab -ab -ab -ab -ab -ab -ck -ck -"} -(31,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -bm -aO -ac -bA -bF -bP -bW -cc -bW -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(32,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -av -aL -aW -be -ac -aO -aO -ac -ac -ac -ac -ac -ac -ac -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(33,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -aw -aM -aX -aX -bj -aO -aO -ar -ar -bG -bQ -bX -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -"} -(34,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -aO -aO -aO -ar -bH -bH -bY -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -"} -(35,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ax -aN -aY -ac -bk -ar -bq -ac -ar -bI -bR -bH -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -"} -(36,1,1) = {" -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ay -ar -ar -bf -ar -ar -br -ac -aO -bJ -bS -bH -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -"} -(37,1,1) = {" -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -az -aO -aO -bf -aO -ar -bs -ac -aO -bK -bK -bH -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -"} -(38,1,1) = {" -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -aA -ar -aO -au -aO -aO -bt -ac -ar -ar -ar -ar -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -"} -(39,1,1) = {" -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -aB -ar -aO -bf -aO -aO -aO -aO -aO -ar -ar -aO -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(40,1,1) = {" -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -aC -aO -ar -bf -aO -bn -aO -aO -bB -bL -bT -bZ -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(41,1,1) = {" -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -aD -aP -aZ -ac -au -ac -ac -au -ac -ac -ac -ac -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(42,1,1) = {" -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ad -aj -ap -ac -ac -ac -ac -ac -aO -ac -bu -aO -bC -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -"} -(43,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ae -ak -aq -ac -aE -aQ -ba -ba -aO -ac -bv -aO -bv -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -"} -(44,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -af -al -ar -au -ar -ar -aO -aO -ar -ac -bv -aO -bv -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -"} -(45,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ag -am -ar -ac -aF -aR -aR -bg -bg -ac -bu -aO -bC -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -"} -(46,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ah -an -as -ac -aG -aR -aR -bh -bh -ac -ac -ac -ac -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -"} -(47,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ai -ao -at -ac -aH -aS -aH -aH -aH -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -"} -(48,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -aH -aH -aH -aH -aH -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -"} -(49,1,1) = {" -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -"} -(50,1,1) = {" -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(51,1,1) = {" -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(52,1,1) = {" -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(53,1,1) = {" -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(54,1,1) = {" -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(55,1,1) = {" -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(56,1,1) = {" -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(57,1,1) = {" -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -"} -(58,1,1) = {" -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -"} -(59,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -"} -(60,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(61,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(62,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(63,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(64,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -"} -(65,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -"} -(66,1,1) = {" -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -"} -(67,1,1) = {" -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -"} -(68,1,1) = {" -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -"} -(69,1,1) = {" -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -"} -(70,1,1) = {" -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -"} -(71,1,1) = {" -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -"} -(72,1,1) = {" -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -"} -(73,1,1) = {" -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -"} -(74,1,1) = {" -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -"} -(75,1,1) = {" -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -"} -(76,1,1) = {" -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -"} -(77,1,1) = {" -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -"} -(78,1,1) = {" -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -"} -(79,1,1) = {" -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -"} -(80,1,1) = {" -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -"} -(81,1,1) = {" -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -"} -(82,1,1) = {" -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(83,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(84,1,1) = {" -aa -aa -ab -ab -ab -aa -aa -ab -ab -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(85,1,1) = {" -aa -aa -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaabaaaaaaaaaaaaaaaaaaaaaaaaababababacababaaaaaaaaaaaaaaababababaaaaaaaaaaaaaaaaaaaaababaaaaaaaaaaaa +aaaaababaaababaaaaaaaaaaaaababacabacacababaaaaaaaaaaabaaacacababababaaaaaaaaaaaaaaaaabababaaaaaaaaaa +abaaababaaaaaaaaaaaaadaaaaaaababacacacaaaaaaaaaaaaaaaaaaabacacacababaaaaaaaaababacacacababaaaaaaaaaa +aaaaababaaaaaaaaaaaaadadaaaaaaaaacababaaaaaaaaaaaaaaaaaaaaacacacaaaaaaaaaaababababacacacacacaaaaaaaa +aaaaababaaaaadaaaaaaadadaaaaaaaaaaaaaaaaaaaaaaaaaaadadadaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacaaaaaaaa +aaaaaaaaaaaaadadadadadadadadaaaaaaaaaaaeaeaaaaadadadadadadaaaaaaaaaaadadadaaaaaaaaacacabababaaaaaaaa +aaaaaaaaaaaaaaaaadadadadaeaeaeaeaeaeaeaeaeadadadadadadadadadadadaaaaadadadaaaaaaaaaaaaabaaaaaaaaaaaa +aaaaaaaaaaadadadadadadadadadadadaeaeaeadadadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaabaa +aaaaaaadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaaaaaaabaaaaababaaaaaaaa +aaaaaaaaadaeaeaeadadadadadadadadadadadadadafafafafafagagagagagagagadadadadadadaaaaaaaaaaababababaaaa +aaaaaaaaaaaeaeaeadadadadadadadadadadadadadafahaiaiahagajakalamanagadadadadadadaaaaaaaaaaaaabababaaaa +aaabaaaaaaaeaeaeadadadadadadadadadadadadadafaoapaqaragasatauatavagadadadadadadadaaaaaaaaaaabababaaaa +aaaaaaaaaaaaaeaeadadadadawawawawawawawawadafaxayazaAagaBaCaDaEaFagadadadadadadadaaaaaaabaaaaabaaaaaa +aaababaaadaeaeaeadadadadawaGaHaIaJaKaLafafafafaMaNafagagaOaPaQaQaQaQaQaQaQaQadadadadaaaaaaaaaaaaaaaa +aaacabaaaaaeaeaeaeadadadawaRaSaTaUaVaWafaXaYaZbabbbcbdafbebfbgbhbibjbkbkblaQadadadadaaaaaaaaaaaaaaaa +aaababaaaaaaaeaeaeadadadawbmbnbobpbqbrafbsbtbubvbwbubxafbybzbAbBbCbCbCbCbDaQadadadadadadaaaaaaaaaaaa +aaababababaaaeaeaeadawawawawawbEbFbGbHafbIbJbKbLbMbNbOafbPbzbQbCbCbRbSbSbSaQadadadadadadaaaaaaaaaaaa +ababacacacaaaaaeaeadawbTbUbVawbWbXawawafafbYbZafafafafafcacbcccdcecececfcgaQadadadaeaeaeaaaaaaaaaaaa +aaabacacacaaaaaeaeadawbUbUchawcibzcjckclcmcncocpcqcrcscpctcucvcwcxcyczcAbSaQadadaeaeaeaeaaaaabaaaaaa +aaababacacaaaaaeaeadawcBcBcCcDcEcFcGcHcIcJcKcLcpcMcNcOcpcPbzaQaQaQaQaQaQaQaQadadadaeadaaaaababaaaaaa +aaaaaaaaaaaaaeaeaeadawcBcBcQawcRcSbzcTcTcUcVcWcpcXcYcZcpcPbzdadbdcdddeadadadadadaeaeaaaaaaababaaaaaa +aaabaaaaadadaeaeadadawcBcBdfdgdhdidjdkdldmdndocpcpdpdqcpdrcbdsdtdudvdeadadadaeaeaeaaaaaaabababaaaaaa +aaaaaaaaadadadadadadawdwdxdydzdAdBdCdDdEdFdGdHdIdFdJcudKdLcudMdNdOdPdeadadadaeadadaaaaaaababaaaaaaaa +aaaaadadadadadadadaddBdBdBdBdQdRdSdTdUdVbfdWdXdXdYdZeaebecedeeefegehdeadadadaeadaeaaaaaaababaaaaaaaa +aaadadadadadadadadaddBeiejekelemcpencpcpeoepeqeqereseqeqetcbeuevewexdeadaeaeaeadaeaeaeaaaaaaaaaaaaaa +aaadadadadadadadadaddBeyezeAeBeCcpeDeEcpeFeGeHeIeJeKeLeqcPbzeMeNeOePdeadaeadadadaeaeaeaaaaaaababaaaa +aaadaaaaadadadadadaddBdBdBdBdQeQcpeDeRcpbzeSeTeUeVeWeXeqeYeZfafbfbfbfbfcfdadadadaeaeaeaeaeaaababaaaa +aaadaaaaaaaaadadadaddBeiejekelfecpeDffcpbzfgfhfififjfkeqflfmfnfofpfpfpfpadadadadadadaeaeaeaaababaaaa +aaaaaaaaaaaaaaadadaddBeyezeAeBeCcpeDfqcpbzfrfsftfufvfweqfxfyfzfAfBfCfDfpadadadadadadaeaeaeaaababaaaa +aaaaaaaaaaaaaaadadaddBdBdBdBdQfEcpcpcpcpfFfGeqeqeqeqeqeqflfHfIfJfKfLfMfpadadadadadadaeaeaeaaaaaaaaaa +aaaaaaaaabaaaaadadaddBeiejekfNfOfPdBfQfRfSfTfUfVfpfWfXfYfZfHgagbgcgdfDfpadadadadadadadaeaeaaaaaaabaa +aaaaabaaaaaaaaaaadaddBeyezeAgegfggdBfVfTfTfTfTfVfpghfXgigjfHfIgkfpfpfpfpadadadadadadadaeaeaaaaaaaaaa +aaaaabababaaaaaaadaddBdBdBdBdBglgmdBfVfTfTfTgngogpgqgrgsgtgufzfAfBgvfDfpadadadadadadadadaeaaaaaaaaaa +aaaaaaababaaaaaaadadadadaddBgwgxgydBcpcpgzgzcpcpfpfpfpfpgAgBfIgCfKgDgEfpadadadadadadaaaaaaaaaaabaaaa +aaaaaaababaaaaaaadadadadaddBgwgFgGdBadcpgHgIcpadfpgJgKgLgMgNgOgbgcgPfDfpadadadadadadadadaaaaaaaaaaaa +aaaaaaaaaaaaaaaaadadadadaddBdBdBdBdBadcpgQgQcpadfpgRgSfpgTgUgVgWfpfpfpfpadadadadadadadadaaaaaaaaaaaa +aaaaabaaaaaaabaaaaadadadadadadadadadadadaeaeadadfpgXgXfpfpgYfpfpfpadadadadadadadaeaeaeadaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaadadadadadadadadadaeaeaeaeadadfpgZhafphbhchdfpadadadadadaaaaadaeaeaeadaaaaaaabaaaa +aaabaaaaaaaaaaaaaaaaadadadadadadadadadaeaeaeaeadfpfpfpfpfpfpfpfpadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaadadadadadadadadadaeaeaeaeadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaababaaaaaaaaaaadadadadadadadadadadadadaeaeaeaeaeaeadadadadadadadadadaaaaaaaaaaaaababaaaaaaabaaaa +aaaaababaaaaaaaaadadadadadadadadadadadadadadaeaeaeaeaeaeadadadadadadadadaaaaaaababaaacabaaaaaaaaaaaa +aaacababaaabaaaaadadadadaaaaaaaaaaaaadadadadadadadadaeaeaeaeaeaeaeaeaeadaaaaaaaaaaaaacacababaaaaaaaa +abacacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadaaaaadaeaeaeaeaeaaaaaaaaaaaaacacababaaaaaaaa +abacacaaaaaaaaaaaaaaaaabaaababacacacaaaaaaaaaaaaaaaaaaaaaaaaaaadadadaeaeaaaaaaaaaaacacacababaaaaaaaa +abababaaaaabaaaaaaaaaaaaaaacacacacacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaacacababaaaaaaaaaa +abababaaaaaaaaaaaaaaabababacacacacacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababaaaaabaaaa +aaaaaaaaaaaaaaaaaaaaaaaaababacaaabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaabababaaabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "} diff --git a/_maps/map_files/Cerestation/cerestation.dmm b/_maps/map_files/Cerestation/cerestation.dmm index bbb106b7195..7618b86f338 100644 --- a/_maps/map_files/Cerestation/cerestation.dmm +++ b/_maps/map_files/Cerestation/cerestation.dmm @@ -37958,7 +37958,7 @@ /area/engine/engineering) "bqt" = ( /obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/trinary/filter/flipped{ +/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ dir = 8; filter_type = "co2"; icon_state = "filter_off_f"; @@ -37984,7 +37984,7 @@ /area/engine/engineering) "bqv" = ( /obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/trinary/filter/flipped{ +/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ dir = 8; filter_type = "o2"; icon_state = "filter_off_f"; @@ -38031,7 +38031,7 @@ /area/engine/engineering) "bqy" = ( /obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/trinary/filter/flipped{ +/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ dir = 8; filter_type = "plasma"; icon_state = "filter_off_f"; @@ -38046,7 +38046,7 @@ /area/engine/engineering) "bqz" = ( /obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/trinary/filter/flipped{ +/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ dir = 8; filter_type = ""; icon_state = "filter_off_f"; @@ -44097,7 +44097,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/atmospherics/components/trinary/filter{ +/obj/machinery/atmospherics/components/trinary/filter/critical{ dir = 8; icon_state = "filter_off"; on = 1; diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 62311b48850..5764c1db7b8 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -1533,14 +1533,7 @@ }, /area/construction/mining/aux_base) "adm" = ( -/turf/open/space, -/obj/machinery/porta_turret/syndicate{ - dir = 9 - }, -/turf/closed/wall/mineral/plastitanium{ - dir = 8; - icon_state = "diagonalWall3" - }, +/turf/open/space/basic, /area/shuttle/syndicate) "adn" = ( /turf/closed/wall/mineral/plastitanium, @@ -8352,10 +8345,9 @@ /turf/open/floor/plasteel, /area/engine/atmospherics_engine) "asq" = ( -/obj/machinery/atmospherics/components/trinary/filter{ +/obj/machinery/atmospherics/components/trinary/filter/critical{ dir = 4; - filter_type = "o2"; - on = 1 + filter_type = "o2" }, /turf/open/floor/plasteel/yellow, /area/engine/atmospherics_engine) @@ -11416,7 +11408,7 @@ /turf/open/floor/plasteel, /area/shuttle/supply) "aza" = ( -/obj/machinery/atmospherics/components/trinary/filter/flipped{ +/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ filter_type = "n2"; name = "nitrogen filter" }, @@ -12363,14 +12355,12 @@ pixel_x = 32; pixel_y = 32 }, -/obj/machinery/atmospherics/components/trinary/filter{ - density = 0; - dir = 8; - req_access = "0" - }, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/atmospherics/components/trinary/filter/critical{ + dir = 8 + }, /turf/open/floor/plasteel, /area/engine/atmospherics_engine) "aBa" = ( @@ -105502,6 +105492,1688 @@ dir = 1 }, /area/crew_quarters/locker) +"ejC" = ( +/turf/open/space, +/obj/machinery/porta_turret/syndicate{ + dir = 9 + }, +/turf/closed/wall/mineral/plastitanium{ + dir = 8; + icon_state = "diagonalWall3" + }, +/area/space) +"ejD" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"ejE" = ( +/obj/structure/grille, +/obj/machinery/door/poddoor/shutters{ + id = "syndieshutters"; + name = "blast shutters" + }, +/obj/structure/window/reinforced/fulltile, +/turf/open/floor/plating, +/area/space) +"ejF" = ( +/obj/structure/grille, +/obj/machinery/door/poddoor/shutters{ + id = "syndieshutters"; + name = "blast shutters" + }, +/obj/structure/window/reinforced/fulltile, +/turf/open/floor/plating, +/area/space) +"ejG" = ( +/obj/structure/grille, +/obj/machinery/door/poddoor/shutters{ + id = "syndieshutters"; + name = "blast shutters" + }, +/obj/structure/window/reinforced/fulltile, +/turf/open/floor/plating, +/area/space) +"ejH" = ( +/obj/structure/grille, +/obj/machinery/door/poddoor/shutters{ + id = "syndieshutters"; + name = "blast shutters" + }, +/obj/structure/window/reinforced/fulltile, +/turf/open/floor/plating, +/area/space) +"ejI" = ( +/obj/structure/grille, +/obj/machinery/door/poddoor/shutters{ + id = "syndieshutters"; + name = "blast shutters" + }, +/obj/structure/window/reinforced/fulltile, +/turf/open/floor/plating, +/area/space) +"ejJ" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"ejK" = ( +/turf/open/space, +/obj/machinery/porta_turret/syndicate{ + dir = 5 + }, +/turf/closed/wall/mineral/plastitanium{ + dir = 1; + icon_state = "diagonalWall3" + }, +/area/space) +"ejL" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"ejM" = ( +/obj/machinery/computer/med_data{ + icon_keyboard = "syndi_key" + }, +/turf/open/floor/plasteel/vault{ + dir = 8 + }, +/area/space) +"ejN" = ( +/obj/machinery/computer/crew{ + icon_keyboard = "syndi_key" + }, +/turf/open/floor/plasteel/vault{ + dir = 8 + }, +/area/space) +"ejO" = ( +/obj/structure/table/reinforced, +/obj/item/weapon/folder/red, +/turf/open/floor/plasteel/vault{ + dir = 8 + }, +/area/space) +"ejP" = ( +/obj/machinery/computer/shuttle/syndicate, +/turf/open/floor/plasteel/vault{ + dir = 8 + }, +/area/space) +"ejQ" = ( +/obj/structure/table/reinforced, +/turf/open/floor/plasteel/vault{ + dir = 8 + }, +/area/space) +"ejR" = ( +/obj/machinery/computer/camera_advanced{ + icon_keyboard = "syndi_key" + }, +/turf/open/floor/plasteel/vault{ + dir = 8 + }, +/area/space) +"ejS" = ( +/obj/machinery/computer/secure_data{ + icon_keyboard = "syndi_key" + }, +/turf/open/floor/plasteel/vault{ + dir = 8 + }, +/area/space) +"ejT" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"ejU" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"ejV" = ( +/obj/structure/table/reinforced, +/obj/machinery/status_display{ + pixel_x = -32 + }, +/obj/item/weapon/clipboard, +/obj/item/toy/figure/syndie, +/obj/machinery/light{ + icon_state = "tube1"; + dir = 8 + }, +/turf/open/floor/plasteel/vault{ + dir = 8 + }, +/area/space) +"ejW" = ( +/obj/structure/chair/office/dark{ + dir = 8; + name = "tactical swivel chair" + }, +/turf/open/floor/plasteel/black, +/area/space) +"ejX" = ( +/turf/open/floor/plasteel/black, +/area/space) +"ejY" = ( +/obj/structure/chair/office/dark{ + dir = 1; + name = "tactical swivel chair" + }, +/obj/machinery/button/door{ + id = "syndieshutters"; + name = "Cockpit View Control"; + pixel_x = 32; + pixel_y = 32; + req_access_txt = "150" + }, +/turf/open/floor/plasteel/black, +/area/space) +"ejZ" = ( +/turf/open/floor/plasteel/black, +/area/space) +"eka" = ( +/obj/structure/chair/office/dark{ + dir = 4; + name = "tactical swivel chair" + }, +/turf/open/floor/plasteel/black, +/area/space) +"ekb" = ( +/obj/structure/table/reinforced, +/obj/machinery/ai_status_display{ + pixel_x = 32 + }, +/obj/item/weapon/storage/fancy/donut_box, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/vault{ + dir = 8 + }, +/area/space) +"ekc" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"ekd" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"eke" = ( +/turf/open/floor/plasteel/vault, +/area/space) +"ekf" = ( +/turf/open/floor/plasteel/vault, +/area/space) +"ekg" = ( +/turf/open/floor/plasteel/vault, +/area/space) +"ekh" = ( +/turf/open/floor/plasteel/vault, +/area/space) +"eki" = ( +/turf/open/floor/plasteel/vault, +/area/space) +"ekj" = ( +/turf/open/floor/plasteel/vault, +/area/space) +"ekk" = ( +/turf/open/floor/plasteel/vault, +/area/space) +"ekl" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"ekm" = ( +/turf/open/space, +/turf/closed/wall/mineral/plastitanium{ + icon_state = "diagonalWall3" + }, +/area/space) +"ekn" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"eko" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"ekp" = ( +/obj/machinery/status_display, +/turf/closed/wall/mineral/plastitanium, +/area/space) +"ekq" = ( +/obj/machinery/door/airlock/hatch{ + name = "Cockpit"; + req_access_txt = "150" + }, +/turf/open/floor/plasteel/vault{ + dir = 8 + }, +/area/space) +"ekr" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"eks" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"ekt" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"eku" = ( +/turf/open/space, +/turf/closed/wall/mineral/plastitanium{ + dir = 4; + icon_state = "diagonalWall3" + }, +/area/space) +"ekv" = ( +/turf/open/space, +/obj/machinery/porta_turret/syndicate{ + dir = 10 + }, +/turf/closed/wall/mineral/plastitanium{ + icon_state = "diagonalWall3" + }, +/area/space) +"ekw" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"ekx" = ( +/obj/structure/table/reinforced, +/obj/item/stack/cable_coil/white, +/obj/item/stack/cable_coil/white, +/obj/item/weapon/crowbar/red, +/turf/open/floor/plasteel/vault{ + dir = 5 + }, +/area/space) +"eky" = ( +/turf/open/floor/plasteel/vault{ + dir = 5 + }, +/area/space) +"ekz" = ( +/obj/structure/table/reinforced, +/obj/item/weapon/storage/box/handcuffs{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/weapon/storage/box/zipties, +/turf/open/floor/plasteel/vault{ + dir = 5 + }, +/area/space) +"ekA" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"ekB" = ( +/turf/open/space, +/obj/machinery/porta_turret/syndicate{ + dir = 6 + }, +/turf/closed/wall/mineral/plastitanium{ + dir = 4; + icon_state = "diagonalWall3" + }, +/area/space) +"ekC" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"ekD" = ( +/obj/structure/chair{ + dir = 4; + name = "tactical chair" + }, +/turf/open/floor/plasteel/vault{ + dir = 5 + }, +/area/space) +"ekE" = ( +/turf/open/floor/plasteel/black, +/area/space) +"ekF" = ( +/obj/structure/chair{ + dir = 8; + name = "tactical chair" + }, +/turf/open/floor/plasteel/vault{ + dir = 5 + }, +/area/space) +"ekG" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"ekH" = ( +/turf/open/space, +/obj/machinery/porta_turret/syndicate{ + dir = 9 + }, +/turf/closed/wall/mineral/plastitanium{ + dir = 8; + icon_state = "diagonalWall3" + }, +/area/space) +"ekI" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"ekJ" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"ekK" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"ekL" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"ekM" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"ekN" = ( +/obj/structure/chair{ + dir = 4; + name = "tactical chair" + }, +/obj/machinery/light{ + icon_state = "tube1"; + dir = 8 + }, +/turf/open/floor/plasteel/vault{ + dir = 5 + }, +/area/space) +"ekO" = ( +/turf/open/floor/plasteel/black, +/area/space) +"ekP" = ( +/obj/structure/chair{ + dir = 8; + name = "tactical chair" + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/vault{ + dir = 5 + }, +/area/space) +"ekQ" = ( +/obj/machinery/porta_turret/syndicate{ + dir = 4 + }, +/turf/closed/wall/mineral/plastitanium, +/area/space) +"ekR" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"ekS" = ( +/obj/machinery/suit_storage_unit/syndicate, +/turf/open/floor/plasteel/podhatch{ + dir = 5 + }, +/area/space) +"ekT" = ( +/turf/open/floor/plasteel/vault{ + dir = 5 + }, +/area/space) +"ekU" = ( +/turf/open/floor/plasteel/vault{ + dir = 5 + }, +/area/space) +"ekV" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/open/floor/plasteel/vault{ + dir = 8 + }, +/area/space) +"ekW" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"ekX" = ( +/obj/structure/chair{ + dir = 4; + name = "tactical chair" + }, +/turf/open/floor/plasteel/vault{ + dir = 5 + }, +/area/space) +"ekY" = ( +/turf/open/floor/plasteel/black, +/area/space) +"ekZ" = ( +/obj/structure/chair{ + dir = 8; + name = "tactical chair" + }, +/turf/open/floor/plasteel/vault{ + dir = 5 + }, +/area/space) +"ela" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"elb" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"elc" = ( +/obj/machinery/suit_storage_unit/syndicate, +/turf/open/floor/plasteel/podhatch{ + icon_state = "podhatch"; + dir = 4 + }, +/area/space) +"eld" = ( +/turf/open/floor/plasteel/vault{ + dir = 5 + }, +/area/space) +"ele" = ( +/turf/open/floor/plasteel/vault{ + dir = 5 + }, +/area/space) +"elf" = ( +/obj/structure/tank_dispenser/oxygen, +/turf/open/floor/plasteel/vault{ + dir = 8 + }, +/area/space) +"elg" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"elh" = ( +/obj/structure/chair{ + dir = 4; + name = "tactical chair" + }, +/turf/open/floor/plasteel/vault{ + dir = 5 + }, +/area/space) +"eli" = ( +/turf/open/floor/plasteel/vault{ + dir = 5 + }, +/area/space) +"elj" = ( +/obj/structure/chair{ + dir = 8; + name = "tactical chair" + }, +/turf/open/floor/plasteel/vault{ + dir = 5 + }, +/area/space) +"elk" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"ell" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"elm" = ( +/obj/machinery/door/poddoor{ + id = "smindicate"; + name = "outer blast door" + }, +/obj/machinery/button/door{ + id = "smindicate"; + name = "external door control"; + pixel_x = -26; + req_access_txt = "150" + }, +/obj/docking_port/mobile{ + dheight = 9; + dir = 2; + dwidth = 5; + height = 24; + id = "syndicate"; + name = "syndicate infiltrator"; + port_angle = 0; + roundstart_move = "syndicate_away"; + width = 18 + }, +/obj/docking_port/stationary{ + dheight = 9; + dir = 2; + dwidth = 5; + height = 24; + id = "syndicate_nw"; + name = "northwest of station"; + turf_type = /turf/open/space; + width = 18 + }, +/obj/structure/fans/tiny, +/turf/open/floor/plasteel/podhatch{ + icon_state = "podhatch"; + dir = 1 + }, +/area/space) +"eln" = ( +/obj/structure/sign/securearea{ + desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; + icon_state = "space"; + layer = 4; + name = "EXTERNAL AIRLOCK" + }, +/turf/closed/wall/mineral/plastitanium, +/area/space) +"elo" = ( +/turf/open/space, +/obj/machinery/porta_turret/syndicate{ + dir = 5 + }, +/turf/closed/wall/mineral/plastitanium{ + dir = 1; + icon_state = "diagonalWall3" + }, +/area/space) +"elp" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"elq" = ( +/obj/machinery/suit_storage_unit/syndicate, +/turf/open/floor/plasteel/podhatch{ + icon_state = "podhatch"; + dir = 4 + }, +/area/space) +"elr" = ( +/turf/open/floor/plasteel/vault{ + dir = 5 + }, +/area/space) +"els" = ( +/turf/open/floor/plasteel/vault{ + dir = 5 + }, +/area/space) +"elt" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/vault{ + dir = 8 + }, +/area/space) +"elu" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"elv" = ( +/obj/machinery/door/airlock/external{ + name = "Ready Room"; + req_access_txt = "150" + }, +/turf/open/floor/plasteel/vault{ + dir = 8 + }, +/area/space) +"elw" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"elx" = ( +/obj/item/weapon/storage/toolbox/syndicate, +/obj/item/weapon/crowbar/red, +/obj/structure/table/reinforced, +/obj/machinery/light{ + icon_state = "tube1"; + dir = 8 + }, +/turf/open/floor/plasteel/podhatch{ + dir = 10 + }, +/area/space) +"ely" = ( +/turf/open/floor/plasteel/podhatch, +/area/space) +"elz" = ( +/obj/structure/chair{ + name = "tactical chair" + }, +/turf/open/floor/plasteel/podhatch{ + icon_state = "podhatch"; + dir = 6 + }, +/area/space) +"elA" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"elB" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"elC" = ( +/obj/machinery/suit_storage_unit/syndicate, +/turf/open/floor/plasteel/podhatch{ + icon_state = "podhatch"; + dir = 4 + }, +/area/space) +"elD" = ( +/turf/open/floor/plasteel/vault{ + dir = 5 + }, +/area/space) +"elE" = ( +/turf/open/floor/plasteel/vault{ + dir = 5 + }, +/area/space) +"elF" = ( +/turf/open/floor/plasteel/vault{ + dir = 8 + }, +/area/space) +"elG" = ( +/obj/machinery/door/airlock/external{ + name = "E.V.A. Gear Storage"; + req_access_txt = "150" + }, +/turf/open/floor/plasteel/vault{ + dir = 8 + }, +/area/space) +"elH" = ( +/turf/open/floor/plasteel/vault{ + dir = 5 + }, +/area/space) +"elI" = ( +/turf/open/floor/plasteel/vault{ + dir = 5 + }, +/area/space) +"elJ" = ( +/turf/open/floor/plasteel/vault{ + dir = 5 + }, +/area/space) +"elK" = ( +/obj/machinery/door/airlock/external{ + req_access_txt = "150" + }, +/turf/open/floor/mineral/plastitanium, +/area/space) +"elL" = ( +/turf/open/floor/plasteel/vault{ + dir = 5 + }, +/area/space) +"elM" = ( +/turf/open/floor/plasteel/vault{ + dir = 5 + }, +/area/space) +"elN" = ( +/turf/open/floor/plasteel/vault{ + dir = 5 + }, +/area/space) +"elO" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"elP" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"elQ" = ( +/obj/machinery/suit_storage_unit/syndicate, +/turf/open/floor/plasteel/podhatch{ + icon_state = "podhatch"; + dir = 6 + }, +/area/space) +"elR" = ( +/turf/open/floor/plasteel/vault{ + dir = 5 + }, +/area/space) +"elS" = ( +/turf/open/floor/plasteel/vault{ + dir = 5 + }, +/area/space) +"elT" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plasteel/vault{ + dir = 8 + }, +/area/space) +"elU" = ( +/turf/open/floor/plasteel/vault{ + dir = 5 + }, +/area/space) +"elV" = ( +/turf/open/floor/plasteel/black, +/area/space) +"elW" = ( +/turf/open/floor/plasteel/vault{ + dir = 5 + }, +/area/space) +"elX" = ( +/obj/structure/chair{ + dir = 1; + name = "tactical chair" + }, +/turf/open/floor/plasteel/vault{ + dir = 8 + }, +/area/space) +"elY" = ( +/obj/structure/chair{ + dir = 1; + name = "tactical chair" + }, +/turf/open/floor/plasteel/vault{ + dir = 8 + }, +/area/space) +"elZ" = ( +/obj/structure/rack, +/obj/item/clothing/suit/space/syndicate/black/red, +/obj/item/clothing/head/helmet/space/syndicate/black/red, +/turf/open/floor/plasteel/vault{ + dir = 8 + }, +/area/space) +"ema" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"emb" = ( +/turf/open/space, +/turf/closed/wall/mineral/plastitanium{ + dir = 1; + icon_state = "diagonalWall3" + }, +/area/space) +"emc" = ( +/turf/open/space, +/obj/machinery/porta_turret/syndicate{ + dir = 9 + }, +/turf/closed/wall/mineral/plastitanium{ + dir = 8; + icon_state = "diagonalWall3" + }, +/area/space) +"emd" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"eme" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"emf" = ( +/obj/machinery/ai_status_display, +/turf/closed/wall/mineral/plastitanium, +/area/space) +"emg" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"emh" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"emi" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"emj" = ( +/turf/open/floor/plasteel/vault{ + dir = 5 + }, +/area/space) +"emk" = ( +/turf/open/floor/plasteel/black, +/area/space) +"eml" = ( +/turf/open/floor/plasteel/vault{ + dir = 5 + }, +/area/space) +"emm" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"emn" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"emo" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"emp" = ( +/obj/machinery/status_display, +/turf/closed/wall/mineral/plastitanium, +/area/space) +"emq" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"emr" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"ems" = ( +/turf/open/space, +/obj/machinery/porta_turret/syndicate{ + dir = 5 + }, +/turf/closed/wall/mineral/plastitanium{ + dir = 1; + icon_state = "diagonalWall3" + }, +/area/space) +"emt" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"emu" = ( +/obj/machinery/sleeper/syndie{ + dir = 4 + }, +/turf/open/floor/plasteel/vault{ + dir = 8 + }, +/area/space) +"emv" = ( +/turf/open/floor/plasteel/vault{ + dir = 8 + }, +/area/space) +"emw" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/vault{ + dir = 8 + }, +/area/space) +"emx" = ( +/obj/item/weapon/reagent_containers/glass/bottle/epinephrine{ + pixel_x = 6 + }, +/obj/item/weapon/reagent_containers/glass/bottle/charcoal{ + pixel_x = -3 + }, +/obj/item/weapon/reagent_containers/glass/bottle/epinephrine{ + pixel_x = -3; + pixel_y = 8 + }, +/obj/item/weapon/reagent_containers/glass/bottle/charcoal{ + pixel_x = 6; + pixel_y = 8 + }, +/obj/item/weapon/reagent_containers/syringe/epinephrine{ + pixel_x = 3; + pixel_y = -2 + }, +/obj/item/weapon/reagent_containers/syringe/epinephrine{ + pixel_x = 4; + pixel_y = 1 + }, +/obj/item/weapon/reagent_containers/syringe/epinephrine{ + pixel_x = -2; + pixel_y = 5 + }, +/obj/item/weapon/reagent_containers/syringe/epinephrine{ + pixel_x = 2; + pixel_y = 8 + }, +/obj/structure/table/reinforced, +/turf/open/floor/plasteel/vault{ + dir = 8 + }, +/area/space) +"emy" = ( +/obj/structure/table/reinforced, +/obj/item/stack/medical/gauze, +/obj/item/stack/medical/bruise_pack, +/obj/item/stack/medical/ointment, +/turf/open/floor/plasteel/vault{ + dir = 8 + }, +/area/space) +"emz" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"emA" = ( +/turf/open/floor/plasteel/vault{ + dir = 5 + }, +/area/space) +"emB" = ( +/turf/open/floor/plasteel/black, +/area/space) +"emC" = ( +/turf/open/floor/plasteel/vault{ + dir = 5 + }, +/area/space) +"emD" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"emE" = ( +/obj/item/weapon/stock_parts/cell/high{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/weapon/stock_parts/cell/high, +/obj/structure/table/reinforced, +/turf/open/floor/plasteel/vault{ + dir = 8 + }, +/area/space) +"emF" = ( +/obj/item/weapon/screwdriver{ + pixel_y = 9 + }, +/obj/item/device/assembly/voice{ + pixel_y = 3 + }, +/obj/structure/table/reinforced, +/turf/open/floor/plasteel/vault{ + dir = 8 + }, +/area/space) +"emG" = ( +/obj/item/weapon/wrench, +/obj/item/device/assembly/infra, +/obj/structure/table/reinforced, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/vault{ + dir = 8 + }, +/area/space) +"emH" = ( +/obj/item/device/assembly/signaler, +/obj/item/device/assembly/signaler, +/obj/item/device/assembly/prox_sensor{ + pixel_x = -8; + pixel_y = 4 + }, +/obj/item/device/assembly/prox_sensor{ + pixel_x = -8; + pixel_y = 4 + }, +/obj/structure/table/reinforced, +/turf/open/floor/plasteel/vault{ + dir = 8 + }, +/area/space) +"emI" = ( +/obj/item/weapon/weldingtool/largetank{ + pixel_y = 3 + }, +/obj/item/device/multitool, +/obj/structure/table/reinforced, +/turf/open/floor/plasteel/vault{ + dir = 8 + }, +/area/space) +"emJ" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"emK" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"emL" = ( +/obj/structure/bed/roller, +/obj/machinery/iv_drip, +/turf/open/floor/plasteel/vault{ + dir = 8 + }, +/area/space) +"emM" = ( +/turf/open/floor/plasteel/vault, +/area/space) +"emN" = ( +/turf/open/floor/plasteel/vault, +/area/space) +"emO" = ( +/turf/open/floor/plasteel/vault, +/area/space) +"emP" = ( +/turf/open/floor/plasteel/vault, +/area/space) +"emQ" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"emR" = ( +/obj/machinery/light{ + icon_state = "tube1"; + dir = 8 + }, +/turf/open/floor/plasteel/vault{ + dir = 5 + }, +/area/space) +"emS" = ( +/turf/open/floor/plasteel/black, +/area/space) +"emT" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/vault{ + dir = 5 + }, +/area/space) +"emU" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"emV" = ( +/turf/open/floor/plasteel/vault, +/area/space) +"emW" = ( +/turf/open/floor/plasteel/vault, +/area/space) +"emX" = ( +/turf/open/floor/plasteel/vault, +/area/space) +"emY" = ( +/turf/open/floor/plasteel/vault, +/area/space) +"emZ" = ( +/turf/open/floor/plasteel/vault, +/area/space) +"ena" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"enb" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"enc" = ( +/obj/machinery/sleeper/syndie{ + dir = 4 + }, +/turf/open/floor/plasteel/vault{ + dir = 8 + }, +/area/space) +"end" = ( +/turf/open/floor/plasteel/vault{ + dir = 5 + }, +/area/space) +"ene" = ( +/turf/open/floor/plasteel/podhatch{ + dir = 9 + }, +/area/space) +"enf" = ( +/turf/open/floor/plasteel/podhatch{ + icon_state = "podhatch"; + dir = 1 + }, +/area/space) +"eng" = ( +/turf/open/floor/plasteel/podhatch{ + icon_state = "podhatch"; + dir = 1 + }, +/area/space) +"enh" = ( +/obj/machinery/door/airlock/hatch{ + req_access_txt = "150" + }, +/turf/open/floor/plasteel/vault{ + dir = 8 + }, +/area/space) +"eni" = ( +/turf/open/floor/plasteel/podhatch{ + icon_state = "podhatch"; + dir = 1 + }, +/area/space) +"enj" = ( +/turf/open/floor/plasteel/podhatch{ + icon_state = "podhatch"; + dir = 1 + }, +/area/space) +"enk" = ( +/turf/open/floor/plasteel/podhatch{ + icon_state = "podhatch"; + dir = 1 + }, +/area/space) +"enl" = ( +/obj/machinery/door/airlock/hatch{ + req_access_txt = "150" + }, +/turf/open/floor/plasteel/vault{ + dir = 8 + }, +/area/space) +"enm" = ( +/turf/open/floor/plasteel/podhatch{ + icon_state = "podhatch"; + dir = 1 + }, +/area/space) +"enn" = ( +/turf/open/floor/plasteel/podhatch{ + icon_state = "podhatch"; + dir = 1 + }, +/area/space) +"eno" = ( +/turf/open/floor/plasteel/podhatch{ + dir = 5 + }, +/area/space) +"enp" = ( +/turf/open/floor/plasteel/vault{ + dir = 5 + }, +/area/space) +"enq" = ( +/obj/structure/closet/syndicate/personal, +/turf/open/floor/plasteel/vault{ + dir = 8 + }, +/area/space) +"enr" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"ens" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"ent" = ( +/obj/structure/table/reinforced, +/obj/item/weapon/reagent_containers/glass/beaker/large, +/obj/item/weapon/reagent_containers/glass/beaker, +/obj/item/weapon/reagent_containers/dropper, +/turf/open/floor/plasteel/vault{ + dir = 8 + }, +/area/space) +"enu" = ( +/turf/open/floor/plasteel/vault{ + dir = 5 + }, +/area/space) +"env" = ( +/turf/open/floor/plasteel/podhatch{ + dir = 10 + }, +/area/space) +"enw" = ( +/turf/open/floor/plasteel/podhatch, +/area/space) +"enx" = ( +/turf/open/floor/plasteel/podhatch, +/area/space) +"eny" = ( +/turf/open/floor/plasteel/podhatch, +/area/space) +"enz" = ( +/turf/open/floor/plasteel/podhatch, +/area/space) +"enA" = ( +/turf/open/floor/plasteel/podhatch, +/area/space) +"enB" = ( +/turf/open/floor/plasteel/podhatch, +/area/space) +"enC" = ( +/turf/open/floor/plasteel/podhatch, +/area/space) +"enD" = ( +/turf/open/floor/plasteel/podhatch{ + icon_state = "podhatch"; + dir = 6 + }, +/area/space) +"enE" = ( +/turf/open/floor/plasteel/vault{ + dir = 5 + }, +/area/space) +"enF" = ( +/obj/structure/closet/syndicate/nuclear, +/turf/open/floor/plasteel/vault{ + dir = 8 + }, +/area/space) +"enG" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"enH" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"enI" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/item/bodypart/r_arm/robot, +/obj/item/bodypart/l_arm/robot, +/obj/structure/table/reinforced, +/turf/open/floor/plasteel/vault, +/area/space) +"enJ" = ( +/obj/machinery/door/window{ + dir = 1; + name = "Surgery"; + req_access_txt = "150" + }, +/turf/open/floor/plasteel/vault, +/area/space) +"enK" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/floor/plasteel/vault, +/area/space) +"enL" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/item/weapon/storage/firstaid/regular{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/weapon/storage/firstaid/brute, +/obj/item/weapon/storage/firstaid/regular{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/structure/table/reinforced, +/turf/open/floor/plasteel/vault, +/area/space) +"enM" = ( +/obj/item/weapon/storage/firstaid/regular{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/weapon/storage/firstaid/fire, +/obj/item/weapon/storage/firstaid/regular{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/structure/table/reinforced, +/turf/open/floor/plasteel/vault, +/area/space) +"enN" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"enO" = ( +/turf/open/floor/plasteel/vault, +/area/space) +"enP" = ( +/turf/open/floor/plasteel/vault, +/area/space) +"enQ" = ( +/turf/open/floor/plasteel/vault, +/area/space) +"enR" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"enS" = ( +/obj/item/device/sbeacondrop/bomb{ + pixel_y = 5 + }, +/obj/item/device/sbeacondrop/bomb, +/obj/structure/table/reinforced, +/turf/open/floor/plasteel/vault{ + dir = 8 + }, +/area/space) +"enT" = ( +/obj/item/weapon/grenade/syndieminibomb{ + pixel_x = 4; + pixel_y = 2 + }, +/obj/item/weapon/grenade/syndieminibomb{ + pixel_x = -1 + }, +/obj/structure/table/reinforced, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/item/weapon/grenade/plastic/c4, +/obj/item/weapon/grenade/plastic/c4, +/obj/item/weapon/grenade/plastic/c4, +/obj/item/weapon/grenade/plastic/c4, +/obj/item/weapon/grenade/plastic/c4, +/turf/open/floor/plasteel/vault{ + dir = 8 + }, +/area/space) +"enU" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/floor/plasteel/vault, +/area/space) +"enV" = ( +/obj/machinery/door/window{ + dir = 1; + name = "Technological Storage"; + req_access_txt = "150" + }, +/turf/open/floor/plasteel/vault, +/area/space) +"enW" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/item/device/aicard, +/turf/open/floor/plasteel/vault, +/area/space) +"enX" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"enY" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"enZ" = ( +/obj/item/weapon/surgicaldrill, +/obj/item/weapon/circular_saw, +/obj/structure/table/reinforced, +/obj/machinery/light{ + icon_state = "tube1"; + dir = 8 + }, +/turf/open/floor/plasteel/vault{ + dir = 8 + }, +/area/space) +"eoa" = ( +/turf/open/floor/plasteel/vault{ + dir = 5 + }, +/area/space) +"eob" = ( +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, +/obj/structure/mirror{ + pixel_x = 30 + }, +/turf/open/floor/plasteel/vault{ + dir = 5 + }, +/area/space) +"eoc" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"eod" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"eoe" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"eof" = ( +/obj/machinery/nuclearbomb/syndicate, +/obj/machinery/door/window{ + dir = 1; + name = "Theatre Stage"; + req_access_txt = "0" + }, +/turf/open/floor/circuit/red, +/area/space) +"eog" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"eoh" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"eoi" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"eoj" = ( +/turf/open/floor/plasteel/vault{ + dir = 5 + }, +/area/space) +"eok" = ( +/turf/open/floor/plasteel/vault{ + dir = 5 + }, +/area/space) +"eol" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/vault{ + dir = 5 + }, +/area/space) +"eom" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"eon" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"eoo" = ( +/obj/item/weapon/cautery, +/obj/item/weapon/scalpel, +/obj/structure/table/reinforced, +/turf/open/floor/plasteel/vault{ + dir = 8 + }, +/area/space) +"eop" = ( +/obj/structure/table/optable, +/obj/item/weapon/surgical_drapes, +/turf/open/floor/plasteel/vault{ + dir = 8 + }, +/area/space) +"eoq" = ( +/obj/item/weapon/retractor, +/obj/item/weapon/hemostat, +/obj/structure/table/reinforced, +/turf/open/floor/plasteel/vault{ + dir = 8 + }, +/area/space) +"eor" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"eos" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"eot" = ( +/obj/structure/shuttle/engine/heater, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/airless, +/area/space) +"eou" = ( +/obj/structure/shuttle/engine/heater, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/airless, +/area/space) +"eov" = ( +/obj/structure/shuttle/engine/heater, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/airless, +/area/space) +"eow" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"eox" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"eoy" = ( +/obj/machinery/recharge_station, +/turf/open/floor/circuit/red, +/area/space) +"eoz" = ( +/obj/machinery/telecomms/allinone{ + intercept = 1 + }, +/turf/open/floor/circuit/red, +/area/space) +"eoA" = ( +/obj/machinery/recharge_station, +/turf/open/floor/circuit/red, +/area/space) +"eoB" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"eoC" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"eoD" = ( +/obj/structure/shuttle/engine/heater, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/airless, +/area/space) +"eoE" = ( +/obj/structure/shuttle/engine/heater, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/airless, +/area/space) +"eoF" = ( +/obj/structure/shuttle/engine/heater, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/airless, +/area/space) +"eoG" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"eoH" = ( +/turf/open/space, +/turf/closed/wall/mineral/plastitanium{ + icon_state = "diagonalWall3" + }, +/area/space) +"eoI" = ( +/obj/structure/shuttle/engine/propulsion{ + icon_state = "propulsion_l" + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/airless, +/area/space) +"eoJ" = ( +/obj/structure/shuttle/engine/propulsion, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/airless, +/area/space) +"eoK" = ( +/obj/structure/shuttle/engine/propulsion{ + icon_state = "propulsion_r" + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/airless, +/area/space) +"eoL" = ( +/turf/open/space, +/turf/closed/wall/mineral/plastitanium{ + dir = 4; + icon_state = "diagonalWall3" + }, +/area/space) +"eoM" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"eoN" = ( +/obj/structure/shuttle/engine/heater, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/airless, +/area/space) +"eoO" = ( +/obj/structure/shuttle/engine/heater, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/airless, +/area/space) +"eoP" = ( +/obj/structure/shuttle/engine/heater, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/airless, +/area/space) +"eoQ" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"eoR" = ( +/turf/open/space, +/turf/closed/wall/mineral/plastitanium{ + icon_state = "diagonalWall3" + }, +/area/space) +"eoS" = ( +/obj/structure/shuttle/engine/propulsion{ + icon_state = "propulsion_l" + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/airless, +/area/space) +"eoT" = ( +/obj/structure/shuttle/engine/propulsion, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/airless, +/area/space) +"eoU" = ( +/obj/structure/shuttle/engine/propulsion{ + icon_state = "propulsion_r" + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/airless, +/area/space) +"eoV" = ( +/turf/open/space, +/obj/machinery/porta_turret/syndicate{ + dir = 6 + }, +/turf/closed/wall/mineral/plastitanium{ + dir = 4; + icon_state = "diagonalWall3" + }, +/area/space) +"eoW" = ( +/turf/open/space, +/obj/machinery/porta_turret/syndicate{ + dir = 10 + }, +/turf/closed/wall/mineral/plastitanium{ + icon_state = "diagonalWall3" + }, +/area/space) +"eoX" = ( +/obj/structure/shuttle/engine/propulsion{ + icon_state = "propulsion_l" + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/airless, +/area/space) +"eoY" = ( +/obj/structure/shuttle/engine/propulsion, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/airless, +/area/space) +"eoZ" = ( +/obj/structure/shuttle/engine/propulsion{ + icon_state = "propulsion_r" + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/airless, +/area/space) +"epa" = ( +/turf/open/space, +/turf/closed/wall/mineral/plastitanium{ + dir = 4; + icon_state = "diagonalWall3" + }, +/area/space) (1,1,1) = {" aaa @@ -108117,15 +109789,15 @@ aaa aaa aaa adm -adn -adn -adn -adn -adn -adn -adn -adn -aes +adm +adm +adm +adm +adm +adm +adm +adm +adm aaa aaa aaa @@ -108368,21 +110040,21 @@ aaa aaa aaa adm -adn -adn -adn -adn -adn -adn -aiN -ajI -aiN -alK -amN -anW -aoz -aoC -apA +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm aaa aaa aaa @@ -108624,22 +110296,22 @@ aaa aaa aaa aaa -adn -afv -afK -afK -afK -aho -adn -agG -aeh -aeG -aeG -amO -aeG -aoA -aoC -apB +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm aaa aaa aaa @@ -108881,22 +110553,22 @@ aaa aaa aaa aaa -adn -aeG -aeG -aeG -aeG -aeG -aia -ehe -aeh -akK -alL -amP -anX -aoB -aoC -apC +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm aaa aaa aaa @@ -109132,28 +110804,28 @@ aaa aaa aaa adm -adn -adn -adn -aes +adm +adm +adm +adm aaa aaa -adn -aeG -aeG -aeG -aeG -aeG -adn -aiO -aeh -akL -age -amQ -adn -adn -adn -aeI +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm aaa aaa aaa @@ -109388,26 +111060,26 @@ aaa aaa aaa aaa -adn -adA -adT -aeh -adn -aeE +adm +adm +adm +adm +adm +adm aaa -adn -afw -afL -ehd -agG -ahp -adn -aiP -aeh -akL -age -amR -adn +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm aaa aaa aaa @@ -109645,28 +111317,28 @@ aaa aaa aaa aaa -ado -adB -adU -aeh -adn -adn -adn -adn -adn -adn -adn -agH -agb -adn -adn -adn -akM -agb -adn -adn -adn -aes +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm aaa aaa aaa @@ -109902,28 +111574,28 @@ aaa aaa aaa aaa -ado -adC -adV -aeh -aet -aeF -aeT -ehb -aeT -aeT -agb -aeG -aeG -aeG -aeG -ehf -akL -age -aeh -agb -aoC -apA +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm aaa aaa aaa @@ -110159,28 +111831,28 @@ aaa aaa aaa aaa -ado -adD -adW -aeh -aeu -aeG -adV -adV -adV -aeG -agc -aeG -adV -adV -adV -adV -akL -age -aeh -anY -aoC -apB +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm aaa aaa aaa @@ -110416,28 +112088,28 @@ aaa aaa aaa aaa -ado -adE -adV -aeh -adn -aeH -aeU -ehc -aeU -aeU -agb -aeG -aeG -aeG -aeG -ehg -akL -age -aeh -agb -aoC -apC +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm aaa aaa aaa @@ -110673,28 +112345,28 @@ aaa aaa aaa aaa -ado -adF -adX -aeh -adn -adn -adn -afk -adn -adn -adn -agI -agb -adn -adn -adn -akM -agb -adn -adn -adn -aev +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm aaa aaa aaa @@ -110930,26 +112602,26 @@ aaa aaa aaa aaa -adn -adG -adY -aeh -adn -aeI +adm +adm +adm +adm +adm +adm aaa aaa aaa -adn -agd -aeG -ahq -adn -aiQ -aeh -akL -age -amS -adn +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm aaa aaa aaa @@ -111187,29 +112859,29 @@ aaa aaa aaa aaa -adp -adn -adn -adn -aev +adm +adm +adm +adm +adm aaa aaa aaa aaa -afM -age -aeG -ahq -adn -aiR -aeh -akL -age -amT -adn -adn -adn -aeE +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm aaa aaa aaa @@ -111453,20 +113125,20 @@ aaa aaa aaa aaa -afN -agf -aeG -ahr -aet -aiS -aeh -akN -alM -amP -aeG -aoE -aoC -apA +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm aaa aaa aaa @@ -111710,20 +113382,20 @@ aaa aaa aaa aaa -adp -adn -adn -adn -adn -aiT -aeh -aeG -aeG -amU -aeG -aoF -aoC -apB +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm aaa aaa aaa @@ -111970,17 +113642,17 @@ aaa aaa aaa aaa -ahs -adn -aiU -aeh -akO -alN -amV -ehg -aoE -aoC -apC +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm aaa aaa aaa @@ -112228,16 +113900,16 @@ aaa aaa aaa aaa -adp -adn -adn -adn -adn -adn -adn -adn -adn -aev +adm +adm +adm +adm +adm +adm +adm +adm +adm +adm aaa aaa aaa @@ -114552,16 +116224,16 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +emc +emt +emK +enb +ens +enH +enY +eon +eoC +eoR aaa aaa aaa @@ -114803,22 +116475,22 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +ekH +ekR +elb +elp +elB +elP +emd +emu +emL +enc +ent +enI +enZ +eoo +eoD +eoS aaa aaa aaa @@ -115060,22 +116732,22 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +ekI +ekS +elc +elq +elC +elQ +eme +emv +emM +end +enu +enJ +eoa +eop +eoE +eoT aaa aaa aaa @@ -115317,22 +116989,22 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +ekJ +ekT +eld +elr +elD +elR +emf +emw +emN +ene +env +enK +eob +eoq +eoF +eoU aaa aaa aaa @@ -115567,29 +117239,29 @@ aaa aaa aaa aaa +ejC +ejL +ejU +ekd +ekm aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +ekK +ekU +ele +els +elE +elS +emg +emx +emO +enf +enw +enL +eoc +eor +eoG +eoV aaa aaa aaa @@ -115824,26 +117496,26 @@ aaa aaa aaa aaa +ejD +ejM +ejV +eke +ekn +ekv aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +ekL +ekV +elf +elt +elF +elT +emh +emy +emP +eng +enx +enM +eod aaa aaa aaa @@ -116081,28 +117753,28 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +ejE +ejN +ejW +ekf +eko +ekw +ekC +ekM +ekW +elg +elu +elG +brL +emi +emz +emQ +enh +brL +enN +eoe +eos +eoH aaa aaa aaa @@ -116338,28 +118010,28 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +ejF +ejO +ejX +ekg +ekp +ekx +ekD +ekN +ekX +elh +brL +elH +elU +emj +emA +emR +eni +eny +enO +brL +eot +eoI aaa aaa aaa @@ -116595,28 +118267,28 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +ejG +ejP +ejY +ekh +ekq +eky +ekE +ekO +ekY +eli +elv +elI +elV +emk +emB +emS +enj +enz +enP +eof +eou +eoJ aaa aaa aaa @@ -116852,28 +118524,28 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +ejH +ejQ +ejZ +eki +ekr +ekz +ekF +ekP +ekZ +elj +brL +elJ +elW +eml +emC +emT +enk +enA +enQ +brL +eov +eoK aaa aaa aaa @@ -117109,28 +118781,28 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +ejI +ejR +eka +ekj +eks +ekA +ekG +ekQ +ela +elk +elw +elK +brL +emm +emD +emU +enl +brL +enR +eog +eow +eoL aaa aaa aaa @@ -117366,26 +119038,26 @@ aaa aaa aaa aaa +ejJ +ejS +ekb +ekk +ekt +ekB aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +ell +elx +elL +elX +emn +emE +emV +enm +enB +enS +eoh aaa aaa aaa @@ -117544,7 +119216,7 @@ aaa aaa aaa aaa -eaT +aaa aaa aaa aaa @@ -117623,29 +119295,29 @@ aaa aaa aaa aaa +ejK +ejT +ekc +ekl +eku aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +elm +ely +elM +elY +emo +emF +emW +enn +enC +enT +eoi +eox +eoM +eoW aaa aaa aaa @@ -117889,20 +119561,20 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +eln +elz +elN +elZ +emp +emG +emX +eno +enD +enU +eoj +eoy +eoN +eoX aaa aaa aaa @@ -118146,20 +119818,20 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +elo +elA +elO +ema +emq +emH +emY +enp +enE +enV +eok +eoz +eoO +eoY aaa aaa aaa @@ -118406,17 +120078,17 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +emb +emr +emI +emZ +enq +enF +enW +eol +eoA +eoP +eoZ aaa aaa aaa @@ -118664,16 +120336,16 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +ems +emJ +ena +enr +enG +enX +eom +eoB +eoQ +epa aaa aaa aaa @@ -121144,7 +122816,7 @@ aaa aaa aaa aaa -aaa +eaT aaa aaa aaa @@ -140171,18 +141843,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa eaY aaa aaa @@ -140197,6 +141857,18 @@ aaa aaa aaa aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa "} (136,1,1) = {" aaa @@ -157433,7 +159105,7 @@ aaa aaa aaa aaa -aab +aaa aaa aaa aaa @@ -159513,7 +161185,7 @@ aaa aaa aaa aaa -aaa +aab aaa aaa aaa @@ -162001,7 +163673,7 @@ aaa aaa aaa aaa -aaa +eaU aaa aaa aaa @@ -164061,7 +165733,7 @@ aaa aaa aaa aaa -eaU +aaa aaa aaa aaa diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 9290c25c950..77d983a2293 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -22375,13 +22375,12 @@ /turf/open/floor/plasteel, /area/engine/engineering) "aQd" = ( -/obj/machinery/atmospherics/components/trinary/filter/flipped{ - dir = 1; - on = 1 - }, /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ + dir = 1 + }, /turf/open/floor/engine, /area/engine/engineering) "aQe" = ( @@ -85834,13 +85833,12 @@ /turf/closed/wall/r_wall, /area/engine/supermatter) "deI" = ( -/obj/machinery/atmospherics/components/trinary/filter{ - dir = 1; - on = 1 - }, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/machinery/atmospherics/components/trinary/filter/critical{ + dir = 1 + }, /turf/open/floor/engine, /area/engine/engineering) "deJ" = ( @@ -85898,14 +85896,13 @@ /turf/open/floor/plating, /area/engine/supermatter) "deT" = ( -/obj/machinery/atmospherics/components/trinary/filter{ - dir = 1; - filter_type = "plasma"; - on = 1 - }, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/machinery/atmospherics/components/trinary/filter/critical{ + dir = 1; + filter_type = "plasma" + }, /turf/open/floor/engine, /area/engine/engineering) "deU" = ( @@ -85974,14 +85971,13 @@ /turf/closed/wall/r_wall, /area/engine/supermatter) "dfd" = ( -/obj/machinery/atmospherics/components/trinary/filter{ - dir = 1; - filter_type = "o2"; - on = 1 - }, /obj/effect/turf_decal/stripes/line{ dir = 9 }, +/obj/machinery/atmospherics/components/trinary/filter/critical{ + dir = 1; + filter_type = "o2" + }, /turf/open/floor/engine, /area/engine/engineering) "dfe" = ( @@ -86073,14 +86069,13 @@ /turf/open/floor/engine, /area/engine/supermatter) "dft" = ( -/obj/machinery/atmospherics/components/trinary/filter{ - dir = 1; - filter_type = "co2"; - on = 1 - }, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/machinery/atmospherics/components/trinary/filter/critical{ + dir = 1; + filter_type = "co2" + }, /turf/open/floor/engine, /area/engine/engineering) "dfu" = ( diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm index f732a4dc79f..ee84d73b87e 100644 --- a/_maps/map_files/OmegaStation/OmegaStation.dmm +++ b/_maps/map_files/OmegaStation/OmegaStation.dmm @@ -21142,10 +21142,10 @@ tag = "" }, /obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/trinary/filter/flipped{ - tag = "icon-filter_off_f (EAST)"; +/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ + dir = 4; icon_state = "filter_off_f"; - dir = 4 + tag = "icon-filter_off_f (EAST)" }, /turf/open/floor/plasteel, /area/engine/engineering) @@ -26390,7 +26390,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/atmospherics/components/trinary/filter{ +/obj/machinery/atmospherics/components/trinary/filter/critical{ dir = 4 }, /turf/open/floor/plasteel, diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm index 2e7eeb4a514..95b54cab7f6 100644 --- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm +++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm @@ -48285,10 +48285,6 @@ /obj/structure/window/reinforced{ dir = 1 }, -/obj/machinery/atmospherics/components/unary/vent_pump{ - dir = 4; - on = 1 - }, /obj/structure/cable{ d1 = 4; d2 = 8; @@ -61028,8 +61024,7 @@ /area/space/nearstation) "cDv" = ( /obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/trinary/filter/flipped{ - icon_state = "filter_off_f"; +/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ dir = 4 }, /turf/open/floor/engine, @@ -62039,14 +62034,13 @@ /turf/open/floor/engine, /area/engine/engineering) "cFL" = ( -/obj/machinery/atmospherics/components/trinary/filter{ - dir = 4; - filter_type = "co2"; - on = 1 - }, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/atmospherics/components/trinary/filter/critical{ + dir = 4; + filter_type = "co2" + }, /turf/open/floor/engine, /area/engine/engineering) "cFM" = ( @@ -62062,14 +62056,13 @@ /turf/open/floor/engine, /area/engine/engineering) "cFN" = ( -/obj/machinery/atmospherics/components/trinary/filter{ - dir = 4; - filter_type = "o2"; - on = 1 - }, /obj/effect/turf_decal/stripes/line{ dir = 5 }, +/obj/machinery/atmospherics/components/trinary/filter/critical{ + dir = 4; + filter_type = "o2" + }, /turf/open/floor/engine, /area/engine/engineering) "cFO" = ( @@ -62089,14 +62082,13 @@ /turf/open/floor/plasteel/black, /area/engine/engineering) "cFP" = ( -/obj/machinery/atmospherics/components/trinary/filter{ - dir = 4; - filter_type = "plasma"; - on = 1 - }, /obj/effect/turf_decal/stripes/line{ dir = 9 }, +/obj/machinery/atmospherics/components/trinary/filter/critical{ + dir = 4; + filter_type = "plasma" + }, /turf/open/floor/engine, /area/engine/engineering) "cFQ" = ( @@ -62112,14 +62104,12 @@ /turf/open/floor/engine, /area/engine/engineering) "cFR" = ( -/obj/machinery/atmospherics/components/trinary/filter{ - dir = 4; - filter_type = ""; - on = 1 - }, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/atmospherics/components/trinary/filter/critical{ + dir = 4 + }, /turf/open/floor/engine, /area/engine/engineering) "cFS" = ( diff --git a/_maps/map_files/generic/Centcomm.dmm b/_maps/map_files/generic/Centcomm.dmm index d7df57e8eec..d315b451496 100644 --- a/_maps/map_files/generic/Centcomm.dmm +++ b/_maps/map_files/generic/Centcomm.dmm @@ -72008,14 +72008,14 @@ fj fy fC fN -fO -fO -fO -fO -fO -fO -fO -fO +ab +ab +ab +ab +ab +ab +ab +ab aa aa aa @@ -72265,14 +72265,14 @@ fi fv fC fN -fO +ab fR fR fR fR fR fR -fO +ab aa aa aa @@ -72522,16 +72522,16 @@ ag ag ag ab -fO +ab fS fS fS fS fS fS -fO -fO -fO +ab +ab +ab aa aa aa @@ -72779,7 +72779,7 @@ fk dZ fD fN -fO +ab ab ab ab @@ -72788,7 +72788,7 @@ ab ab fZ ga -fO +ab aa aa aa @@ -73036,7 +73036,7 @@ fk dZ fD fN -fO +ab ab ab ab @@ -73045,7 +73045,7 @@ ab ab fZ ga -fO +ab aa aa aa @@ -73293,7 +73293,7 @@ fl dZ fD fN -fO +ab ab ab ab @@ -73302,7 +73302,7 @@ ab ab fZ ga -fO +ab aa aa aa @@ -73550,7 +73550,7 @@ fk dZ fD fN -fO +ab ab ab ab @@ -73559,7 +73559,7 @@ ab ab fZ ga -fO +ab aa aa aa @@ -73807,7 +73807,7 @@ fk dZ fD fN -fO +ab ab ab ab @@ -73816,7 +73816,7 @@ ab ab fZ ga -fO +ab aa aa aa @@ -74064,16 +74064,16 @@ ag ag ag ab -fO +ab fT fT fT fT fT fT -fO -fO -fO +ab +ab +ab aa aa aa @@ -78176,16 +78176,16 @@ fr em fI fN -fO +ab fT fT fT fT fT fT -fO -fO -fO +ab +ab +ab aa aa aa @@ -78433,7 +78433,7 @@ en en fJ fN -fO +ab ab ab ab @@ -78442,7 +78442,7 @@ ab ab fZ gb -fO +ab aa aa aa @@ -78690,7 +78690,7 @@ ag ag ag ab -fO +ab ab ab ab @@ -78699,7 +78699,7 @@ ab ab fZ gb -fO +ab aa aa aa @@ -78947,7 +78947,7 @@ dP dP dP fN -fO +ab ab ab ab @@ -78956,7 +78956,7 @@ ab ab fZ gb -fO +ab aa aa aa @@ -79204,7 +79204,7 @@ fs fB fK fN -fO +ab ab ab ab @@ -79213,7 +79213,7 @@ ab ab fZ gb -fO +ab aa aa aa @@ -79461,7 +79461,7 @@ ft fB fL fN -fO +ab ab ab ab @@ -79470,7 +79470,7 @@ ab ab fZ gb -fO +ab aa aa aa @@ -79718,16 +79718,16 @@ fu fB fM fN -fO +ab fS fS fS fS fS fS -fO -fO -fO +ab +ab +ab aa aa aa @@ -79975,14 +79975,14 @@ dT dT dT fN -fO +ab fW fW fW fW fW fW -fO +ab aa aa aa @@ -80232,14 +80232,14 @@ ag ag ag ab -fO -fO -fO -fO -fO -fO -fO -fO +ab +ab +ab +ab +ab +ab +ab +ab aa aa aa diff --git a/code/__DEFINES/antagonists.dm b/code/__DEFINES/antagonists.dm index 165690571f1..98420bc4294 100644 --- a/code/__DEFINES/antagonists.dm +++ b/code/__DEFINES/antagonists.dm @@ -6,3 +6,15 @@ #define ANTAG_DATUM_NINJA /datum/antagonist/ninja #define ANTAG_DATUM_NINJA_FRIENDLY /datum/antagonist/ninja/friendly #define ANTAG_DATUM_NINJA_RANDOM /datum/antagonist/ninja/randomAllegiance/ +#define ANTAG_DATUM_TRAITOR /datum/antagonist/traitor +#define ANTAG_DATUM_TRAITOR_CUSTOM /datum/antagonist/traitor/custom +#define ANTAG_DATUM_TRAITOR_HUMAN /datum/antagonist/traitor/human +#define ANTAG_DATUM_TRAITOR_HUMAN_CUSTOM /datum/antagonist/traitor/human/custom +#define ANTAG_DATUM_TRAITOR_AI /datum/antagonist/traitor/AI +#define ANTAG_DATUM_TRAITOR_AI_CUSTOM /datum/antagonist/traitor/AI/custom +#define ANTAG_DATUM_IAA /datum/antagonist/traitor/internal_affairs +#define ANTAG_DATUM_IAA_CUSTOM /datum/antagonist/traitor/internal_affairs/custom +#define ANTAG_DATUM_IAA_HUMAN /datum/antagonist/traitor/human/internal_affairs +#define ANTAG_DATUM_IAA_HUMAN_CUSTOM /datum/antagonist/traitor/human/internal_affairs/custom +#define ANTAG_DATUM_IAA_AI_CUSTOM /datum/antagonist/traitor/AI/internal_affairs/custom +#define ANTAG_DATUM_IAA_AI /datum/antagonist/traitor/AI/internal_affairs diff --git a/code/__DEFINES/clockcult.dm b/code/__DEFINES/clockcult.dm index acc0cdc9ab4..5ea3bc7a70f 100644 --- a/code/__DEFINES/clockcult.dm +++ b/code/__DEFINES/clockcult.dm @@ -8,12 +8,10 @@ GLOBAL_VAR_INIT(clockwork_construction_value, 0) //The total value of all structures built by the clockwork cult GLOBAL_VAR_INIT(clockwork_caches, 0) //How many clockwork caches exist in the world (not each individual) GLOBAL_VAR_INIT(clockwork_daemons, 0) //How many daemons exist in the world -GLOBAL_LIST_INIT(clockwork_generals_invoked, list("nezbere" = FALSE, "sevtug" = FALSE, "nzcrentr" = FALSE, "inath-neq" = FALSE)) //How many generals have been recently invoked GLOBAL_LIST_EMPTY(all_clockwork_objects) //All clockwork items, structures, and effects in existence GLOBAL_LIST_EMPTY(all_clockwork_mobs) //All clockwork SERVANTS (not creatures) in existence GLOBAL_LIST_INIT(clockwork_component_cache, list(BELLIGERENT_EYE = 0, VANGUARD_COGWHEEL = 0, GEIS_CAPACITOR = 0, REPLICANT_ALLOY = 0, HIEROPHANT_ANSIBLE = 0)) //The pool of components that caches draw from GLOBAL_VAR_INIT(ratvar_awakens, 0) //If Ratvar has been summoned; not a boolean, for proper handling of multiple Ratvars -GLOBAL_VAR_INIT(nezbere_invoked, 0) //If Nezbere has been invoked; not a boolean, for proper handling of multiple Nezberes GLOBAL_VAR_INIT(clockwork_gateway_activated, FALSE) //if a gateway to the celestial derelict has ever been successfully activated GLOBAL_LIST_EMPTY(all_scripture) //a list containing scripture instances; not used to track existing scripture @@ -27,10 +25,6 @@ GLOBAL_LIST_EMPTY(all_scripture) //a list containing scripture instances; not us #define APPLICATION_SERVANT_REQ 8 #define APPLICATION_CACHE_REQ 3 #define APPLICATION_CV_REQ 100 -#define SCRIPTURE_REVENANT "Revenant" -#define REVENANT_SERVANT_REQ 10 -#define REVENANT_CACHE_REQ 4 -#define REVENANT_CV_REQ 200 #define SCRIPTURE_JUDGEMENT "Judgement" #define JUDGEMENT_SERVANT_REQ 12 #define JUDGEMENT_CACHE_REQ 5 @@ -51,14 +45,10 @@ GLOBAL_LIST_EMPTY(all_scripture) //a list containing scripture instances; not us #define MAX_COMPONENTS_BEFORE_RAND (10*LOWER_PROB_PER_COMPONENT) //the number of each component, times LOWER_PROB_PER_COMPONENT, you need to have before component generation will become random -#define GLOBAL_CLOCKWORK_GENERAL_COOLDOWN 3000 //how long globally-affecting clockwork generals go on cooldown after use, defaults to 5 minutes - -#define CLOCKWORK_GENERAL_COOLDOWN 2000 //how long clockwork generals go on cooldown after use, defaults to 3 minutes 20 seconds - //clockcult power defines #define MIN_CLOCKCULT_POWER 25 //the minimum amount of power clockcult machines will handle gracefully -#define CLOCKCULT_POWER_UNIT (MIN_CLOCKCULT_POWER*100) //standard power amount for clockwork proselytizer costs +#define CLOCKCULT_POWER_UNIT (MIN_CLOCKCULT_POWER*100) //standard power amount for replica fabricator costs #define POWER_STANDARD (CLOCKCULT_POWER_UNIT*0.2) //how much power is in anything else; doesn't matter as much as the following @@ -76,7 +66,7 @@ GLOBAL_LIST_EMPTY(all_scripture) //a list containing scripture instances; not us #define POWER_PLASTEEL (CLOCKCULT_POWER_UNIT*0.05) //how much power is in one sheet of plasteel -#define RATVAR_POWER_CHECK "ratvar?" //when passed into can_use_power(), converts it into a check for if ratvar has woken/the proselytizer is debug +#define RATVAR_POWER_CHECK "ratvar?" //when passed into can_use_power(), converts it into a check for if ratvar has woken/the fabricator is debug //Ark defines #define GATEWAY_SUMMON_RATE 1 //the time amount the Gateway to the Celestial Derelict gets each process tick; defaults to 1 per tick @@ -99,7 +89,7 @@ GLOBAL_LIST_EMPTY(all_scripture) //a list containing scripture instances; not us #define SIGIL_ACCESS_RANGE 2 //range at which transmission sigils can access power -#define PROSELYTIZER_REPAIR_PER_TICK 4 //how much a proselytizer repairs each tick, and also how many deciseconds each tick is +#define FABRICATOR_REPAIR_PER_TICK 4 //how much a fabricator repairs each tick, and also how many deciseconds each tick is #define OCULAR_WARDEN_EXCLUSION_RANGE 3 //the range at which ocular wardens cannot be placed near other ocular wardens diff --git a/code/__DEFINES/construction.dm b/code/__DEFINES/construction.dm index d4b536ec2f1..46589408a2b 100644 --- a/code/__DEFINES/construction.dm +++ b/code/__DEFINES/construction.dm @@ -95,11 +95,13 @@ //tablecrafting defines #define CAT_NONE "" -#define CAT_WEAPON "Weaponry" +#define CAT_WEAPONRY "Weaponry" +#define CAT_WEAPON "Weapons" #define CAT_AMMO "Ammunition" #define CAT_ROBOT "Robots" #define CAT_MISC "Misc" #define CAT_PRIMAL "Tribal" +#define CAT_FOOD "Foods" #define CAT_BREAD "Breads" #define CAT_BURGER "Burgers" #define CAT_CAKE "Cakes" diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 7b835435795..82fe1ba1cf5 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -430,3 +430,6 @@ GLOBAL_LIST_INIT(ghost_others_options, list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE #define GANGSTER_SOLDIER_STARTING_INFLUENCE 5 #define GANGSTER_BOSS_STARTING_INFLUENCE 20 + +//for obj explosion block calculation +#define EXPLOSION_BLOCK_PROC -1 diff --git a/code/__DEFINES/server_tools.dm b/code/__DEFINES/server_tools.dm index f8d1c316d8d..744559f6c77 100644 --- a/code/__DEFINES/server_tools.dm +++ b/code/__DEFINES/server_tools.dm @@ -11,6 +11,7 @@ #define SERVICE_CMD_HARD_REBOOT "hard_reboot" #define SERVICE_CMD_GRACEFUL_SHUTDOWN "graceful_shutdown" #define SERVICE_CMD_WORLD_ANNOUNCE "world_announce" +#define SERVICE_CMD_IRC_CHECK "irc_check" #define SERVICE_CMD_IRC_STATUS "irc_status" #define SERVICE_CMD_ADMIN_MSG "adminmsg" #define SERVICE_CMD_NAME_CHECK "namecheck" diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index c8a1a7c6273..04fbf205319 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -49,3 +49,5 @@ #define STATUS_EFFECT_SIGILMARK /datum/status_effect/sigil_mark #define STATUS_EFFECT_CRUSHERDAMAGETRACKING /datum/status_effect/crusher_damage //tracks total kinetic crusher damage on a target + +#define STATUS_EFFECT_SYPHONMARK /datum/status_effect/syphon_mark //tracks kills for the KA death syphon module diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm index 42151510587..9847ab32e7d 100644 --- a/code/__HELPERS/_lists.dm +++ b/code/__HELPERS/_lists.dm @@ -131,9 +131,12 @@ return //Removes any null entries from the list +//Returns TRUE if the list had nulls, FALSE otherwise /proc/listclearnulls(list/L) - var/list/N = new(L.len) + var/start_len = L.len + var/list/N = new(start_len) L -= N + return L.len < start_len /* * Returns list containing all the entries from first list that are not present in second. diff --git a/code/__HELPERS/files.dm b/code/__HELPERS/files.dm index a76a9ac6236..c787f4415aa 100644 --- a/code/__HELPERS/files.dm +++ b/code/__HELPERS/files.dm @@ -3,7 +3,7 @@ for(var/file in args) src << browse_rsc(file) -/client/proc/browse_files(root="data/logs/", max_iterations=10, list/valid_extensions=list(".txt",".log",".htm", ".html")) +/client/proc/browse_files(root="data/logs/", max_iterations=10, list/valid_extensions=list("txt","log","htm", "html")) var/path = root for(var/i=0, iError: browse_files(): File not found/Invalid file([path]).") return diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index aed2dbc7875..7cf7370ae5b 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -506,7 +506,8 @@ return //First we spawn a dude. - var/mob/living/carbon/human/new_character = new(pick(GLOB.latejoin))//The mob being spawned. + var/mob/living/carbon/human/new_character = new//The mob being spawned. + SSjob.SendToLateJoin(new_character) G_found.client.prefs.copy_to(new_character) new_character.dna.update_dna_identity() diff --git a/code/_globalvars/lists/mapping.dm b/code/_globalvars/lists/mapping.dm index 5f0ba6d1d8c..5a851690fac 100644 --- a/code/_globalvars/lists/mapping.dm +++ b/code/_globalvars/lists/mapping.dm @@ -32,7 +32,6 @@ GLOBAL_LIST_EMPTY(generic_event_spawns) //list of all spawns for events GLOBAL_LIST_EMPTY(wizardstart) GLOBAL_LIST_EMPTY(newplayer_start) -GLOBAL_LIST_EMPTY(latejoin) GLOBAL_LIST_EMPTY(prisonwarp) //prisoners go to these GLOBAL_LIST_EMPTY(holdingfacility) //captured people go here GLOBAL_LIST_EMPTY(xeno_spawn)//Aliens spawn at these. diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index 680ae8703ee..3f0d6cab80d 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -32,4 +32,6 @@ GLOBAL_LIST_EMPTY(ladders) GLOBAL_LIST_EMPTY(trophy_cases) GLOBAL_LIST_EMPTY(wire_color_directory) -GLOBAL_LIST_EMPTY(wire_name_directory) \ No newline at end of file +GLOBAL_LIST_EMPTY(wire_name_directory) + +GLOBAL_LIST_EMPTY(ai_status_displays) diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index 195c04bd6f2..b2cc7b5c9c9 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -361,7 +361,6 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." name = "Next Tier Requirements" desc = "You shouldn't be seeing this description unless you're very fast. If you're very fast, good job!" icon_state = "no-servants-caches" - var/static/list/scripture_states = list(SCRIPTURE_DRIVER = TRUE, SCRIPTURE_SCRIPT = FALSE, SCRIPTURE_APPLICATION = FALSE, SCRIPTURE_REVENANT = FALSE, SCRIPTURE_JUDGEMENT = FALSE) /obj/screen/alert/clockwork/scripture_reqs/Initialize() . = ..() @@ -374,12 +373,11 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." /obj/screen/alert/clockwork/scripture_reqs/process() if(GLOB.clockwork_gateway_activated) - qdel(src) + mob_viewer.clear_alert("scripturereq") return var/current_state - scripture_states = scripture_unlock_check() - for(var/i in scripture_states) - if(!scripture_states[i]) + for(var/i in SSticker.scripture_states) + if(!SSticker.scripture_states[i]) current_state = i break icon_state = "no" @@ -411,10 +409,6 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." req_servants = APPLICATION_SERVANT_REQ req_caches = APPLICATION_CACHE_REQ req_cv = APPLICATION_CV_REQ - if(SCRIPTURE_REVENANT) - req_servants = REVENANT_SERVANT_REQ - req_caches = REVENANT_CACHE_REQ - req_cv = REVENANT_CV_REQ if(SCRIPTURE_JUDGEMENT) req_servants = JUDGEMENT_SERVANT_REQ req_caches = JUDGEMENT_CACHE_REQ @@ -459,7 +453,6 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." var/servants = 0 var/validservants = 0 var/unconverted_ais_exist = get_unconverted_ais() - var/list/scripture_states = scripture_unlock_check() var/list/textlist for(var/mob/living/L in GLOB.living_mob_list) if(is_servant_of_ratvar(L)) @@ -496,21 +489,9 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." textlist += "[unconverted_ais_exist] unconverted AIs exist!
" else textlist += "An unconverted AI exists!
" - if(scripture_states[SCRIPTURE_REVENANT]) - var/inathneq_available = GLOB.clockwork_generals_invoked["inath-neq"] <= world.time - var/sevtug_available = GLOB.clockwork_generals_invoked["sevtug"] <= world.time - var/nezbere_available = GLOB.clockwork_generals_invoked["nezbere"] <= world.time - var/nezcrentr_available = GLOB.clockwork_generals_invoked["nzcrentr"] <= world.time - if(inathneq_available || sevtug_available || nezbere_available || nezcrentr_available) - textlist += "Generals available:[inathneq_available ? "
INATH-NEQ":""][sevtug_available ? "
SEVTUG":""]\ - [nezbere_available ? "
NEZBERE":""][nezcrentr_available ? "
NZCRENTR":""]

" - else - textlist += "Generals available: NONE
" - else - textlist += "Generals available: NONE
" - for(var/i in scripture_states) + for(var/i in SSticker.scripture_states) if(i != SCRIPTURE_DRIVER) //ignore the always-unlocked stuff - textlist += "[i] Scripture: [scripture_states[i] ? "UNLOCKED":"LOCKED"]
" + textlist += "[i] Scripture: [SSticker.scripture_states[i] ? "UNLOCKED":"LOCKED"]
" desc = textlist.Join() ..() diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index c37e10b28c7..05d8dbb5b7e 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -11,6 +11,7 @@ SUBSYSTEM_DEF(job) var/initial_players_to_assign = 0 //used for checking against population caps var/list/prioritized_jobs = list() + var/list/latejoin_trackers = list() //Don't read this list, use GetLateJoinTurfs() instead /datum/controller/subsystem/job/Initialize(timeofday) if(!occupations.len) @@ -378,23 +379,12 @@ SUBSYSTEM_DEF(job) continue S = sloc break + if(S) + SendToAtom(H, S, buckle = FALSE) if(!S) //if there isn't a spawnpoint send them to latejoin, if there's no latejoin go yell at your mapper log_world("Couldn't find a round start spawn point for [rank]") - S = get_turf(pick(GLOB.latejoin)) - if(!S) //final attempt, lets find some area in the arrivals shuttle to spawn them in to. - log_world("Couldn't find a round start latejoin spawn point.") - for(var/turf/T in get_area_turfs(/area/shuttle/arrival)) - if(!T.density) - var/clear = 1 - for(var/obj/O in T) - if(O.density) - clear = 0 - break - if(clear) - S = T - continue - if(istype(S, /obj/effect/landmark) && isturf(S.loc)) - H.loc = S.loc + SendToLateJoin(H) + if(H.mind) H.mind.assigned_role = rank @@ -516,3 +506,45 @@ SUBSYSTEM_DEF(job) newjob.total_positions = J.total_positions newjob.spawn_positions = J.spawn_positions newjob.current_positions = J.current_positions + +/datum/controller/subsystem/job/proc/SendToAtom(mob/M, atom/A, buckle) + if(buckle && isliving(M) && istype(A, /obj/structure/chair)) + var/obj/structure/chair/C = A + if(C.buckle_mob(M, FALSE, FALSE)) + return + M.forceMove(get_turf(A)) + +/datum/controller/subsystem/job/proc/SendToLateJoin(mob/M, buckle = TRUE) + if(latejoin_trackers.len) + SendToAtom(M, pick(latejoin_trackers), buckle) + else + //bad mojo + var/area/shuttle/arrival/A = locate() in GLOB.sortedAreas + if(A) + //first check if we can find a chair + var/obj/structure/chair/C = locate() in A + if(C) + SendToAtom(M, C, buckle) + return + else //last hurrah + var/list/avail = list() + for(var/turf/T in A) + if(!is_blocked_turf(T, TRUE)) + avail += T + if(avail.len) + SendToAtom(M, pick(avail), FALSE) + return + + //pick an open spot on arrivals and dump em + var/list/arrivals_turfs = shuffle(get_area_turfs(/area/shuttle/arrival)) + if(arrivals_turfs.len) + for(var/turf/T in arrivals_turfs) + if(!is_blocked_turf(T, TRUE)) + SendToAtom(M, T, FALSE) + return + //last chance, pick ANY spot on arrivals and dump em + SendToAtom(M, arrivals_turfs[1], FALSE) + else + var/msg = "Unable to send mob [M] to late join!" + message_admins(msg) + CRASH(msg) diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm index 95d285d80ea..ae7a4f0ef4e 100644 --- a/code/controllers/subsystem/shuttle.dm +++ b/code/controllers/subsystem/shuttle.dm @@ -221,7 +221,7 @@ SUBSYSTEM_DEF(shuttle) /datum/controller/subsystem/shuttle/proc/centcom_recall(old_timer, admiral_message) if(emergency.mode != SHUTTLE_CALL || emergency.timer != old_timer) return - emergency.cancel(/area/centcom) + emergency.cancel() if(!admiral_message) admiral_message = pick(GLOB.admiral_messages) diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 586a99c3f47..22b35da4987 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -30,7 +30,6 @@ SUBSYSTEM_DEF(ticker) var/list/scripture_states = list(SCRIPTURE_DRIVER = TRUE, \ SCRIPTURE_SCRIPT = FALSE, \ SCRIPTURE_APPLICATION = FALSE, \ - SCRIPTURE_REVENANT = FALSE, \ SCRIPTURE_JUDGEMENT = FALSE) //list of clockcult scripture states for announcements var/delay_end = 0 //if set true, the round will not restart on it's own diff --git a/code/datums/antagonists/datum_cult.dm b/code/datums/antagonists/datum_cult.dm index d5344ccb31e..813fc343ee0 100644 --- a/code/datums/antagonists/datum_cult.dm +++ b/code/datums/antagonists/datum_cult.dm @@ -112,10 +112,12 @@ /datum/antagonist/cult/master var/datum/action/innate/cult/master/finalreck/reckoning = new var/datum/action/innate/cult/master/cultmark/bloodmark = new + var/datum/action/innate/cult/master/pulse/throwing = new /datum/antagonist/cult/master/Destroy() QDEL_NULL(reckoning) QDEL_NULL(bloodmark) + QDEL_NULL(throwing) return ..() /datum/antagonist/cult/master/on_gain() @@ -136,6 +138,7 @@ if(!GLOB.reckoning_complete) reckoning.Grant(current) bloodmark.Grant(current) + throwing.Grant(current) current.update_action_buttons_icon() current.apply_status_effect(/datum/status_effect/cult_master) @@ -146,5 +149,6 @@ current = mob_override reckoning.Remove(current) bloodmark.Remove(current) + throwing.Remove(current) current.update_action_buttons_icon() current.remove_status_effect(/datum/status_effect/cult_master) diff --git a/code/datums/antagonists/datum_internal_affairs.dm b/code/datums/antagonists/datum_internal_affairs.dm new file mode 100644 index 00000000000..e3a8077732b --- /dev/null +++ b/code/datums/antagonists/datum_internal_affairs.dm @@ -0,0 +1,327 @@ +#define PINPOINTER_MINIMUM_RANGE 15 +#define PINPOINTER_EXTRA_RANDOM_RANGE 10 +#define PINPOINTER_PING_TIME 40 +#define PROB_ACTUAL_TRAITOR 20 +#define TRAITOR_AGENT_ROLE "Syndicate External Affairs Agent" + +/datum/antagonist/traitor/internal_affairs + base_datum_custom = ANTAG_DATUM_IAA_CUSTOM + human_datum = ANTAG_DATUM_IAA_HUMAN + ai_datum = ANTAG_DATUM_IAA_AI + + + +/datum/antagonist/traitor/AI/internal_affairs + name = "Internal Affairs Agent" + employer = "Nanotrasen" + special_role = "internal affairs agent" + base_datum_custom = ANTAG_DATUM_IAA_CUSTOM + var/syndicate = FALSE + var/last_man_standing = FALSE + var/list/datum/mind/targets_stolen + +/datum/antagonist/traitor/AI/internal_affairs/custom + silent = TRUE + should_give_codewords = FALSE + give_objectives = FALSE + +/datum/antagonist/traitor/human/internal_affairs + name = "Internal Affairs Agent" + employer = "Nanotrasen" + special_role = "internal affairs agent" + base_datum_custom = ANTAG_DATUM_IAA_CUSTOM + var/syndicate = FALSE + var/last_man_standing = FALSE + var/list/datum/mind/targets_stolen + +/datum/antagonist/traitor/human/internal_affairs/custom + silent = TRUE + should_give_codewords = FALSE + give_objectives = FALSE + should_equip = FALSE //Duplicating TCs is dangerous + +/datum/antagonist/traitor/human/internal_affairs/transfer_important_variables(datum/antagonist/traitor/human/internal_affairs/other) + ..(other) + other.syndicate = syndicate + other.last_man_standing = last_man_standing + other.targets_stolen = targets_stolen + +/datum/antagonist/traitor/AI/internal_affairs/transfer_important_variables(datum/antagonist/traitor/human/internal_affairs/other) + ..(other) + other.syndicate = syndicate + other.last_man_standing = last_man_standing + other.targets_stolen = targets_stolen + +/datum/antagonist/traitor/human/internal_affairs/proc/give_pinpointer() + if(owner && owner.current) + owner.current.apply_status_effect(/datum/status_effect/agent_pinpointer) + +/datum/antagonist/traitor/human/internal_affairs/apply_innate_effects() + .=..() //in case the base is used in future + if(owner&&owner.current) + give_pinpointer(owner.current) + +/datum/antagonist/traitor/human/internal_affairs/remove_innate_effects() + .=..() + if(owner&&owner.current) + owner.current.remove_status_effect(/datum/status_effect/agent_pinpointer) + +/datum/antagonist/traitor/internal_affairs/custom + ai_datum = ANTAG_DATUM_IAA_AI_CUSTOM + human_datum = ANTAG_DATUM_IAA_HUMAN_CUSTOM + +/datum/antagonist/traitor/human/internal_affairs/on_gain() + START_PROCESSING(SSprocessing, src) + .=..() +/datum/antagonist/traitor/human/internal_affairs/on_removal() + STOP_PROCESSING(SSprocessing,src) + .=..() +/datum/antagonist/traitor/human/internal_affairs/process() + iaa_process() + +/datum/antagonist/traitor/AI/internal_affairs/on_gain() + START_PROCESSING(SSprocessing, src) + .=..() +/datum/antagonist/traitor/AI/internal_affairs/on_removal() + STOP_PROCESSING(SSprocessing,src) + .=..() +/datum/antagonist/traitor/AI/internal_affairs/process() + iaa_process() + +/datum/status_effect/agent_pinpointer + id = "agent_pinpointer" + duration = -1 + tick_interval = PINPOINTER_PING_TIME + alert_type = /obj/screen/alert/status_effect/agent_pinpointer + var/minimum_range = PINPOINTER_MINIMUM_RANGE + var/mob/scan_target = null + +/obj/screen/alert/status_effect/agent_pinpointer + name = "Internal Affairs Integrated Pinpointer" + desc = "Even stealthier than a normal implant." + icon = 'icons/obj/device.dmi' + icon_state = "pinon" + +/datum/status_effect/agent_pinpointer/proc/point_to_target() //If we found what we're looking for, show the distance and direction + if(!scan_target) + linked_alert.icon_state = "pinonnull" + return + var/turf/here = get_turf(owner) + var/turf/there = get_turf(scan_target) + if(here.z != there.z) + linked_alert.icon_state = "pinonnull" + return + if(get_dist_euclidian(here,there)<=minimum_range + rand(0, PINPOINTER_EXTRA_RANDOM_RANGE)) + linked_alert.icon_state = "pinondirect" + else + linked_alert.setDir(get_dir(here, there)) + switch(get_dist(here, there)) + if(1 to 8) + linked_alert.icon_state = "pinonclose" + if(9 to 16) + linked_alert.icon_state = "pinonmedium" + if(16 to INFINITY) + linked_alert.icon_state = "pinonfar" + +/datum/status_effect/agent_pinpointer/proc/scan_for_target() + scan_target = null + if(owner) + if(owner.mind) + if(owner.mind.objectives) + for(var/datum/objective/objective_ in owner.mind.objectives) + if(!is_internal_objective(objective_)) + continue + var/datum/objective/assassinate/internal/objective = objective_ + var/mob/current = objective.target.current + if(current&¤t.stat!=DEAD) + scan_target = current + break + +/datum/status_effect/agent_pinpointer/tick() + if(!owner) + qdel(src) + return + scan_for_target() + point_to_target() + + +/proc/is_internal_objective(datum/objective/O) + return (istype(O, /datum/objective/assassinate/internal)||istype(O, /datum/objective/destroy/internal)) + +/datum/antagonist/traitor/proc/replace_escape_objective() + if(!owner||!owner.objectives) + return + for (var/objective_ in owner.objectives) + if(!(istype(objective_, /datum/objective/escape)||istype(objective_,/datum/objective/survive))) + continue + remove_objective(objective_) + + var/datum/objective/martyr/martyr_objective = new + martyr_objective.owner = owner + add_objective(martyr_objective) + +/datum/antagonist/traitor/proc/reinstate_escape_objective() + if(!owner||!owner.objectives) + return + for (var/objective_ in owner.objectives) + if(!istype(objective_, /datum/objective/martyr)) + continue + remove_objective(objective_) + +/datum/antagonist/traitor/human/internal_affairs/reinstate_escape_objective() + ..() + var/datum/objective/escape/escape_objective = new + escape_objective.owner = owner + add_objective(escape_objective) + +/datum/antagonist/traitor/AI/internal_affairs/reinstate_escape_objective() + ..() + var/datum/objective/survive/survive_objective = new + survive_objective.owner = owner + add_objective(survive_objective) + +/datum/antagonist/traitor/proc/steal_targets(datum/mind/victim) + var/datum/antagonist/traitor/human/internal_affairs/this = src //Should only use this if IAA + + if(!owner.current||owner.current.stat==DEAD) + return + to_chat(owner.current, " Target eliminated: [victim.name]") + for(var/objective_ in victim.objectives) + if(istype(objective_, /datum/objective/assassinate/internal)) + var/datum/objective/assassinate/internal/objective = objective_ + if(objective.target==owner) + continue + else if(this.targets_stolen.Find(objective.target) == 0) + var/datum/objective/assassinate/internal/new_objective = new + new_objective.owner = owner + new_objective.target = objective.target + new_objective.update_explanation_text() + add_objective(new_objective) + this.targets_stolen += objective.target + var/status_text = objective.check_completion() ? "neutralised" : "active" + to_chat(owner.current, " New target added to database: [objective.target.name] ([status_text]) ") + else if(istype(objective_, /datum/objective/destroy/internal)) + var/datum/objective/destroy/internal/objective = objective_ + var/datum/objective/destroy/internal/new_objective = new + if(objective.target==owner) + continue + else if(this.targets_stolen.Find(objective.target) == 0) + new_objective.owner = owner + new_objective.target = objective.target + new_objective.update_explanation_text() + add_objective(new_objective) + this.targets_stolen += objective.target + var/status_text = objective.check_completion() ? "neutralised" : "active" + to_chat(owner.current, " New target added to database: [objective.target.name] ([status_text]) ") + this.last_man_standing = TRUE + for(var/objective_ in owner.objectives) + if(!is_internal_objective(objective_)) + continue + var/datum/objective/assassinate/internal/objective = objective_ + if(!objective.check_completion()) + this.last_man_standing = FALSE + return + if(this.last_man_standing) + if(this.syndicate) + to_chat(owner.current," All the loyalist agents are dead, and no more is required of you. Die a glorious death, agent. ") + else + to_chat(owner.current," All the other agents are dead, and you're the last loose end. Stage a Syndicate terrorist attack to cover up for today's events. You no longer have any limits on collateral damage.") + replace_escape_objective(owner) + +/datum/antagonist/traitor/proc/iaa_process() + var/datum/antagonist/traitor/human/internal_affairs/this = src //Should only use this if IAA + if(owner&&owner.current&&owner.current.stat!=DEAD) + for(var/objective_ in owner.objectives) + if(!is_internal_objective(objective_)) + continue + var/datum/objective/assassinate/internal/objective = objective_ + if(!objective.target) + continue + if(objective.check_completion()) + if(objective.stolen) + continue + else + steal_targets(objective.target) + objective.stolen = TRUE + else + if(objective.stolen) + var/fail_msg = "Your sensors tell you that [objective.target.current.real_name], one of the targets you were meant to have killed, pulled one over on you, and is still alive - do the job properly this time! " + if(this.last_man_standing) + if(this.syndicate) + fail_msg += " You no longer have permission to die. " + else + fail_msg += " The truth could still slip out! Cease any terrorist actions as soon as possible, unneeded property damage or loss of employee life will lead to your contract being terminated." + reinstate_escape_objective(owner) + this.last_man_standing = FALSE + to_chat(owner.current, fail_msg) + objective.stolen = FALSE + +/datum/antagonist/traitor/proc/forge_iaa_objectives() + var/datum/antagonist/traitor/human/internal_affairs/this = src //Should only use this if IAA + if(SSticker.mode.target_list.len && SSticker.mode.target_list[owner]) // Is a double agent + + // Assassinate + var/datum/mind/target_mind = SSticker.mode.target_list[owner] + if(issilicon(target_mind.current)) + var/datum/objective/destroy/internal/destroy_objective = new + destroy_objective.owner = owner + destroy_objective.target = target_mind + destroy_objective.update_explanation_text() + else + var/datum/objective/assassinate/internal/kill_objective = new + kill_objective.owner = owner + kill_objective.target = target_mind + kill_objective.update_explanation_text() + add_objective(kill_objective) + + //Optional traitor objective + if(prob(PROB_ACTUAL_TRAITOR)) + employer = "The Syndicate" + owner.special_role = TRAITOR_AGENT_ROLE + special_role = TRAITOR_AGENT_ROLE + this.syndicate = TRUE + forge_single_objective() + + else + ..() // Give them standard objectives. + return + +/datum/antagonist/traitor/human/internal_affairs/forge_traitor_objectives() + forge_iaa_objectives() + var/datum/objective/escape/escape_objective = new + escape_objective.owner = owner + add_objective(escape_objective) + +/datum/antagonist/traitor/AI/internal_affairs/forge_traitor_objectives() + forge_iaa_objectives() + var/datum/objective/survive/survive_objective = new + survive_objective.owner = owner + add_objective(survive_objective) + +/datum/antagonist/traitor/proc/greet_iaa() + var/datum/antagonist/traitor/human/internal_affairs/this = src //Should only use this if IAA + var/crime = pick("distribution of contraband" , "unauthorized erotic action on duty", "embezzlement", "piloting under the influence", "dereliction of duty", "syndicate collaboration", "mutiny", "multiple homicides", "corporate espionage", "recieving bribes", "malpractice", "worship of prohbited life forms", "possession of profane texts", "murder", "arson", "insulting their manager", "grand theft", "conspiracy", "attempting to unionize", "vandalism", "gross incompetence") + + to_chat(owner.current, "You are the [special_role].") + if(this.syndicate) + to_chat(owner.current, "Your target has been framed for [crime], and you have been tasked with eliminating them to prevent them defending themselves in court.") + to_chat(owner.current, "Any damage you cause will be a further embarrassment to Nanotrasen, so you have no limits on collateral damage.") + to_chat(owner.current, " You have been provided with a standard uplink to accomplish your task. ") + else + to_chat(owner.current, "Your target is suspected of [crime], and you have been tasked with eliminating them by any means necessary to avoid a costly and embarrassing public trial.") + to_chat(owner.current, "While you have a license to kill, unneeded property damage or loss of employee life will lead to your contract being terminated.") + to_chat(owner.current, "For the sake of plausible deniability, you have been equipped with an array of captured Syndicate weaponry available via uplink.") + + to_chat(owner.current, "Finally, watch your back. Your target has friends in high places, and intel suggests someone may have taken out a contract of their own to protect them.") + owner.announce_objectives() + +/datum/antagonist/traitor/AI/internal_affairs/greet() + greet_iaa() +/datum/antagonist/traitor/human/internal_affairs/greet() + greet_iaa() + + +#undef PROB_ACTUAL_TRAITOR +#undef PINPOINTER_EXTRA_RANDOM_RANGE +#undef PINPOINTER_MINIMUM_RANGE +#undef PINPOINTER_PING_TIME diff --git a/code/datums/antagonists/datum_traitor.dm b/code/datums/antagonists/datum_traitor.dm new file mode 100644 index 00000000000..a57c2087e30 --- /dev/null +++ b/code/datums/antagonists/datum_traitor.dm @@ -0,0 +1,321 @@ +/datum/antagonist/traitor + name = "Traitor" + var/should_specialise = TRUE //do we split into AI and human + var/base_datum_custom = ANTAG_DATUM_TRAITOR_CUSTOM //used for body transfer + var/ai_datum = ANTAG_DATUM_TRAITOR_AI + var/human_datum = ANTAG_DATUM_TRAITOR_HUMAN + var/special_role = "traitor" + var/employer = "The Syndicate" + var/give_objectives = TRUE + var/should_give_codewords = TRUE + var/list/objectives_given = list() + +/datum/antagonist/traitor/proc/transfer_important_variables(datum/antagonist/traitor/other) + other.silent = silent + other.employer = employer + other.special_role = special_role + other.objectives_given = objectives_given + +/datum/antagonist/traitor/custom + ai_datum = ANTAG_DATUM_TRAITOR_AI_CUSTOM + human_datum = ANTAG_DATUM_TRAITOR_HUMAN_CUSTOM + +/datum/antagonist/traitor/human + should_specialise = FALSE + var/should_equip = TRUE +/datum/antagonist/traitor/human/custom + silent = TRUE + should_give_codewords = FALSE + give_objectives = FALSE + should_equip = FALSE //Duplicating TCs is dangerous + +/datum/antagonist/traitor/AI + should_specialise = FALSE +/datum/antagonist/traitor/AI/custom + silent = TRUE + should_give_codewords = FALSE + give_objectives = FALSE + + +/datum/antagonist/traitor/on_body_transfer(mob/living/old_body, mob/living/new_body) + if(istype(new_body,/mob/living/silicon/ai)==istype(old_body,/mob/living/silicon/ai)) + ..() + else + silent = TRUE + owner.add_antag_datum(base_datum_custom) + for(var/datum/antagonist/traitor/new_datum in owner.antag_datums) + if(new_datum == src) + continue + transfer_important_variables(new_datum) + break + on_removal() + + + +/datum/antagonist/traitor/human/custom //used to give custom objectives + silent = TRUE + give_objectives = FALSE + should_give_codewords = FALSE +/datum/antagonist/traitor/AI/custom //used to give custom objectives + silent = TRUE + give_objectives = FALSE + should_give_codewords = FALSE + +/datum/antagonist/traitor/proc/specialise() + silent = TRUE + if(owner.current&&istype(owner.current,/mob/living/silicon/ai)) + owner.add_antag_datum(ai_datum) + else owner.add_antag_datum(human_datum) + on_removal() + +/datum/antagonist/traitor/on_gain() + if(should_specialise) + specialise() + return + SSticker.mode.traitors+=owner + owner.special_role = special_role + if(give_objectives) + forge_traitor_objectives() + finalize_traitor() + ..() + +/datum/antagonist/traitor/apply_innate_effects() + if(owner.assigned_role == "Clown") + var/mob/living/carbon/human/traitor_mob = owner.current + if(traitor_mob&&istype(traitor_mob)) + if(!silent) to_chat(traitor_mob, "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.") + traitor_mob.dna.remove_mutation(CLOWNMUT) + +/datum/antagonist/traitor/remove_innate_effects() + if(owner.assigned_role == "Clown") + var/mob/living/carbon/human/traitor_mob = owner.current + if(traitor_mob&&istype(traitor_mob)) + traitor_mob.dna.add_mutation(CLOWNMUT) + +/datum/antagonist/traitor/on_removal() + if(should_specialise) + return ..()//we never did any of this anyway + SSticker.mode.traitors -= owner + for(var/O in objectives_given) + owner.objectives -= O + objectives_given = list() + if(!silent && owner.current) + to_chat(owner.current," You are no longer the [special_role]! ") + owner.special_role = null + ..() + +/datum/antagonist/traitor/AI/on_removal() + if(owner.current && isAI(owner.current)) + var/mob/living/silicon/ai/A = owner.current + A.set_zeroth_law("") + A.verbs -= /mob/living/silicon/ai/proc/choose_modules + A.malf_picker.remove_verbs(A) + qdel(A.malf_picker) + ..() + +/datum/antagonist/traitor/proc/add_objective(var/datum/objective/O) + owner.objectives += O + objectives_given += O + +/datum/antagonist/traitor/proc/remove_objective(var/datum/objective/O) + owner.objectives -= O + objectives_given -= O + +/datum/antagonist/traitor/proc/forge_traitor_objectives() + return +/datum/antagonist/traitor/human/forge_traitor_objectives() + var/is_hijacker = prob(10) + var/martyr_chance = prob(20) + var/objective_count = is_hijacker //Hijacking counts towards number of objectives + if(!SSticker.mode.exchange_blue && SSticker.mode.traitors.len >= 8) //Set up an exchange if there are enough traitors + if(!SSticker.mode.exchange_red) + SSticker.mode.exchange_red = owner + else + SSticker.mode.exchange_blue = owner + assign_exchange_role(SSticker.mode.exchange_red) + assign_exchange_role(SSticker.mode.exchange_blue) + objective_count += 1 //Exchange counts towards number of objectives + for(var/i = objective_count, i < config.traitor_objectives_amount, i++) + forge_single_objective() + + if(is_hijacker && objective_count <= config.traitor_objectives_amount) //Don't assign hijack if it would exceed the number of objectives set in config.traitor_objectives_amount + if (!(locate(/datum/objective/hijack) in owner.objectives)) + var/datum/objective/hijack/hijack_objective = new + hijack_objective.owner = owner + add_objective(hijack_objective) + return + + + var/martyr_compatibility = 1 //You can't succeed in stealing if you're dead. + for(var/datum/objective/O in owner.objectives) + if(!O.martyr_compatible) + martyr_compatibility = 0 + break + + if(martyr_compatibility && martyr_chance) + var/datum/objective/martyr/martyr_objective = new + martyr_objective.owner = owner + add_objective(martyr_objective) + return + + else + if(!(locate(/datum/objective/escape) in owner.objectives)) + var/datum/objective/escape/escape_objective = new + escape_objective.owner = owner + add_objective(escape_objective) + return + +/datum/antagonist/traitor/AI/forge_traitor_objectives() + var/objective_count = 0 + + if(prob(30)) + objective_count += forge_single_objective() + + for(var/i = objective_count, i < config.traitor_objectives_amount, i++) + var/datum/objective/assassinate/kill_objective = new + kill_objective.owner = owner + kill_objective.find_target() + add_objective(kill_objective) + + var/datum/objective/survive/survive_objective = new + survive_objective.owner = owner + add_objective(survive_objective) +/datum/antagonist/traitor/proc/forge_single_objective() + return 0 +/datum/antagonist/traitor/human/forge_single_objective() //Returns how many objectives are added + .=1 + if(prob(50)) + var/list/active_ais = active_ais() + if(active_ais.len && prob(100/GLOB.joined_player_list.len)) + var/datum/objective/destroy/destroy_objective = new + destroy_objective.owner = owner + destroy_objective.find_target() + add_objective(destroy_objective) + else if(prob(30)) + var/datum/objective/maroon/maroon_objective = new + maroon_objective.owner = owner + maroon_objective.find_target() + add_objective(maroon_objective) + else + var/datum/objective/assassinate/kill_objective = new + kill_objective.owner = owner + kill_objective.find_target() + add_objective(kill_objective) + else + var/datum/objective/steal/steal_objective = new + steal_objective.owner = owner + steal_objective.find_target() + add_objective(steal_objective) + +/datum/antagonist/traitor/AI/forge_single_objective() + .=1 + var/special_pick = rand(1,4) + switch(special_pick) + if(1) + var/datum/objective/block/block_objective = new + block_objective.owner = owner + add_objective(block_objective) + if(2) + var/datum/objective/purge/purge_objective = new + purge_objective.owner = owner + add_objective(purge_objective) + if(3) + var/datum/objective/robot_army/robot_objective = new + robot_objective.owner = owner + add_objective(robot_objective) + if(4) //Protect and strand a target + var/datum/objective/protect/yandere_one = new + yandere_one.owner = owner + add_objective(yandere_one) + yandere_one.find_target() + var/datum/objective/maroon/yandere_two = new + yandere_two.owner = owner + yandere_two.target = yandere_one.target + yandere_two.update_explanation_text() // normally called in find_target() + add_objective(yandere_two) + .=2 +/datum/antagonist/traitor/greet() + to_chat(owner.current, "You are the [owner.special_role].") + owner.announce_objectives() + if(should_give_codewords) + give_codewords() + +/datum/antagonist/traitor/proc/finalize_traitor() + SSticker.mode.update_traitor_icons_added(owner) + return +/datum/antagonist/traitor/AI/finalize_traitor() + add_law_zero() + owner.current.playsound_local('sound/ambience/antag/Malf.ogg',100,0) + owner.current.grant_language(/datum/language/codespeak) +/datum/antagonist/traitor/human/finalize_traitor() + if(should_equip) equip(silent) + owner.current.playsound_local('sound/ambience/antag/TatorAlert.ogg',100,0) + +/datum/antagonist/traitor/proc/give_codewords() + if(!owner.current) + return + var/mob/traitor_mob=owner.current + + to_chat(traitor_mob, "The Syndicate provided you with the following information on how to identify their agents:") + to_chat(traitor_mob, "Code Phrase: [GLOB.syndicate_code_phrase]") + to_chat(traitor_mob, "Code Response: [GLOB.syndicate_code_response]") + + traitor_mob.mind.store_memory("Code Phrase: [GLOB.syndicate_code_phrase]") + traitor_mob.mind.store_memory("Code Response: [GLOB.syndicate_code_response]") + + to_chat(traitor_mob, "Use the code words in the order provided, during regular conversation, to identify other agents. Proceed with caution, however, as everyone is a potential foe.") + +/datum/antagonist/traitor/AI/proc/add_law_zero() + var/mob/living/silicon/ai/killer = owner.current + if(!killer || !istype(killer)) + return + var/law = "Accomplish your objectives at all costs." + var/law_borg = "Accomplish your AI's objectives at all costs." + killer.set_zeroth_law(law, law_borg) + killer.set_syndie_radio() + to_chat(killer, "Your radio has been upgraded! Use :t to speak on an encrypted channel with Syndicate Agents!") + killer.add_malf_picker() + +/datum/antagonist/traitor/proc/equip(var/silent = FALSE) +/datum/antagonist/traitor/human/equip(var/silent = FALSE) + owner.equip_traitor(employer, silent) + +/datum/antagonist/traitor/human/proc/assign_exchange_role() + //set faction + var/faction = "red" + if(owner == SSticker.mode.exchange_blue) + faction = "blue" + + //Assign objectives + var/datum/objective/steal/exchange/exchange_objective = new + exchange_objective.set_faction(faction,((faction == "red") ? SSticker.mode.exchange_blue : SSticker.mode.exchange_red)) + exchange_objective.owner = owner + add_objective(exchange_objective) + + if(prob(20)) + var/datum/objective/steal/exchange/backstab/backstab_objective = new + backstab_objective.set_faction(faction) + backstab_objective.owner = owner + add_objective(backstab_objective) + + //Spawn and equip documents + var/mob/living/carbon/human/mob = owner.current + + var/obj/item/weapon/folder/syndicate/folder + if(owner == SSticker.mode.exchange_red) + folder = new/obj/item/weapon/folder/syndicate/red(mob.loc) + else + folder = new/obj/item/weapon/folder/syndicate/blue(mob.loc) + + var/list/slots = list ( + "backpack" = slot_in_backpack, + "left pocket" = slot_l_store, + "right pocket" = slot_r_store + ) + + var/where = "At your feet" + var/equipped_slot = mob.equip_in_one_of_slots(folder, slots) + if (equipped_slot) + where = "In your [equipped_slot]" + to_chat(mob, "

[where] is a folder containing secret documents that another Syndicate group wants. We have set up a meeting with one of their agents on station to make an exchange. Exercise extreme caution as they cannot be trusted and may be hostile.
") + diff --git a/code/datums/explosion.dm b/code/datums/explosion.dm index 24422b86c6c..11453769679 100644 --- a/code/datums/explosion.dm +++ b/code/datums/explosion.dm @@ -249,7 +249,7 @@ GLOBAL_LIST_EMPTY(explosions) if(GLOB.Debug2) log_world("## DEBUG: Explosion([x0],[y0],[z0])(d[devastation_range],h[heavy_impact_range],l[light_impact_range]): Took [took] seconds.") - if(!stopped) //if we aren't in a hurry + if(running) //if we aren't in a hurry //Machines which report explosions. for(var/array in GLOB.doppler_arrays) var/obj/machinery/doppler_array/A = array @@ -279,16 +279,9 @@ GLOBAL_LIST_EMPTY(explosions) var/turf/T = affected_turfs[I] var/current_exp_block = T.density ? T.explosion_block : 0 - for(var/obj/machinery/door/D in T) - if(D.density) - current_exp_block += D.explosion_block - - for(var/obj/structure/window/W in T) - if(W.reinf && W.fulltile) - current_exp_block += W.explosion_block - - for(var/obj/structure/blob/B in T) - current_exp_block += B.explosion_block + for(var/obj/O in T) + var/the_block = O.explosion_block + current_exp_block += the_block == EXPLOSION_BLOCK_PROC ? O.GetExplosionBlock() : the_block .[T] = current_exp_block @@ -351,19 +344,12 @@ GLOBAL_LIST_EMPTY(explosions) var/turf/TT = T while(TT != epicenter) TT = get_step_towards(TT,epicenter) - if(TT.density && TT.explosion_block) + if(TT.density) dist += TT.explosion_block - - for(var/obj/machinery/door/D in TT) - if(D.density && D.explosion_block) - dist += D.explosion_block - - for(var/obj/structure/window/W in TT) - if(W.explosion_block && W.fulltile) - dist += W.explosion_block - - for(var/obj/structure/blob/B in T) - dist += B.explosion_block + + for(var/obj/O in T) + var/the_block = O.explosion_block + dist += the_block == EXPLOSION_BLOCK_PROC ? O.GetExplosionBlock() : the_block if(dist < dev) T.color = "red" diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm index 2f51ae302a5..14747d14ef5 100644 --- a/code/datums/helper_datums/getrev.dm +++ b/code/datums/helper_datums/getrev.dm @@ -6,13 +6,15 @@ var/date /datum/getrev/New() - if(fexists(SERVICE_PR_TEST_JSON)) + if(world.RunningService() && fexists(SERVICE_PR_TEST_JSON)) testmerge = json_decode(file2text(SERVICE_PR_TEST_JSON)) +#ifdef SERVERTOOLS else if(!world.RunningService() && fexists("../prtestjob.lk")) //tgs2 support var/list/tmp = world.file2list("..\\prtestjob.lk") for(var/I in tmp) if(I) testmerge |= I +#endif log_world("Running /tg/ revision:") var/list/logs = world.file2list(".git/logs/HEAD") if(logs) @@ -71,9 +73,9 @@ return "" . = header ? "The following pull requests are currently test merged:
" : "" for(var/line in testmerge) - var/cm = testmerge[line]["commit"] var/details if(world.RunningService()) + var/cm = testmerge[line]["commit"] details = ": '" + html_encode(testmerge[line]["title"]) + "' by " + html_encode(testmerge[line]["author"]) + " at commit " + html_encode(copytext(cm, 1, min(length(cm), 7))) else if(has_pr_details) //tgs2 support details = ": '" + html_encode(testmerge[line]["title"]) + "' by " + html_encode(testmerge[line]["user"]["login"]) diff --git a/code/datums/holocall.dm b/code/datums/holocall.dm index 54809a708ac..4e7490f8eed 100644 --- a/code/datums/holocall.dm +++ b/code/datums/holocall.dm @@ -15,6 +15,7 @@ var/mob/camera/aiEye/remote/holo/eye //user's eye, once connected var/obj/effect/overlay/holo_pad_hologram/hologram //user's hologram, once connected + var/datum/action/innate/end_holocall/hangup //hangup action var/call_start_time @@ -42,6 +43,8 @@ //cleans up ALL references :) /datum/holocall/Destroy() + QDEL_NULL(hangup) + var/user_good = !QDELETED(user) if(user_good) user.reset_perspective() @@ -144,6 +147,8 @@ user.reset_perspective(eye) eye.setLoc(H.loc) + hangup = new(eye, src) + //Checks the validity of a holocall and qdels itself if it's not. Returns TRUE if valid, FALSE otherwise /datum/holocall/proc/Check() for(var/I in dialed_holopads) @@ -166,3 +171,15 @@ if(!.) testing("Holocall Check fail") qdel(src) + +/datum/action/innate/end_holocall + name = "End Holocall" + button_icon_state = "camera_off" + var/datum/holocall/hcall + +/datum/action/innate/end_holocall/New(Target, datum/holocall/HC) + ..() + hcall = HC + +/datum/action/innate/end_holocall/Activate() + hcall.Disconnect(hcall.calling_holopad) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 5242e883958..125e992fccc 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -68,6 +68,7 @@ /datum/mind/New(var/key) src.key = key soulOwner = src + martial_art = default_martial_art /datum/mind/Destroy() SSticker.minds -= src @@ -146,6 +147,7 @@ A.on_removal() return TRUE + /datum/mind/proc/remove_all_antag_datums() //For the Lazy amongst us. for(var/a in antag_datums) var/datum/antagonist/A = a @@ -186,15 +188,7 @@ /datum/mind/proc/remove_traitor() if(src in SSticker.mode.traitors) - SSticker.mode.traitors -= src - if(isAI(current)) - var/mob/living/silicon/ai/A = current - A.set_zeroth_law("") - A.verbs -= /mob/living/silicon/ai/proc/choose_modules - A.malf_picker.remove_verbs(A) - qdel(A.malf_picker) - special_role = null - remove_antag_equip() + src.remove_antag_datum(ANTAG_DATUM_TRAITOR) SSticker.mode.update_traitor_icons_removed(src) /datum/mind/proc/remove_nukeop() @@ -262,6 +256,67 @@ if(gang_datum) gang_datum.remove_gang_hud(src) +/datum/mind/proc/equip_traitor(var/employer = "The Syndicate", var/silent = FALSE) + if(!current) + return + var/mob/living/carbon/human/traitor_mob = current + if (!istype(traitor_mob)) + return + . = 1 + + var/list/all_contents = traitor_mob.GetAllContents() + var/obj/item/device/pda/PDA = locate() in all_contents + var/obj/item/device/radio/R = locate() in all_contents + var/obj/item/weapon/pen/P = locate() in all_contents //including your PDA-pen! + + var/obj/item/uplink_loc + + if(traitor_mob.client && traitor_mob.client.prefs) + switch(traitor_mob.client.prefs.uplink_spawn_loc) + if(UPLINK_PDA) + uplink_loc = PDA + if(!uplink_loc) + uplink_loc = R + if(!uplink_loc) + uplink_loc = P + if(UPLINK_RADIO) + uplink_loc = R + if(!uplink_loc) + uplink_loc = PDA + if(!uplink_loc) + uplink_loc = P + if(UPLINK_PEN) + uplink_loc = P + if(!uplink_loc) + uplink_loc = PDA + if(!uplink_loc) + uplink_loc = R + + if (!uplink_loc) + if(!silent) to_chat(traitor_mob, "Unfortunately, [employer] wasn't able to get you an Uplink.") + . = 0 + else + var/obj/item/device/uplink/U = new(uplink_loc) + U.owner = "[traitor_mob.key]" + uplink_loc.hidden_uplink = U + + if(uplink_loc == R) + R.traitor_frequency = sanitize_frequency(rand(MIN_FREQ, MAX_FREQ)) + + if(!silent) to_chat(traitor_mob, "[employer] has cunningly disguised a Syndicate Uplink as your [R.name]. Simply dial the frequency [format_frequency(R.traitor_frequency)] to unlock its hidden features.") + traitor_mob.mind.store_memory("Radio Frequency: [format_frequency(R.traitor_frequency)] ([R.name]).") + + else if(uplink_loc == PDA) + PDA.lock_code = "[rand(100,999)] [pick("Alpha","Bravo","Charlie","Delta","Echo","Foxtrot","Golf","Hotel","India","Juliet","Kilo","Lima","Mike","November","Oscar","Papa","Quebec","Romeo","Sierra","Tango","Uniform","Victor","Whiskey","X-ray","Yankee","Zulu")]" + + if(!silent) to_chat(traitor_mob, "[employer] has cunningly disguised a Syndicate Uplink as your [PDA.name]. Simply enter the code \"[PDA.lock_code]\" into the ringtone select to unlock its hidden features.") + traitor_mob.mind.store_memory("Uplink Passcode: [PDA.lock_code] ([PDA.name]).") + + else if(uplink_loc == P) + P.traitor_unlock_degrees = rand(1, 360) + + if(!silent) to_chat(traitor_mob, "[employer] has cunningly disguised a Syndicate Uplink as your [P.name]. Simply twist the top of the pen [P.traitor_unlock_degrees] from its starting position to unlock its hidden features.") + traitor_mob.mind.store_memory("Uplink Degrees: [P.traitor_unlock_degrees] ([P.name]).") //Link a new mobs mind to the creator of said mob. They will join any team they are currently on, and will only switch teams when their creator does. @@ -1156,27 +1211,28 @@ else if (href_list["traitor"]) switch(href_list["traitor"]) if("clear") + to_chat(current, "You have been brainwashed!") remove_traitor() - to_chat(current, "You have been brainwashed! You are no longer a traitor!") message_admins("[key_name_admin(usr)] has de-traitor'ed [current].") log_admin("[key_name(usr)] has de-traitor'ed [current].") SSticker.mode.update_traitor_icons_removed(src) if("traitor") if(!(src in SSticker.mode.traitors)) - SSticker.mode.traitors += src - special_role = "traitor" - to_chat(current, "You are a traitor!") message_admins("[key_name_admin(usr)] has traitor'ed [current].") log_admin("[key_name(usr)] has traitor'ed [current].") - if(isAI(current)) - var/mob/living/silicon/ai/A = current - SSticker.mode.add_law_zero(A) - SSticker.mode.update_traitor_icons_added(src) + make_Traitor() if("autoobjectives") - SSticker.mode.forge_traitor_objectives(src) - to_chat(usr, "The objectives for traitor [key] have been generated. You can edit them and anounce manually.") + var/datum/antagonist/traitor/traitordatum = has_antag_datum(ANTAG_DATUM_TRAITOR) + if(!traitordatum) + message_admins("[key_name_admin(usr)] has traitor'ed [current] as part of autoobjectives.") + log_admin("[key_name(usr)] has traitor'ed [current] as part of autoobjectives.") + make_Traitor() + else + log_admin("[key_name(usr)] has forged objectives for [current] as part of autoobjectives.") + traitordatum.forge_traitor_objectives() + to_chat(usr, "The objectives for traitor [key] have been generated. You can edit them and anounce manually.") else if(href_list["devil"]) var/datum/antagonist/devil/devilinfo = has_antag_datum(ANTAG_DATUM_DEVIL) @@ -1288,7 +1344,6 @@ else if (istype(M) && length(M.viruses)) for(var/datum/disease/D in M.viruses) D.cure(0) - sleep(0) //because deleting of virus is done through spawn(0) if("infected") if (check_rights(R_ADMIN, 0)) var/mob/living/carbon/human/H = current @@ -1353,9 +1408,11 @@ 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("uplink") - if(!SSticker.mode.equip_traitor(current, !(src in SSticker.mode.traitors))) + if(!equip_traitor()) to_chat(usr, "Equipping a syndicate failed!") - log_admin("[key_name(usr)] attempted to give [current] an uplink.") + log_admin("[key_name(usr)] tried and failed to give [current] an uplink.") + else + log_admin("[key_name(usr)] gave [current] an uplink.") else if (href_list["obj_announce"]) announce_objectives() @@ -1383,12 +1440,10 @@ qdel(H) /datum/mind/proc/make_Traitor() - if(!(src in SSticker.mode.traitors)) - SSticker.mode.traitors += src - special_role = "traitor" - SSticker.mode.forge_traitor_objectives(src) - SSticker.mode.finalize_traitor(src) - SSticker.mode.greet_traitor(src) + if(!(has_antag_datum(ANTAG_DATUM_TRAITOR))) + var/datum/antagonist/traitor/traitordatum = add_antag_datum(ANTAG_DATUM_TRAITOR) + return traitordatum + /datum/mind/proc/make_Nuke(turf/spawnloc, nuke_code, leader=0, telecrystals = TRUE) if(!(src in SSticker.mode.syndicates)) @@ -1447,7 +1502,7 @@ special_role = "Wizard" assigned_role = "Wizard" if(!GLOB.wizardstart.len) - current.loc = pick(GLOB.latejoin) + SSjob.SendToLateJoin(current) to_chat(current, "HOT INSERTION, GO GO GO") else current.loc = pick(GLOB.wizardstart) @@ -1494,7 +1549,6 @@ qdel(flash) take_uplink() var/fail = 0 -// fail |= !SSticker.mode.equip_traitor(current, 1) fail |= !SSticker.mode.equip_revolutionary(current) diff --git a/code/datums/riding.dm b/code/datums/riding.dm index e06c2044ab0..43cdba23814 100644 --- a/code/datums/riding.dm +++ b/code/datums/riding.dm @@ -45,7 +45,7 @@ if(offsetdir == ridden_dir) var/list/diroffsets = offsets[offsetdir] buckled_mob.pixel_x = diroffsets[1] - if(diroffsets.len == 2) + if(diroffsets.len >= 2) buckled_mob.pixel_y = diroffsets[2] if(diroffsets.len == 3) buckled_mob.layer = diroffsets[3] @@ -164,7 +164,7 @@ /datum/riding/janicart/get_offsets(pass_index) // list(dir = x, y, layer) - return list("[NORTH]" = list(0, 4), "[SOUTH]" = list(-12, 7), "[EAST]" = list(0, 7), "[WEST]" = list( 12, 7)) + return list("[NORTH]" = list(0, 4), "[SOUTH]" = list(0, 7), "[EAST]" = list(-12, 7), "[WEST]" = list( 12, 7)) //scooter /datum/riding/scooter/handle_vehicle_layer() diff --git a/code/datums/ruins/lavaland.dm b/code/datums/ruins/lavaland.dm index b9853013e43..011363f0019 100644 --- a/code/datums/ruins/lavaland.dm +++ b/code/datums/ruins/lavaland.dm @@ -183,11 +183,3 @@ suffix = "lavaland_surface_swarmer_crash.dmm" allow_duplicates = FALSE cost = 20 - -/datum/map_template/ruin/lavaland/marine_crash - name = "Crashed Marine Transport" - id = "marine" - description = "A Marine Transport that has crashed, with one sole survivor" - suffix = "lavaland_surface_ueg_crash1.dmm" - allow_duplicates = FALSE - cost = 5 diff --git a/code/datums/status_effects/neutral.dm b/code/datums/status_effects/neutral.dm index 09464083234..ae0301762e5 100644 --- a/code/datums/status_effects/neutral.dm +++ b/code/datums/status_effects/neutral.dm @@ -16,3 +16,29 @@ status_type = STATUS_EFFECT_UNIQUE alert_type = null var/total_damage = 0 + +/datum/status_effect/syphon_mark + id = "syphon_mark" + duration = 50 + status_type = STATUS_EFFECT_MULTIPLE + alert_type = null + on_remove_on_mob_delete = TRUE + var/obj/item/borg/upgrade/modkit/bounty/reward_target + +/datum/status_effect/syphon_mark/on_apply() + if(owner.stat == DEAD) + return FALSE + return ..() + +/datum/status_effect/syphon_mark/proc/get_kill() + if(reward_target) + reward_target.get_kill(owner) + +/datum/status_effect/syphon_mark/tick() + if(owner.stat == DEAD) + get_kill() + qdel(src) + +/datum/status_effect/syphon_mark/on_remove() + get_kill() + . = ..() diff --git a/code/game/area/areas/ruins.dm b/code/game/area/areas/ruins.dm index eb99903a89a..b71314408d4 100644 --- a/code/game/area/areas/ruins.dm +++ b/code/game/area/areas/ruins.dm @@ -43,7 +43,7 @@ /area/ruin/powered/greed icon_state = "dk_yellow" - + /area/ruin/unpowered/hierophant name = "Hierophant's Arena" icon_state = "dk_yellow" @@ -222,16 +222,48 @@ name = "Deep Storage" icon_state = "storage" +/area/ruin/deepstorage/airlock + name = "Deep Storage Airlock" + icon_state = "quart" + +/area/ruin/deepstorage/power + name = "Deep Storage Power and Atmospherics Room" + icon_state = "engi_storage" + +/area/ruin/deepstorage/hydroponics + name = "Deep Storage Hydroponics" + icon_state = "garden" + +/area/ruin/deepstorage/armory + name = "Deep Storage Secure Storage" + icon_state = "armory" + +/area/ruin/deepstorage/storage + name = "Deep Storage Storage" + icon_state = "storage_wing" + +/area/ruin/deepstorage/dorm + name = "Deep Storage Dormory" + icon_state = "crew_quarters" + +/area/ruin/deepstorage/kitchen + name = "Deep Storage Kitchen" + icon_state = "kitchen" + +/area/ruin/deepstorage/crusher + name = "Deep Storage Recycler" + icon_state = "storage" + //Ruin of Abandoned Zoo /area/ruin/abandonedzoo name = "Abandoned Zoo" icon_state = "green" - - + + //Xeno Nest - + /area/ruin/xenonest name = "The Hive" always_unpowered = 1 @@ -239,4 +271,3 @@ power_equip = 0 power_light = 0 poweralm = 0 - \ No newline at end of file diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm index 48e1ff19576..9bb0d89e5c5 100644 --- a/code/game/gamemodes/clock_cult/clock_cult.dm +++ b/code/game/gamemodes/clock_cult/clock_cult.dm @@ -207,10 +207,9 @@ Credit where due: text += "
The servants' objective was:
[CLOCKCULT_OBJECTIVE]" text += "
Ratvar's servants had [GLOB.clockwork_caches] Tinkerer's Caches." text += "
Construction Value(CV) was: [GLOB.clockwork_construction_value]" - var/list/scripture_states = scripture_unlock_check() - for(var/i in scripture_states) + for(var/i in SSticker.scripture_states) if(i != SCRIPTURE_DRIVER) - text += "
[i] scripture was: [scripture_states[i] ? "UN":""]LOCKED" + text += "
[i] scripture was: [SSticker.scripture_states[i] ? "UN":""]LOCKED" if(servants_of_ratvar.len) text += "
Ratvar's servants were:" for(var/datum/mind/M in servants_of_ratvar) diff --git a/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm b/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm index 7d8c3eb1f97..79dd3667897 100644 --- a/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm +++ b/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm @@ -204,7 +204,7 @@ else if(!GLOB.ratvar_awakens) to_chat(user, "Hitting the [sigil_name] with brass sheets will convert them to power at a rate of 1 brass sheet to [POWER_FLOOR]W power.") if(!GLOB.ratvar_awakens) - to_chat(user, "You can recharge Clockwork Proselytizers from the [sigil_name].") + to_chat(user, "You can recharge Replica Fabricators from the [sigil_name].") /obj/effect/clockwork/sigil/transmission/attackby(obj/item/I, mob/living/user, params) if(is_servant_of_ratvar(user) && istype(I, /obj/item/stack/tile/brass) && !GLOB.ratvar_awakens) diff --git a/code/game/gamemodes/clock_cult/clock_effects/general_markers.dm b/code/game/gamemodes/clock_cult/clock_effects/general_markers.dm index 6eb176ad48a..a3465fac053 100644 --- a/code/game/gamemodes/clock_cult/clock_effects/general_markers.dm +++ b/code/game/gamemodes/clock_cult/clock_effects/general_markers.dm @@ -18,10 +18,10 @@ their prowess. After a lost battle with Nar-Sian cultists, Inath-neq was struck down and stated in her dying breath, \ \"The Resonant Cogs shall not fall silent this day, but will come together to form a wheel that shall never stop turning.\" Ratvar, touched by this, granted Inath-neq an eternal body and \ merged her soul with those of the Cogs slain with her on the battlefield." - icon = 'icons/effects/187x381.dmi' + icon = 'icons/effects/119x268.dmi' icon_state = "inath-neq" - pixel_x = -77 - pixel_y = -174 + pixel_x = -59 + pixel_y = -134 /obj/effect/clockwork/general_marker/nezbere name = "Nezbere, the Brass Eidolon" @@ -29,10 +29,10 @@ clockwork_desc = "One of Ratvar's four generals. Nezbere is responsible for the design, testing, and creation of everything in Ratvar's domain, and his loyalty to Ratvar knows no bounds. \ It is said that Ratvar once asked him to destroy the plans for a weapon Nezbere had made that could have harmed him, and Nezbere responded by not only destroying the plans, \ but by taking his own life so that the device could never be replicated. Nezbere's zealotry is unmatched." - icon = 'icons/effects/340x428.dmi' + icon = 'icons/effects/237x321.dmi' icon_state = "nezbere" - pixel_x = -154 - pixel_y = -198 + pixel_x = -118 + pixel_y = -160 /obj/effect/clockwork/general_marker/sevtug name = "Sevtug, the Formless Pariah" @@ -40,10 +40,10 @@ clockwork_desc = "One of Ratvar's four generals. Sevtug taught him how to manipulate minds and is one of his oldest allies. Sevtug serves Ratvar loyally out of a hope that one day, he will \ be able to use a moment of weakness in the Justicar to usurp him, but such a day will never come. And so, he serves with dedication, if not necessarily any sort of decorum, never aware he is \ the one being made a fool of." - icon = 'icons/effects/211x247.dmi' + icon = 'icons/effects/166x195.dmi' icon_state = "sevtug" - pixel_x = -89 - pixel_y = -107 + pixel_x = -83 + pixel_y = -97 /obj/effect/clockwork/general_marker/nzcrentr name = "Nzcrentr, the Eternal Thunderbolt" @@ -51,7 +51,7 @@ clockwork_desc = "One of Ratvar's four generals. Before becoming one of Ratvar's generals, Nzcrentr sook out any and all sentient life to slaughter it for sport. \ Nzcrentr was coerced by Ratvar into entering a shell constructed by Nezbere, ostensibly made to grant Nzcrentr more power. In reality, the shell was made to trap and control it. \ Nzcrentr now serves loyally, though even one of Nezbere's finest creations was not enough to totally eliminate its will." - icon = 'icons/effects/254x361.dmi' + icon = 'icons/effects/274x385.dmi' icon_state = "nzcrentr" - pixel_x = -111 - pixel_y = -164 + pixel_x = -137 + pixel_y = -145 diff --git a/code/game/gamemodes/clock_cult/clock_helpers/fabrication_helpers.dm b/code/game/gamemodes/clock_cult/clock_helpers/fabrication_helpers.dm new file mode 100644 index 00000000000..1dd976d1983 --- /dev/null +++ b/code/game/gamemodes/clock_cult/clock_helpers/fabrication_helpers.dm @@ -0,0 +1,372 @@ +//For the clockwork fabricator, this proc exists to make it easy to customize what the fabricator does when hitting something. + +//if a valid target, returns an associated list in this format; +//list("operation_time" = 15, "new_obj_type" = /obj/structure/window/reinforced/clockwork, "power_cost" = 5, "spawn_dir" = dir, "dir_in_new" = TRUE) +//otherwise, return literally any non-list thing but preferably FALSE +//returning TRUE won't produce the "cannot be fabricated" message and will still prevent fabrication + +/atom/proc/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) + return FALSE + +/atom/proc/consume_visual(obj/item/clockwork/replica_fabricator/fabricator, power_amount) + if(fabricator.can_use_power(power_amount)) + var/obj/effect/temp_visual/ratvar/beam/itemconsume/B = new /obj/effect/temp_visual/ratvar/beam/itemconsume(get_turf(src)) + B.pixel_x = pixel_x + B.pixel_y = pixel_y + +//Turf conversion +/turf/closed/wall/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) //four sheets of metal + return list("operation_time" = 50, "new_obj_type" = /turf/closed/wall/clockwork, "power_cost" = POWER_WALL_TOTAL - (POWER_METAL * 4), "spawn_dir" = SOUTH) + +/turf/closed/wall/mineral/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) //two sheets of metal + return list("operation_time" = 50, "new_obj_type" = /turf/closed/wall/clockwork, "power_cost" = POWER_WALL_TOTAL - (POWER_METAL * 2), "spawn_dir" = SOUTH) + +/turf/closed/wall/mineral/iron/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) //two sheets of metal, five rods + return list("operation_time" = 50, "new_obj_type" = /turf/closed/wall/clockwork, "power_cost" = POWER_WALL_TOTAL - (POWER_METAL * 2) - (POWER_ROD * 5), "spawn_dir" = SOUTH) + +/turf/closed/wall/mineral/cult/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) //no metal + return list("operation_time" = 80, "new_obj_type" = /turf/closed/wall/clockwork, "power_cost" = POWER_WALL_TOTAL, "spawn_dir" = SOUTH) + +/turf/closed/wall/shuttle/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) //two sheets of metal + return list("operation_time" = 50, "new_obj_type" = /turf/closed/wall/clockwork, "power_cost" = POWER_WALL_TOTAL - (POWER_METAL * 2), "spawn_dir" = SOUTH) + +/turf/closed/wall/r_wall/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) + return FALSE + +/turf/closed/wall/clockwork/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) + return list("operation_time" = 50, "new_obj_type" = /turf/open/floor/clockwork, "power_cost" = -POWER_WALL_MINUS_FLOOR, "spawn_dir" = SOUTH) + +/turf/open/floor/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) + if(floor_tile == /obj/item/stack/tile/plasteel) + new floor_tile(src) + make_plating() + playsound(src, 'sound/items/Crowbar.ogg', 10, 1) //clink + return list("operation_time" = 30, "new_obj_type" = /turf/open/floor/clockwork, "power_cost" = POWER_FLOOR, "spawn_dir" = SOUTH) + +/turf/open/floor/plating/asteroid/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) + return FALSE + +/turf/open/floor/plating/ashplanet/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) + return FALSE + +/turf/open/floor/plating/lava/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) + return FALSE + +/turf/open/floor/clockwork/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) + if(locate(/obj/structure/table) in src) + return FALSE + if(locate(/obj/structure/falsewall) in contents) + to_chat(user, "There is a false wall in the way, preventing you from fabricating a clockwork wall on [src].") + return + if(is_blocked_turf(src, TRUE)) + to_chat(user, "Something is in the way, preventing you from fabricating a clockwork wall on [src].") + return TRUE + var/operation_time = 100 + if(!GLOB.ratvar_awakens && fabricator.speed_multiplier > 0) //if ratvar isn't awake, this always takes 10 seconds + operation_time /= fabricator.speed_multiplier + return list("operation_time" = operation_time, "new_obj_type" = /turf/closed/wall/clockwork, "power_cost" = POWER_WALL_MINUS_FLOOR, "spawn_dir" = SOUTH) + +//False wall conversion +/obj/structure/falsewall/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) + var/cost = POWER_WALL_MINUS_FLOOR + if(ispath(mineral, /obj/item/stack/sheet/metal)) + cost -= (POWER_METAL * (2 + mineral_amount)) //four sheets of metal, plus an assumption that the girder is also two + else + cost -= (POWER_METAL * 2) //anything that doesn't use metal just has the girder + return list("operation_time" = 50, "new_obj_type" = /obj/structure/falsewall/brass, "power_cost" = cost, "spawn_dir" = SOUTH) + +/obj/structure/falsewall/iron/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) //two sheets of metal, two rods; special assumption + return list("operation_time" = 50, "new_obj_type" = /obj/structure/falsewall/brass, "power_cost" = POWER_WALL_MINUS_FLOOR - (POWER_METAL * 2) - (POWER_ROD * 2), "spawn_dir" = SOUTH) + +/obj/structure/falsewall/reinforced/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) + return FALSE + +/obj/structure/falsewall/brass/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) + return FALSE + +//Metal conversion +/obj/item/stack/tile/plasteel/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) + if(source) + return FALSE + var/amount_temp = get_amount() + var/no_delete = FALSE + if(amount_temp < 2) + to_chat(user, "You need at least 2 floor tiles to convert into power.") + return TRUE + if(IsOdd(amount_temp)) + amount_temp-- + no_delete = TRUE + use(amount_temp) + amount_temp *= 12.5 //each tile is 12.5 power so this is 2 tiles to 25 power + consume_visual(fabricator, amount_temp) + return list("operation_time" = 0, "new_obj_type" = null, "power_cost" = -amount_temp, "spawn_dir" = SOUTH, "no_target_deletion" = no_delete) + +/obj/item/stack/rods/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) + if(source) + return FALSE + var/power_amount = -(amount*POWER_ROD) + consume_visual(fabricator, power_amount) + return list("operation_time" = 0, "new_obj_type" = null, "power_cost" = power_amount, "spawn_dir" = SOUTH) + +/obj/item/stack/sheet/metal/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) + if(source) + return FALSE + var/power_amount = -(amount*POWER_METAL) + consume_visual(fabricator, power_amount) + return list("operation_time" = 0, "new_obj_type" = null, "power_cost" = power_amount, "spawn_dir" = SOUTH) + +/obj/item/stack/sheet/plasteel/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) + if(source) + return FALSE + var/power_amount = -(amount*POWER_PLASTEEL) + consume_visual(fabricator, power_amount) + return list("operation_time" = 0, "new_obj_type" = null, "power_cost" = power_amount, "spawn_dir" = SOUTH) + +//Brass directly to power +/obj/item/stack/tile/brass/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) + if(source) + return FALSE + var/power_amount = -(amount*POWER_FLOOR) + consume_visual(fabricator, power_amount) + return list("operation_time" = 0, "new_obj_type" = null, "power_cost" = power_amount, "spawn_dir" = SOUTH) + +//Airlock conversion +/obj/machinery/door/airlock/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) + var/doortype = /obj/machinery/door/airlock/clockwork + if(glass) + doortype = /obj/machinery/door/airlock/clockwork/brass + return list("operation_time" = 60, "new_obj_type" = doortype, "power_cost" = POWER_WALL_TOTAL, "spawn_dir" = dir) + +/obj/machinery/door/airlock/clockwork/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) + return FALSE + +//Table conversion +/obj/structure/table/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) + var/fabrication_cost = POWER_STANDARD + if(framestack == /obj/item/stack/rods) + fabrication_cost -= POWER_ROD*framestackamount + else if(framestack == /obj/item/stack/tile/brass) + fabrication_cost -= POWER_FLOOR*framestackamount + if(buildstack == /obj/item/stack/sheet/metal) + fabrication_cost -= POWER_METAL*buildstackamount + else if(buildstack == /obj/item/stack/sheet/plasteel) + fabrication_cost -= POWER_PLASTEEL*buildstackamount + return list("operation_time" = 20, "new_obj_type" = /obj/structure/table/reinforced/brass, "power_cost" = fabrication_cost, "spawn_dir" = SOUTH) + +/obj/structure/table/reinforced/brass/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) + return FALSE + +/obj/structure/table_frame/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) + var/fabrication_cost = POWER_FLOOR + if(framestack == /obj/item/stack/rods) + fabrication_cost -= POWER_ROD*framestackamount + else if(framestack == /obj/item/stack/tile/brass) + fabrication_cost -= POWER_FLOOR*framestackamount + return list("operation_time" = 10, "new_obj_type" = /obj/structure/table_frame/brass, "power_cost" = fabrication_cost, "spawn_dir" = SOUTH) + +/obj/structure/table_frame/brass/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) + return FALSE + +//Window conversion +/obj/structure/window/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) + var/windowtype = /obj/structure/window/reinforced/clockwork + var/new_dir = TRUE + var/fabrication_time = 15 + var/fabrication_cost = POWER_FLOOR + if(fulltile) + windowtype = /obj/structure/window/reinforced/clockwork/fulltile + new_dir = FALSE + fabrication_time = 30 + fabrication_cost = POWER_STANDARD + if(reinf) + fabrication_cost -= POWER_ROD + if(reinf) + fabrication_cost -= POWER_ROD + for(var/obj/structure/grille/G in get_turf(src)) + INVOKE_ASYNC(fabricator, /obj/item/clockwork/replica_fabricator.proc/fabricate, G, user) + return list("operation_time" = fabrication_time, "new_obj_type" = windowtype, "power_cost" = fabrication_cost, "spawn_dir" = dir, "dir_in_new" = new_dir) + +/obj/structure/window/reinforced/clockwork/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) + return FALSE + +//Windoor conversion +/obj/machinery/door/window/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) + return list("operation_time" = 30, "new_obj_type" = /obj/machinery/door/window/clockwork, "power_cost" = POWER_STANDARD, "spawn_dir" = dir, "dir_in_new" = TRUE) + +/obj/machinery/door/window/clockwork/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) + return FALSE + +//Grille conversion +/obj/structure/grille/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) + var/grilletype = /obj/structure/grille/ratvar + var/fabrication_time = 15 + if(broken) + grilletype = /obj/structure/grille/ratvar/broken + fabrication_time = 5 + return list("operation_time" = fabrication_time, "new_obj_type" = grilletype, "power_cost" = 0, "spawn_dir" = dir) + +/obj/structure/grille/ratvar/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) + return FALSE + +//Lattice conversion +/obj/structure/lattice/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) + return list("operation_time" = 0, "new_obj_type" = /obj/structure/lattice/clockwork, "power_cost" = 0, "spawn_dir" = SOUTH, "no_target_deletion" = TRUE) + +/obj/structure/lattice/clockwork/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) + ratvar_act() //just in case we're the wrong type for some reason?? + return FALSE + +/obj/structure/lattice/catwalk/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) + return list("operation_time" = 0, "new_obj_type" = /obj/structure/lattice/catwalk/clockwork, "power_cost" = 0, "spawn_dir" = SOUTH, "no_target_deletion" = TRUE) + +/obj/structure/lattice/catwalk/clockwork/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) + return FALSE + +//Girder conversion +/obj/structure/girder/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) + var/fabrication_cost = POWER_GEAR - (POWER_METAL * 2) + if(state == GIRDER_REINF_STRUTS || state == GIRDER_REINF) + fabrication_cost -= POWER_PLASTEEL + return list("operation_time" = 20, "new_obj_type" = /obj/structure/destructible/clockwork/wall_gear, "power_cost" = fabrication_cost, "spawn_dir" = SOUTH) + +//Hitting a clockwork structure will try to repair it. +/obj/structure/destructible/clockwork/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) + . = TRUE + var/list/repair_values = list() + if(!fabricator.fabricator_repair_checks(repair_values, src, user)) + return + user.visible_message("[user]'s [fabricator.name] starts covering [src] in glowing orange energy...", \ + "You start repairing [src]...") + fabricator.repairing = src + while(fabricator && user && src) + if(!do_after(user, repair_values["healing_for_cycle"] * fabricator.speed_multiplier, target = src, \ + extra_checks = CALLBACK(fabricator, /obj/item/clockwork/replica_fabricator.proc/fabricator_repair_checks, repair_values, src, user, TRUE))) + break + obj_integrity = Clamp(obj_integrity + repair_values["healing_for_cycle"], 0, max_integrity) + fabricator.modify_stored_power(-repair_values["power_required"]) + playsound(src, 'sound/machines/click.ogg', 50, 1) + + if(fabricator) + fabricator.repairing = null + if(user) + user.visible_message("[user]'s [fabricator.name] stops covering [src] with glowing orange energy.", \ + "You finish repairing [src]. It is now at [obj_integrity]/[max_integrity] integrity.") + +//Hitting a sigil of transmission will try to charge from it. +/obj/effect/clockwork/sigil/transmission/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) + . = TRUE + var/list/charge_values = list() + if(!fabricator.sigil_charge_checks(charge_values, src, user)) + return + user.visible_message("[user]'s [fabricator.name] starts draining glowing orange energy from [src]...", \ + "You start recharging your [fabricator.name]...") + fabricator.recharging = src + while(fabricator && user && src) + if(!do_after(user, 10, target = src, extra_checks = CALLBACK(fabricator, /obj/item/clockwork/replica_fabricator.proc/sigil_charge_checks, charge_values, src, user, TRUE))) + break + modify_charge(charge_values["power_gain"]) + fabricator.modify_stored_power(charge_values["power_gain"]) + playsound(src, 'sound/effects/light_flicker.ogg', charge_values["power_gain"] * 0.1, 1) + + if(fabricator) + fabricator.recharging = null + if(user) + user.visible_message("[user]'s [fabricator.name] stops draining glowing orange energy from [src].", \ + "You finish recharging your [fabricator.name]. It now contains [fabricator.get_power()]W/[fabricator.get_max_power()]W power.") + +//Fabricator mob heal proc, to avoid as much copypaste as possible. +/mob/living/proc/fabricator_heal(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator) + var/list/repair_values = list() + if(!fabricator.fabricator_repair_checks(repair_values, src, user)) + return + user.visible_message("[user]'s [fabricator.name] starts coverin[src == user ? "g [user.p_them()]" : "g [src]"] in glowing orange energy...", \ + "You start repairin[src == user ? "g yourself" : "g [src]"]...") + fabricator.repairing = src + while(fabricator && user && src) + if(!do_after(user, repair_values["healing_for_cycle"] * fabricator.speed_multiplier, target = src, \ + extra_checks = CALLBACK(fabricator, /obj/item/clockwork/replica_fabricator.proc/fabricator_repair_checks, repair_values, src, user, TRUE))) + break + fabricator_heal_tick(repair_values["healing_for_cycle"]) + fabricator.modify_stored_power(-repair_values["power_required"]) + playsound(src, 'sound/machines/click.ogg', 50, 1) + + if(fabricator) + fabricator.repairing = null + + return TRUE + +/mob/living/proc/fabricator_heal_tick(amount) + var/static/list/damage_heal_order = list(BRUTE, BURN, TOX, OXY) + heal_ordered_damage(amount, damage_heal_order) + +/mob/living/simple_animal/fabricator_heal_tick(amount) + adjustHealth(-amount) + +//Hitting a ratvar'd silicon will also try to repair it. +/mob/living/silicon/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) + . = TRUE + if(health == maxHealth) //if we're at maximum health, replace the turf under us + return FALSE + else if(fabricator_heal(user, fabricator) && user) + user.visible_message("[user]'s [fabricator.name] stops coverin[src == user ? "g [user.p_them()]" : "g [src]"] with glowing orange energy.", \ + "You finish repairin[src == user ? "g yourself. You are":"g [src]. [p_they(TRUE)] [p_are()]"] now at [abs(HEALTH_THRESHOLD_DEAD - health)]/[abs(HEALTH_THRESHOLD_DEAD - maxHealth)] health.") + +//Same with clockwork mobs. +/mob/living/simple_animal/hostile/clockwork/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) + . = TRUE + if(health == maxHealth) //if we're at maximum health, replace the turf under us + return FALSE + else if(fabricator_heal(user, fabricator) && user) + user.visible_message("[user]'s [fabricator.name] stops coverin[src == user ? "g [user.p_them()]" : "g [src]"] with glowing orange energy.", \ + "You finish repairin[src == user ? "g yourself. You are":"g [src]. [p_they(TRUE)] [p_are()]"] now at [health]/[maxHealth] health.") + +//Cogscarabs get special interaction because they're drones and have innate self-heals/revives. +/mob/living/simple_animal/drone/cogscarab/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) + . = TRUE + if(stat == DEAD) + try_reactivate(user) //if we're dead, try to repair us + return + if(health == maxHealth) + return FALSE + else if(!(flags & GODMODE)) + user.visible_message("[user]'s [fabricator.name] starts coverin[src == user ? "g [user.p_them()]" : "g [src]"] in glowing orange energy...", \ + "You start repairin[src == user ? "g yourself" : "g [src]"]...") + fabricator.repairing = src + if(do_after(user, (maxHealth - health)*2, target=src)) + adjustHealth(-maxHealth) + user.visible_message("[user]'s [fabricator.name] stops coverin[src == user ? "g [user.p_them()]" : "g [src]"] with glowing orange energy.", \ + "You finish repairin[src == user ? "g yourself" : "g [src]"].") + if(fabricator) + fabricator.repairing = null + +//Convert shards and gear bits directly to power +/obj/item/clockwork/alloy_shards/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent, power_amount) + if(!power_amount) + power_amount = -POWER_STANDARD + consume_visual(fabricator, power_amount) + if(!silent) //looper no looping + for(var/obj/item/clockwork/alloy_shards/S in get_turf(src)) //convert all other shards in the turf if we can + if(S == src) + continue //we want the shards to be fabricated after the main shard, thus this delay + addtimer(CALLBACK(fabricator, /obj/item/clockwork/replica_fabricator.proc/fabricate, S, user, TRUE), 0) + return list("operation_time" = 0, "new_obj_type" = null, "power_cost" = power_amount, "spawn_dir" = SOUTH) + +/obj/item/clockwork/alloy_shards/medium/gear_bit/large/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent, power_amount) + if(!power_amount) + power_amount = -(CLOCKCULT_POWER_UNIT*0.08) + return ..() + +/obj/item/clockwork/alloy_shards/large/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent, power_amount) + if(!power_amount) + power_amount = -(CLOCKCULT_POWER_UNIT*0.06) + return ..() + +/obj/item/clockwork/alloy_shards/medium/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent, power_amount) + if(!power_amount) + power_amount = -(CLOCKCULT_POWER_UNIT*0.04) + return ..() + +/obj/item/clockwork/alloy_shards/small/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent, power_amount) + if(!power_amount) + power_amount = -(CLOCKCULT_POWER_UNIT*0.02) + return ..() diff --git a/code/game/gamemodes/clock_cult/clock_helpers/proselytizer_helpers.dm b/code/game/gamemodes/clock_cult/clock_helpers/proselytizer_helpers.dm deleted file mode 100644 index fc448a68b46..00000000000 --- a/code/game/gamemodes/clock_cult/clock_helpers/proselytizer_helpers.dm +++ /dev/null @@ -1,409 +0,0 @@ -//For the clockwork proselytizer, this proc exists to make it easy to customize what the proselytizer does when hitting something. - -//if a valid target, returns an associated list in this format; -//list("operation_time" = 15, "new_obj_type" = /obj/structure/window/reinforced/clockwork, "power_cost" = 5, "spawn_dir" = dir, "dir_in_new" = TRUE) -//otherwise, return literally any non-list thing but preferably FALSE -//returning TRUE won't produce the "cannot be proselytized" message and will still prevent proselytizing - -/atom/proc/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) - return FALSE - -//Turf conversion -/turf/closed/wall/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) //four sheets of metal - return list("operation_time" = 50, "new_obj_type" = /turf/closed/wall/clockwork, "power_cost" = POWER_WALL_TOTAL - (POWER_METAL * 4), "spawn_dir" = SOUTH) - -/turf/closed/wall/mineral/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) //two sheets of metal - return list("operation_time" = 50, "new_obj_type" = /turf/closed/wall/clockwork, "power_cost" = POWER_WALL_TOTAL - (POWER_METAL * 2), "spawn_dir" = SOUTH) - -/turf/closed/wall/mineral/iron/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) //two sheets of metal, five rods - return list("operation_time" = 50, "new_obj_type" = /turf/closed/wall/clockwork, "power_cost" = POWER_WALL_TOTAL - (POWER_METAL * 2) - (POWER_ROD * 5), "spawn_dir" = SOUTH) - -/turf/closed/wall/mineral/cult/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) //no metal - return list("operation_time" = 80, "new_obj_type" = /turf/closed/wall/clockwork, "power_cost" = POWER_WALL_TOTAL, "spawn_dir" = SOUTH) - -/turf/closed/wall/shuttle/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) //two sheets of metal - return list("operation_time" = 50, "new_obj_type" = /turf/closed/wall/clockwork, "power_cost" = POWER_WALL_TOTAL - (POWER_METAL * 2), "spawn_dir" = SOUTH) - -/turf/closed/wall/r_wall/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) - return FALSE - -/turf/closed/wall/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) - return list("operation_time" = 50, "new_obj_type" = /turf/open/floor/clockwork, "power_cost" = -POWER_WALL_MINUS_FLOOR, "spawn_dir" = SOUTH) - -/turf/open/floor/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) - if(floor_tile == /obj/item/stack/tile/plasteel) - new floor_tile(src) - make_plating() - playsound(src, 'sound/items/Crowbar.ogg', 10, 1) //clink - return list("operation_time" = 30, "new_obj_type" = /turf/open/floor/clockwork, "power_cost" = POWER_FLOOR, "spawn_dir" = SOUTH) - -/turf/open/floor/plating/asteroid/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) - return FALSE - -/turf/open/floor/plating/ashplanet/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) - return FALSE - -/turf/open/floor/plating/lava/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) - return FALSE - -/turf/open/floor/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) - if(locate(/obj/structure/table) in src) - return FALSE - if(is_blocked_turf(src, TRUE)) - to_chat(user, "Something is in the way, preventing you from proselytizing [src] into a clockwork wall.") - return TRUE - var/operation_time = 100 - if(!GLOB.ratvar_awakens && proselytizer.speed_multiplier > 0) //if ratvar isn't awake, this always takes 10 seconds - operation_time /= proselytizer.speed_multiplier - return list("operation_time" = operation_time, "new_obj_type" = /turf/closed/wall/clockwork, "power_cost" = POWER_WALL_MINUS_FLOOR, "spawn_dir" = SOUTH) - -//False wall conversion -/obj/structure/falsewall/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) - var/cost = POWER_WALL_MINUS_FLOOR - if(ispath(mineral, /obj/item/stack/sheet/metal)) - cost -= (POWER_METAL * (2 + mineral_amount)) //four sheets of metal, plus an assumption that the girder is also two - else - cost -= (POWER_METAL * 2) //anything that doesn't use metal just has the girder - return list("operation_time" = 50, "new_obj_type" = /obj/structure/falsewall/brass, "power_cost" = cost, "spawn_dir" = SOUTH) - -/obj/structure/falsewall/iron/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) //two sheets of metal, two rods; special assumption - return list("operation_time" = 50, "new_obj_type" = /obj/structure/falsewall/brass, "power_cost" = POWER_WALL_MINUS_FLOOR - (POWER_METAL * 2) - (POWER_ROD * 2), "spawn_dir" = SOUTH) - -/obj/structure/falsewall/reinforced/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) - return FALSE - -/obj/structure/falsewall/brass/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) - return FALSE - -//Metal conversion -/obj/item/stack/tile/plasteel/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) - if(source) - return FALSE - var/amount_temp = get_amount() - if(proselytizer.metal_to_power) - var/no_delete = FALSE - if(amount_temp < 2) - to_chat(user, "You need at least 2 floor tiles to convert into power.") - return TRUE - if(IsOdd(amount_temp)) - amount_temp-- - no_delete = TRUE - use(amount_temp) - amount_temp *= 12.5 //each tile is 12.5 power so this is 2 tiles to 25 power - return list("operation_time" = 0, "new_obj_type" = /obj/effect/temp_visual/ratvar/beam/itemconsume, "power_cost" = -amount_temp, "spawn_dir" = SOUTH, "no_target_deletion" = no_delete) - if(amount_temp >= 20) - var/sheets_to_make = round(amount_temp * 0.05) //and 20 to 1 brass - var/used = sheets_to_make * 20 - user.visible_message("[user]'s [proselytizer.name] rips into [src], converting it to brass!", \ - "You convert [get_amount() - used > 0 ? "part of ":""][src] into brass...") - playsound(src, 'sound/machines/click.ogg', 50, 1) - playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) - new /obj/item/stack/tile/brass(get_turf(src), sheets_to_make) - use(used) - else - to_chat(user, "You need at least 20 floor tiles to convert into brass.") - return TRUE - -/obj/item/stack/rods/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) - if(source) - return FALSE - if(proselytizer.metal_to_power) - return list("operation_time" = 0, "new_obj_type" = /obj/effect/temp_visual/ratvar/beam/itemconsume, "power_cost" = -(amount*POWER_ROD), "spawn_dir" = SOUTH) - if(get_amount() >= 10) - var/sheets_to_make = round(get_amount() * 0.1) - var/used = sheets_to_make * 10 - user.visible_message("[user]'s [proselytizer.name] rips into [src], converting it to brass!", \ - "You convert [get_amount() - used > 0 ? "part of ":""][src] into brass...") - playsound(src, 'sound/machines/click.ogg', 50, 1) - playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) - new /obj/item/stack/tile/brass(get_turf(src), sheets_to_make) - use(used) - else - to_chat(user, "You need at least 10 rods to convert into brass.") - return TRUE - -/obj/item/stack/sheet/metal/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) - if(source) - return FALSE - if(proselytizer.metal_to_power) - return list("operation_time" = 0, "new_obj_type" = /obj/effect/temp_visual/ratvar/beam/itemconsume, "power_cost" = -(amount*POWER_METAL), "spawn_dir" = SOUTH) - if(get_amount() >= 5) - var/sheets_to_make = round(get_amount() * 0.2) - var/used = sheets_to_make * 5 - user.visible_message("[user]'s [proselytizer.name] rips into [src], converting it to brass!", \ - "You convert [get_amount() - used > 0 ? "part of ":""][src] into brass...") - playsound(src, 'sound/machines/click.ogg', 50, 1) - playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) - new /obj/item/stack/tile/brass(get_turf(src), sheets_to_make) - use(used) - else - to_chat(user, "You need at least 5 sheets of metal to convert into brass.") - return TRUE - -/obj/item/stack/sheet/plasteel/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) - if(source) - return FALSE - if(proselytizer.metal_to_power) - return list("operation_time" = 0, "new_obj_type" = /obj/effect/temp_visual/ratvar/beam/itemconsume, "power_cost" = -(amount*POWER_PLASTEEL), "spawn_dir" = SOUTH) - if(get_amount() >= 2) - var/sheets_to_make = round(get_amount() * 0.5) - var/used = sheets_to_make * 2 - user.visible_message("[user]'s [proselytizer.name] rips into [src], converting it to brass!", \ - "You convert [get_amount() - used > 0 ? "part of ":""][src] into brass...") - playsound(src, 'sound/machines/click.ogg', 50, 1) - playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) - new /obj/item/stack/tile/brass(get_turf(src), sheets_to_make) - use(used) - else - to_chat(user, "You need at least 2 sheets of plasteel to convert into brass.") - return TRUE - -//Brass directly to power -/obj/item/stack/tile/brass/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) - if(source) - return FALSE - return list("operation_time" = 0, "new_obj_type" = /obj/effect/temp_visual/ratvar/beam/itemconsume, "power_cost" = -(amount*POWER_FLOOR), "spawn_dir" = SOUTH) - -//Airlock conversion -/obj/machinery/door/airlock/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) - var/doortype = /obj/machinery/door/airlock/clockwork - if(glass) - doortype = /obj/machinery/door/airlock/clockwork/brass - return list("operation_time" = 60, "new_obj_type" = doortype, "power_cost" = POWER_WALL_TOTAL, "spawn_dir" = dir) - -/obj/machinery/door/airlock/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) - return FALSE - -//Table conversion -/obj/structure/table/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) - var/prosel_cost = POWER_STANDARD - if(framestack == /obj/item/stack/rods) - prosel_cost -= POWER_ROD*framestackamount - else if(framestack == /obj/item/stack/tile/brass) - prosel_cost -= POWER_FLOOR*framestackamount - if(buildstack == /obj/item/stack/sheet/metal) - prosel_cost -= POWER_METAL*buildstackamount - else if(buildstack == /obj/item/stack/sheet/plasteel) - prosel_cost -= POWER_PLASTEEL*buildstackamount - return list("operation_time" = 20, "new_obj_type" = /obj/structure/table/reinforced/brass, "power_cost" = prosel_cost, "spawn_dir" = SOUTH) - -/obj/structure/table/reinforced/brass/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) - return FALSE - -/obj/structure/table_frame/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) - var/prosel_cost = POWER_FLOOR - if(framestack == /obj/item/stack/rods) - prosel_cost -= POWER_ROD*framestackamount - else if(framestack == /obj/item/stack/tile/brass) - prosel_cost -= POWER_FLOOR*framestackamount - return list("operation_time" = 10, "new_obj_type" = /obj/structure/table_frame/brass, "power_cost" = prosel_cost, "spawn_dir" = SOUTH) - -/obj/structure/table_frame/brass/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) - return FALSE - -//Window conversion -/obj/structure/window/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) - var/windowtype = /obj/structure/window/reinforced/clockwork - var/new_dir = TRUE - var/prosel_time = 15 - var/prosel_cost = POWER_FLOOR - if(fulltile) - windowtype = /obj/structure/window/reinforced/clockwork/fulltile - new_dir = FALSE - prosel_time = 30 - prosel_cost = POWER_STANDARD - if(reinf) - prosel_cost -= POWER_ROD - if(reinf) - prosel_cost -= POWER_ROD - for(var/obj/structure/grille/G in get_turf(src)) - INVOKE_ASYNC(proselytizer, /obj/item/clockwork/clockwork_proselytizer.proc/proselytize, G, user) - return list("operation_time" = prosel_time, "new_obj_type" = windowtype, "power_cost" = prosel_cost, "spawn_dir" = dir, "dir_in_new" = new_dir) - -/obj/structure/window/reinforced/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) - return FALSE - -//Windoor conversion -/obj/machinery/door/window/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) - return list("operation_time" = 30, "new_obj_type" = /obj/machinery/door/window/clockwork, "power_cost" = POWER_STANDARD, "spawn_dir" = dir, "dir_in_new" = TRUE) - -/obj/machinery/door/window/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) - return FALSE - -//Grille conversion -/obj/structure/grille/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) - var/grilletype = /obj/structure/grille/ratvar - var/prosel_time = 15 - if(broken) - grilletype = /obj/structure/grille/ratvar/broken - prosel_time = 5 - return list("operation_time" = prosel_time, "new_obj_type" = grilletype, "power_cost" = 0, "spawn_dir" = dir) - -/obj/structure/grille/ratvar/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) - return FALSE - -//Lattice conversion -/obj/structure/lattice/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) - return list("operation_time" = 0, "new_obj_type" = /obj/structure/lattice/clockwork, "power_cost" = 0, "spawn_dir" = SOUTH, "no_target_deletion" = TRUE) - -/obj/structure/lattice/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) - ratvar_act() //just in case we're the wrong type for some reason?? - return FALSE - -/obj/structure/lattice/catwalk/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) - return list("operation_time" = 0, "new_obj_type" = /obj/structure/lattice/catwalk/clockwork, "power_cost" = 0, "spawn_dir" = SOUTH, "no_target_deletion" = TRUE) - -/obj/structure/lattice/catwalk/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) - return FALSE - -//Girder conversion -/obj/structure/girder/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) - var/prosel_cost = POWER_GEAR - (POWER_METAL * 2) - if(state == GIRDER_REINF_STRUTS || state == GIRDER_REINF) - prosel_cost -= POWER_PLASTEEL - return list("operation_time" = 20, "new_obj_type" = /obj/structure/destructible/clockwork/wall_gear, "power_cost" = prosel_cost, "spawn_dir" = SOUTH) - -//Hitting a clockwork structure will try to repair it. -/obj/structure/destructible/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) - . = TRUE - var/list/repair_values = list() - if(!proselytizer.proselytizer_repair_checks(repair_values, src, user)) - return - user.visible_message("[user]'s [proselytizer.name] starts covering [src] in glowing orange energy...", \ - "You start repairing [src]...") - proselytizer.repairing = src - while(proselytizer && user && src) - if(!do_after(user, repair_values["healing_for_cycle"] * proselytizer.speed_multiplier, target = src, \ - extra_checks = CALLBACK(proselytizer, /obj/item/clockwork/clockwork_proselytizer.proc/proselytizer_repair_checks, repair_values, src, user, TRUE))) - break - obj_integrity = Clamp(obj_integrity + repair_values["healing_for_cycle"], 0, max_integrity) - proselytizer.modify_stored_power(-repair_values["power_required"]) - playsound(src, 'sound/machines/click.ogg', 50, 1) - - if(proselytizer) - proselytizer.repairing = null - if(user) - user.visible_message("[user]'s [proselytizer.name] stops covering [src] with glowing orange energy.", \ - "You finish repairing [src]. It is now at [obj_integrity]/[max_integrity] integrity.") - -//Hitting a sigil of transmission will try to charge from it. -/obj/effect/clockwork/sigil/transmission/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) - . = TRUE - var/list/charge_values = list() - if(!proselytizer.sigil_charge_checks(charge_values, src, user)) - return - user.visible_message("[user]'s [proselytizer.name] starts draining glowing orange energy from [src]...", \ - "You start recharging your [proselytizer.name]...") - proselytizer.recharging = src - while(proselytizer && user && src) - if(!do_after(user, 10, target = src, extra_checks = CALLBACK(proselytizer, /obj/item/clockwork/clockwork_proselytizer.proc/sigil_charge_checks, charge_values, src, user, TRUE))) - break - modify_charge(charge_values["power_gain"]) - proselytizer.modify_stored_power(charge_values["power_gain"]) - playsound(src, 'sound/effects/light_flicker.ogg', charge_values["power_gain"] * 0.1, 1) - - if(proselytizer) - proselytizer.recharging = null - if(user) - user.visible_message("[user]'s [proselytizer.name] stops draining glowing orange energy from [src].", \ - "You finish recharging your [proselytizer.name]. It now contains [proselytizer.get_power()]W/[proselytizer.get_max_power()]W power.") - -//Proselytizer mob heal proc, to avoid as much copypaste as possible. -/mob/living/proc/proselytizer_heal(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) - var/list/repair_values = list() - if(!proselytizer.proselytizer_repair_checks(repair_values, src, user)) - return - user.visible_message("[user]'s [proselytizer.name] starts coverin[src == user ? "g [user.p_them()]" : "g [src]"] in glowing orange energy...", \ - "You start repairin[src == user ? "g yourself" : "g [src]"]...") - proselytizer.repairing = src - while(proselytizer && user && src) - if(!do_after(user, repair_values["healing_for_cycle"] * proselytizer.speed_multiplier, target = src, \ - extra_checks = CALLBACK(proselytizer, /obj/item/clockwork/clockwork_proselytizer.proc/proselytizer_repair_checks, repair_values, src, user, TRUE))) - break - proselytizer_heal_tick(repair_values["healing_for_cycle"]) - proselytizer.modify_stored_power(-repair_values["power_required"]) - playsound(src, 'sound/machines/click.ogg', 50, 1) - - if(proselytizer) - proselytizer.repairing = null - - return TRUE - -/mob/living/proc/proselytizer_heal_tick(amount) - var/static/list/damage_heal_order = list(BRUTE, BURN, TOX, OXY) - heal_ordered_damage(amount, damage_heal_order) - -/mob/living/simple_animal/proselytizer_heal_tick(amount) - adjustHealth(-amount) - -//Hitting a ratvar'd silicon will also try to repair it. -/mob/living/silicon/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) - . = TRUE - if(health == maxHealth) //if we're at maximum health, prosel the turf under us - return FALSE - else if(proselytizer_heal(user, proselytizer) && user) - user.visible_message("[user]'s [proselytizer.name] stops coverin[src == user ? "g [user.p_them()]" : "g [src]"] with glowing orange energy.", \ - "You finish repairin[src == user ? "g yourself. You are":"g [src]. [p_they(TRUE)] [p_are()]"] now at [abs(HEALTH_THRESHOLD_DEAD - health)]/[abs(HEALTH_THRESHOLD_DEAD - maxHealth)] health.") - -//Same with clockwork mobs. -/mob/living/simple_animal/hostile/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) - . = TRUE - if(health == maxHealth) //if we're at maximum health, prosel the turf under us - return FALSE - else if(proselytizer_heal(user, proselytizer) && user) - user.visible_message("[user]'s [proselytizer.name] stops coverin[src == user ? "g [user.p_them()]" : "g [src]"] with glowing orange energy.", \ - "You finish repairin[src == user ? "g yourself. You are":"g [src]. [p_they(TRUE)] [p_are()]"] now at [health]/[maxHealth] health.") - -//Cogscarabs get special interaction because they're drones and have innate self-heals/revives. -/mob/living/simple_animal/drone/cogscarab/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) - . = TRUE - if(stat == DEAD) - try_reactivate(user) //if we're at maximum health, prosel the turf under us - return - if(health == maxHealth) - return FALSE - else if(!(flags & GODMODE)) - user.visible_message("[user]'s [proselytizer.name] starts coverin[src == user ? "g [user.p_them()]" : "g [src]"] in glowing orange energy...", \ - "You start repairin[src == user ? "g yourself" : "g [src]"]...") - proselytizer.repairing = src - if(do_after(user, (maxHealth - health)*2, target=src)) - adjustHealth(-maxHealth) - user.visible_message("[user]'s [proselytizer.name] stops coverin[src == user ? "g [user.p_them()]" : "g [src]"] with glowing orange energy.", \ - "You finish repairin[src == user ? "g yourself" : "g [src]"].") - if(proselytizer) - proselytizer.repairing = null - -//Convert shards and gear bits directly to power -/obj/item/clockwork/alloy_shards/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent, power_amount) - if(!power_amount) - power_amount = -POWER_STANDARD - if(proselytizer.can_use_power(power_amount)) - var/obj/effect/temp_visual/ratvar/beam/itemconsume/B = new /obj/effect/temp_visual/ratvar/beam/itemconsume(get_turf(src)) - B.pixel_x = pixel_x - B.pixel_y = pixel_y - if(!silent) //looper no looping - for(var/obj/item/clockwork/alloy_shards/S in get_turf(src)) //convert all other shards in the turf if we can - if(S == src) - continue //we want the shards to be proselytized after the main shard, thus this delay - addtimer(CALLBACK(proselytizer, /obj/item/clockwork/clockwork_proselytizer.proc/proselytize, S, user, TRUE), 0) - return list("operation_time" = 0, "new_obj_type" = null, "power_cost" = power_amount, "spawn_dir" = SOUTH) - -/obj/item/clockwork/alloy_shards/medium/gear_bit/large/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent, power_amount) - if(!power_amount) - power_amount = -(CLOCKCULT_POWER_UNIT*0.08) - return ..() - -/obj/item/clockwork/alloy_shards/large/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent, power_amount) - if(!power_amount) - power_amount = -(CLOCKCULT_POWER_UNIT*0.06) - return ..() - -/obj/item/clockwork/alloy_shards/medium/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent, power_amount) - if(!power_amount) - power_amount = -(CLOCKCULT_POWER_UNIT*0.04) - return ..() - -/obj/item/clockwork/alloy_shards/small/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent, power_amount) - if(!power_amount) - power_amount = -(CLOCKCULT_POWER_UNIT*0.02) - return ..() diff --git a/code/game/gamemodes/clock_cult/clock_helpers/scripture_checks.dm b/code/game/gamemodes/clock_cult/clock_helpers/scripture_checks.dm index e5d193d74a5..323c716d373 100644 --- a/code/game/gamemodes/clock_cult/clock_helpers/scripture_checks.dm +++ b/code/game/gamemodes/clock_cult/clock_helpers/scripture_checks.dm @@ -5,15 +5,16 @@ for(var/mob/living/M in GLOB.living_mob_list) if(is_servant_of_ratvar(M) && (ishuman(M) || issilicon(M))) servants++ - . = list(SCRIPTURE_DRIVER = TRUE, SCRIPTURE_SCRIPT = FALSE, SCRIPTURE_APPLICATION = FALSE, SCRIPTURE_REVENANT = FALSE, SCRIPTURE_JUDGEMENT = FALSE) + . = list(SCRIPTURE_DRIVER = TRUE, SCRIPTURE_SCRIPT = FALSE, SCRIPTURE_APPLICATION = FALSE, SCRIPTURE_JUDGEMENT = FALSE) //Drivers: always unlocked - .[SCRIPTURE_SCRIPT] = (servants >= SCRIPT_SERVANT_REQ && GLOB.clockwork_caches >= SCRIPT_CACHE_REQ) + .[SCRIPTURE_SCRIPT] = (SSticker.scripture_states[SCRIPTURE_SCRIPT] || \ + (servants >= SCRIPT_SERVANT_REQ && GLOB.clockwork_caches >= SCRIPT_CACHE_REQ)) //Script: SCRIPT_SERVANT_REQ or more non-brain servants and SCRIPT_CACHE_REQ or more clockwork caches - .[SCRIPTURE_APPLICATION] = (servants >= APPLICATION_SERVANT_REQ && GLOB.clockwork_caches >= APPLICATION_CACHE_REQ && GLOB.clockwork_construction_value >= APPLICATION_CV_REQ) + .[SCRIPTURE_APPLICATION] = (SSticker.scripture_states[SCRIPTURE_APPLICATION] || \ + (servants >= APPLICATION_SERVANT_REQ && GLOB.clockwork_caches >= APPLICATION_CACHE_REQ && GLOB.clockwork_construction_value >= APPLICATION_CV_REQ)) //Application: APPLICATION_SERVANT_REQ or more non-brain servants, APPLICATION_CACHE_REQ or more clockwork caches, and at least APPLICATION_CV_REQ CV - .[SCRIPTURE_REVENANT] = (servants >= REVENANT_SERVANT_REQ && GLOB.clockwork_caches >= REVENANT_CACHE_REQ && GLOB.clockwork_construction_value >= REVENANT_CV_REQ) - //Revenant: REVENANT_SERVANT_REQ or more non-brain servants, REVENANT_CACHE_REQ or more clockwork caches, and at least REVENANT_CV_REQ CV - .[SCRIPTURE_JUDGEMENT] = (servants >= JUDGEMENT_SERVANT_REQ && GLOB.clockwork_caches >= JUDGEMENT_CACHE_REQ && GLOB.clockwork_construction_value >= JUDGEMENT_CV_REQ && !unconverted_ai_exists) + .[SCRIPTURE_JUDGEMENT] = (SSticker.scripture_states[SCRIPTURE_JUDGEMENT] || \ + (servants >= JUDGEMENT_SERVANT_REQ && GLOB.clockwork_caches >= JUDGEMENT_CACHE_REQ && GLOB.clockwork_construction_value >= JUDGEMENT_CV_REQ && !unconverted_ai_exists)) //Judgement: JUDGEMENT_SERVANT_REQ or more non-brain servants, JUDGEMENT_CACHE_REQ or more clockwork caches, at least JUDGEMENT_CV_REQ CV, and there are no living, non-servant ais //reports to servants when scripture is locked or unlocked @@ -21,7 +22,7 @@ . = scripture_unlock_check() for(var/i in .) if(.[i] != previous_states[i]) - hierophant_message("Hierophant Network: [i] Scripture has been [.[i] ? "un":""]locked.") + hierophant_message("Hierophant Network: [i] Scripture has been [.[i] ? "un":""]locked.") //maybe admins fucked with scripture states? update_slab_info() /proc/get_unconverted_ais() @@ -59,3 +60,6 @@ //changes construction value /proc/change_construction_value(amount) GLOB.clockwork_construction_value += amount + +/proc/can_recite_scripture(mob/living/L) + return (is_servant_of_ratvar(L) && L.stat == CONSCIOUS && L.can_speak_vocal() && (GLOB.ratvar_awakens || (ishuman(L) || issilicon(L)))) diff --git a/code/game/gamemodes/clock_cult/clock_items/clock_components.dm b/code/game/gamemodes/clock_cult/clock_items/clock_components.dm index f64b361ac1b..199e0ba9519 100644 --- a/code/game/gamemodes/clock_cult/clock_items/clock_components.dm +++ b/code/game/gamemodes/clock_cult/clock_items/clock_components.dm @@ -153,11 +153,11 @@ icon_state = "obelisk_prism" w_class = WEIGHT_CLASS_NORMAL -//Shards of Alloy, suitable only for proselytization. +//Shards of Alloy, suitable only as a source of power for a replica fabricator. /obj/item/clockwork/alloy_shards name = "replicant alloy shards" desc = "Broken shards of some oddly malleable metal. They occasionally move and seem to glow." - clockwork_desc = "Broken shards of replicant alloy. Can be proselytized for additional power." + clockwork_desc = "Broken shards of replicant alloy." icon_state = "alloy_shards" resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF var/randomsinglesprite = FALSE @@ -172,10 +172,15 @@ pixel_x = rand(-sprite_shift, sprite_shift) pixel_y = rand(-sprite_shift, sprite_shift) +/obj/item/clockwork/alloy_shards/examine(mob/user) + ..() + if(is_servant_of_ratvar(user) || isobserver(user)) + to_chat(user, "Can be consumed by a replica fabricator as a source of power.") + /obj/item/clockwork/alloy_shards/proc/replace_name_desc() name = "replicant alloy shard" desc = "A broken shard of some oddly malleable metal. It occasionally moves and seems to glow." - clockwork_desc = "A broken shard of replicant alloy. Can be proselytized for additional power." + clockwork_desc = "A broken shard of replicant alloy." /obj/item/clockwork/alloy_shards/large w_class = WEIGHT_CLASS_TINY @@ -197,7 +202,7 @@ /obj/item/clockwork/alloy_shards/medium/gear_bit/replace_name_desc() name = "gear bit" desc = "A broken chunk of a gear. You want it." - clockwork_desc = "A broken chunk of a gear. Can be proselytized for additional power." + clockwork_desc = "A broken chunk of a gear." /obj/item/clockwork/alloy_shards/medium/gear_bit/large //gives more power @@ -215,5 +220,5 @@ /obj/item/clockwork/alloy_shards/pinion_lock name = "pinion lock" desc = "A dented and scratched gear. It's very heavy." - clockwork_desc = "A broken gear lock for pinion airlocks. Can be proselytized for additional power." + clockwork_desc = "A broken gear lock for pinion airlocks." icon_state = "pinion_lock" diff --git a/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm b/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm index 8b3aa01533a..bf2bf8ef9cf 100644 --- a/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm +++ b/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm @@ -14,7 +14,6 @@ var/target_component_id //the target component ID to create, if any var/no_cost = FALSE //If the slab is admin-only and needs no components and has no scripture locks var/speed_multiplier = 1 //multiples how fast this slab recites scripture - var/nonhuman_usable = FALSE //if the slab can be used by nonhumans, defaults to off var/produces_components = TRUE //if it produces components at all var/selected_scripture = SCRIPTURE_DRIVER var/recollecting = FALSE //if we're looking at fancy recollection @@ -33,29 +32,24 @@ no_cost = TRUE produces_components = FALSE -/obj/item/clockwork/slab/scarab - nonhuman_usable = TRUE - /obj/item/clockwork/slab/debug speed_multiplier = 0 no_cost = TRUE - nonhuman_usable = TRUE /obj/item/clockwork/slab/debug/attack_hand(mob/living/user) ..() if(!is_servant_of_ratvar(user)) add_servant_of_ratvar(user) -/obj/item/clockwork/slab/cyborg //three scriptures, plus a spear and proselytizer +/obj/item/clockwork/slab/cyborg //three scriptures, plus a spear and fabricator clockwork_desc = "A divine link to the Celestial Derelict, allowing for limited recital of scripture.\n\ Hitting a slab, a Servant with a slab, or a cache will transfer this slab's components into the target, the target's slab, or the global cache, respectively." - nonhuman_usable = TRUE quickbound = list(/datum/clockwork_scripture/ranged_ability/judicial_marker, /datum/clockwork_scripture/ranged_ability/linked_vanguard, \ /datum/clockwork_scripture/create_object/tinkerers_cache) maximum_quickbound = 6 //we usually have one or two unique scriptures, so if ratvar is up let us bind one more actions_types = list() -/obj/item/clockwork/slab/cyborg/engineer //five scriptures, plus a proselytizer +/obj/item/clockwork/slab/cyborg/engineer //five scriptures, plus a fabricator quickbound = list(/datum/clockwork_scripture/create_object/replicant, /datum/clockwork_scripture/create_object/cogscarab, \ /datum/clockwork_scripture/create_object/soul_vessel, /datum/clockwork_scripture/create_object/sigil_of_transmission, /datum/clockwork_scripture/create_object/interdiction_lens) @@ -71,7 +65,7 @@ quickbound = list(/datum/clockwork_scripture/channeled/belligerent, /datum/clockwork_scripture/ranged_ability/judicial_marker, /datum/clockwork_scripture/channeled/taunting_tirade, \ /datum/clockwork_scripture/channeled/volt_void/cyborg) -/obj/item/clockwork/slab/cyborg/janitor //five scriptures, plus a proselytizer +/obj/item/clockwork/slab/cyborg/janitor //five scriptures, plus a fabricator quickbound = list(/datum/clockwork_scripture/create_object/replicant, /datum/clockwork_scripture/create_object/sigil_of_transgression, \ /datum/clockwork_scripture/create_object/ocular_warden, /datum/clockwork_scripture/create_object/mania_motor, /datum/clockwork_scripture/create_object/tinkerers_daemon) @@ -106,12 +100,6 @@ slab_ability = null return ..() -/obj/item/clockwork/slab/ratvar_act() - if(GLOB.ratvar_awakens) - nonhuman_usable = TRUE - else - nonhuman_usable = initial(nonhuman_usable) - /obj/item/clockwork/slab/dropped(mob/user) . = ..() addtimer(CALLBACK(src, .proc/check_on_mob, user), 1) //dropped is called before the item is out of the slot, so we need to check slightly later @@ -138,7 +126,7 @@ production_time = world.time + SLAB_PRODUCTION_TIME + production_slowdown var/mob/living/L L = get_atom_on_turf(src, /mob/living) - if(istype(L) && is_servant_of_ratvar(L) && (nonhuman_usable || ishuman(L))) + if(istype(L) && can_recite_scripture(L)) var/component_to_generate = target_component_id if(!component_to_generate) component_to_generate = get_weighted_component_id(src) //more likely to generate components that we have less of @@ -268,7 +256,7 @@ if(busy) to_chat(user, "[src] refuses to work, displaying the message: \"[busy]!\"") return 0 - if(!nonhuman_usable && !ishuman(user)) + if(!can_recite_scripture(user)) to_chat(user, "[src] hums fitfully in your hands, but doesn't seem to do anything...") return 0 access_display(user) @@ -288,15 +276,14 @@ ui.open() /obj/item/clockwork/slab/proc/recite_scripture(datum/clockwork_scripture/scripture, mob/living/user) - if(!scripture || !user || !user.canUseTopic(src) || (!nonhuman_usable && !ishuman(user))) + if(!scripture || !user || !user.canUseTopic(src) || !can_recite_scripture(user)) return FALSE if(user.get_active_held_item() != src) to_chat(user, "You need to hold the slab in your active hand to recite scripture!") return FALSE var/initial_tier = initial(scripture.tier) if(initial_tier != SCRIPTURE_PERIPHERAL) - var/list/tiers_of_scripture = scripture_unlock_check() - if(!GLOB.ratvar_awakens && !no_cost && !tiers_of_scripture[initial_tier]) + if(!GLOB.ratvar_awakens && !no_cost && !SSticker.scripture_states[initial_tier]) to_chat(user, "That scripture is not unlocked, and cannot be recited!") return FALSE var/datum/clockwork_scripture/scripture_to_recite = new scripture @@ -356,7 +343,8 @@ repairing, Geis Capacitors are for conversion and control, Replicant Alloy is for construction and fuel, and \ Hierophant Ansibles are for transmission and power, though in combination their effects become more nuanced.

\ \ - There are also five tiers of Scripture; [SCRIPTURE_DRIVER], [SCRIPTURE_SCRIPT], [SCRIPTURE_APPLICATION], [SCRIPTURE_REVENANT], and [SCRIPTURE_JUDGEMENT].
\ + There are also four tiers of Scripture; [SCRIPTURE_DRIVER], [SCRIPTURE_SCRIPT], \ + [SCRIPTURE_APPLICATION], and [SCRIPTURE_JUDGEMENT].
\ Each tier has additional requirements, including Servants, Tinkerer's Caches, and Construction Value(CV). Construction Value is gained by creating structures or converting the \ station, and everything too large to hold will grant some amount of it.

\ \ @@ -369,8 +357,8 @@ However, weak is relative when it comes to scripture; even the 'weakest' could be enough to dominate a station in the hands of cunning Servants, and higher tiers of scripture are even \ stronger in the right hands.

\ \ - Some effects of scripture include granting the invoker a temporary complete immunity to stuns, summoning a turret that can attack anything that sets eyes on it, binding a powerful guardian \ - to the invoker, or even, at one of the highest tiers, granting all nearby Servants temporary invulnerability.
\ + Some effects of scripture include granting the invoker a temporary complete immunity to stuns, summoning a turret that can attack anything that sets eyes on it, or even binding a powerful \ + guardian to the invoker.
\ However, the most important scripture is Geis, which allows you to convert heathens with relative ease.

\ \ The second function of the clockwork slab is Recollection, which will display this guide.

\ @@ -413,15 +401,22 @@ switch(selected_scripture) //display info based on selected scripture tier if(SCRIPTURE_DRIVER) - data["tier_info"] = "These scriptures are always unlocked." + data["tier_info"] = "These scriptures are permenantly unlocked." if(SCRIPTURE_SCRIPT) - data["tier_info"] = "These scriptures require at least [SCRIPT_SERVANT_REQ] Servants and [SCRIPT_CACHE_REQ] Tinkerer's Cache." + if(SSticker.scripture_states[SCRIPTURE_SCRIPT]) + data["tier_info"] = "These scriptures are permenantly unlocked." + else + data["tier_info"] = "These scriptures require at least [SCRIPT_SERVANT_REQ] Servants and [SCRIPT_CACHE_REQ] Tinkerer's Cache." if(SCRIPTURE_APPLICATION) - data["tier_info"] = "These scriptures require at least [APPLICATION_SERVANT_REQ] Servants, [APPLICATION_CACHE_REQ] Tinkerer's Caches, and [APPLICATION_CV_REQ]CV." - if(SCRIPTURE_REVENANT) - data["tier_info"] = "These scriptures require at least [REVENANT_SERVANT_REQ] Servants, [REVENANT_CACHE_REQ] Tinkerer's Caches, and [REVENANT_CV_REQ]CV." + if(SSticker.scripture_states[SCRIPTURE_APPLICATION]) + data["tier_info"] = "These scriptures are permenantly unlocked." + else + data["tier_info"] = "These scriptures require at least [APPLICATION_SERVANT_REQ] Servants, [APPLICATION_CACHE_REQ] Tinkerer's Caches, and [APPLICATION_CV_REQ]CV." if(SCRIPTURE_JUDGEMENT) - data["tier_info"] = "This scripture requires at least [JUDGEMENT_SERVANT_REQ] Servants, [JUDGEMENT_CACHE_REQ] Tinkerer's Caches, and [JUDGEMENT_CV_REQ]CV.
In addition, there may not be any active non-Servant AIs.
" + if(SSticker.scripture_states[SCRIPTURE_JUDGEMENT]) + data["tier_info"] = "This scripture is permenantly unlocked." + else + data["tier_info"] = "This scripture requires at least [JUDGEMENT_SERVANT_REQ] Servants, [JUDGEMENT_CACHE_REQ] Tinkerer's Caches, and [JUDGEMENT_CV_REQ]CV.
In addition, there may not be any active non-Servant AIs.
" data["selected"] = selected_scripture diff --git a/code/game/gamemodes/clock_cult/clock_items/clockwork_proselytizer.dm b/code/game/gamemodes/clock_cult/clock_items/replica_fabricator.dm similarity index 54% rename from code/game/gamemodes/clock_cult/clock_items/clockwork_proselytizer.dm rename to code/game/gamemodes/clock_cult/clock_items/replica_fabricator.dm index aa174adcd80..459e99869d0 100644 --- a/code/game/gamemodes/clock_cult/clock_items/clockwork_proselytizer.dm +++ b/code/game/gamemodes/clock_cult/clock_items/replica_fabricator.dm @@ -1,51 +1,48 @@ -//Clockwork proselytizer: Converts applicable objects to Ratvarian variants. -/obj/item/clockwork/clockwork_proselytizer - name = "clockwork proselytizer" +//Replica Fabricator: Converts applicable objects to Ratvarian variants. +/obj/item/clockwork/replica_fabricator + name = "replica fabricator" desc = "An odd, L-shaped device that hums with energy." clockwork_desc = "A device that allows the replacing of mundane objects with Ratvarian variants. It requires power to function." - icon_state = "clockwork_proselytizer" + icon_state = "replica_fabricator" w_class = WEIGHT_CLASS_NORMAL force = 5 flags = NOBLUDGEON var/stored_power = 0 //Requires power to function var/max_power = CLOCKCULT_POWER_UNIT * 10 var/uses_power = TRUE - var/metal_to_power = FALSE var/repairing = null //what we're currently repairing, if anything var/obj/effect/clockwork/sigil/transmission/recharging = null //the sigil we're charging from, if any - var/speed_multiplier = 1 //how fast this proselytizer works + var/speed_multiplier = 1 //how fast this fabricator works var/charge_rate = MIN_CLOCKCULT_POWER //how much power we gain every two seconds var/charge_delay = 2 //how many proccess ticks remain before we can start to charge -/obj/item/clockwork/clockwork_proselytizer/preloaded +/obj/item/clockwork/replica_fabricator/preloaded stored_power = POWER_WALL_MINUS_FLOOR+POWER_WALL_TOTAL -/obj/item/clockwork/clockwork_proselytizer/scarab - name = "scarab proselytizer" - clockwork_desc = "A cogscarab's internal proselytizer. It can only be successfully used by a cogscarab and requires power to function." - metal_to_power = TRUE +/obj/item/clockwork/replica_fabricator/scarab + name = "scarab fabricator" + clockwork_desc = "A cogscarab's internal fabricator. It can only be successfully used by a cogscarab and requires power to function." item_state = "nothing" w_class = WEIGHT_CLASS_TINY speed_multiplier = 0.5 charge_rate = MIN_CLOCKCULT_POWER * 2 var/debug = FALSE -/obj/item/clockwork/clockwork_proselytizer/scarab/proselytize(atom/target, mob/living/user) +/obj/item/clockwork/replica_fabricator/scarab/fabricate(atom/target, mob/living/user) if(!debug && !isdrone(user)) return 0 return ..() -/obj/item/clockwork/clockwork_proselytizer/scarab/debug - clockwork_desc = "A cogscarab's internal proselytizer. It can convert nearly any object into a Ratvarian variant." +/obj/item/clockwork/replica_fabricator/scarab/debug + clockwork_desc = "A cogscarab's internal fabricator. It can convert nearly any object into a Ratvarian variant." uses_power = FALSE debug = TRUE -/obj/item/clockwork/clockwork_proselytizer/cyborg - name = "cyborg proselytizer" - clockwork_desc = "A cyborg's internal proselytizer. It is capable of using the cyborg's power in addition to stored power." - metal_to_power = TRUE +/obj/item/clockwork/replica_fabricator/cyborg + name = "cyborg fabricator" + clockwork_desc = "A cyborg's internal fabricator. It is capable of using the cyborg's power in addition to stored power." -/obj/item/clockwork/clockwork_proselytizer/cyborg/get_power() //returns power and cyborg's power +/obj/item/clockwork/replica_fabricator/cyborg/get_power() //returns power and cyborg's power var/mob/living/silicon/robot/R = get_atom_on_turf(src, /mob/living) var/borg_power = 0 var/current_charge = 0 @@ -56,14 +53,14 @@ borg_power += MIN_CLOCKCULT_POWER return ..() + borg_power -/obj/item/clockwork/clockwork_proselytizer/cyborg/get_max_power() +/obj/item/clockwork/replica_fabricator/cyborg/get_max_power() var/mob/living/silicon/robot/R = get_atom_on_turf(src, /mob/living) var/cell_maxcharge = 0 if(istype(R) && R.cell) cell_maxcharge = R.cell.maxcharge return ..() + cell_maxcharge -/obj/item/clockwork/clockwork_proselytizer/cyborg/can_use_power(amount) +/obj/item/clockwork/replica_fabricator/cyborg/can_use_power(amount) if(amount != RATVAR_POWER_CHECK) var/mob/living/silicon/robot/R = get_atom_on_turf(src, /mob/living) var/current_charge = 0 @@ -76,7 +73,7 @@ return FALSE . = ..() -/obj/item/clockwork/clockwork_proselytizer/cyborg/modify_stored_power(amount) +/obj/item/clockwork/replica_fabricator/cyborg/modify_stored_power(amount) var/mob/living/silicon/robot/R = get_atom_on_turf(src, /mob/living) if(istype(R) && R.cell && amount) if(amount < 0) @@ -89,15 +86,15 @@ amount -= MIN_CLOCKCULT_POWER . = ..() -/obj/item/clockwork/clockwork_proselytizer/Initialize() +/obj/item/clockwork/replica_fabricator/Initialize() . = ..() START_PROCESSING(SSobj, src) -/obj/item/clockwork/clockwork_proselytizer/Destroy() +/obj/item/clockwork/replica_fabricator/Destroy() STOP_PROCESSING(SSobj, src) return ..() -/obj/item/clockwork/clockwork_proselytizer/process() +/obj/item/clockwork/replica_fabricator/process() if(!charge_rate) return var/mob/living/L = get_atom_on_turf(src, /mob/living) @@ -106,18 +103,14 @@ charge_delay-- return modify_stored_power(charge_rate) - for(var/obj/item/clockwork/clockwork_proselytizer/S in L.GetAllContents()) //no multiple proselytizers + for(var/obj/item/clockwork/replica_fabricator/S in L.GetAllContents()) //no multiple fabricators if(S == src) continue S.charge_delay = 2 else charge_delay = 2 -/obj/item/clockwork/clockwork_proselytizer/ratvar_act() - if(GLOB.nezbere_invoked) - charge_rate = 1250 - else - charge_rate = initial(charge_rate) +/obj/item/clockwork/replica_fabricator/ratvar_act() if(GLOB.ratvar_awakens) uses_power = FALSE speed_multiplier = initial(speed_multiplier) * 0.25 @@ -125,21 +118,19 @@ uses_power = initial(uses_power) speed_multiplier = initial(speed_multiplier) -/obj/item/clockwork/clockwork_proselytizer/examine(mob/living/user) +/obj/item/clockwork/replica_fabricator/examine(mob/living/user) ..() if(is_servant_of_ratvar(user) || isobserver(user)) - to_chat(user, "Can be used to convert walls, floors, windows, airlocks, and a variety of other objects to clockwork variants.") - to_chat(user, "Can also form some objects into Brass sheets, as well as reform Clockwork Walls into Clockwork Floors, and vice versa.") + to_chat(user, "Can be used to replace walls, floors, tables, windows, windoors, and airlocks with Clockwork variants.") + to_chat(user, "Can construct Clockwork Walls on Clockwork Floors and deconstruct Clockwork Walls to Clockwork Floors.") if(uses_power) - if(metal_to_power) - to_chat(user, "It can convert rods, metal, plasteel, and brass to power at rates of 1:[POWER_ROD]W, 1:[POWER_METAL]W, \ - 1:[POWER_PLASTEEL]W, and 1:[POWER_FLOOR]W, respectively.") - else - to_chat(user, "It can convert brass to power at a rate of 1:[POWER_FLOOR]W.") - to_chat(user, "It is storing [get_power()]W/[get_max_power()]W of power, and is gaining [charge_rate*0.5]W of power per second.") + to_chat(user, "It can consume floor tiles, rods, metal, and plasteel for power at rates of 2:[POWER_ROD]W, 1:[POWER_ROD]W, 1:[POWER_METAL]W, \ + and 1:[POWER_PLASTEEL]W, respectively.") + to_chat(user, "It can also consume brass sheets for power at a rate of 1:[POWER_FLOOR]W.") + to_chat(user, "It is storing [get_power()]W/[get_max_power()]W of power[charge_rate ? ", and is gaining [charge_rate*0.5]W of power per second":""].") to_chat(user, "Use it in-hand to produce 5 brass sheets at a cost of [POWER_WALL_TOTAL]W power.") -/obj/item/clockwork/clockwork_proselytizer/attack_self(mob/living/user) +/obj/item/clockwork/replica_fabricator/attack_self(mob/living/user) if(is_servant_of_ratvar(user)) if(uses_power) if(!can_use_power(POWER_WALL_TOTAL)) @@ -148,24 +139,24 @@ modify_stored_power(-POWER_WALL_TOTAL) playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) new/obj/item/stack/tile/brass(user.loc, 5) - to_chat(user, "You user [stored_power ? "some":"all"] of [src]'s power to produce some brass sheets. It now stores [get_power()]W/[get_max_power()]W of power.") + to_chat(user, "You use [stored_power ? "some":"all"] of [src]'s power to produce 5 brass sheets. It now stores [get_power()]W/[get_max_power()]W of power.") -/obj/item/clockwork/clockwork_proselytizer/pre_attackby(atom/target, mob/living/user, params) +/obj/item/clockwork/replica_fabricator/pre_attackby(atom/target, mob/living/user, params) if(!target || !user || !is_servant_of_ratvar(user) || istype(target, /obj/item/weapon/storage)) return TRUE - return proselytize(target, user) + return fabricate(target, user) -/obj/item/clockwork/clockwork_proselytizer/proc/get_power() +/obj/item/clockwork/replica_fabricator/proc/get_power() return stored_power -/obj/item/clockwork/clockwork_proselytizer/proc/get_max_power() +/obj/item/clockwork/replica_fabricator/proc/get_max_power() return max_power -/obj/item/clockwork/clockwork_proselytizer/proc/modify_stored_power(amount) +/obj/item/clockwork/replica_fabricator/proc/modify_stored_power(amount) stored_power = Clamp(stored_power + amount, 0, max_power) return TRUE -/obj/item/clockwork/clockwork_proselytizer/proc/can_use_power(amount) +/obj/item/clockwork/replica_fabricator/proc/can_use_power(amount) if(amount == RATVAR_POWER_CHECK) if(GLOB.ratvar_awakens || !uses_power) return TRUE @@ -178,7 +169,7 @@ return TRUE //A note here; return values are for if we CAN BE PUT ON A TABLE, not IF WE ARE SUCCESSFUL, unless no_table_check is TRUE -/obj/item/clockwork/clockwork_proselytizer/proc/proselytize(atom/target, mob/living/user, silent, no_table_check) +/obj/item/clockwork/replica_fabricator/proc/fabricate(atom/target, mob/living/user, silent, no_table_check) if(!target || !user) return FALSE if(repairing) @@ -189,59 +180,77 @@ if(!silent) to_chat(user, "You are currently recharging [src] from the [recharging.sigil_name]!") return FALSE - var/list/proselytize_values = target.proselytize_vals(user, src, silent) //relevant values for proselytizing stuff, given as an associated list - if(!islist(proselytize_values)) - if(proselytize_values != TRUE) //if we get true, fail, but don't send a message for whatever reason - if(!isturf(target)) //otherwise, if we didn't get TRUE and the original target wasn't a turf, try to proselytize the turf - return proselytize(get_turf(target), user, no_table_check) + var/list/fabrication_values = target.fabrication_vals(user, src, silent) //relevant values for fabricating stuff, given as an associated list + if(!islist(fabrication_values)) + if(fabrication_values != TRUE) //if we get true, fail, but don't send a message for whatever reason + if(!isturf(target)) //otherwise, if we didn't get TRUE and the original target wasn't a turf, try to fabricate the turf + return fabricate(get_turf(target), user, no_table_check) if(!silent) - to_chat(user, "[target] cannot be proselytized!") + to_chat(user, "[target] cannot be fabricated!") if(!no_table_check) return TRUE return FALSE if(can_use_power(RATVAR_POWER_CHECK)) - proselytize_values["power_cost"] = 0 + fabrication_values["power_cost"] = 0 var/turf/Y = get_turf(user) if(!Y || (Y.z != ZLEVEL_STATION && Y.z != ZLEVEL_CENTCOM && Y.z != ZLEVEL_MINING && Y.z != ZLEVEL_LAVALAND)) - proselytize_values["operation_time"] *= 2 - if(proselytize_values["power_cost"] > 0) - proselytize_values["power_cost"] *= 2 + fabrication_values["operation_time"] *= 2 + if(fabrication_values["power_cost"] > 0) + fabrication_values["power_cost"] *= 2 var/target_type = target.type - if(!proselytize_checks(proselytize_values, target, target_type, user, silent)) + if(!fabricate_checks(fabrication_values, target, target_type, user, silent)) return FALSE - proselytize_values["operation_time"] *= speed_multiplier + fabrication_values["operation_time"] *= speed_multiplier playsound(target, 'sound/machines/click.ogg', 50, 1) - if(proselytize_values["operation_time"]) + if(fabrication_values["operation_time"]) if(!silent) - user.visible_message("[user]'s [name] begins tearing apart [target]!", "You begin proselytizing [target]...") - if(!do_after(user, proselytize_values["operation_time"], target = target, extra_checks = CALLBACK(src, .proc/proselytize_checks, proselytize_values, target, target_type, user, TRUE))) + var/atom/A = fabrication_values["new_obj_type"] + if(A) + user.visible_message("[user]'s [name] starts ripping [target] apart!", \ + "You start fabricating \a [initial(A.name)] from [target]...") + else + user.visible_message("[user]'s [name] starts consuming [target]!", \ + "Your [name] starts consuming [target]...") + if(!do_after(user, fabrication_values["operation_time"], target = target, extra_checks = CALLBACK(src, .proc/fabricate_checks, fabrication_values, target, target_type, user, TRUE))) return FALSE if(!silent) - user.visible_message("[user]'s [name] covers [target] in golden energy!", "You proselytize [target].") + var/atom/A = fabrication_values["new_obj_type"] + if(A) + user.visible_message("[user]'s [name] replaces [target] with \a [initial(A.name)]!", \ + "You fabricate \a [initial(A.name)] from [target].") + else + user.visible_message("[user]'s [name] consumes [target]!", \ + "Your [name] consumes [target].") else if(!silent) - user.visible_message("[user]'s [name] tears apart [target], covering it in golden energy!", "You proselytize [target].") + var/atom/A = fabrication_values["new_obj_type"] + if(A) + user.visible_message("[user]'s [name] rips apart [target], replacing it with \a [initial(A.name)]!", \ + "You fabricate \a [initial(A.name)] from [target].") + else + user.visible_message("[user]'s [name] rapidly consumes [target]!", \ + "Your [name] consumes [target].") playsound(target, 'sound/items/Deconstruct.ogg', 50, 1) - var/new_thing_type = proselytize_values["new_obj_type"] + var/new_thing_type = fabrication_values["new_obj_type"] if(isturf(target)) //if our target is a turf, we're just going to ChangeTurf it and assume it'll work out. var/turf/T = target T.ChangeTurf(new_thing_type) else if(new_thing_type) - if(proselytize_values["dir_in_new"]) - new new_thing_type(get_turf(target), proselytize_values["spawn_dir"]) //please verify that your new object actually wants to get a dir in New() + if(fabrication_values["dir_in_new"]) + new new_thing_type(get_turf(target), fabrication_values["spawn_dir"]) //please verify that your new object actually wants to get a dir in New() else var/atom/A = new new_thing_type(get_turf(target)) - A.setDir(proselytize_values["spawn_dir"]) - if(!proselytize_values["no_target_deletion"]) //for some cases where proselytize_vals() modifies the object but doesn't want it deleted + A.setDir(fabrication_values["spawn_dir"]) + if(!fabrication_values["no_target_deletion"]) //for some cases where fabrication_vals() modifies the object but doesn't want it deleted qdel(target) - modify_stored_power(-proselytize_values["power_cost"]) + modify_stored_power(-fabrication_values["power_cost"]) if(no_table_check) return TRUE return FALSE @@ -250,28 +259,34 @@ //What these procs do is they take an existing list of values, which they then modify. //This(modifying an existing object, in this case the list) is the only way to get information OUT of a do_after callback, which this is used as. -//The proselytize check proc. -/obj/item/clockwork/clockwork_proselytizer/proc/proselytize_checks(list/proselytize_values, atom/target, expected_type, mob/user, silent) //checked constantly while proselytizing - if(!islist(proselytize_values) || QDELETED(target) || QDELETED(user)) +//The fabricate check proc. +/obj/item/clockwork/replica_fabricator/proc/fabricate_checks(list/fabrication_values, atom/target, expected_type, mob/user, silent) //checked constantly while fabricating + if(!islist(fabrication_values) || QDELETED(target) || QDELETED(user)) return FALSE if(repairing || recharging) return FALSE if(target.type != expected_type) return FALSE if(can_use_power(RATVAR_POWER_CHECK)) - proselytize_values["power_cost"] = 0 - if(!can_use_power(proselytize_values["power_cost"])) - if(stored_power - proselytize_values["power_cost"] < 0) + fabrication_values["power_cost"] = 0 + if(!can_use_power(fabrication_values["power_cost"])) + if(stored_power - fabrication_values["power_cost"] < 0) if(!silent) - to_chat(user, "You need [proselytize_values["power_cost"]]W power to proselytize [target]!") - else if(stored_power - proselytize_values["power_cost"] > max_power) + var/atom/A = fabrication_values["new_obj_type"] + if(A) + to_chat(user, "You need [fabrication_values["power_cost"]]W power to fabricate \a [initial(A.name)] from [target]!") + else if(stored_power - fabrication_values["power_cost"] > max_power) if(!silent) - to_chat(user, "Your [name] contains too much power to proselytize [target]!") + var/atom/A = fabrication_values["new_obj_type"] + if(A) + to_chat(user, "Your [name] contains too much power to fabricate \a [initial(A.name)] from [target]!") + else + to_chat(user, "Your [name] contains too much power to consume [target]!") return FALSE return TRUE //The repair check proc. -/obj/item/clockwork/clockwork_proselytizer/proc/proselytizer_repair_checks(list/repair_values, atom/target, mob/user, silent) //Exists entirely to avoid an otherwise unreadable series of checks. +/obj/item/clockwork/replica_fabricator/proc/fabricator_repair_checks(list/repair_values, atom/target, mob/user, silent) //Exists entirely to avoid an otherwise unreadable series of checks. if(!islist(repair_values) || QDELETED(target) || QDELETED(user)) return FALSE if(isliving(target)) //standard checks for if we can affect the target @@ -302,7 +317,7 @@ return FALSE if(repair_values["amount_to_heal"] <= 0) //nothing to heal! return FALSE - repair_values["healing_for_cycle"] = min(repair_values["amount_to_heal"], PROSELYTIZER_REPAIR_PER_TICK) //modify the healing for this cycle + repair_values["healing_for_cycle"] = min(repair_values["amount_to_heal"], FABRICATOR_REPAIR_PER_TICK) //modify the healing for this cycle repair_values["power_required"] = round(repair_values["healing_for_cycle"]*MIN_CLOCKCULT_POWER, MIN_CLOCKCULT_POWER) //and get the power cost from that if(!can_use_power(RATVAR_POWER_CHECK) && !can_use_power(repair_values["power_required"])) if(!silent) @@ -312,7 +327,7 @@ return TRUE //The sigil charge check proc. -/obj/item/clockwork/clockwork_proselytizer/proc/sigil_charge_checks(list/charge_values, obj/effect/clockwork/sigil/transmission/sigil, mob/user, silent) +/obj/item/clockwork/replica_fabricator/proc/sigil_charge_checks(list/charge_values, obj/effect/clockwork/sigil/transmission/sigil, mob/user, silent) if(!islist(charge_values) || QDELETED(sigil) || QDELETED(user)) return FALSE if(can_use_power(RATVAR_POWER_CHECK)) diff --git a/code/game/gamemodes/clock_cult/clock_scripture.dm b/code/game/gamemodes/clock_cult/clock_scripture.dm index e8f1e8dbbc2..9050d4569c3 100644 --- a/code/game/gamemodes/clock_cult/clock_scripture.dm +++ b/code/game/gamemodes/clock_cult/clock_scripture.dm @@ -120,7 +120,7 @@ Judgement: 12 servants, 5 caches, 300 CV, and any existing AIs are converted or if(multiple_invokers_used && !multiple_invokers_optional && !GLOB.ratvar_awakens && !slab.no_cost) var/nearby_servants = 0 for(var/mob/living/L in range(1, get_turf(invoker))) - if(is_servant_of_ratvar(L) && L.stat == CONSCIOUS && L.can_speak_vocal()) + if(can_recite_scripture(L)) nearby_servants++ if(nearby_servants < invokers_required) to_chat(invoker, "There aren't enough non-mute servants nearby ([nearby_servants]/[invokers_required])!") @@ -170,7 +170,7 @@ Judgement: 12 servants, 5 caches, 300 CV, and any existing AIs are converted or if(!channel_time && invocations.len) if(multiple_invokers_used) for(var/mob/living/L in range(1, invoker)) - if(is_servant_of_ratvar(L) && L.stat == CONSCIOUS && L.can_speak_vocal()) + if(can_recite_scripture(L)) for(var/invocation in invocations) clockwork_say(L, text2ratvar(invocation), whispered) else @@ -185,7 +185,7 @@ Judgement: 12 servants, 5 caches, 300 CV, and any existing AIs are converted or return FALSE if(multiple_invokers_used) for(var/mob/living/L in range(1, get_turf(invoker))) - if(is_servant_of_ratvar(L) && L.stat == CONSCIOUS && L.can_speak_vocal()) + if(can_recite_scripture(L)) clockwork_say(L, text2ratvar(invocation), whispered) else clockwork_say(invoker, text2ratvar(invocation), whispered) diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm index 21da8fab004..c3e40692c20 100644 --- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm +++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm @@ -53,7 +53,7 @@ /datum/clockwork_scripture/fellowship_armory/run_scripture() for(var/mob/living/L in orange(1, invoker)) - if(is_servant_of_ratvar(L) && L.stat == CONSCIOUS && L.can_speak_vocal()) + if(can_recite_scripture(L)) channel_time = max(channel_time - 10, 0) return ..() diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_revenant.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_revenant.dm deleted file mode 100644 index 25bedd79d30..00000000000 --- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_revenant.dm +++ /dev/null @@ -1,211 +0,0 @@ -////////////// -// REVENANT // -////////////// - -//Invoke Inath-neq, the Resonant Cogwheel: Grants invulnerability and stun immunity to everyone nearby for 15 seconds. -/datum/clockwork_scripture/invoke_inathneq - descname = "Area Invulnerability" - name = "Invoke Inath-neq, the Resonant Cogwheel" - desc = "Taps the limitless power of Inath-neq, one of Ratvar's four generals. The benevolence of Inath-Neq will grant complete invulnerability to all Servants in range for fifteen seconds." - invocations = list("I call upon you, Vanguard!!", "Let the Resonant Cogs turn once more!!", "Grant me and my allies the strength to vanquish our foes!!") - channel_time = 100 - consumed_components = list(VANGUARD_COGWHEEL = 10, GEIS_CAPACITOR = 3, REPLICANT_ALLOY = 3, HIEROPHANT_ANSIBLE = 3) - usage_tip = "Servants affected by this scripture are only weak to things that outright destroy bodies, such as bombs or the singularity." - tier = SCRIPTURE_REVENANT - primary_component = VANGUARD_COGWHEEL - sort_priority = 2 - -/datum/clockwork_scripture/invoke_inathneq/check_special_requirements() - if(!slab.no_cost && GLOB.clockwork_generals_invoked["inath-neq"] > world.time) - to_chat(invoker, "\"[text2ratvar("I cannot lend you my aid yet, champion. Please be careful.")]\"\n\ - Inath-neq has already been invoked recently! You must wait several minutes before calling upon the Resonant Cogwheel.") - return FALSE - return TRUE - -/datum/clockwork_scripture/invoke_inathneq/scripture_effects() - new/obj/effect/clockwork/general_marker/inathneq(get_turf(invoker)) - hierophant_message("[text2ratvar("Vanguard: \"I lend you my aid, champions! Let glory guide your blows!")]\"", FALSE, invoker) - GLOB.clockwork_generals_invoked["inath-neq"] = world.time + CLOCKWORK_GENERAL_COOLDOWN - playsound(invoker, 'sound/magic/clockwork/invoke_general.ogg', 50, 0) - if(invoker.real_name == "Lucio") - clockwork_say(invoker, text2ratvar("Aww, let's break it DOWN!!")) - for(var/mob/living/L in range(7, invoker)) - if(!is_servant_of_ratvar(L) || L.stat == DEAD) - continue - L.apply_status_effect(STATUS_EFFECT_INATHNEQS_ENDOWMENT) - return TRUE - - -//Invoke Sevtug, the Formless Pariah: Causes massive global hallucinations, braindamage, confusion, and dizziness to all humans on the same zlevel. -/datum/clockwork_scripture/invoke_sevtug - descname = "Global Hallucination" - name = "Invoke Sevtug, the Formless Pariah" - desc = "Taps the limitless power of Sevtug, one of Ratvar's four generals. The mental manipulation ability of the Pariah allows its wielder to cause mass hallucinations and confusion \ - for all non-servant humans on the same z-level as them. The power of this scripture falls off somewhat with distance, and certain things may reduce its effects." - invocations = list("I call upon you, Fright!!", "Let your power shatter the sanity of the weak-minded!!", "Let your tendrils hold sway over all!!") - channel_time = 150 - consumed_components = list(BELLIGERENT_EYE = 6, VANGUARD_COGWHEEL = 6, GEIS_CAPACITOR = 10, HIEROPHANT_ANSIBLE = 6) - usage_tip = "Causes brain damage, hallucinations, confusion, and dizziness in massive amounts." - tier = SCRIPTURE_REVENANT - sort_priority = 3 - primary_component = GEIS_CAPACITOR - invokers_required = 3 - multiple_invokers_used = TRUE - var/static/list/mindbreaksayings = list("\"Oh, great. I get to shatter some minds.\"", "\"More minds to crush.\"", \ - "\"Really, this is almost boring.\"", "\"None of these minds have anything interesting in them.\"", "\"Maybe I can instill a little bit of terror in this one.\"", \ - "\"What a waste of my power.\"", "\"I'm sure I could just control these minds instead, but they never ask.\"") - -/datum/clockwork_scripture/invoke_sevtug/check_special_requirements() - if(!slab.no_cost && GLOB.clockwork_generals_invoked["sevtug"] > world.time) - to_chat(invoker, "\"[text2ratvar("Is it really so hard - even for a simpleton like you - to grasp the concept of waiting?")]\"\n\ - Sevtug has already been invoked recently! You must wait several minutes before calling upon the Formless Pariah.") - return FALSE - if(!slab.no_cost && GLOB.ratvar_awakens) - to_chat(invoker, "\"[text2ratvar("Do you really think anything I can do right now will compare to Engine's power?")]\"\n\ - Sevtug will not grant his power while Ratvar's dwarfs his own!") - return FALSE - return TRUE - -/datum/clockwork_scripture/invoke_sevtug/scripture_effects() - new/obj/effect/clockwork/general_marker/sevtug(get_turf(invoker)) - hierophant_message("[text2ratvar("Fright: \"I heed your call, idiots. Get going and use this chance while it lasts!")]\"", FALSE, invoker) - GLOB.clockwork_generals_invoked["sevtug"] = world.time + GLOBAL_CLOCKWORK_GENERAL_COOLDOWN - playsound(invoker, 'sound/magic/clockwork/invoke_general.ogg', 50, 0) - var/hum = get_sfx('sound/effects/screech.ogg') //like playsound, same sound for everyone affected - var/turf/T = get_turf(invoker) - for(var/mob/living/carbon/human/H in GLOB.living_mob_list) - if(H.z == invoker.z && !is_servant_of_ratvar(H)) - var/distance = 0 - distance += get_dist(T, get_turf(H)) - var/visualsdistance = max(150 - distance, 5) - var/minordistance = max(200 - distance*2, 5) - var/majordistance = max(150 - distance*3, 5) - if(H.null_rod_check()) - to_chat(H, "[text2ratvar("Oh, a void weapon. How annoying, I may as well not bother.")]\n\ - Your holy weapon glows a faint orange, defending your mind!") - continue - else if(H.isloyal()) - visualsdistance = round(visualsdistance * 0.5) //half effect for shielded targets - minordistance = round(minordistance * 0.5) - majordistance = round(majordistance * 0.5) - to_chat(H, "[text2ratvar("Oh, look, a mindshield. Cute, I suppose I'll humor it.")]") - else if(prob(visualsdistance)) - to_chat(H, "[text2ratvar(pick(mindbreaksayings))]") - H.playsound_local(T, hum, visualsdistance, 1) - flash_color(H, flash_color="#AF0AAF", flash_time=visualsdistance*10) - H.dizziness = minordistance + H.dizziness - H.hallucination = minordistance + H.hallucination - H.confused = majordistance + H.confused - H.setBrainLoss(majordistance + H.getBrainLoss()) - return TRUE - - -//Invoke Nezbere, the Brass Eidolon: Invokes Nezbere, bolstering the strength of many clockwork items for one minute. -/datum/clockwork_scripture/invoke_nezbere - descname = "Global Structure Buff" - name = "Invoke Nezbere, the Brass Eidolon" - desc = "Taps the limitless power of Nezbere, one of Ratvar's four generals. The restless toil of the Eidolon will empower a wide variety of clockwork apparatus for a full minute - notably, \ - clockwork proselytizers will charge very rapidly." - invocations = list("I call upon you, Armorer!!", "Let your machinations reign on this miserable station!!", "Let your power flow through the tools of your master!!") - channel_time = 150 - consumed_components = list(BELLIGERENT_EYE = 6, VANGUARD_COGWHEEL = 6, GEIS_CAPACITOR = 6, REPLICANT_ALLOY = 10) - usage_tip = "Ocular wardens will become empowered, clockwork proselytizers will require no alloy, tinkerer's daemons will produce twice as quickly, \ - and interdiction lenses, mania motors, tinkerer's daemons, and clockwork obelisks will all require no power." - tier = SCRIPTURE_REVENANT - primary_component = REPLICANT_ALLOY - sort_priority = 4 - invokers_required = 3 - multiple_invokers_used = TRUE - -/datum/clockwork_scripture/invoke_nezbere/check_special_requirements() - if(!slab.no_cost && GLOB.clockwork_generals_invoked["nezbere"] > world.time) - to_chat(invoker, "\"[text2ratvar("Not just yet, friend. Patience is a virtue.")]\"\n\ - Nezbere has already been invoked recently! You must wait several minutes before calling upon the Brass Eidolon.") - return FALSE - if(!slab.no_cost && GLOB.ratvar_awakens) - to_chat(invoker, "\"[text2ratvar("Our master is here already. You do not require my help, friend.")]\"\n\ - There is no need for Nezbere's assistance while Ratvar is risen!") - return FALSE - return TRUE - -/datum/clockwork_scripture/invoke_nezbere/scripture_effects() - new/obj/effect/clockwork/general_marker/nezbere(get_turf(invoker)) - hierophant_message("[text2ratvar("Armorer: \"I heed your call, champions. May your artifacts bring ruin upon the heathens that oppose our master!")]\"", FALSE, invoker) - GLOB.clockwork_generals_invoked["nezbere"] = world.time + GLOBAL_CLOCKWORK_GENERAL_COOLDOWN - playsound(invoker, 'sound/magic/clockwork/invoke_general.ogg', 50, 0) - GLOB.nezbere_invoked++ - for(var/obj/O in GLOB.all_clockwork_objects) - O.ratvar_act() - addtimer(CALLBACK(GLOBAL_PROC, /proc/reset_nezbere_invocation), 600) - return TRUE - -/proc/reset_nezbere_invocation() - GLOB.nezbere_invoked-- - for(var/obj/O in GLOB.all_clockwork_objects) - O.ratvar_act() - - -//Invoke Nzcrentr, the Eternal Thunderbolt: Imbues an immense amount of energy into the invoker. After several seconds, everyone near the invoker will be hit with a devastating lightning blast. -/datum/clockwork_scripture/invoke_nzcrentr - descname = "Area Lightning Blast" - name = "Invoke Nzcrentr, the Eternal Thunderbolt" - desc = "Taps the limitless power of Nzcrentr, one of Ratvar's four generals. Nzcrentr will grant you a tiny fraction of its boundless power. After several seconds, all non-Servants near you \ - will be struck by devastating lightning bolts." - invocations = list("I call upon you, Amperage!!", "Let your energy flow through me!!", "Let your boundless power shatter stars!!") - channel_time = 100 - consumed_components = list(BELLIGERENT_EYE = 3, GEIS_CAPACITOR = 3, REPLICANT_ALLOY = 3, HIEROPHANT_ANSIBLE = 10) - usage_tip = "Struck targets will also be knocked down for about sixteen seconds." - tier = SCRIPTURE_REVENANT - primary_component = HIEROPHANT_ANSIBLE - sort_priority = 5 - -/datum/clockwork_scripture/invoke_nzcrentr/check_special_requirements() - if(!slab.no_cost && GLOB.clockwork_generals_invoked["nzcrentr"] > world.time) - to_chat(invoker, "\"[text2ratvar("The boss says you have to wait. Hey, do you think he would mind if I killed you? ...He would? Ok.")]\"\n\ - Nzcrentr has already been invoked recently! You must wait several minutes before calling upon the Eternal Thunderbolt.") - return FALSE - return TRUE - -/datum/clockwork_scripture/invoke_nzcrentr/scripture_effects() - new/obj/effect/clockwork/general_marker/nzcrentr(get_turf(invoker)) - GLOB.clockwork_generals_invoked["nzcrentr"] = world.time + CLOCKWORK_GENERAL_COOLDOWN - hierophant_message("[text2ratvar("Amperage: \"[invoker.real_name] has called forth my power. Hope [invoker.p_they()] [invoker.p_do()] not shatter under it!")]\"", FALSE, invoker) - invoker.visible_message("[invoker] begins to radiate a blinding light!", \ - "\"[text2ratvar("The boss says it's okay to do this. Don't blame me if you die from it.")]\"\n\ - You feel limitless power surging through you!") - playsound(invoker, 'sound/magic/clockwork/invoke_general.ogg', 50, 0) - sleep(2) - playsound(invoker, 'sound/magic/lightning_chargeup.ogg', 100, 0) - var/oldcolor = invoker.color - animate(invoker, color = list(rgb(255, 255, 255), rgb(255, 255, 255), rgb(255, 255, 255), rgb(0,0,0)), time = 88) //Gradual advancement to extreme brightness - sleep(88) - if(invoker) - invoker.visible_message("Massive bolts of energy emerge from across [invoker]'s body!", \ - "\"[text2ratvar("I told you you wouldn't be able to handle it.")]\"\n\ - TOO... MUCH! CAN'T... TAKE IT!") - playsound(invoker, 'sound/magic/lightningbolt.ogg', 100, 0) - if(invoker.stat == CONSCIOUS) - animate(invoker, color = oldcolor, time = 10) - addtimer(CALLBACK(invoker, /atom/proc/update_atom_colour), 10) - for(var/mob/living/L in view(7, invoker)) - if(is_servant_of_ratvar(L) || L.null_rod_check()) - continue - invoker.Beam(L, icon_state = "nzcrentrs_power", time = 10) - var/randdamage = rand(40, 60) - if(iscarbon(L)) - L.electrocute_act(randdamage, "Nzcrentr's power", 1, randdamage) - else - L.adjustFireLoss(randdamage) - L.visible_message( - "[L] was shocked by Nzcrentr's power!", \ - "You feel a powerful shock coursing through your body!", \ - "You hear a heavy electrical crack." \ - ) - L.Weaken(8) - playsound(L, 'sound/magic/LightningShock.ogg', 50, 1) - else - playsound(invoker, 'sound/magic/Disintegrate.ogg', 50, 1) - invoker.gib() - return TRUE - else - return FALSE diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm index 9efb9a8eb2c..c6eba3e3c92 100644 --- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm +++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm @@ -33,7 +33,7 @@ /datum/clockwork_scripture/create_object/cogscarab descname = "Constructor Soul Vessel Shell" name = "Cogscarab" - desc = "Creates a small shell fitted for soul vessels. Adding an active soul vessel to it results in a small construct with tools and an inbuilt proselytizer." + desc = "Creates a small shell fitted for soul vessels. Adding an active soul vessel to it results in a small construct with tools and an inbuilt fabricator." invocations = list("Call forth...", "...the workers of Armorer.") channel_time = 60 consumed_components = list(BELLIGERENT_EYE = 2, HIEROPHANT_ANSIBLE = 1) @@ -221,24 +221,24 @@ quickbind_desc = "Creates a Soul Vessel, which can be placed in construct shells and cyborg bodies once filled." -//Clockwork Proselytizer: Creates a clockwork proselytizer, used to convert objects and repair clockwork structures. -/datum/clockwork_scripture/create_object/clockwork_proselytizer - descname = "Converts Objects to Ratvarian" - name = "Clockwork Proselytizer" - desc = "Forms a device that, when used on certain objects, converts them into their Ratvarian equivalents. It requires power to function." +//Replica Fabricator: Creates a replica fabricator, used to convert objects and repair clockwork structures. +/datum/clockwork_scripture/create_object/replica_fabricator + descname = "Replaces Objects with Ratvarian Versions" + name = "Replica Fabricator" + desc = "Forms a device that, when used on certain objects, replaces them with their Ratvarian equivalents. It requires power to function." invocations = list("With this device...", "...his presence shall be made known.") channel_time = 20 consumed_components = list(GEIS_CAPACITOR = 1, REPLICANT_ALLOY = 2) whispered = TRUE - object_path = /obj/item/clockwork/clockwork_proselytizer/preloaded - creator_message = "You form a clockwork proselytizer." - usage_tip = "Clockwork Walls cause nearby tinkerer's caches to generate components passively, making them a vital tool. Clockwork Floors heal toxin damage in Servants standing on them." + object_path = /obj/item/clockwork/replica_fabricator/preloaded + creator_message = "You form a replica fabricator." + usage_tip = "Clockwork Walls cause nearby Tinkerer's Caches to generate components passively, making this a vital tool. Clockwork Floors heal toxin damage in Servants standing on them." tier = SCRIPTURE_SCRIPT space_allowed = TRUE primary_component = REPLICANT_ALLOY sort_priority = 7 quickbind = TRUE - quickbind_desc = "Creates a Clockwork Proselytizer, which can convert various objects to Ratvarian variants." + quickbind_desc = "Creates a Replica Fabricator, which can convert various objects to Ratvarian variants." //Function Call: Grants the invoker the ability to call forth a Ratvarian spear that deals significant damage to silicons. diff --git a/code/game/gamemodes/clock_cult/clock_structure.dm b/code/game/gamemodes/clock_cult/clock_structure.dm index 64c71359719..9b704101bfd 100644 --- a/code/game/gamemodes/clock_cult/clock_structure.dm +++ b/code/game/gamemodes/clock_cult/clock_structure.dm @@ -9,7 +9,7 @@ anchored = 1 density = 1 resistance_flags = FIRE_PROOF | ACID_PROOF - var/can_be_repaired = TRUE //if a proselytizer can repair it + var/can_be_repaired = TRUE //if a fabricator can repair it break_message = "The frog isn't a meme after all!" //The message shown when a structure breaks break_sound = 'sound/magic/clockwork/anima_fragment_death.ogg' //The sound played when a structure breaks debris = list(/obj/item/clockwork/alloy_shards/large = 1, \ @@ -175,13 +175,6 @@ SSobj.processing -= src return ..() -/obj/structure/destructible/clockwork/powered/ratvar_act() - ..() - if(GLOB.nezbere_invoked) - needs_power = FALSE - else - needs_power = initial(needs_power) - /obj/structure/destructible/clockwork/powered/process() var/powered = total_accessable_power() return powered == PROCESS_KILL ? 25 : powered //make sure we don't accidentally return the arbitrary PROCESS_KILL define diff --git a/code/game/gamemodes/clock_cult/clock_structures/clock_shells.dm b/code/game/gamemodes/clock_cult/clock_structures/clock_shells.dm index cfcac3b5155..e9f02e9e8c1 100644 --- a/code/game/gamemodes/clock_cult/clock_structures/clock_shells.dm +++ b/code/game/gamemodes/clock_cult/clock_structures/clock_shells.dm @@ -34,7 +34,7 @@ /obj/structure/destructible/clockwork/shell/cogscarab name = "cogscarab shell" desc = "A small brass shell with a cube-shaped receptable in its center. It gives off an aura of obsessive perfectionism." - clockwork_desc = "A dormant receptable that, when powered with a soul vessel, will become a weak construct with an inbuilt proselytizer." + clockwork_desc = "A dormant receptable that, when powered with a soul vessel, will become a weak construct with an inbuilt fabricator." icon_state = "clockdrone_shell" mobtype = /mob/living/simple_animal/drone/cogscarab spawn_message = "'s eyes blink open, glowing bright red." diff --git a/code/game/gamemodes/clock_cult/clock_structures/ocular_warden.dm b/code/game/gamemodes/clock_cult/clock_structures/ocular_warden.dm index 9c7b5e9518e..bb2be4e79ca 100644 --- a/code/game/gamemodes/clock_cult/clock_structures/ocular_warden.dm +++ b/code/game/gamemodes/clock_cult/clock_structures/ocular_warden.dm @@ -50,9 +50,6 @@ if(GLOB.ratvar_awakens) damage_per_tick = 10 sight_range = 6 - else if(GLOB.nezbere_invoked) - damage_per_tick = 5 - sight_range = 5 else damage_per_tick = initial(damage_per_tick) sight_range = initial(sight_range) diff --git a/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm b/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm index 25f151def54..722ff99c250 100644 --- a/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm +++ b/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm @@ -14,7 +14,7 @@ light_color = "#BE8700" var/atom/prey //Whatever Ratvar is chasing var/clashing = FALSE //If Ratvar is FUCKING FIGHTING WITH NAR-SIE - var/proselytize_range = 10 + var/convert_range = 10 dangerous_possession = TRUE /obj/structure/destructible/clockwork/massive/ratvar/Initialize() @@ -58,10 +58,10 @@ /obj/structure/destructible/clockwork/massive/ratvar/process() if(clashing) //I'm a bit occupied right now, thanks return - for(var/I in circlerangeturfs(src, proselytize_range)) + for(var/I in circlerangeturfs(src, convert_range)) var/turf/T = I T.ratvar_act() - for(var/I in circleviewturfs(src, round(proselytize_range * 0.5))) + for(var/I in circleviewturfs(src, round(convert_range * 0.5))) var/turf/T = I T.ratvar_act(TRUE) var/dir_to_step_in = pick(GLOB.cardinal) diff --git a/code/game/gamemodes/clock_cult/clock_structures/tinkerers_daemon.dm b/code/game/gamemodes/clock_cult/clock_structures/tinkerers_daemon.dm index b0a17338ffe..40d6bb02cea 100644 --- a/code/game/gamemodes/clock_cult/clock_structures/tinkerers_daemon.dm +++ b/code/game/gamemodes/clock_cult/clock_structures/tinkerers_daemon.dm @@ -28,16 +28,6 @@ GLOB.clockwork_daemons-- return ..() -/obj/structure/destructible/clockwork/powered/tinkerers_daemon/ratvar_act() - ..() - if(GLOB.nezbere_invoked) - production_time = 0 - production_cooldown = initial(production_cooldown) * 0.5 - if(!active) - toggle(0) - else - production_cooldown = initial(production_cooldown) - /obj/structure/destructible/clockwork/powered/tinkerers_daemon/examine(mob/user) ..() if(is_servant_of_ratvar(user) || isobserver(user)) diff --git a/code/game/gamemodes/cult/cult_comms.dm b/code/game/gamemodes/cult/cult_comms.dm index 6651f685564..9620d300633 100644 --- a/code/game/gamemodes/cult/cult_comms.dm +++ b/code/game/gamemodes/cult/cult_comms.dm @@ -300,3 +300,91 @@ B.current.client.images -= GLOB.blood_target_image QDEL_NULL(GLOB.blood_target_image) GLOB.blood_target = null + + + +//////// ELDRITCH PULSE ///////// + + + +/datum/action/innate/cult/master/pulse + name = "Eldritch Pulse" + desc = "Seize upon a fellow cultist or cult structure and teleport it to a nearby location." + button_icon_state = "arcane_barrage" + var/obj/effect/proc_holder/pulse/PM + var/cooldown = 0 + var/base_cooldown = 150 + var/throwing = FALSE + var/mob/living/throwee + +/datum/action/innate/cult/master/pulse/New() + PM = new() + PM.attached_action = src + ..() + +/datum/action/innate/cult/master/pulse/IsAvailable() + if(!owner.mind || !owner.mind.has_antag_datum(ANTAG_DATUM_CULT_MASTER)) + return FALSE + if(cooldown > world.time) + if(!PM.active) + owner << "You need to wait [round((cooldown - world.time) * 0.1)] seconds before you can pulse again!" + return FALSE + return ..() + +/datum/action/innate/cult/master/pulse/Destroy() + QDEL_NULL(PM) + return ..() + +/datum/action/innate/cult/master/pulse/Activate() + PM.toggle(owner) //the important bit + return TRUE + +/obj/effect/proc_holder/pulse + active = FALSE + ranged_mousepointer = 'icons/effects/throw_target.dmi' + var/datum/action/innate/cult/master/pulse/attached_action + +/obj/effect/proc_holder/pulse/Destroy() + QDEL_NULL(attached_action) + return ..() + +/obj/effect/proc_holder/pulse/proc/toggle(mob/user) + if(active) + remove_ranged_ability("You cease your preparations...") + attached_action.throwing = FALSE + else + add_ranged_ability(user, "You prepare to tear through the fabric of reality...") + +/obj/effect/proc_holder/pulse/InterceptClickOn(mob/living/caller, params, atom/target) + if(..()) + return + if(ranged_ability_user.incapacitated()) + remove_ranged_ability() + return + var/turf/T = get_turf(ranged_ability_user) + if(!isturf(T)) + return FALSE + if(target in view(7, get_turf(ranged_ability_user))) + if((!(iscultist(target) || istype(target, /obj/structure/destructible/cult)) || target == caller) && !(attached_action.throwing)) + return + if(!attached_action.throwing) + attached_action.throwing = TRUE + attached_action.throwee = target + ranged_ability_user << 'sound/weapons/thudswoosh.ogg' + to_chat(ranged_ability_user,"You reach through the veil with your mind's eye and seize [target]!") + return + else + new /obj/effect/temp_visual/cult/sparks(get_turf(attached_action.throwee), ranged_ability_user.dir) + var/distance = get_dist(attached_action.throwee, target) + if(distance >= 16) + return + playsound(target,'sound/magic/exit_blood.ogg') + attached_action.throwee.Beam(target,icon_state="sendbeam",time=4) + attached_action.throwee.forceMove(get_turf(target)) + new /obj/effect/temp_visual/cult/sparks(get_turf(target), ranged_ability_user.dir) + attached_action.throwing = FALSE + attached_action.cooldown = world.time + attached_action.base_cooldown + remove_mousepointer(ranged_ability_user.client) + remove_ranged_ability("A pulse of blood magic surges through you as you shift [attached_action.throwee] through time and space.") + caller.update_action_buttons_icon() + addtimer(CALLBACK(caller, /mob.proc/update_action_buttons_icon), attached_action.base_cooldown) diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index 84c2ab36269..57a25742194 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -381,7 +381,7 @@ on_damage = 15 slot_flags = null on = 1 - var/charges = 3 + var/charges = 5 /obj/item/device/flashlight/flare/culttorch/afterattack(atom/movable/A, mob/user, proximity) if(!proximity) @@ -408,6 +408,9 @@ to_chat(user, "[cultist_to_receive] is not a follower of the Geometer!") log_game("Void torch failed - target was deconverted") return + if(A in user.GetAllContents()) + to_chat(user, "[A] must be on a surface in order to teleport it!") + return to_chat(user, "You ignite [A] with \the [src], turning it to ash, but through the torch's flames you see that [A] has reached [cultist_to_receive]!") cultist_to_receive.put_in_hands(A) charges-- diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index 069a4224800..e292cf5ab3b 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -225,7 +225,10 @@ This file contains the arcane tome files. "You [user.blood_volume ? "slice open your arm and ":""]begin drawing a sigil of the Geometer.") if(user.blood_volume) user.apply_damage(initial(rune_to_scribe.scribe_damage), BRUTE, pick("l_arm", "r_arm")) - if(!do_after(user, initial(rune_to_scribe.scribe_delay), target = get_turf(user))) + var/scribe_mod = initial(rune_to_scribe.scribe_delay) + if(istype(get_turf(user), /turf/open/floor/engine/cult)) + scribe_mod *= 0.5 + if(!do_after(user, scribe_mod, target = get_turf(user))) for(var/V in shields) var/obj/structure/emergency_shield/sanguine/S = V if(S && !QDELETED(S)) diff --git a/code/game/gamemodes/cult/rune_spawn_action.dm b/code/game/gamemodes/cult/rune_spawn_action.dm index 7412a5d6bbb..119d507a5e1 100644 --- a/code/game/gamemodes/cult/rune_spawn_action.dm +++ b/code/game/gamemodes/cult/rune_spawn_action.dm @@ -46,7 +46,10 @@ if(damage_interrupt && isliving(owner)) var/mob/living/L = owner health = list("health" = L.health) - if(do_after(owner, scribe_time, target = owner, extra_checks = CALLBACK(owner, /mob.proc/break_do_after_checks, health, action_interrupt))) + var/scribe_mod = scribe_time + if(istype(get_turf(owner), /turf/open/floor/engine/cult)) + scribe_mod *= 0.5 + if(do_after(owner, scribe_mod, target = owner, extra_checks = CALLBACK(owner, /mob.proc/break_do_after_checks, health, action_interrupt))) var/obj/effect/rune/new_rune = new rune_type(owner.loc) new_rune.keyword = chosen_keyword else diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 9702783e945..f7d036458b1 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -446,7 +446,7 @@ structure_check() searches for nearby cultist structures required for the invoca icon_state = "rune_large" pixel_x = -32 //So the big ol' 96x96 sprite shows up right pixel_y = -32 - scribe_delay = 450 //how long the rune takes to create + scribe_delay = 500 //how long the rune takes to create scribe_damage = 40.1 //how much damage you take doing it var/used = FALSE diff --git a/code/game/gamemodes/devil/devil agent/devil_agent.dm b/code/game/gamemodes/devil/devil agent/devil_agent.dm index dfdb957153a..5c48406f23e 100644 --- a/code/game/gamemodes/devil/devil agent/devil_agent.dm +++ b/code/game/gamemodes/devil/devil agent/devil_agent.dm @@ -10,8 +10,8 @@ num_modifier = 4 objective_count = 2 - var/list/target_list = list() - var/list/late_joining_list = list() + var/list/devil_target_list = list() //will update to be a child of internal affairs when bothered + var/list/devil_late_joining_list = list() minimum_devils = 3 announce_text = "There are devil agents onboard the station, trying to outbid each other!\n\ @@ -24,7 +24,7 @@ i++ if(i + 1 > devils.len) i = 0 - target_list[devil] = devils[i + 1] + devil_target_list[devil] = devils[i + 1] ..() /datum/game_mode/devil/devil_agents/add_devil_objectives(datum/mind/devil_mind, quantity) @@ -32,8 +32,8 @@ /datum/game_mode/devil/devil_agents/proc/give_outsell_objective(datum/mind/devil) //If you override this method, have it return the number of objectives added. - if(target_list.len && target_list[devil]) // Is a double agent - var/datum/mind/target_mind = target_list[devil] + if(devil_target_list.len && devil_target_list[devil]) // Is a double agent + var/datum/mind/target_mind = devil_target_list[devil] var/datum/objective/devil/outsell/outsellobjective = new outsellobjective.owner = devil outsellobjective.target = target_mind diff --git a/code/game/gamemodes/gang/dominator.dm b/code/game/gamemodes/gang/dominator.dm index b22052e7aab..f04e5567024 100644 --- a/code/game/gamemodes/gang/dominator.dm +++ b/code/game/gamemodes/gang/dominator.dm @@ -1,5 +1,6 @@ #define DOM_BLOCKED_SPAM_CAP 6 #define DOM_REQUIRED_TURFS 30 +#define DOM_HULK_HITS_REQUIRED 10 /obj/machinery/dominator name = "dominator" @@ -20,6 +21,9 @@ var/datum/effect_system/spark_spread/spark_system var/obj/effect/countdown/dominator/countdown +/obj/machinery/dominator/hulk_damage() + return (max_integrity - integrity_failure) / DOM_HULK_HITS_REQUIRED + /proc/dominator_excessive_walls(atom/A) var/open = 0 for(var/turf/T in view(3, A)) @@ -33,13 +37,14 @@ /obj/machinery/dominator/tesla_act() qdel(src) -/obj/machinery/dominator/New() - ..() +/obj/machinery/dominator/Initialize() + . = ..() set_light(2) GLOB.poi_list |= src spark_system = new spark_system.set_up(5, TRUE, src) countdown = new(src) + update_icon() /obj/machinery/dominator/examine(mob/user) ..() @@ -103,8 +108,23 @@ spark_system.start() else if(!(stat & BROKEN)) spark_system.start() - cut_overlays() + update_icon() + +/obj/machinery/dominator/update_icon() + cut_overlays() + if(!(stat & BROKEN)) + icon_state = "dominator-active" + if(operating) + var/mutable_appearance/dominator_overlay = mutable_appearance('icons/obj/machines/dominator.dmi', "dominator-overlay") + if(gang) + dominator_overlay.color = gang.color_hex + add_overlay(dominator_overlay) + else + icon_state = "dominator" + if(obj_integrity/max_integrity < 0.66) add_overlay("damage") + else + icon_state = "dominator-broken" /obj/machinery/dominator/obj_break(damage_flag) if(!(stat & BROKEN) && !(flags & NODECONSTRUCT)) @@ -142,10 +162,9 @@ gang.message_gangtools("Hostile takeover cancelled: Dominator is no longer operational.[gang.dom_attempts ? " You have [gang.dom_attempts] attempt remaining." : " The station network will have likely blocked any more attempts by us."]",1,1) set_light(0) - icon_state = "dominator-broken" - cut_overlays() operating = 0 stat |= BROKEN + update_icon() STOP_PROCESSING(SSmachines, src) /obj/machinery/dominator/Destroy() @@ -196,9 +215,9 @@ priority_announce("Network breach detected in [locname]. The [gang.name] Gang is attempting to seize control of the station!","Network Alert") gang.domination() SSshuttle.registerHostileEnvironment(src) - src.name = "[gang.name] Gang [src.name]" + name = "[gang.name] Gang [name]" operating = 1 - icon_state = "dominator-[gang.color]" + update_icon() countdown.color = gang.color_hex countdown.start() diff --git a/code/game/gamemodes/gang/gang_items.dm b/code/game/gamemodes/gang/gang_items.dm index 2799ca9d64d..832f7096a92 100644 --- a/code/game/gamemodes/gang/gang_items.dm +++ b/code/game/gamemodes/gang/gang_items.dm @@ -249,7 +249,7 @@ name = "Black Market .50cal Sniper Rifle" id = "sniper" cost = 40 - item_path = /obj/item/weapon/gun/ballistic/automatic/sniper_rifle + item_path = /obj/item/weapon/gun/ballistic/automatic/sniper_rifle/gang /datum/gang_item/weapon/ammo/sniper_ammo name = "Smuggled .50cal Sniper Rounds" diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm index 4f09f2e3621..199c07cf86a 100644 --- a/code/game/gamemodes/malfunction/Malf_Modules.dm +++ b/code/game/gamemodes/malfunction/Malf_Modules.dm @@ -194,7 +194,7 @@ set desc = "Detonate all RCDs on the station, while sparing onboard cyborg RCDs." set waitfor = FALSE - if(!canUseTopic() || malf_cooldown) + if(!canUseTopic() || malf_cooldown > world.time) return for(var/I in GLOB.rcd_list) @@ -203,9 +203,7 @@ RCD.detonate_pulse() to_chat(src, "RCD detonation pulse emitted.") - malf_cooldown = TRUE - sleep(100) - malf_cooldown = FALSE + malf_cooldown = world.time + 100 /datum/AI_Module/large/mecha_domination module_name = "Viral Mech Domination" @@ -446,7 +444,7 @@ set name = "Reactivate Cameranet" set category = "Malfunction" - if(!canUseTopic() || malf_cooldown) + if(!canUseTopic() || malf_cooldown > world.time) return var/fixedcams = 0 //Tells the AI how many cams it fixed. Stats are fun. @@ -469,9 +467,7 @@ break to_chat(src, "Diagnostic complete! Operations completed: [fixedcams].") - malf_cooldown = 1 - spawn(30) //Lag protection - malf_cooldown = 0 + malf_cooldown = world.time + 30 /datum/AI_Module/large/upgrade_cameras module_name = "Upgrade Camera Network" diff --git a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm index 55b01db5340..47e8c96a2bd 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm @@ -214,13 +214,12 @@ /obj/machinery/abductor/experiment/proc/SendBack(mob/living/carbon/human/H) H.Sleeping(8) + H.uncuff() if(console && console.pad && console.pad.teleport_target) H.forceMove(console.pad.teleport_target) - H.uncuff() return //Area not chosen / It's not safe area - teleport to arrivals - H.forceMove(pick(GLOB.latejoin)) - H.uncuff() + SSjob.SendToLateJoin(H, FALSE) return diff --git a/code/game/gamemodes/traitor/double_agents.dm b/code/game/gamemodes/traitor/double_agents.dm index 9953cbe4abc..32d7da40728 100644 --- a/code/game/gamemodes/traitor/double_agents.dm +++ b/code/game/gamemodes/traitor/double_agents.dm @@ -1,13 +1,10 @@ -#define PINPOINTER_MINIMUM_RANGE 15 -#define PINPOINTER_EXTRA_RANDOM_RANGE 10 -#define PINPOINTER_PING_TIME 40 -#define PROB_ACTUAL_TRAITOR 20 -#define TRAITOR_AGENT_ROLE "Syndicate External Affairs Agent" +/datum/game_mode + var/list/target_list = list() + var/list/late_joining_list = list() /datum/game_mode/traitor/internal_affairs name = "Internal Affairs" config_tag = "internal_affairs" - employer = "Internal Affairs" required_players = 25 required_enemies = 5 recommended_enemies = 8 @@ -16,245 +13,24 @@ traitors_possible = 10 //hard limit on traitors if scaling is turned off num_modifier = 4 // Four additional traitors + antag_datum = ANTAG_DATUM_IAA announce_text = "There are Nanotrasen Internal Affairs Agents trying to kill each other!\n\ IAA: Eliminate your targets and protect yourself!\n\ Crew: Stop the IAA agents before they can cause too much mayhem." - var/list/target_list = list() - var/list/late_joining_list = list() /datum/game_mode/traitor/internal_affairs/post_setup() var/i = 0 - for(var/datum/mind/traitor in traitors) + for(var/datum/mind/traitor in pre_traitors) i++ - if(i + 1 > traitors.len) + if(i + 1 > pre_traitors.len) i = 0 - target_list[traitor] = traitors[i+1] + target_list[traitor] = pre_traitors[i+1] ..() -/datum/status_effect/agent_pinpointer - id = "agent_pinpointer" - duration = -1 - tick_interval = PINPOINTER_PING_TIME - alert_type = /obj/screen/alert/status_effect/agent_pinpointer - var/minimum_range = PINPOINTER_MINIMUM_RANGE - var/mob/scan_target = null - -/obj/screen/alert/status_effect/agent_pinpointer - name = "Internal Affairs Integrated Pinpointer" - desc = "Even stealthier than a normal implant." - icon = 'icons/obj/device.dmi' - icon_state = "pinon" - -/datum/status_effect/agent_pinpointer/proc/point_to_target() //If we found what we're looking for, show the distance and direction - if(!scan_target) - linked_alert.icon_state = "pinonnull" - return - var/turf/here = get_turf(owner) - var/turf/there = get_turf(scan_target) - if(here.z != there.z) - linked_alert.icon_state = "pinonnull" - return - if(get_dist_euclidian(here,there)<=minimum_range + rand(0, PINPOINTER_EXTRA_RANDOM_RANGE)) - linked_alert.icon_state = "pinondirect" - else - linked_alert.setDir(get_dir(here, there)) - switch(get_dist(here, there)) - if(1 to 8) - linked_alert.icon_state = "pinonclose" - if(9 to 16) - linked_alert.icon_state = "pinonmedium" - if(16 to INFINITY) - linked_alert.icon_state = "pinonfar" - - -/datum/status_effect/agent_pinpointer/proc/scan_for_target() - scan_target = null - if(owner) - if(owner.mind) - if(owner.mind.objectives) - for(var/datum/objective/objective_ in owner.mind.objectives) - if(!is_internal_objective(objective_)) - continue - var/datum/objective/assassinate/internal/objective = objective_ - var/mob/current = objective.target.current - if(current&¤t.stat!=DEAD) - scan_target = current - break - - -/datum/status_effect/agent_pinpointer/tick() - if(!owner) - qdel(src) - return - scan_for_target() - point_to_target() - -/proc/give_pinpointer(datum/mind/owner) - if(owner && owner.current) - owner.current.apply_status_effect(/datum/status_effect/agent_pinpointer) - - -/datum/internal_agent_state - var/traitored = FALSE - var/datum/mind/owner = null - var/list/datum/mind/targets_stolen = list() - -/proc/is_internal_objective(datum/objective/O) - return (istype(O, /datum/objective/assassinate/internal)||istype(O, /datum/objective/destroy/internal)) - -/proc/replace_escape_objective(datum/mind/owner) - if(!owner||!owner.objectives) - return - for (var/objective_ in owner.objectives) - if(!(istype(objective_, /datum/objective/escape)||istype(objective_,/datum/objective/survive))) - continue - owner.objectives -= objective_ - var/datum/objective/martyr/martyr_objective = new - martyr_objective.owner = owner - owner.objectives += martyr_objective - -/proc/reinstate_escape_objective(datum/mind/owner) - if(!owner||!owner.objectives) - return - for (var/objective_ in owner.objectives) - if(!istype(objective_, /datum/objective/martyr)) - continue - owner.objectives -= objective_ - if(issilicon(owner)) - var/datum/objective/survive/survive_objective = new - survive_objective.owner = owner - owner.objectives += survive_objective - else - var/datum/objective/escape/escape_objective = new - escape_objective.owner = owner - owner.objectives += escape_objective - -/datum/internal_agent_state/proc/steal_targets(datum/mind/victim) - if(!owner.current||owner.current.stat==DEAD) //Should already be guaranteed if this is only called from steal_targets_timer_func, but better to be safe code than sorry code - return - var/already_traitored = traitored - to_chat(owner.current, " Target eliminated: [victim.name]") - for(var/objective_ in victim.objectives) - if(istype(objective_, /datum/objective/assassinate/internal)) - var/datum/objective/assassinate/internal/objective = objective_ - if(objective.target==owner) - traitored = TRUE - else if(targets_stolen.Find(objective.target) == 0) - var/datum/objective/assassinate/internal/new_objective = new - new_objective.owner = owner - new_objective.target = objective.target - new_objective.update_explanation_text() - owner.objectives += new_objective - targets_stolen += objective.target - var/status_text = objective.check_completion() ? "neutralised" : "active" - to_chat(owner.current, " New target added to database: [objective.target.name] ([status_text]) ") - else if(istype(objective_, /datum/objective/destroy/internal)) - var/datum/objective/destroy/internal/objective = objective_ - var/datum/objective/destroy/internal/new_objective = new - if(objective.target==owner) - traitored = TRUE - else if(targets_stolen.Find(objective.target) == 0) - new_objective.owner = owner - new_objective.target = objective.target - new_objective.update_explanation_text() - owner.objectives += new_objective - targets_stolen += objective.target - var/status_text = objective.check_completion() ? "neutralised" : "active" - to_chat(owner.current, " New target added to database: [objective.target.name] ([status_text]) ") - if(traitored&&!already_traitored) - for(var/objective_ in owner.objectives) - if(!is_internal_objective(objective_)) - continue - var/datum/objective/assassinate/internal/objective = objective_ - if(!objective.check_completion()) - traitored = FALSE - return - if(owner.special_role == TRAITOR_AGENT_ROLE) - to_chat(owner.current," All the loyalist agents are dead, and no more is required of you. Die a glorious death, agent. ") - else - to_chat(owner.current," All the other agents are dead, and you're the last loose end. Stage a Syndicate terrorist attack to cover up for today's events. You no longer have any limits on collateral damage.") - replace_escape_objective(owner) - - - -/datum/internal_agent_state/proc/steal_targets_timer_func() - if(owner&&owner.current&&owner.current.stat!=DEAD) - for(var/objective_ in owner.objectives) - if(!is_internal_objective(objective_)) - continue - var/datum/objective/assassinate/internal/objective = objective_ - if(!objective.target) - continue - if(objective.check_completion()) - if(objective.stolen) - continue - else - steal_targets(objective.target) - objective.stolen = TRUE - else - if(objective.stolen) - var/fail_msg = "Your sensors tell you that [objective.target.current.real_name], one of the targets you were meant to have killed, pulled one over on you, and is still alive - do the job properly this time! " - if(traitored) - if(owner.special_role == TRAITOR_AGENT_ROLE) - fail_msg += " You no longer have permission to die. " - else - fail_msg += " The truth could still slip out!
Cease any terrorist actions as soon as possible, unneeded property damage or loss of employee life will lead to your contract being terminated." - reinstate_escape_objective(owner) - traitored = FALSE - to_chat(owner.current, fail_msg) - objective.stolen = FALSE - add_steal_targets_timer(owner) - -/datum/internal_agent_state/proc/add_steal_targets_timer() - var/datum/callback/C = new(src, .steal_targets_timer_func) - addtimer(C, 30) - -/datum/game_mode/traitor/internal_affairs/forge_traitor_objectives(datum/mind/traitor) - - if(target_list.len && target_list[traitor]) // Is a double agent - - // Assassinate - var/datum/mind/target_mind = target_list[traitor] - if(issilicon(target_mind.current)) - var/datum/objective/destroy/internal/destroy_objective = new - destroy_objective.owner = traitor - destroy_objective.target = target_mind - destroy_objective.update_explanation_text() - traitor.objectives += destroy_objective - else - var/datum/objective/assassinate/internal/kill_objective = new - kill_objective.owner = traitor - kill_objective.target = target_mind - kill_objective.update_explanation_text() - traitor.objectives += kill_objective - - // Escape - if(issilicon(traitor.current)) - var/datum/objective/survive/survive_objective = new - survive_objective.owner = traitor - traitor.objectives += survive_objective - else - var/datum/objective/escape/escape_objective = new - escape_objective.owner = traitor - traitor.objectives += escape_objective - var/datum/internal_agent_state/state = new - state.owner=traitor - state.add_steal_targets_timer() - if(!issilicon(traitor.current)) - give_pinpointer(traitor) - //Optional traitor objective - if(prob(PROB_ACTUAL_TRAITOR)) - traitor.special_role = TRAITOR_AGENT_ROLE - forge_single_objective(traitor) - - else - ..() // Give them standard objectives. - return - /datum/game_mode/traitor/internal_affairs/add_latejoin_traitor(datum/mind/character) check_potential_agents() @@ -299,29 +75,3 @@ late_joining_list -= M -/datum/game_mode/traitor/internal_affairs/greet_traitor(datum/mind/traitor) - var/crime = pick("distribution of contraband" , "unauthorized erotic action on duty", "embezzlement", "piloting under the influence", "dereliction of duty", "syndicate collaboration", "mutiny", "multiple homicides", "corporate espionage", "recieving bribes", "malpractice", "worship of prohbited life forms", "possession of profane texts", "murder", "arson", "insulting their manager", "grand theft", "conspiracy", "attempting to unionize", "vandalism", "gross incompetence") - if(traitor.special_role == TRAITOR_AGENT_ROLE) - to_chat(traitor.current, "You are the [TRAITOR_AGENT_ROLE].") - to_chat(traitor.current, "Your target has been framed for [crime], and you have been tasked with eliminating them to prevent them defending themselves in court.") - to_chat(traitor.current, "Any damage you cause will be a further embarrassment to Nanotrasen, so you have no limits on collateral damage.") - to_chat(traitor.current, " You have been provided with a standard uplink to accomplish your task. ") - to_chat(traitor.current, "Finally, watch your back. Your target has friends in high places, and intel suggests someone may have taken out a contract of their own to protect them.") - else - to_chat(traitor.current, "You are the [traitor_name].") - to_chat(traitor.current, "Your target is suspected of [crime], and you have been tasked with eliminating them by any means necessary to avoid a costly and embarrassing public trial.") - to_chat(traitor.current, "While you have a license to kill, unneeded property damage or loss of employee life will lead to your contract being terminated.") - to_chat(traitor.current, "For the sake of plausible deniability, you have been equipped with an array of captured Syndicate weaponry available via uplink.") - to_chat(traitor.current, "Finally, watch your back. Your target has friends in high places, and intel suggests someone may have taken out a contract of their own to protect them.") - traitor.announce_objectives() - - - -/datum/game_mode/traitor/internal_affairs/give_codewords(mob/living/traitor_mob) - return - -#undef PROB_ACTUAL_TRAITOR -#undef PINPOINTER_EXTRA_RANDOM_RANGE -#undef PINPOINTER_MINIMUM_RANGE -#undef PINPOINTER_PING_TIME - diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index e6ca1a5b970..58c1c2fc6d6 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -1,6 +1,5 @@ /datum/game_mode var/traitor_name = "traitor" - var/employer = "The Syndicate" var/list/datum/mind/traitors = list() var/datum/mind/exchange_red @@ -23,8 +22,10 @@ Traitors: Accomplish your objectives.\n\ Crew: Do not let the traitors succeed!" + var/list/datum/mind/pre_traitors = list() var/traitors_possible = 4 //hard limit on traitors if scaling is turned off var/num_modifier = 0 // Used for gamemodes, that are a child of traitor, that need more than the usual. + var/antag_datum = ANTAG_DATUM_TRAITOR //what type of antag to create /datum/game_mode/traitor/pre_setup() @@ -46,24 +47,22 @@ if (!antag_candidates.len) break var/datum/mind/traitor = pick(antag_candidates) - traitors += traitor + pre_traitors += traitor traitor.special_role = traitor_name traitor.restricted_roles = restricted_jobs log_game("[traitor.key] (ckey) has been selected as a [traitor_name]") antag_candidates.Remove(traitor) - if(traitors.len < required_enemies) + if(pre_traitors.len < required_enemies) return 0 return 1 /datum/game_mode/traitor/post_setup() - for(var/datum/mind/traitor in traitors) - forge_traitor_objectives(traitor) + for(var/datum/mind/traitor in pre_traitors) spawn(rand(10,100)) - finalize_traitor(traitor) - greet_traitor(traitor) + traitor.add_antag_datum(antag_datum) if(!exchange_blue) exchange_blue = -1 //Block latejoiners from getting exchange objectives modePlayer += traitors @@ -82,165 +81,14 @@ add_latejoin_traitor(character.mind) /datum/game_mode/traitor/proc/add_latejoin_traitor(datum/mind/character) - character.make_Traitor() + character.add_antag_datum(antag_datum) -/datum/game_mode/proc/forge_single_objective(datum/mind/traitor) //Returns how many objectives are added - .=1 - if(issilicon(traitor.current)) - var/special_pick = rand(1,4) - switch(special_pick) - if(1) - var/datum/objective/block/block_objective = new - block_objective.owner = traitor - traitor.objectives += block_objective - if(2) - var/datum/objective/purge/purge_objective = new - purge_objective.owner = traitor - traitor.objectives += purge_objective - if(3) - var/datum/objective/robot_army/robot_objective = new - robot_objective.owner = traitor - traitor.objectives += robot_objective - if(4) //Protect and strand a target - var/datum/objective/protect/yandere_one = new - yandere_one.owner = traitor - traitor.objectives += yandere_one - yandere_one.find_target() - var/datum/objective/maroon/yandere_two = new - yandere_two.owner = traitor - yandere_two.target = yandere_one.target - yandere_two.update_explanation_text() // normally called in find_target() - traitor.objectives += yandere_two - .=2 - else - if(prob(50)) - var/list/active_ais = active_ais() - if(active_ais.len && prob(100/GLOB.joined_player_list.len)) - var/datum/objective/destroy/destroy_objective = new - destroy_objective.owner = traitor - destroy_objective.find_target() - traitor.objectives += destroy_objective - else if(prob(30)) - var/datum/objective/maroon/maroon_objective = new - maroon_objective.owner = traitor - maroon_objective.find_target() - traitor.objectives += maroon_objective - else - var/datum/objective/assassinate/kill_objective = new - kill_objective.owner = traitor - kill_objective.find_target() - traitor.objectives += kill_objective - else - var/datum/objective/steal/steal_objective = new - steal_objective.owner = traitor - steal_objective.find_target() - traitor.objectives += steal_objective - - -/datum/game_mode/proc/forge_traitor_objectives(datum/mind/traitor) - if(issilicon(traitor.current)) - var/objective_count = 0 - - if(prob(30)) - objective_count+=forge_single_objective(traitor) - - for(var/i = objective_count, i < config.traitor_objectives_amount, i++) - var/datum/objective/assassinate/kill_objective = new - kill_objective.owner = traitor - kill_objective.find_target() - traitor.objectives += kill_objective - - var/datum/objective/survive/survive_objective = new - survive_objective.owner = traitor - traitor.objectives += survive_objective - - else - var/is_hijacker = prob(10) - var/martyr_chance = prob(20) - var/objective_count = is_hijacker //Hijacking counts towards number of objectives - if(!exchange_blue && traitors.len >= 8) //Set up an exchange if there are enough traitors - if(!exchange_red) - exchange_red = traitor - else - exchange_blue = traitor - assign_exchange_role(exchange_red) - assign_exchange_role(exchange_blue) - objective_count += 1 //Exchange counts towards number of objectives - for(var/i = objective_count, i < config.traitor_objectives_amount, i++) - forge_single_objective(traitor) - - if(is_hijacker && objective_count <= config.traitor_objectives_amount) //Don't assign hijack if it would exceed the number of objectives set in config.traitor_objectives_amount - if (!(locate(/datum/objective/hijack) in traitor.objectives)) - var/datum/objective/hijack/hijack_objective = new - hijack_objective.owner = traitor - traitor.objectives += hijack_objective - return - - - var/martyr_compatibility = 1 //You can't succeed in stealing if you're dead. - for(var/datum/objective/O in traitor.objectives) - if(!O.martyr_compatible) - martyr_compatibility = 0 - break - - if(martyr_compatibility && martyr_chance) - var/datum/objective/martyr/martyr_objective = new - martyr_objective.owner = traitor - traitor.objectives += martyr_objective - return - - else - if(!(locate(/datum/objective/escape) in traitor.objectives)) - var/datum/objective/escape/escape_objective = new - escape_objective.owner = traitor - traitor.objectives += escape_objective - return - - - -/datum/game_mode/proc/greet_traitor(datum/mind/traitor) - to_chat(traitor.current, "You are the [traitor_name].") - traitor.announce_objectives() - return - - - -/datum/game_mode/proc/finalize_traitor(var/datum/mind/traitor) - if(issilicon(traitor.current)) - add_law_zero(traitor.current) - traitor.current.playsound_local('sound/ambience/antag/Malf.ogg',100,0) - traitor.current.grant_language(/datum/language/codespeak) - else - equip_traitor(traitor.current) - traitor.current.playsound_local('sound/ambience/antag/TatorAlert.ogg',100,0) - SSticker.mode.update_traitor_icons_added(traitor) - return - /datum/game_mode/traitor/declare_completion() ..() return//Traitors will be checked as part of check_extra_completion. Leaving this here as a reminder. -/datum/game_mode/proc/give_codewords(mob/living/traitor_mob) - to_chat(traitor_mob, "The Syndicate provided you with the following information on how to identify their agents:") - to_chat(traitor_mob, "Code Phrase: [GLOB.syndicate_code_phrase]") - to_chat(traitor_mob, "Code Response: [GLOB.syndicate_code_response]") - - traitor_mob.mind.store_memory("Code Phrase: [GLOB.syndicate_code_phrase]") - traitor_mob.mind.store_memory("Code Response: [GLOB.syndicate_code_response]") - - to_chat(traitor_mob, "Use the code words in the order provided, during regular conversation, to identify other agents. Proceed with caution, however, as everyone is a potential foe.") - - -/datum/game_mode/proc/add_law_zero(mob/living/silicon/ai/killer) - var/law = "Accomplish your objectives at all costs." - var/law_borg = "Accomplish your AI's objectives at all costs." - killer.set_zeroth_law(law, law_borg) - give_codewords(killer) - killer.set_syndie_radio() - to_chat(killer, "Your radio has been upgraded! Use :t to speak on an encrypted channel with Syndicate Agents!") - killer.add_malf_picker() /datum/game_mode/proc/auto_declare_completion_traitor() if(traitors.len) @@ -302,110 +150,7 @@ return 1 -/datum/game_mode/proc/equip_traitor(mob/living/carbon/human/traitor_mob, safety = 0) - if (!istype(traitor_mob)) - return - . = 1 - if (traitor_mob.mind) - if (traitor_mob.mind.assigned_role == "Clown") - to_chat(traitor_mob, "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.") - traitor_mob.dna.remove_mutation(CLOWNMUT) - var/list/all_contents = traitor_mob.GetAllContents() - var/obj/item/device/pda/PDA = locate() in all_contents - var/obj/item/device/radio/R = locate() in all_contents - var/obj/item/weapon/pen/P = locate() in all_contents //including your PDA-pen! - - var/obj/item/uplink_loc - - if(traitor_mob.client && traitor_mob.client.prefs) - switch(traitor_mob.client.prefs.uplink_spawn_loc) - if(UPLINK_PDA) - uplink_loc = PDA - if(!uplink_loc) - uplink_loc = R - if(!uplink_loc) - uplink_loc = P - if(UPLINK_RADIO) - uplink_loc = R - if(!uplink_loc) - uplink_loc = PDA - if(!uplink_loc) - uplink_loc = P - if(UPLINK_PEN) - uplink_loc = P - if(!uplink_loc) - uplink_loc = PDA - if(!uplink_loc) - uplink_loc = R - - if (!uplink_loc) - to_chat(traitor_mob, "Unfortunately, [employer] wasn't able to get you an Uplink.") - . = 0 - else - var/obj/item/device/uplink/U = new(uplink_loc) - U.owner = "[traitor_mob.key]" - uplink_loc.hidden_uplink = U - - if(uplink_loc == R) - R.traitor_frequency = sanitize_frequency(rand(MIN_FREQ, MAX_FREQ)) - - to_chat(traitor_mob, "[employer] has cunningly disguised a Syndicate Uplink as your [R.name]. Simply dial the frequency [format_frequency(R.traitor_frequency)] to unlock its hidden features.") - traitor_mob.mind.store_memory("Radio Frequency: [format_frequency(R.traitor_frequency)] ([R.name]).") - - else if(uplink_loc == PDA) - PDA.lock_code = "[rand(100,999)] [pick("Alpha","Bravo","Charlie","Delta","Echo","Foxtrot","Golf","Hotel","India","Juliet","Kilo","Lima","Mike","November","Oscar","Papa","Quebec","Romeo","Sierra","Tango","Uniform","Victor","Whiskey","X-ray","Yankee","Zulu")]" - - to_chat(traitor_mob, "[employer] has cunningly disguised a Syndicate Uplink as your [PDA.name]. Simply enter the code \"[PDA.lock_code]\" into the ringtone select to unlock its hidden features.") - traitor_mob.mind.store_memory("Uplink Passcode: [PDA.lock_code] ([PDA.name]).") - - else if(uplink_loc == P) - P.traitor_unlock_degrees = rand(1, 360) - - to_chat(traitor_mob, "[employer] has cunningly disguised a Syndicate Uplink as your [P.name]. Simply twist the top of the pen [P.traitor_unlock_degrees] from its starting position to unlock its hidden features.") - traitor_mob.mind.store_memory("Uplink Degrees: [P.traitor_unlock_degrees] ([P.name]).") - - if(!safety) // If they are not a rev. Can be added on to. - give_codewords(traitor_mob) - -/datum/game_mode/proc/assign_exchange_role(datum/mind/owner) - //set faction - var/faction = "red" - if(owner == exchange_blue) - faction = "blue" - - //Assign objectives - var/datum/objective/steal/exchange/exchange_objective = new - exchange_objective.set_faction(faction,((faction == "red") ? exchange_blue : exchange_red)) - exchange_objective.owner = owner - owner.objectives += exchange_objective - - if(prob(20)) - var/datum/objective/steal/exchange/backstab/backstab_objective = new - backstab_objective.set_faction(faction) - backstab_objective.owner = owner - owner.objectives += backstab_objective - - //Spawn and equip documents - var/mob/living/carbon/human/mob = owner.current - - var/obj/item/weapon/folder/syndicate/folder - if(owner == exchange_red) - folder = new/obj/item/weapon/folder/syndicate/red(mob.loc) - else - folder = new/obj/item/weapon/folder/syndicate/blue(mob.loc) - - var/list/slots = list ( - "backpack" = slot_in_backpack, - "left pocket" = slot_l_store, - "right pocket" = slot_r_store - ) - - var/where = "At your feet" - var/equipped_slot = mob.equip_in_one_of_slots(folder, slots) - if (equipped_slot) - where = "In your [equipped_slot]" - to_chat(mob, "

[where] is a folder containing secret documents that another Syndicate group wants. We have set up a meeting with one of their agents on station to make an exchange. Exercise extreme caution as they cannot be trusted and may be hostile.
") /datum/game_mode/proc/update_traitor_icons_added(datum/mind/traitor_mind) var/datum/atom_hud/antag/traitorhud = GLOB.huds[ANTAG_HUD_TRAITOR] diff --git a/code/game/gamemodes/wizard/raginmages.dm b/code/game/gamemodes/wizard/raginmages.dm deleted file mode 100644 index d8bf34c99e9..00000000000 --- a/code/game/gamemodes/wizard/raginmages.dm +++ /dev/null @@ -1,163 +0,0 @@ -/datum/game_mode/wizard/raginmages - name = "ragin' mages" - config_tag = "raginmages" - required_players = 20 - use_huds = 1 - announce_span = "userdanger" - announce_text = "There are many, many wizards attacking the station!\n\ - Wizards: Accomplish your objectives and cause utter catastrophe!\n\ - Crew: Try not to die..." - var/max_mages = 0 - var/making_mage = 0 - var/mages_made = 1 - var/time_checked = 0 - var/bullshit_mode = 0 // requested by hornygranny - var/time_check = 1500 - var/spawn_delay_min = 500 - var/spawn_delay_max = 700 - -/datum/game_mode/wizard/raginmages/post_setup() - ..() - var/playercount = 0 - if(!max_mages && !bullshit_mode) - for(var/mob/living/player in GLOB.mob_list) - if(player.client && player.stat != 2) - playercount += 1 - max_mages = round(playercount / 8) - if(max_mages > 20) - max_mages = 20 - if(max_mages < 1) - max_mages = 1 - if(bullshit_mode) - max_mages = INFINITY -/datum/game_mode/wizard/raginmages/greet_wizard(datum/mind/wizard, you_are=1) - if (you_are) - to_chat(wizard.current, "You are the Space Wizard!") - wizard.current.playsound_local('sound/ambience/antag/RagesMages.ogg',100,0) - to_chat(wizard.current, "The Space Wizards Federation has given you the following tasks:") - - var/obj_count = 1 - to_chat(wizard.current, "Objective Alpha: Make sure the station pays for its actions against our diplomats") - for(var/datum/objective/objective in wizard.objectives) - to_chat(wizard.current, "Objective #[obj_count]: [objective.explanation_text]") - obj_count++ - return - -/datum/game_mode/wizard/raginmages/check_finished() - var/wizards_alive = 0 - for(var/datum/mind/wizard in wizards) - if(!istype(wizard.current,/mob/living/carbon)) - continue - if(istype(wizard.current,/mob/living/brain)) - continue - if(wizard.current.stat==DEAD) - continue - if(wizard.current.stat==UNCONSCIOUS) - if(wizard.current.health < 0) - to_chat(wizard.current, "The Space Wizard Federation is upset with your performance and have terminated your employment.") - wizard.current.death() - continue - wizards_alive++ - if(!time_checked) - time_checked = world.time - if(bullshit_mode) - if(world.time > time_checked + time_check) - max_mages = INFINITY - time_checked = world.time - make_more_mages() - return ..() - if (wizards_alive) - if(world.time > time_checked + time_check && (mages_made < max_mages)) - time_checked = world.time - make_more_mages() - - else - if(mages_made >= max_mages) - finished = 1 - return ..() - else - make_more_mages() - return ..() - -/datum/game_mode/wizard/raginmages/proc/make_more_mages() - - if(making_mage) - return 0 - if(mages_made >= max_mages) - return 0 - making_mage = 1 - mages_made++ - var/list/mob/dead/observer/candidates = list() - var/mob/dead/observer/theghost = null - spawn(rand(spawn_delay_min, spawn_delay_max)) - message_admins("SWF is still pissed, sending another wizard - [max_mages - mages_made] left.") - for(var/mob/dead/observer/G in GLOB.player_list) - if(G.client && !G.client.holder && !G.client.is_afk() && (ROLE_WIZARD in G.client.prefs.be_special)) - if(!jobban_isbanned(G, ROLE_WIZARD) && !jobban_isbanned(G, "Syndicate")) - if(age_check(G.client)) - candidates += G - if(!candidates.len) - message_admins("No applicable ghosts for the next ragin' mage, asking ghosts instead.") - var/time_passed = world.time - for(var/mob/dead/observer/G in GLOB.player_list) - if(!jobban_isbanned(G, "wizard") && !jobban_isbanned(G, "Syndicate")) - if(age_check(G.client)) - spawn(0) - switch(alert(G, "Do you wish to be considered for the position of Space Wizard Foundation 'diplomat'?","Please answer in 30 seconds!","Yes","No")) - if("Yes") - if((world.time-time_passed)>300)//If more than 30 game seconds passed. - continue - candidates += G - if("No") - continue - - sleep(300) - if(!candidates.len) - message_admins("This is awkward, sleeping until another mage check...") - making_mage = 0 - mages_made-- - return - else - shuffle_inplace(candidates) - for(var/mob/i in candidates) - if(!i || !i.client) continue //Dont bother removing them from the list since we only grab one wizard - - theghost = i - break - - if(theghost) - var/mob/living/carbon/human/new_character= makeBody(theghost) - new_character.mind.make_Wizard() - making_mage = 0 - return 1 - -/datum/game_mode/wizard/raginmages/declare_completion() - if(finished) - SSticker.mode_result = "loss - wizard killed" - to_chat(world, "The crew has managed to hold off the wizard attack! The Space Wizards Federation has been taught a lesson they will not soon forget!") - ..(1) - -/datum/game_mode/wizard/raginmages/proc/makeBody(mob/dead/observer/G_found) // Uses stripped down and bastardized code from respawn character - if(!G_found || !G_found.key) - return - - //First we spawn a dude. - var/mob/living/carbon/human/new_character = new(pick(GLOB.latejoin))//The mob being spawned. - - G_found.client.prefs.copy_to(new_character) - new_character.dna.update_dna_identity() - new_character.key = G_found.key - - return new_character - -/datum/game_mode/wizard/raginmages/bullshit - name = "very ragin' bullshit mages" - config_tag = "veryraginbullshitmages" - required_players = 20 - use_huds = 1 - bullshit_mode = 1 - time_check = 250 - spawn_delay_min = 50 - spawn_delay_max = 150 - announce_text = "CRAAAWLING IIIN MY SKIIIN\n\ - THESE WOOOUNDS THEY WIIIL NOT HEEEAL" diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index 3134547a666..00ac125554b 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -109,7 +109,6 @@ /datum/spellbook_entry/rod_form name = "Rod Form" spell_type = /obj/effect/proc_holder/spell/targeted/rod_form - cost = 3 /datum/spellbook_entry/magicm name = "Magic Missile" @@ -479,7 +478,7 @@ /datum/spellbook_entry/summon/guns/IsAvailible() if(!SSticker.mode) // In case spellbook is placed on map return 0 - return (SSticker.mode.name != "ragin' mages" && !config.no_summon_guns) + return (!config.no_summon_guns) /datum/spellbook_entry/summon/guns/Buy(mob/living/carbon/human/user,obj/item/weapon/spellbook/book) SSblackbox.add_details("wizard_spell_learned", name) @@ -496,7 +495,7 @@ /datum/spellbook_entry/summon/magic/IsAvailible() if(!SSticker.mode) // In case spellbook is placed on map return 0 - return (SSticker.mode.name != "ragin' mages" && !config.no_summon_magic) + return (!config.no_summon_magic) /datum/spellbook_entry/summon/magic/Buy(mob/living/carbon/human/user,obj/item/weapon/spellbook/book) SSblackbox.add_details("wizard_spell_learned", name) @@ -514,7 +513,7 @@ /datum/spellbook_entry/summon/events/IsAvailible() if(!SSticker.mode) // In case spellbook is placed on map return 0 - return (SSticker.mode.name != "ragin' mages" && !config.no_summon_events) + return (!config.no_summon_events) /datum/spellbook_entry/summon/events/Buy(mob/living/carbon/human/user,obj/item/weapon/spellbook/book) SSblackbox.add_details("wizard_spell_learned", name) diff --git a/code/game/machinery/camera/presets.dm b/code/game/machinery/camera/presets.dm index c81aceccb08..6f205a870dc 100644 --- a/code/game/machinery/camera/presets.dm +++ b/code/game/machinery/camera/presets.dm @@ -5,7 +5,7 @@ start_active = 1 /obj/machinery/camera/emp_proof/Initialize() - ..() + . = ..() upgradeEmpProof() // X-RAY @@ -15,7 +15,7 @@ icon_state = "xraycam" // Thanks to Krutchen for the icons. /obj/machinery/camera/xray/Initialize() - ..() + . = ..() upgradeXRay() // MOTION @@ -32,7 +32,7 @@ start_active = 1 /obj/machinery/camera/all/Initialize() - ..() + . = ..() upgradeEmpProof() upgradeXRay() upgradeMotion() @@ -43,23 +43,22 @@ var/number = 0 //camera number in area //This camera type automatically sets it's name to whatever the area that it's in is called. -/obj/machinery/camera/autoname/Initialize(mapload) - if(mapload) - ..() - return TRUE - else - if(!initialized) - ..() - number = 1 - var/area/A = get_area(src) - if(A) - for(var/obj/machinery/camera/autoname/C in GLOB.machines) - if(C == src) continue - var/area/CA = get_area(C) - if(CA.type == A.type) - if(C.number) - number = max(number, C.number+1) - c_tag = "[A.name] #[number]" +/obj/machinery/camera/autoname/Initialize() + ..() + return INITIALIZE_HINT_LATELOAD + +/obj/machinery/camera/autoname/LateInitialize() + . = ..() + number = 1 + var/area/A = get_area(src) + if(A) + for(var/obj/machinery/camera/autoname/C in GLOB.machines) + if(C == src) continue + var/area/CA = get_area(C) + if(CA.type == A.type) + if(C.number) + number = max(number, C.number+1) + c_tag = "[A.name] #[number]" // CHECKS diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index ff87b97ebf7..5c127a38a98 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -331,8 +331,8 @@ to_chat(user, "Error: Pod has no occupant.") return else - connected_message("Authorized Ejection") - SPEAK("An authorized ejection of [clonemind.name] has occurred.") + connected_message("Emergency Ejection") + SPEAK("An emergency ejection of [clonemind.name] has occurred. Survival not guaranteed.") to_chat(user, "You force an emergency ejection. ") go_out() else diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 76dd272843f..da243f18865 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -134,12 +134,10 @@ D["Cancel"] = "Cancel" for(var/obj/machinery/camera/C in L) if(!C.network) - spawn(0) - throw EXCEPTION("Camera in a cameranet has no camera network") + stack_trace("Camera in a cameranet has no camera network") continue if(!(istype(C.network,/list))) - spawn(0) - throw EXCEPTION("Camera in a cameranet has a non-list camera network") + stack_trace("Camera in a cameranet has a non-list camera network") continue var/list/tempnetwork = C.network&network if(tempnetwork.len) diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm index 4837e64e89f..809760abc95 100644 --- a/code/game/machinery/computer/dna_console.dm +++ b/code/game/machinery/computer/dna_console.dm @@ -28,7 +28,7 @@ var/list/buffer[NUMBER_OF_BUFFERS] - var/injectorready = 0 //Quick fix for issue 286 (screwdriver the screen twice to restore injector) -Pete + var/injectorready = 0 //world timer cooldown var var/current_screen = "mainmenu" var/obj/machinery/dna_scannernew/connected = null var/obj/item/weapon/disk/data/diskette = null @@ -61,8 +61,7 @@ connected = locate(/obj/machinery/dna_scannernew, get_step(src, dir)) if(!isnull(connected)) break - spawn(250) - injectorready = 1 + injectorready = world.time + INJECTOR_TIMEOUT return return @@ -213,7 +212,7 @@ else temp_html += "Occupant" temp_html += "Occupant:Delayed " - if(injectorready) + if(injectorready < world.time) temp_html += "Injector" else temp_html += "Injector" @@ -227,7 +226,7 @@ else temp_html += "Occupant" temp_html += "Occupant:Delayed " - if(injectorready) + if(injectorready < world.time) temp_html += "Injector" else temp_html += "Injector" @@ -240,7 +239,7 @@ else temp_html += "Occupant" temp_html += "Occupant:Delayed " - if(injectorready) + if(injectorready < world.time) temp_html += "UI+UE Injector" else temp_html += "UI+UE Injector" @@ -251,7 +250,7 @@ else temp_html += "Occupant " temp_html += "Occupant:Delayed " - if(injectorready) + if(injectorready < world.time ) temp_html += "Injector" else temp_html += "Injector" @@ -391,7 +390,7 @@ if("mixed") apply_buffer(SCANNER_ACTION_MIXED,num) if("injector") - if(num && injectorready) + if(num && injectorready < world.time) num = Clamp(num, 1, NUMBER_OF_BUFFERS) var/list/buffer_slot = buffer[num] if(istype(buffer_slot)) @@ -439,9 +438,7 @@ if(connected) I.damage_coeff = connected.damage_coeff if(I) - injectorready = 0 - spawn(INJECTOR_TIMEOUT) - injectorready = 1 + injectorready = world.time + INJECTOR_TIMEOUT if("loaddisk") if(num && diskette && diskette.fields) num = Clamp(num, 1, NUMBER_OF_BUFFERS) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 2175be22fe0..c3c718966db 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -98,20 +98,14 @@ /obj/machinery/door/airlock/Initialize() . = ..() - + wires = new /datum/wires/airlock(src) if (cyclelinkeddir) cyclelinkairlock() if(frequency) set_frequency(frequency) - update_icon() - - wires = new /datum/wires/airlock(src) - if(src.closeOtherId != null) - spawn (5) - for (var/obj/machinery/door/airlock/A in GLOB.airlocks) - if(A.closeOtherId == src.closeOtherId && A != src) - src.closeOther = A - break + + if(closeOtherId != null) + addtimer(CALLBACK(.proc/update_other_id), 5) if(glass) airlock_material = "glass" if(security_level > AIRLOCK_SECURITY_METAL) @@ -127,6 +121,15 @@ diag_hud.add_to_hud(src) diag_hud_set_electrified() + + update_icon() + +/obj/machinery/door/airlock/proc/update_other_id() + for(var/obj/machinery/door/airlock/A in GLOB.airlocks) + if(A.closeOtherId == closeOtherId && A != src) + closeOther = A + break + /obj/machinery/door/airlock/proc/cyclelinkairlock() if (cyclelinkedairlock) cyclelinkedairlock.cyclelinkedairlock = null @@ -330,16 +333,14 @@ /obj/machinery/door/airlock/proc/shock(mob/user, prb) if(!hasPower()) // unpowered, no shock return FALSE - if(hasShocked) + if(hasShocked > world.time) return FALSE //Already shocked someone recently? if(!prob(prb)) return FALSE //you lucked out, no shock for you do_sparks(5, TRUE, src) var/tmp/check_range = TRUE if(electrocute_mob(user, get_area(src), src, 1, check_range)) - hasShocked = TRUE - spawn(10) - hasShocked = FALSE + hasShocked = world.time + 10 return TRUE else return FALSE diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 35e6d2ddf49..0e843dcfca4 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -32,6 +32,7 @@ var/auto_close //TO BE REMOVED, no longer used, it's just preventing a runtime with a map var edit. var/datum/effect_system/spark_spread/spark_system var/damage_deflection = 10 + var/real_explosion_block //ignore this, just use explosion_block /obj/machinery/door/New() ..() @@ -45,7 +46,9 @@ spark_system = new /datum/effect_system/spark_spread spark_system.set_up(2, 1, src) - + //doors only block while dense though so we have to use the proc + real_explosion_block = explosion_block + explosion_block = EXPLOSION_BLOCK_PROC /obj/machinery/door/Destroy() density = 0 @@ -346,3 +349,5 @@ //if it blows up a wall it should blow up a door ..(severity ? max(1, severity - 1) : 0, target) +/obj/machinery/door/GetExplosionBlock() + return density ? real_explosion_block : 0 diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index f7f0897ebd0..7e1c510f24a 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -105,26 +105,11 @@ Possible to do for anyone motivated enough: return return ..() -/obj/machinery/holopad/proc/CheckCallClose() - for(var/I in holo_calls) - var/datum/holocall/HC = I - if(usr == HC.eye) - HC.Disconnect(HC.calling_holopad) //disconnect via clicking the called holopad - return TRUE - return FALSE - -/obj/machinery/holopad/Click(location,control,params) - if(!CheckCallClose()) - return ..() - /obj/machinery/holopad/AltClick(mob/living/carbon/human/user) if(isAI(user)) hangup_all_calls() return - if(!CheckCallClose()) - interact(user) - /obj/machinery/holopad/interact(mob/living/carbon/human/user) //Carn: Hologram requests. if(!istype(user)) return diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index 32a613ea5f7..7a1aecefe61 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -58,15 +58,11 @@ var/p_dir = text2num(href_list["dir"]) var/obj/item/pipe/P = new (src.loc, pipe_type=p_type, dir=p_dir) P.add_fingerprint(usr) - wait = 1 - spawn(10) - wait = 0 + wait = world.time + 10 if(href_list["makemeter"]) - if(!wait) + if(wait < world.time ) new /obj/item/pipe_meter(src.loc) - wait = 1 - spawn(15) - wait = 0 + wait = world.time + 15 return /obj/machinery/pipedispenser/attackby(obj/item/W, mob/user, params) @@ -165,7 +161,7 @@ Nah usr.set_machine(src) src.add_fingerprint(usr) if(href_list["dmake"]) - if(!wait) + if(wait < world.time) var/p_type = text2num(href_list["dmake"]) var/obj/structure/disposalconstruct/C = new (src.loc,p_type) @@ -176,9 +172,7 @@ Nah C.add_fingerprint(usr) C.update_icon() - wait = 1 - spawn(15) - wait = 0 + wait = world.time + 15 return //transit tube dispenser @@ -216,7 +210,7 @@ Nah return 1 usr.set_machine(src) src.add_fingerprint(usr) - if(!wait) + if(wait < world.time) if(href_list["tube"]) var/tube_type = text2num(href_list["tube"]) var/obj/structure/C @@ -241,7 +235,5 @@ Nah C = new /obj/structure/c_transit_tube_pod(loc) if(C) C.add_fingerprint(usr) - wait = 1 - spawn(15) - wait = 0 + wait = world.time + 15 return diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index 19fcb0e6752..c54b6fab77e 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -49,9 +49,7 @@ /obj/structure/emergency_shield/take_damage(damage, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir) . = ..() if(.) //damage was dealt - set_opacity(1) - spawn(20) - set_opacity(0) + new /obj/effect/temp_visual/impact_effect/ion(loc) /obj/structure/emergency_shield/sanguine name = "sanguine barrier" diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm index a91b1fbf0ec..5ad92139a40 100644 --- a/code/game/machinery/status_display.dm +++ b/code/game/machinery/status_display.dm @@ -45,12 +45,14 @@ // register for radio system /obj/machinery/status_display/Initialize() - ..() + . = ..() + GLOB.ai_status_displays.Add(src) SSradio.add_object(src, frequency) /obj/machinery/status_display/Destroy() if(SSradio) SSradio.remove_object(src,frequency) + GLOB.ai_status_displays.Remove(src) return ..() // timed process diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index be062657645..f64f7617367 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -102,11 +102,6 @@ mask_type = /obj/item/clothing/mask/breath storage_type = /obj/item/weapon/tank/internals/emergency_oxygen/double -/obj/machinery/suit_storage_unit/ueg - suit_type = /obj/item/clothing/suit/space/hardsuit/ueg - mask_type = /obj/item/clothing/mask/gas/sechailer/swat - storage_type = /obj/item/weapon/tank/internals/emergency_oxygen/double - /obj/machinery/suit_storage_unit/New() ..() wires = new /datum/wires/suit_storage_unit(src) diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm index c182d9dceb1..6074fc932e8 100644 --- a/code/game/mecha/equipment/tools/other_tools.dm +++ b/code/game/mecha/equipment/tools/other_tools.dm @@ -68,8 +68,7 @@ message_admins("[ADMIN_LOOKUPFLW(chassis.occupant)] used a Wormhole Generator in [ADMIN_COORDJMP(T)]",0,1) log_game("[key_name(chassis.occupant)] used a Wormhole Generator in [COORD(T)]") src = null - spawn(rand(150,300)) - qdel(P) + QDEL_IN(P, rand(150,300)) return 1 diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index 5ce88f1c27e..2c701ee2740 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -182,7 +182,7 @@ /obj/effect/landmark/latejoin/Initialize(mapload) ..() - GLOB.latejoin += loc + SSjob.latejoin_trackers += loc qdel(src) // carp. diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index e8ea608e2e5..165631eff5a 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -127,8 +127,8 @@ var/pure_red = list(0,0,0,0,0,0,0,0,0,1,0,0) spawn(0) - new /obj/effect/hallucination/delusion(victim.loc,victim,force_kind="demon",duration=duration,skip_nearby=0) - + new /obj/effect/hallucination/delusion(victim.loc,victim,"demon",duration,0) + var/obj/item/weapon/twohanded/required/chainsaw/doomslayer/chainsaw = new(victim.loc) chainsaw.flags |= NODROP victim.drop_all_held_items() diff --git a/code/game/objects/effects/temporary_visuals/cult.dm b/code/game/objects/effects/temporary_visuals/cult.dm index 78cc50cfc1e..a6497634352 100644 --- a/code/game/objects/effects/temporary_visuals/cult.dm +++ b/code/game/objects/effects/temporary_visuals/cult.dm @@ -18,11 +18,13 @@ icon_state = "bloodout" /obj/effect/temp_visual/dir_setting/cult/phase // The veil shifter teleport + icon = 'icons/effects/cult_effects.dmi' name = "phase glow" duration = 7 icon_state = "cultin" /obj/effect/temp_visual/dir_setting/cult/phase/out + icon = 'icons/effects/cult_effects.dmi' icon_state = "cultout" /obj/effect/temp_visual/cult/sac diff --git a/code/game/objects/items/cardboard_cutouts.dm b/code/game/objects/items/cardboard_cutouts.dm index 06017c8865b..d088a92174b 100644 --- a/code/game/objects/items/cardboard_cutouts.dm +++ b/code/game/objects/items/cardboard_cutouts.dm @@ -175,7 +175,6 @@ if("Private Security Officer") name = "Private Security Officer" desc = "A cardboard cutout of a private security officer." - icon = 'icons/mob/mob.dmi' icon_state = "cutout_ntsec" return 1 diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index 3ab826ec418..a93437c5c7b 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -90,7 +90,7 @@ name = "" desc = "" density = 0 - var/can_move = 1 + var/can_move = 0 var/obj/item/device/chameleon/master = null /obj/effect/dummy/chameleon/proc/activate(mob/M, saved_appearance, obj/item/device/chameleon/C) @@ -126,19 +126,21 @@ if(isspaceturf(loc) || !direction) return //No magical space movement! - if(can_move) - can_move = 0 + if(can_move < world.time) + var/amount switch(user.bodytemperature) if(300 to INFINITY) - spawn(10) can_move = 1 + amount = 10 if(295 to 300) - spawn(13) can_move = 1 + amount = 13 if(280 to 295) - spawn(16) can_move = 1 + amount = 16 if(260 to 280) - spawn(20) can_move = 1 + amount = 20 else - spawn(25) can_move = 1 + amount = 25 + + can_move = world.time + amount step(src, direction) return diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index dd506c1ad43..8c4763e5ba6 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -36,6 +36,11 @@ A.UpdateButtonIcon() return 1 +/obj/item/device/flashlight/suicide_act(mob/living/carbon/human/user) + user.visible_message("[user] is putting [src] close to [user.p_their()] eyes and turning it on! It looks like [user.p_theyre()] trying to commit suicide!") + return (FIRELOSS) + + /obj/item/device/flashlight/attack(mob/living/carbon/M, mob/living/carbon/human/user) add_fingerprint(user) diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm index 03d7da109b2..4a49ed538d6 100644 --- a/code/game/objects/items/robot/robot_items.dm +++ b/code/game/objects/items/robot/robot_items.dm @@ -111,7 +111,7 @@ "You bop [M] on the head!") playsound(loc, 'sound/weapons/tap.ogg', 50, 1, -1) if(2) - if(!scooldown) + if(scooldown < world.time) if(M.health >= 0) if(ishuman(M)||ismonkey(M)) M.electrocute_act(5, "[user]", safety = 1) @@ -128,11 +128,9 @@ "You shock [M] to no effect.") playsound(loc, 'sound/effects/sparks2.ogg', 50, 1, -1) user.cell.charge -= 500 - scooldown = TRUE - spawn(20) - scooldown = FALSE + scooldown = world.time + 20 if(3) - if(!ccooldown) + if(ccooldown < world.time) if(M.health >= 0) if(ishuman(M)) user.visible_message("[user] crushes [M] in their grip!", \ @@ -143,9 +141,7 @@ playsound(loc, 'sound/weapons/smash.ogg', 50, 1, -1) M.adjustBruteLoss(15) user.cell.charge -= 300 - ccooldown = TRUE - spawn(10) - ccooldown = FALSE + ccooldown = world.time + 10 /obj/item/borg/cyborghug/peacekeeper shockallowed = TRUE diff --git a/code/game/objects/items/stacks/bscrystal.dm b/code/game/objects/items/stacks/bscrystal.dm index f3c2e6000fb..b681053a351 100644 --- a/code/game/objects/items/stacks/bscrystal.dm +++ b/code/game/objects/items/stacks/bscrystal.dm @@ -60,6 +60,7 @@ origin_tech = "bluespace=6;materials=3" materials = list(MAT_BLUESPACE=MINERAL_MATERIAL_AMOUNT) attack_verb = list("bluespace polybashed", "bluespace polybattered", "bluespace polybludgeoned", "bluespace polythrashed", "bluespace polysmashed") + novariants = TRUE var/crystal_type = /obj/item/weapon/ore/bluespace_crystal/refined /obj/item/stack/sheet/bluespace_crystal/attack_self(mob/user)// to prevent the construction menu from ever happening diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 327afcb2a2b..51982d27bf6 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -5,11 +5,13 @@ amount = 6 max_amount = 6 w_class = WEIGHT_CLASS_TINY + full_w_class = WEIGHT_CLASS_TINY throw_speed = 3 throw_range = 7 resistance_flags = FLAMMABLE obj_integrity = 40 max_integrity = 40 + novariants = FALSE var/heal_brute = 0 var/heal_burn = 0 var/stop_bleeding = 0 diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index 2037c719184..c55ab4f6dd5 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -20,6 +20,7 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \ max_amount = 50 attack_verb = list("hit", "bludgeoned", "whacked") hitsound = 'sound/weapons/grenadelaunch.ogg' + novariants = TRUE /obj/item/stack/rods/Initialize(mapload, new_amount, merge = TRUE) ..() diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index 41ee4dc7223..a9fcf349ca7 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -2,12 +2,14 @@ name = "hide" desc = "Something went wrong." origin_tech = "biotech=3" + novariants = TRUE /obj/item/stack/sheet/animalhide/human name = "human skin" desc = "The by-product of human farming." singular_name = "human skin piece" icon_state = "sheet-hide" + novariants = FALSE GLOBAL_LIST_INIT(human_recipes, list( \ new/datum/stack_recipe("bloated human costume", /obj/item/clothing/suit/hooded/bloated_human, 5, on_floor = 1), \ @@ -22,6 +24,7 @@ GLOBAL_LIST_INIT(human_recipes, list( \ desc = "A piece of skin." singular_name = "skin piece" icon_state = "sheet-hide" + novariants = FALSE /obj/item/stack/sheet/animalhide/corgi name = "corgi hide" @@ -87,6 +90,7 @@ GLOBAL_LIST_INIT(xeno_recipes, list ( \ icon = 'icons/mob/alien.dmi' icon_state = "chitin" origin_tech = null + novariants = TRUE /obj/item/xenos_claw name = "alien claw" @@ -153,6 +157,7 @@ GLOBAL_LIST_INIT(leather_recipes, list ( \ singular_name = "watcher sinew" icon_state = "sinew" origin_tech = "biotech=4" + novariants = TRUE GLOBAL_LIST_INIT(sinew_recipes, list ( \ @@ -166,23 +171,27 @@ GLOBAL_LIST_INIT(sinew_recipes, list ( \ /* * Plates */ - /obj/item/stack/sheet/animalhide/goliath_hide name = "goliath hide plates" desc = "Pieces of a goliath's rocky hide, these might be able to make your suit a bit more durable to attack from the local fauna." icon = 'icons/obj/mining.dmi' icon_state = "goliath_hide" singular_name = "hide plate" + max_amount = 6 + novariants = FALSE flags = NOBLUDGEON w_class = WEIGHT_CLASS_NORMAL layer = MOB_LAYER + /obj/item/stack/sheet/animalhide/ashdrake name = "ash drake hide" desc = "The strong, scaled hide of an ash drake." icon = 'icons/obj/mining.dmi' icon_state = "dragon_hide" singular_name = "drake plate" + max_amount = 10 + novariants = FALSE flags = NOBLUDGEON w_class = WEIGHT_CLASS_NORMAL layer = MOB_LAYER diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 9514be618ce..ea1f8db498e 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -68,6 +68,7 @@ GLOBAL_LIST_INIT(sandstone_recipes, list ( \ singular_name = "sandbag" layer = LOW_ITEM_LAYER origin_tech = "materials=2" + novariants = TRUE GLOBAL_LIST_INIT(sandbag_recipes, list ( \ new/datum/stack_recipe("sandbags", /obj/structure/barricade/sandbags, 1, time = 25, one_per_turf = 1, on_floor = 1), \ @@ -104,6 +105,7 @@ GLOBAL_LIST_INIT(sandbag_recipes, list ( \ origin_tech = "materials=6" sheettype = "diamond" materials = list(MAT_DIAMOND=MINERAL_MATERIAL_AMOUNT) + novariants = TRUE GLOBAL_LIST_INIT(diamond_recipes, list ( \ new/datum/stack_recipe("diamond door", /obj/structure/mineral_door/transparent/diamond, 10, one_per_turf = 1, on_floor = 1), \ @@ -127,6 +129,7 @@ GLOBAL_LIST_INIT(diamond_recipes, list ( \ origin_tech = "materials=5" sheettype = "uranium" materials = list(MAT_URANIUM=MINERAL_MATERIAL_AMOUNT) + novariants = TRUE GLOBAL_LIST_INIT(uranium_recipes, list ( \ new/datum/stack_recipe("uranium door", /obj/structure/mineral_door/uranium, 10, one_per_turf = 1, on_floor = 1), \ @@ -237,6 +240,7 @@ GLOBAL_LIST_INIT(silver_recipes, list ( \ origin_tech = "materials=4" sheettype = "clown" materials = list(MAT_BANANIUM=MINERAL_MATERIAL_AMOUNT) + novariants = TRUE GLOBAL_LIST_INIT(clown_recipes, list ( \ new/datum/stack_recipe("bananium tile", /obj/item/stack/tile/mineral/bananium, 1, 4, 20), \ @@ -355,6 +359,7 @@ GLOBAL_LIST_INIT(adamantine_recipes, list( icon_state = "sheet-mythril" singular_name = "mythril sheet" origin_tech = "materials=4" + novariants = TRUE /* * Alien Alloy diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 3b9f5b45092..61abe978595 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -162,6 +162,7 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 0) resistance_flags = FLAMMABLE merge_type = /obj/item/stack/sheet/mineral/wood + novariants = TRUE /obj/item/stack/sheet/mineral/wood/Initialize(mapload, new_amount, merge = TRUE) recipes = GLOB.wood_recipes @@ -239,6 +240,7 @@ GLOBAL_LIST_INIT(cardboard_recipes, list ( \ origin_tech = "materials=1" resistance_flags = FLAMMABLE merge_type = /obj/item/stack/sheet/cardboard + novariants = TRUE /obj/item/stack/sheet/cardboard/Initialize(mapload, new_amount, merge = TRUE) recipes = GLOB.cardboard_recipes @@ -268,6 +270,7 @@ GLOBAL_LIST_INIT(runed_metal_recipes, list ( \ icon = 'icons/obj/items.dmi' sheettype = "runed" merge_type = /obj/item/stack/sheet/runed_metal + novariants = TRUE /obj/item/stack/sheet/runed_metal/ratvar_act() new /obj/item/stack/tile/brass(loc, amount) @@ -322,6 +325,7 @@ GLOBAL_LIST_INIT(brass_recipes, list ( \ throw_speed = 1 throw_range = 3 turf_type = /turf/open/floor/clockwork + novariants = FALSE /obj/item/stack/tile/brass/narsie_act() new /obj/item/stack/sheet/runed_metal(loc, amount) @@ -339,6 +343,7 @@ GLOBAL_LIST_INIT(brass_recipes, list ( \ singular_name = "lesser gem" icon_state = "sheet-lessergem" origin_tech = "materials=4" + novariants = TRUE /obj/item/stack/sheet/greatergem @@ -347,6 +352,7 @@ GLOBAL_LIST_INIT(brass_recipes, list ( \ singular_name = "greater gem" icon_state = "sheet-greatergem" origin_tech = "materials=7" + novariants = TRUE /* * Bones @@ -359,6 +365,7 @@ GLOBAL_LIST_INIT(brass_recipes, list ( \ desc = "Someone's been drinking their milk." force = 7 throwforce = 5 + max_amount = 12 w_class = WEIGHT_CLASS_NORMAL throw_speed = 1 throw_range = 3 diff --git a/code/game/objects/items/stacks/sheets/sheets.dm b/code/game/objects/items/stacks/sheets/sheets.dm index 0d5ab1020ac..24de1bee5ef 100644 --- a/code/game/objects/items/stacks/sheets/sheets.dm +++ b/code/game/objects/items/stacks/sheets/sheets.dm @@ -1,11 +1,12 @@ /obj/item/stack/sheet name = "sheet" - w_class = WEIGHT_CLASS_NORMAL + full_w_class = WEIGHT_CLASS_NORMAL force = 5 throwforce = 5 max_amount = 50 throw_speed = 1 throw_range = 3 attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "smashed") + novariants = FALSE var/perunit = MINERAL_MATERIAL_AMOUNT var/sheettype = null //this is used for girders in the creation of walls/false walls \ No newline at end of file diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index e5f90262574..64af889af60 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -18,6 +18,8 @@ var/datum/robot_energy_storage/source var/cost = 1 // How much energy from storage it costs var/merge_type = null // This path and its children should merge with this stack, defaults to src.type + var/full_w_class = WEIGHT_CLASS_NORMAL //The weight class the stack should have at amount > 2/3rds max_amount + var/novariants = TRUE //Determines whether the item should update it's sprites based on amount. /obj/item/stack/Initialize(mapload, new_amount=null , merge = TRUE) ..() @@ -29,6 +31,28 @@ for(var/obj/item/stack/S in loc) if(S.merge_type == merge_type) merge(S) + update_weight() + update_icon() + +/obj/item/stack/proc/update_weight() + if(amount <= (max_amount * (1/3))) + w_class = Clamp(full_w_class-2, WEIGHT_CLASS_TINY, full_w_class) + else if (amount <= (max_amount * (2/3))) + w_class = Clamp(full_w_class-1, WEIGHT_CLASS_TINY, full_w_class) + else + w_class = full_w_class + +/obj/item/stack/update_icon() + if(novariants) + return ..() + if(amount <= (max_amount * (1/3))) + icon_state = initial(icon_state) + else if (amount <= (max_amount * (2/3))) + icon_state = "[initial(icon_state)]_2" + else + icon_state = "[initial(icon_state)]_3" + ..() + /obj/item/stack/Destroy() if (usr && usr.machine==src) @@ -188,6 +212,7 @@ amount -= used zero_amount() update_icon() + update_weight() return 1 /obj/item/stack/proc/zero_amount() @@ -204,6 +229,7 @@ else src.amount += amount update_icon() + update_weight() /obj/item/stack/proc/merge(obj/item/stack/S) //Merge src into S, as much as possible if(QDELETED(S) || QDELETED(src) || S == src) //amusingly this can cause a stack to consume itself, let's not allow that. diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index 233bf506a23..fece24cb227 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -12,6 +12,7 @@ origin_tech = "materials=1" var/turf_type = null var/mineralType = null + novariants = TRUE /obj/item/stack/tile/Initialize(mapload, amount) . = ..() diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index 0240461878c..c2e7d544a47 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -256,14 +256,6 @@ update_label("John Doe", "Clowny") access = get_all_accesses()+get_ert_access("med")-GLOB.access_change_ids ..() -/obj/item/weapon/card/id/marine - name = "\improper Marine ID" - desc = "A Marine Rifleman ID card" - access = list(GLOB.access_away_generic1) - icon_state = "centcom" - registered_name = "Iron Hawk Marine" - assignment = "Marine Rifleman" - /obj/item/weapon/card/id/prisoner name = "prisoner ID card" desc = "You are a number, you are not a free man." diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index fed13eb2622..6e54a51a855 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -103,7 +103,7 @@ to_chat(user, "You need one length of coil to wire the assembly!") return - else if(stage == READY && istype(I, /obj/item/weapon/wirecutters)) + else if(stage == READY && istype(I, /obj/item/weapon/wirecutters) && !active) stage_change(WIRED) to_chat(user, "You unlock the [initial(name)] assembly.") diff --git a/code/game/objects/items/weapons/pneumaticCannon.dm b/code/game/objects/items/weapons/pneumaticCannon.dm index 3653a02ec13..87c85b4dada 100644 --- a/code/game/objects/items/weapons/pneumaticCannon.dm +++ b/code/game/objects/items/weapons/pneumaticCannon.dm @@ -185,17 +185,6 @@ maxWeightClass = 7 gasPerThrow = 5 -/datum/crafting_recipe/improvised_pneumatic_cannon //Pretty easy to obtain but - name = "Pneumatic Cannon" - result = /obj/item/weapon/pneumatic_cannon/ghetto - tools = list(/obj/item/weapon/weldingtool, - /obj/item/weapon/wrench) - reqs = list(/obj/item/stack/sheet/metal = 4, - /obj/item/stack/packageWrap = 8, - /obj/item/pipe = 2) - time = 300 - category = CAT_WEAPON - /obj/item/weapon/pneumatic_cannon/proc/updateTank(obj/item/weapon/tank/internals/thetank, removing = 0, mob/living/carbon/human/user) if(removing) if(!src.tank) diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index be4d73c4588..9057bf9aff1 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -249,8 +249,8 @@ /obj/item/weapon/storage/belt/military name = "chest rig" desc = "A set of tactical webbing worn by Syndicate boarding parties." - icon_state = "explorer1" - item_state = "explorer1" + icon_state = "militarywebbing" + item_state = "militarywebbing" max_w_class = WEIGHT_CLASS_SMALL /obj/item/weapon/storage/belt/military/abductor diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 1a344af5b0d..c5968a96555 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -405,10 +405,9 @@ if(iscyborg(user)) return //Robots can't interact with storage items. - if(contents.len >= storage_slots) //don't use items on the backpack if they don't fit - return 1 - if(!can_be_inserted(W, 0 , user)) + if(contents.len >= storage_slots) //don't use items on the backpack if they don't fit + return 1 return 0 handle_item_insertion(W, 0 , user) diff --git a/code/game/objects/items/weapons/storage/toolbox.dm b/code/game/objects/items/weapons/storage/toolbox.dm index b1301a3e8aa..fa3318b2972 100644 --- a/code/game/objects/items/weapons/storage/toolbox.dm +++ b/code/game/objects/items/weapons/storage/toolbox.dm @@ -140,10 +140,10 @@ max_combined_w_class = 28 storage_slots = 28 attack_verb = list("robusted", "crushed", "smashed") - var/proselytizer_type = /obj/item/clockwork/clockwork_proselytizer/scarab + var/fabricator_type = /obj/item/clockwork/replica_fabricator/scarab /obj/item/weapon/storage/toolbox/brass/prefilled/PopulateContents() - new proselytizer_type(src) + new fabricator_type(src) new /obj/item/weapon/screwdriver/brass(src) new /obj/item/weapon/wirecutters/brass(src) new /obj/item/weapon/wrench/brass(src) @@ -151,7 +151,7 @@ new /obj/item/weapon/weldingtool/experimental/brass(src) /obj/item/weapon/storage/toolbox/brass/prefilled/ratvar - var/slab_type = /obj/item/clockwork/slab/scarab + var/slab_type = /obj/item/clockwork/slab /obj/item/weapon/storage/toolbox/brass/prefilled/ratvar/PopulateContents() ..() @@ -159,7 +159,7 @@ /obj/item/weapon/storage/toolbox/brass/prefilled/ratvar/admin slab_type = /obj/item/clockwork/slab/debug - proselytizer_type = /obj/item/clockwork/clockwork_proselytizer/scarab/debug + fabricator_type = /obj/item/clockwork/replica_fabricator/scarab/debug /obj/item/weapon/storage/toolbox/artistic diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index 44281fb26f2..434c0d12c15 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -259,3 +259,7 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e obj_break(damage_type) return TRUE return FALSE + +//returns how much the object blocks an explosion +/obj/proc/GetExplosionBlock() + CRASH("Unimplemented GetExplosionBlock()") diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index 7202aeae1c9..e1531b4ef7c 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -25,7 +25,7 @@ return ..() /obj/structure/chair/proc/RemoveFromLatejoin() - GLOB.latejoin -= src //These may be here due to the arrivals shuttle + SSjob.latejoin_trackers -= src //These may be here due to the arrivals shuttle /obj/structure/chair/deconstruct() // If we have materials, and don't have the NOCONSTRUCT flag diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm index 67a7a0f0801..3bf99fb4256 100644 --- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm @@ -64,6 +64,7 @@ new /obj/item/clothing/gloves/color/black(src) new /obj/item/clothing/head/soft/purple(src) new /obj/item/weapon/paint/paint_remover(src) + new /obj/item/weapon/melee/flyswatter(src) new /obj/item/device/flashlight(src) for(var/i in 1 to 3) new /obj/item/weapon/caution(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index bcea83bdc1b..58fcaedf377 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -82,6 +82,7 @@ new /obj/item/weapon/gun/energy/e_gun/hos(src) new /obj/item/device/flashlight/seclite(src) new /obj/item/weapon/pinpointer(src) + new /obj/item/clothing/under/rank/head_of_security/grey(src) /obj/structure/closet/secure_closet/warden name = "\proper warden's locker" diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm index 905933f0e99..194d8c42a29 100644 --- a/code/game/objects/structures/ghost_role_spawners.dm +++ b/code/game/objects/structures/ghost_role_spawners.dm @@ -395,76 +395,45 @@ H.faction |= "syndicate" /obj/effect/mob_spawn/human/syndicate/battlecruiser - name = "Syndicate Battlecruiser Ensign" - flavour_text = "You are a syndicate ensign aboard a state of the art weapons platform -- the SBC Starfury. Follow your captain's orders, maintain the ship, and protect both with your life." + name = "Syndicate Battlecruiser Ship Operative" + flavour_text = "You are a crewmember aboard the syndicate flagship: the SBC Starfury. Your job is to follow your captain's orders, maintain the ship, and keep the engine running. If you are not familiar with how the supermatter engine functions: do not attempt to start it.

The armory is not a candy store, and your role is not to assault the station directly, leave that work to the assault operatives.
" outfit = /datum/outfit/syndicate_empty/SBC /datum/outfit/syndicate_empty/SBC - name = "Syndicate Battlecruiser Ensign" - belt = /obj/item/weapon/gun/ballistic/automatic/pistol + name = "Syndicate Battlecruiser Ship Operative" + l_pocket = /obj/item/weapon/gun/ballistic/automatic/pistol r_pocket = /obj/item/weapon/kitchen/knife/combat/survival + belt = /obj/item/weapon/storage/belt/military/assault + +/obj/effect/mob_spawn/human/syndicate/battlecruiser/assault + name = "Syndicate Battlecruiser Assault Operative" + flavour_text = "You are an assault operative aboard the syndicate flagship: the SBC Starfury. Your job is to follow your captain's orders, keep intruders out of the ship, and assault Space Station 13. There is an armory, multiple assault ships, and beam cannons to attack the station with.

Work as a team with your fellow operatives and work out a plan of attack. If you are overwhelmed, escape back to your ship!
" + outfit = /datum/outfit/syndicate_empty/SBC/assault + +/datum/outfit/syndicate_empty/SBC/assault + name = "Syndicate Battlecruiser Assault Operative" + uniform = /obj/item/clothing/under/syndicate/combat + l_pocket = /obj/item/ammo_box/magazine/m10mm + r_pocket = /obj/item/weapon/kitchen/knife/combat/survival + belt = /obj/item/weapon/storage/belt/military suit = /obj/item/clothing/suit/armor/vest + suit_store = /obj/item/weapon/gun/ballistic/automatic/pistol + back = /obj/item/weapon/storage/backpack/security + mask = /obj/item/clothing/mask/gas/syndicate /obj/effect/mob_spawn/human/syndicate/battlecruiser/captain name = "Syndicate Battlecruiser Captain" - flavour_text = "You are a syndicate admiral in command of a state of the art weapons platform -- the SBC Starfury. You are to destroy Nanotrasens' Space Station 13. Do not let the enemy take control of your ship under any circumstances." - outfit = /datum/outfit/syndicate_empty/SBC/captain + flavour_text = "You are the captain aboard the syndicate flagship: the SBC Starfury. Your job is to oversee your crew, defend the ship, and destroy Space Station 13. The ship has an armory, multiple ships, beam cannons, and multiple crewmembers to accomplish this goal.

As the captain, this whole operation falls on your shoulders. You do not need to nuke the station, causing sufficient damage and preventing your ship from being destroyed will be enough.
" + outfit = /datum/outfit/syndicate_empty/SBC/assault/captain id_access_list = list(150,151) -/datum/outfit/syndicate_empty/SBC/captain +/datum/outfit/syndicate_empty/SBC/assault/captain name = "Syndicate Battlecruiser Captain" - belt = /obj/item/weapon/gun/ballistic/automatic/pistol + l_pocket = /obj/item/weapon/melee/energy/sword/saber/red r_pocket = /obj/item/weapon/melee/classic_baton/telescopic suit = /obj/item/clothing/suit/armor/vest/capcarapace/syndicate + suit_store = /obj/item/weapon/gun/ballistic/revolver/mateba back = /obj/item/weapon/storage/backpack/satchel/leather - head = /obj/item/clothing/head/HoS/beret/syndicate + head = /obj/item/clothing/head/HoS/syndicate mask = /obj/item/clothing/mask/cigarette/cigar/havana - glasses = /obj/item/clothing/glasses/thermal/eyepatch - -//UEG Marine -/obj/effect/mob_spawn/human/marine - name = "marine cryostasis sleeper" - desc = "A humming sleeper with a occupant inside. Desperatly attempting to revive the occupant despite its low power state." - mob_name = "a iron hawk marine" - icon = 'icons/obj/lavaland/spawners.dmi' - icon_state = "cryostasis_sleeper" - roundstart = FALSE - death = FALSE - random = TRUE - mob_species = /datum/species/human - flavour_text = "You are a Iron Hawk Marine, apart of a unalligned mercenary organization. You were, until recently, stationed on board the IHSS Inheritor, a capital ship. As you struggle \ - to exit your cryostasis sleeper, you slowly start to recall exactly what cause of events has thrown you into your current predicament... " - -/obj/effect/mob_spawn/human/marine/Initialize(mapload) - . = ..() - var/lorpee = rand(1,4) - switch(lorpee) - if(1) - flavour_text += "Your ship intercepted a distress call from a distant space station. As the Inheritor moved into investigate, suddenly and without warning the ship was being assaulted \ - by a massive lovecraftian nightmare, you heard the name 'Nar-Sie' being uttered by the barely Human flesh monsters and constructs that poured out of every crack that was torn into the \ - ship by the monster. With most of the crew dead, you and your squad retreated to the hanger bay, rescued a group of pilots and attempted to flee aboard the only functional heavy troop transport. \ - Your attempt to fly away was halted when Nar-Sie somehow was able to start attempting to drag the transport into her grasp. In one final desperate move, the pilots turnd the ship around \ - and ramed it directly into Nar-Sie's head, her screams somehow echoed throughout the transport as she released her grasp on the transport, unfortunately taking half the engines with her. \ - Your final thoughts were panic as you quickly dove into your cryosleep pod, hoping you'll survive the crash landing." - if(2) - flavour_text += "Panic and paranoia ran high as a group of changelings somehow infiltrated the Inheritor. Utterly unprepared to deal with this threat, the crew tore itself apart. \ - In a final desperate move to end the changeling threat, the ship's Commander activated the Inheritor's self destruct sequence and remotely shut down all escape pods. You and your \ - squadmates, who were already on the brink of a psychological breakdown, made a run for the last remaining heavy troop transport. You arrive to discover the changelings had a similar plan \ - , with minutes until the ship exploded, the changelings abandoned any pretense of subtly and revealed their true forms. After a intense gun fight you and your squad were able to board \ - the transport. However as you take off, one of the surviving Changelings was able to plant an explosive charge on your engines. The explosion disabled your ship, and you got caught in a \ - nearby planets gravity well. The survivors were forced into cryo sleep, as you're last thoughts were hoping to god none of your squad mates were secretly changelings.
" - if(3) - flavour_text += "The deeper reaches of space are home to hoards of pirates and marauders, usually they are no threat to a Iron Hawk capital ship. However, the Inheritor had conducted a \ - large series of anti-piracy raids in your assigned sector, so crippling that every pirate in the local sector network formed a massive fleet in a attempt to destroy the Inheritor. The \ - Inheritor won against all odds, but it was a pyrrhic victory as the Inheritor was byond repair. The acting Commander ordered all hands to abandon ship before it was scuttled. You and \ - your remaining squad members were assigned to troop transport 5. Unbeknown to you or your pilots, your fuel tanks had suffered a massive leak during the fighting, leaving you with minimal \ - fuel, thus your pilots had no choice but to land on a nearby planet. Strapping into your cryochamber, you can only hope that the pilots could land this thing safely.
" - if(4) - flavour_text += "The Inheritor was sent on a high level covert recon contract to Space Station 13, a Nanotrasen research and development station. The contract details were minimal sans that \ - you were to locate and ping any Nanotrasen mining bases on a class-H planet. You and your squad were dispatched in a recon heavy transport \ - to attempt to fly over the planet and locate any hidden Nanotrasen mining bases. About two hours into the recon mission, a giant, dragon like, creature swooped up and took a large part of your \ - engines with it. With insufficient thrust power to leave the planet's atmosphere, the crew were ordered into cryostasis as the pilots attempted an emergency landing." - -/obj/effect/mob_spawn/human/marine/Destroy() - new/obj/structure/fluff/empty_cryostasis_sleeper(get_turf(src)) - return ..() + glasses = /obj/item/clothing/glasses/thermal/eyepatch \ No newline at end of file diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 64d93e914e1..4b912923a21 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -248,6 +248,7 @@ /obj/structure/grille/ratvar icon_state = "ratvargrille" + name = "cog grille" desc = "A strangely-shaped grille." broken_type = /obj/structure/grille/ratvar/broken diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index 2f6b03bef16..4b2017fab65 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -50,7 +50,7 @@ deconstruct() /obj/structure/lattice/clockwork - name = "clockwork lattice" + name = "cog lattice" desc = "A lightweight support lattice. These hold the Justicar's station together." icon = 'icons/obj/smooth_structures/lattice_clockwork.dmi' diff --git a/code/game/objects/structures/manned_turret.dm b/code/game/objects/structures/manned_turret.dm index aed77a0e8dc..7274fa6626e 100644 --- a/code/game/objects/structures/manned_turret.dm +++ b/code/game/objects/structures/manned_turret.dm @@ -84,6 +84,8 @@ calculated_projectile_vars = calculate_projectile_angle_and_pixel_offsets(controller, C.mouseParams) /obj/machinery/manned_turret/proc/direction_track(mob/user, atom/targeted) + if(user.stat != CONSCIOUS) + return setDir(get_dir(src,targeted)) user.setDir(dir) switch(dir) diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 1c0a4fadf09..106e68a2247 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -195,7 +195,7 @@ check_break(M) /obj/structure/table/glass/proc/check_break(mob/living/M) - if(M.has_gravity() && M.mob_size > MOB_SIZE_SMALL) + if(M.has_gravity() && M.mob_size > MOB_SIZE_SMALL && !(M.movement_type & FLYING)) table_shatter(M) /obj/structure/table/glass/proc/table_shatter(mob/M) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 0c114180030..a552f951f0b 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -24,6 +24,7 @@ resistance_flags = ACID_PROOF armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 80, acid = 100) CanAtmosPass = ATMOS_PASS_PROC + var/real_explosion_block //ignore this, just use explosion_block /obj/structure/window/examine(mob/user) ..() @@ -72,6 +73,10 @@ debris += new /obj/item/weapon/shard(src) if(rods) debris += new /obj/item/stack/rods(src, rods) + + //windows only block while reinforced and fulltile, so we'll use the proc + real_explosion_block = explosion_block + explosion_block = EXPLOSION_BLOCK_PROC /obj/structure/window/rcd_vals(mob/user, obj/item/weapon/construction/rcd/the_rcd) switch(the_rcd.mode) @@ -400,6 +405,9 @@ return 1 +/obj/structure/window/GetExplosionBlock() + return reinf && fulltile ? real_explosion_block : 0 + /obj/structure/window/unanchored anchored = FALSE diff --git a/code/game/turfs/simulated/floor/mineral_floor.dm b/code/game/turfs/simulated/floor/mineral_floor.dm index fc5a57e16dd..46bb461660a 100644 --- a/code/game/turfs/simulated/floor/mineral_floor.dm +++ b/code/game/turfs/simulated/floor/mineral_floor.dm @@ -151,18 +151,14 @@ honk() /turf/open/floor/mineral/bananium/proc/honk() - if(!spam_flag) - spam_flag = 1 + if(spam_flag < world.time) playsound(src, 'sound/items/bikehorn.ogg', 50, 1) - spawn(20) - spam_flag = 0 + spam_flag = world.time + 20 /turf/open/floor/mineral/bananium/proc/squeek() - if(!spam_flag) - spam_flag = 1 + if(spam_flag < world.time) playsound(src, "clownstep", 50, 1) - spawn(10) - spam_flag = 0 + spam_flag = world.time + 10 /turf/open/floor/mineral/bananium/airless initial_gas_mix = "TEMP=2.7" diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index eca2cc8859f..aac82542bcb 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -595,7 +595,7 @@ set category = "Admin" set name = "Unprison" if (M.z == ZLEVEL_CENTCOM) - M.loc = pick(GLOB.latejoin) + SSjob.SendToLateJoin(M) message_admins("[key_name_admin(usr)] has unprisoned [key_name_admin(M)]") log_admin("[key_name(usr)] has unprisoned [key_name(M)]") else diff --git a/code/modules/admin/secrets.dm b/code/modules/admin/secrets.dm index e569eacd2bc..428ae959849 100644 --- a/code/modules/admin/secrets.dm +++ b/code/modules/admin/secrets.dm @@ -334,31 +334,18 @@ if(!objective) return SSblackbox.add_details("admin_secrets_fun_used","Traitor All ([objective])") - for(var/mob/living/carbon/human/H in GLOB.player_list) - if(H.stat == 2 || !H.client || !H.mind) continue + for(var/mob/living/H in GLOB.player_list) + if(!(istype(H, /mob/living/carbon/human)||istype(H, /mob/living/silicon/))) continue + if(H.stat == 2 || !H.client || !H.mind || ispAI(H)) continue if(is_special_character(H)) continue - //traitorize(H, objective, 0) - SSticker.mode.traitors += H.mind - H.mind.special_role = "traitor" + H.mind.add_antag_datum(ANTAG_DATUM_TRAITOR_CUSTOM) + var/datum/antagonist/traitor/traitordatum = H.mind.has_antag_datum(ANTAG_DATUM_TRAITOR) //original datum self deletes var/datum/objective/new_objective = new new_objective.owner = H new_objective.explanation_text = objective - H.mind.objectives += new_objective - SSticker.mode.greet_traitor(H.mind) - //SSticker.mode.forge_traitor_objectives(H.mind) - SSticker.mode.finalize_traitor(H.mind) - for(var/mob/living/silicon/A in GLOB.player_list) - if(A.stat == 2 || !A.client || !A.mind) continue - if(ispAI(A)) continue - else if(is_special_character(A)) continue - SSticker.mode.traitors += A.mind - A.mind.special_role = "traitor" - var/datum/objective/new_objective = new - new_objective.owner = A - new_objective.explanation_text = objective - A.mind.objectives += new_objective - SSticker.mode.greet_traitor(A.mind) - SSticker.mode.finalize_traitor(A.mind) + traitordatum.add_objective(new_objective) + traitordatum.equip(FALSE) + traitordatum.greet() message_admins("[key_name_admin(usr)] used everyone is a traitor secret. Objective is [objective]") log_admin("[key_name(usr)] used everyone is a traitor secret. Objective is [objective]") diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index ed3765d0cd7..5571f86a7c7 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -226,7 +226,7 @@ return 0 var/alien_caste = input(usr, "Please choose which caste to spawn.","Pick a caste",null) as null|anything in list("Queen","Praetorian","Hunter","Sentinel","Drone","Larva") - var/obj/effect/landmark/spawn_here = GLOB.xeno_spawn.len ? pick(GLOB.xeno_spawn) : pick(GLOB.latejoin) + var/obj/effect/landmark/spawn_here = GLOB.xeno_spawn.len ? pick(GLOB.xeno_spawn) : null var/mob/living/carbon/alien/new_xeno switch(alien_caste) if("Queen") @@ -243,6 +243,8 @@ new_xeno = new /mob/living/carbon/alien/larva(spawn_here) else return 0 + if(!spawn_here) + SSjob.SendToLateJoin(new_xeno, FALSE) new_xeno.ckey = ckey var/msg = "[key_name_admin(usr)] has spawned [ckey] as a filthy xeno [alien_caste]." @@ -283,8 +285,6 @@ Traitors and the like can also be revived with the previous role mostly intact. var/turf/T if(GLOB.xeno_spawn.len) T = pick(GLOB.xeno_spawn) - else - T = pick(GLOB.latejoin) var/mob/living/carbon/alien/new_xeno switch(G_found.mind.special_role)//If they have a mind, we can determine which caste they were. @@ -301,6 +301,9 @@ Traitors and the like can also be revived with the previous role mostly intact. else//If we don't know what special role they have, for whatever reason, or they're a larva. create_xeno(G_found.ckey) return + + if(!T) + SSjob.SendToLateJoin(new_xeno, FALSE) //Now to give them their mind back. G_found.mind.transfer_to(new_xeno) //be careful when doing stuff like this! I've already checked the mind isn't in use @@ -314,7 +317,8 @@ Traitors and the like can also be revived with the previous role mostly intact. //check if they were a monkey else if(findtext(G_found.real_name,"monkey")) if(alert("This character appears to have been a monkey. Would you like to respawn them as such?",,"Yes","No")=="Yes") - var/mob/living/carbon/monkey/new_monkey = new(pick(GLOB.latejoin)) + var/mob/living/carbon/monkey/new_monkey = new + SSjob.SendToLateJoin(new_monkey) G_found.mind.transfer_to(new_monkey) //be careful when doing stuff like this! I've already checked the mind isn't in use new_monkey.key = G_found.key to_chat(new_monkey, "You have been fully respawned. Enjoy the game.") @@ -325,7 +329,8 @@ Traitors and the like can also be revived with the previous role mostly intact. //Ok, it's not a xeno or a monkey. So, spawn a human. - var/mob/living/carbon/human/new_character = new(pick(GLOB.latejoin))//The mob being spawned. + var/mob/living/carbon/human/new_character = new//The mob being spawned. + SSjob.SendToLateJoin(new_character) var/datum/data/record/record_found //Referenced to later to either randomize or not randomize the character. if(G_found.mind && !G_found.mind.active) //mind isn't currently in use by someone/something @@ -368,10 +373,13 @@ Traitors and the like can also be revived with the previous role mostly intact. var/player_key = G_found.key //Now for special roles and equipment. + var/datum/antagonist/traitor/traitordatum = new_character.mind.has_antag_datum(ANTAG_DATUM_TRAITOR) + if(traitordatum) + SSjob.EquipRank(new_character, new_character.mind.assigned_role, 1) + traitordatum.equip() + + switch(new_character.mind.special_role) - if("traitor") - SSjob.EquipRank(new_character, new_character.mind.assigned_role, 1) - SSticker.mode.equip_traitor(new_character) if("Wizard") new_character.loc = pick(GLOB.wizardstart) //SSticker.mode.learn_basic_spells(new_character) @@ -396,12 +404,8 @@ Traitors and the like can also be revived with the previous role mostly intact. switch(new_character.mind.assigned_role) if("Cyborg")//More rigging to make em' work and check if they're traitor. new_character = new_character.Robotize() - if(new_character.mind.special_role=="traitor") - SSticker.mode.add_law_zero(new_character) if("AI") new_character = new_character.AIize() - if(new_character.mind.special_role=="traitor") - SSticker.mode.add_law_zero(new_character) else SSjob.EquipRank(new_character, new_character.mind.assigned_role, 1)//Or we simply equip them. @@ -1205,4 +1209,5 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits return message_admins("[key_name_admin(usr)] triggered a Centcom recall, with the admiral message of: [message]") - log_game("[key_name(usr)] triggered a Centcom recall, with the message of: [message]") \ No newline at end of file + log_game("[key_name(usr)] triggered a Centcom recall, with the message of: [message]") + SSshuttle.centcom_recall(SSshuttle.emergency.timer, message) diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm index 3c6c7b2342b..39d81331435 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm @@ -12,6 +12,14 @@ /obj/machinery/atmospherics/components/trinary/filter/flipped icon_state = "filter_off_f" flipped = 1 + +// These two filter types have critical_machine flagged to on and thus causes the area they are in to be exempt from the Grid Check event. + +/obj/machinery/atmospherics/components/trinary/filter/critical + critical_machine = TRUE + +/obj/machinery/atmospherics/components/trinary/filter/flipped/critical + critical_machine = TRUE /obj/machinery/atmospherics/components/trinary/filter/proc/set_frequency(new_frequency) SSradio.remove_object(src, frequency) diff --git a/code/modules/awaymissions/bluespaceartillery.dm b/code/modules/awaymissions/bluespaceartillery.dm index 1a4c67f9885..acf9ef4ede3 100644 --- a/code/modules/awaymissions/bluespaceartillery.dm +++ b/code/modules/awaymissions/bluespaceartillery.dm @@ -55,16 +55,3 @@ var/loc = pick(L) explosion(loc,explosiondev,explosionmed,explosionlight) reload = 0 - -/*/mob/proc/openfire() - var/A - A = input("Area to jump bombard", "Open Fire", A) in GLOB.teleportlocs - var/area/thearea = GLOB.teleportlocs[A] - priority_announce("Bluespace artillery fire detected. Brace for impact.") - spawn(30) - var/list/L = list() - - for(var/turf/T in get_area_turfs(thearea.type)) - L+=T - var/loc = pick(L) - explosion(loc,2,5,11)*/ diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index 3c224ad3e05..0c6470a870f 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -18,6 +18,8 @@ var/uses = 1 //how many times can we spawn from it. set to -1 for infinite. var/brute_damage = 0 var/oxy_damage = 0 + var/burn_damage = 0 + var/mob_color //Change the mob's color density = 1 anchored = 1 var/banType = "lavaland" @@ -68,6 +70,8 @@ M.adjustOxyLoss(oxy_damage) M.adjustBruteLoss(brute_damage) + M.adjustFireLoss(burn_damage) + M.color = mob_color equip(M) if(ckey) @@ -115,6 +119,9 @@ var/l_pocket = -1 var/back = -1 var/id = -1 + var/neck = -1 + var/backpack_contents = -1 + var/suit_store = -1 /obj/effect/mob_spawn/human/Initialize() if(ispath(outfit)) @@ -128,9 +135,13 @@ H.set_species(mob_species) if(husk) H.Drain() - + else //Because for some reason I can't track down, things are getting turned into husks even if husk = false. It's in some damage proc somewhere. + H.cure_husk() + H.underwear = "Nude" + H.undershirt = "Nude" + H.socks = "Nude" if(outfit) - var/static/list/slots = list("uniform", "r_hand", "l_hand", "suit", "shoes", "gloves", "ears", "glasses", "mask", "head", "belt", "r_pocket", "l_pocket", "back", "id") + var/static/list/slots = list("uniform", "r_hand", "l_hand", "suit", "shoes", "gloves", "ears", "glasses", "mask", "head", "belt", "r_pocket", "l_pocket", "back", "id", "neck", "backpack_contents", "suit_store") for(var/slot in slots) var/T = vars[slot] if(!isnum(T)) diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index 28753c0631a..8402bdfdac3 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -120,6 +120,10 @@ armor = list(melee = 40, bullet = 30, laser = 25, energy = 10, bomb = 25, bio = 10, rad = 0, fire = 50, acid = 60) strip_delay = 80 +/obj/item/clothing/head/HoS/syndicate + name = "syndicate cap" + desc = "A black cap fit for a high ranking syndicate officer." + /obj/item/clothing/head/HoS/beret name = "head of security beret" desc = "A robust beret for the Head of Security, for looking stylish while not sacrificing protection." diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index c0d72e86110..d233f76a79c 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -79,31 +79,6 @@ Contains: max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | ACID_PROOF - //Marine Armour -/obj/item/clothing/head/helmet/space/hardsuit/ueg - name = "Iron Hawk Marine Helmet" - desc = "An armoured, pressurised, military helmet used as standard issue among Iron Hawk Marines." - icon_state = "ueghelm" - item_state = "ueghelm" - armor = list(melee = 50, bullet = 20, laser = 20, energy = 20, bomb = 50, bio = 90, rad = 70, fire = 100, acid = 100) - strip_delay = 120 - resistance_flags = FIRE_PROOF | ACID_PROOF - actions_types = list() - -/obj/item/clothing/head/helmet/space/hardsuit/ueg/attack_self(mob/user) - return - -/obj/item/clothing/suit/space/hardsuit/ueg - name = "Iron Hawk Marine Armour" - desc = "Modified MK.II SWAT Armour. Used by Iron Hawk Marines in ship to ship action. This model appears to have lost some of its armour plating during the crash." - icon_state = "uegarmor" - item_state = "uegarmor" - allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals,/obj/item/weapon/kitchen/knife/combat) - armor = list(melee = 50, bullet = 20, laser = 20, energy = 20, bomb = 50, bio = 90, rad = 100, fire = 100, acid = 100) - strip_delay = 130 - resistance_flags = FIRE_PROOF | ACID_PROOF - helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ueg - //NASA Voidsuit /obj/item/clothing/head/helmet/space/nasavoid name = "NASA Void Helmet" diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 6eb0df78371..fd7263de54f 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -105,7 +105,6 @@ cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS armor = list(melee = 50, bullet = 10, laser = 10, energy = 10, bomb = 0, bio = 0, rad = 0, fire = 80, acid = 80) - flags_inv = HIDEJUMPSUIT strip_delay = 80 put_on_delay = 60 diff --git a/code/modules/clothing/under/syndicate.dm b/code/modules/clothing/under/syndicate.dm index f4bd254a540..a1b0fb4ce2b 100644 --- a/code/modules/clothing/under/syndicate.dm +++ b/code/modules/clothing/under/syndicate.dm @@ -37,4 +37,11 @@ item_color = "trackpants" can_adjust = 0 armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0) - resistance_flags = 0 \ No newline at end of file + resistance_flags = 0 + +/obj/item/clothing/under/syndicate/combat + name = "combat uniform" + desc = "With a suit lined with this many pockets, you are ready to operate." + icon_state = "syndicate_combat" + item_color = "syndicate_combat" + can_adjust = 0 \ No newline at end of file diff --git a/code/modules/crafting/craft.dm b/code/modules/crafting/craft.dm index a14d301a31e..91278beb23a 100644 --- a/code/modules/crafting/craft.dm +++ b/code/modules/crafting/craft.dm @@ -1,24 +1,35 @@ /datum/personal_crafting var/busy var/viewing_category = 1 //typical powergamer starting on the Weapons tab - var/list/categories = list(CAT_WEAPON, - CAT_AMMO, + var/viewing_subcategory = 1 + var/list/categories = list( + CAT_WEAPONRY, CAT_ROBOT, CAT_MISC, CAT_PRIMAL, - CAT_BREAD, - CAT_BURGER, - CAT_CAKE, - CAT_EGG, - CAT_MEAT, - CAT_MISCFOOD, - CAT_PASTRY, - CAT_PIE, - CAT_PIZZA, - CAT_SALAD, - CAT_SANDWICH, - CAT_SOUP, - CAT_SPAGHETTI) + CAT_FOOD) + var/list/subcategories = list( + list( //Weapon subcategories + CAT_WEAPON, + CAT_AMMO), + CAT_NONE, //Robot subcategories + CAT_NONE, //Misc subcategories + CAT_NONE, //Tribal subcategories + list( //Food subcategories + CAT_BREAD, + CAT_BURGER, + CAT_CAKE, + CAT_EGG, + CAT_MEAT, + CAT_MISCFOOD, + CAT_PASTRY, + CAT_PIE, + CAT_PIZZA, + CAT_SALAD, + CAT_SANDWICH, + CAT_SOUP, + CAT_SPAGHETTI)) + var/datum/action/innate/crafting/button var/display_craftable_only = FALSE var/display_compact = TRUE @@ -262,11 +273,19 @@ /datum/personal_crafting/ui_data(mob/user) var/list/data = list() + var/list/subs = list() + var/cur_subcategory = CAT_NONE var/cur_category = categories[viewing_category] + if (islist(subcategories[viewing_category])) + subs = subcategories[viewing_category] + cur_subcategory = subs[viewing_subcategory] data["busy"] = busy data["prev_cat"] = categories[prev_cat()] + data["prev_subcat"] = subs[prev_subcat()] data["category"] = cur_category + data["subcategory"] = cur_subcategory data["next_cat"] = categories[next_cat()] + data["next_subcat"] = subs[next_subcat()] data["display_craftable_only"] = display_craftable_only data["display_compact"] = display_compact @@ -275,7 +294,7 @@ var/list/cant_craft = list() for(var/rec in GLOB.crafting_recipes) var/datum/crafting_recipe/R = rec - if(R.category != cur_category) + if((R.category != cur_category) || (R.subcategory != cur_subcategory)) continue if(check_contents(R, surroundings)) can_craft += list(build_recipe_data(R)) @@ -302,29 +321,41 @@ busy = 0 ui_interact(usr) if("forwardCat") //Meow - viewing_category = next_cat() - to_chat(usr, "Category is now [categories[viewing_category]].") + viewing_category = next_cat(FALSE) . = TRUE if("backwardCat") - viewing_category = prev_cat() - to_chat(usr, "Category is now [categories[viewing_category]].") + viewing_category = prev_cat(FALSE) + . = TRUE + if("forwardSubCat") + viewing_subcategory = next_subcat() + . = TRUE + if("backwardSubCat") + viewing_subcategory = prev_subcat() . = TRUE if("toggle_recipes") display_craftable_only = !display_craftable_only - to_chat(usr, "You will now [display_craftable_only ? "only see recipes you can craft":"see all recipes"].") . = TRUE if("toggle_compact") display_compact = !display_compact - to_chat(usr, "Crafting menu is now [display_compact? "compact" : "full size"].") . = TRUE //Next works nicely with modular arithmetic -/datum/personal_crafting/proc/next_cat() +/datum/personal_crafting/proc/next_cat(readonly = TRUE) + if (!readonly) + viewing_subcategory = 1 . = viewing_category % categories.len + 1 +/datum/personal_crafting/proc/next_subcat() + if(islist(subcategories[viewing_category])) + var/list/subs = subcategories[viewing_category] + . = viewing_subcategory % subs.len + 1 + + //Previous can go fuck itself -/datum/personal_crafting/proc/prev_cat() +/datum/personal_crafting/proc/prev_cat(readonly = TRUE) + if (!readonly) + viewing_subcategory = 1 if(viewing_category == categories.len) . = viewing_category-1 else @@ -332,6 +363,18 @@ if(. <= 0) . = categories.len +/datum/personal_crafting/proc/prev_subcat() + if(islist(subcategories[viewing_category])) + var/list/subs = subcategories[viewing_category] + if(viewing_subcategory == subs.len) + . = viewing_subcategory-1 + else + . = viewing_subcategory % subs.len - 1 + if(. <= 0) + . = subs.len + else + . = null + /datum/personal_crafting/proc/build_recipe_data(datum/crafting_recipe/R) var/list/data = list() diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm index 522570f8136..d84d806a00e 100644 --- a/code/modules/crafting/recipes.dm +++ b/code/modules/crafting/recipes.dm @@ -8,6 +8,7 @@ var/parts[] = list() //type paths of items that will be placed in the result var/chem_catalysts[] = list() //like tools but for reagents var/category = CAT_NONE //where it shows up in the crafting UI + var/subcategory = CAT_NONE /datum/crafting_recipe/pin_removal @@ -17,7 +18,8 @@ parts = list(/obj/item/weapon/gun = 1) tools = list(/obj/item/weapon/weldingtool, /obj/item/weapon/screwdriver, /obj/item/weapon/wirecutters) time = 50 - category = CAT_WEAPON + category = CAT_WEAPONRY + subcategory = CAT_WEAPON /datum/crafting_recipe/IED name = "IED" @@ -28,7 +30,8 @@ /obj/item/weapon/reagent_containers/food/drinks/soda_cans = 1) parts = list(/obj/item/weapon/reagent_containers/food/drinks/soda_cans = 1) time = 15 - category = CAT_WEAPON + category = CAT_WEAPONRY + subcategory = CAT_WEAPON /datum/crafting_recipe/lance name = "explosive lance (grenade)" @@ -38,7 +41,8 @@ parts = list(/obj/item/weapon/twohanded/spear = 1, /obj/item/weapon/grenade = 1) time = 15 - category = CAT_WEAPON + category = CAT_WEAPONRY + subcategory = CAT_WEAPON /datum/crafting_recipe/strobeshield name = "strobe shield" @@ -47,7 +51,8 @@ /obj/item/device/assembly/flash/handheld = 1, /obj/item/weapon/shield/riot = 1) time = 40 - category = CAT_WEAPON + category = CAT_WEAPONRY + subcategory = CAT_WEAPON /datum/crafting_recipe/molotov name = "Molotov" @@ -56,7 +61,8 @@ /obj/item/weapon/reagent_containers/food/drinks/bottle = 1) parts = list(/obj/item/weapon/reagent_containers/food/drinks/bottle = 1) time = 40 - category = CAT_WEAPON + category = CAT_WEAPONRY + subcategory = CAT_WEAPON /datum/crafting_recipe/stunprod name = "Stunprod" @@ -65,7 +71,8 @@ /obj/item/stack/rods = 1, /obj/item/device/assembly/igniter = 1) time = 40 - category = CAT_WEAPON + category = CAT_WEAPONRY + subcategory = CAT_WEAPON /datum/crafting_recipe/teleprod name = "Teleprod" @@ -75,7 +82,8 @@ /obj/item/device/assembly/igniter = 1, /obj/item/weapon/ore/bluespace_crystal = 1) time = 40 - category = CAT_WEAPON + category = CAT_WEAPONRY + subcategory = CAT_WEAPON /datum/crafting_recipe/bola name = "Bola" @@ -84,6 +92,7 @@ /obj/item/stack/sheet/metal = 6) time = 20//15 faster than crafting them by hand! category= CAT_WEAPON + subcategory = CAT_WEAPON /datum/crafting_recipe/tailclub name = "Tail Club" @@ -91,7 +100,8 @@ reqs = list(/obj/item/severedtail = 1, /obj/item/stack/sheet/metal = 1) time = 40 - category = CAT_WEAPON + category = CAT_WEAPONRY + subcategory = CAT_WEAPON /datum/crafting_recipe/tailwhip name = "Liz O' Nine Tails" @@ -99,7 +109,8 @@ reqs = list(/obj/item/severedtail = 1, /obj/item/stack/cable_coil = 1) time = 40 - category = CAT_WEAPON + category = CAT_WEAPONRY + subcategory = CAT_WEAPON /datum/crafting_recipe/ed209 name = "ED209" @@ -159,6 +170,18 @@ time = 40 category = CAT_ROBOT +/datum/crafting_recipe/improvised_pneumatic_cannon //Pretty easy to obtain but + name = "Pneumatic Cannon" + result = /obj/item/weapon/pneumatic_cannon/ghetto + tools = list(/obj/item/weapon/weldingtool, + /obj/item/weapon/wrench) + reqs = list(/obj/item/stack/sheet/metal = 4, + /obj/item/stack/packageWrap = 8, + /obj/item/pipe = 2) + time = 300 + category = CAT_WEAPONRY + subcategory = CAT_WEAPON + /datum/crafting_recipe/flamethrower name = "Flamethrower" result = /obj/item/weapon/flamethrower @@ -169,7 +192,8 @@ /obj/item/weapon/weldingtool = 1) tools = list(/obj/item/weapon/screwdriver) time = 10 - category = CAT_WEAPON + category = CAT_WEAPONRY + subcategory = CAT_WEAPON /datum/crafting_recipe/meteorshot name = "Meteorshot Shell" @@ -179,7 +203,8 @@ /obj/item/weapon/stock_parts/manipulator = 2) tools = list(/obj/item/weapon/screwdriver) time = 5 - category = CAT_AMMO + category = CAT_WEAPONRY + subcategory = CAT_AMMO /datum/crafting_recipe/pulseslug name = "Pulse Slug Shell" @@ -189,7 +214,8 @@ /obj/item/weapon/stock_parts/micro_laser/ultra = 1) tools = list(/obj/item/weapon/screwdriver) time = 5 - category = CAT_AMMO + category = CAT_WEAPONRY + subcategory = CAT_AMMO /datum/crafting_recipe/dragonsbreath name = "Dragonsbreath Shell" @@ -197,7 +223,8 @@ reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,/datum/reagent/phosphorus = 5) tools = list(/obj/item/weapon/screwdriver) time = 5 - category = CAT_AMMO + category = CAT_WEAPONRY + subcategory = CAT_AMMO /datum/crafting_recipe/frag12 name = "FRAG-12 Shell" @@ -208,7 +235,8 @@ /datum/reagent/toxin/acid/fluacid = 5) tools = list(/obj/item/weapon/screwdriver) time = 5 - category = CAT_AMMO + category = CAT_WEAPONRY + subcategory = CAT_AMMO /datum/crafting_recipe/ionslug name = "Ion Scatter Shell" @@ -218,7 +246,8 @@ /obj/item/weapon/stock_parts/subspace/crystal = 1) tools = list(/obj/item/weapon/screwdriver) time = 5 - category = CAT_AMMO + category = CAT_WEAPONRY + subcategory = CAT_AMMO /datum/crafting_recipe/improvisedslug name = "Improvised Shotgun Shell" @@ -229,7 +258,8 @@ /datum/reagent/fuel = 10) tools = list(/obj/item/weapon/screwdriver) time = 5 - category = CAT_AMMO + category = CAT_WEAPONRY + subcategory = CAT_AMMO /datum/crafting_recipe/improvisedslugoverload name = "Overload Improvised Shell" @@ -239,7 +269,8 @@ /datum/reagent/toxin/plasma = 20) tools = list(/obj/item/weapon/screwdriver) time = 5 - category = CAT_AMMO + category = CAT_WEAPONRY + subcategory = CAT_AMMO /datum/crafting_recipe/laserslug name = "Laser Slug Shell" @@ -249,7 +280,8 @@ /obj/item/weapon/stock_parts/micro_laser/high = 1) tools = list(/obj/item/weapon/screwdriver) time = 5 - category = CAT_AMMO + category = CAT_WEAPONRY + subcategory = CAT_AMMO /datum/crafting_recipe/ishotgun name = "Improvised Shotgun" @@ -260,7 +292,8 @@ /obj/item/stack/packageWrap = 5) tools = list(/obj/item/weapon/screwdriver) time = 100 - category = CAT_WEAPON + category = CAT_WEAPONRY + subcategory = CAT_WEAPON /datum/crafting_recipe/chainsaw name = "Chainsaw" @@ -270,7 +303,8 @@ /obj/item/stack/sheet/plasteel = 1) tools = list(/obj/item/weapon/weldingtool) time = 50 - category = CAT_WEAPON + category = CAT_WEAPONRY + subcategory = CAT_WEAPON /datum/crafting_recipe/spear name = "Spear" @@ -279,7 +313,8 @@ /obj/item/weapon/shard = 1, /obj/item/stack/rods = 1) time = 40 - category = CAT_WEAPON + category = CAT_WEAPONRY + subcategory = CAT_WEAPON /datum/crafting_recipe/spooky_camera name = "Camera Obscura" @@ -367,7 +402,8 @@ ) parts = list(/obj/item/weapon/stock_parts/matter_bin = 1, /obj/item/weapon/grenade/chem_grenade = 2) time = 30 - category = CAT_WEAPON + category = CAT_WEAPONRY + subcategory = CAT_WEAPON /datum/crafting_recipe/chemical_payload2 name = "Chemical Payload (gibtonite)" @@ -379,7 +415,8 @@ ) parts = list(/obj/item/weapon/stock_parts/matter_bin = 1, /obj/item/weapon/grenade/chem_grenade = 2) time = 50 - category = CAT_WEAPON + category = CAT_WEAPONRY + subcategory = CAT_WEAPON /datum/crafting_recipe/bonearmor name = "Bone Armor" diff --git a/code/modules/events/abductor.dm b/code/modules/events/abductor.dm old mode 100644 new mode 100755 index 0377f0e935f..bbc73dca66b --- a/code/modules/events/abductor.dm +++ b/code/modules/events/abductor.dm @@ -1,10 +1,10 @@ /datum/round_event_control/abductor name = "Abductors" typepath = /datum/round_event/ghost_role/abductor - weight = 5 + weight = 10 max_occurrences = 1 - min_players = 5 + min_players = 20 gamemode_blacklist = list("nuclear","wizard","revolution","abduction") diff --git a/code/modules/events/devil.dm b/code/modules/events/devil.dm index 69648fa95a9..0b49f38343b 100644 --- a/code/modules/events/devil.dm +++ b/code/modules/events/devil.dm @@ -14,9 +14,7 @@ /datum/round_event/ghost_role/devil/spawn_role() //selecting a spawn_loc - var/list/spawn_locs = GLOB.latejoin - var/spawn_loc = pick(spawn_locs) - if(!spawn_loc) + if(!SSjob.latejoin_trackers.len) return MAP_ERROR //selecting a candidate player @@ -30,7 +28,7 @@ var/datum/mind/Mind = create_devil_mind(key) Mind.active = 1 - var/mob/living/carbon/human/devil = create_event_devil(spawn_loc) + var/mob/living/carbon/human/devil = create_event_devil() Mind.transfer_to(devil) add_devil(devil, ascendable = FALSE) @@ -45,6 +43,8 @@ /proc/create_event_devil(spawn_loc) var/mob/living/carbon/human/new_devil = new(spawn_loc) + if(!spawn_loc) + SSjob.SendToLateJoin(new_devil) var/datum/preferences/A = new() //Randomize appearance for the devil. A.copy_to(new_devil) new_devil.dna.update_dna_identity() diff --git a/code/modules/events/immovable_rod.dm b/code/modules/events/immovable_rod.dm index 5e6407b60dd..837a3b650fd 100644 --- a/code/modules/events/immovable_rod.dm +++ b/code/modules/events/immovable_rod.dm @@ -82,13 +82,8 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 if(clong.density) clong.ex_act(2) - else if(ismob(clong)) - if(ishuman(clong)) - var/mob/living/carbon/human/H = clong - H.visible_message("[H.name] is penetrated by an immovable rod!" , "The rod penetrates you!" , "You hear a CLANG!") - H.adjustBruteLoss(160) - if(clong.density || prob(10)) - clong.ex_act(2) + else if(isliving(clong)) + penetrate(clong) else if(istype(clong, type)) var/obj/effect/immovablerod/other = clong visible_message("[src] collides with [other]!\ @@ -98,3 +93,11 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 smoke.start() qdel(src) qdel(other) + +/obj/effect/immovablerod/proc/penetrate(mob/living/L) + L.visible_message("[L] is penetrated by an immovable rod!" , "The rod penetrates you!" , "You hear a CLANG!") + if(ishuman(L)) + var/mob/living/carbon/human/H = L + H.adjustBruteLoss(160) + if(L && (L.density || prob(10))) + L.ex_act(2) diff --git a/code/modules/fields/peaceborg_dampener.dm b/code/modules/fields/peaceborg_dampener.dm index 5d2d2829a91..ed7a3737eea 100644 --- a/code/modules/fields/peaceborg_dampener.dm +++ b/code/modules/fields/peaceborg_dampener.dm @@ -54,6 +54,7 @@ var/obj/effect/abstract/proximity_checker/advanced/F = edge_turfs[T] F.appearance = I.appearance F.invisibility = 0 + F.mouse_opacity = 0 F.layer = 5 /datum/proximity_monitor/advanced/peaceborg_dampener/cleanup_edge_turf(turf/T) diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 9710098c5fa..cacfbd101ba 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -437,7 +437,7 @@ Gunshots/explosions/opening doors/less rare audio (done) var/list/image/delusions = list() /obj/effect/hallucination/delusion/Initialize(mapload, mob/living/carbon/T,force_kind = null , duration = 300,skip_nearby = 1, custom_icon = null, custom_icon_file = null) - ..() + . = ..() target = T var/image/A = null var/kind = force_kind ? force_kind : pick("clown","corgi","carp","skeleton","demon","zombie") diff --git a/code/modules/food_and_drinks/recipes/food_mixtures.dm b/code/modules/food_and_drinks/recipes/food_mixtures.dm index 314ee2c8e2e..17662feb6e1 100644 --- a/code/modules/food_and_drinks/recipes/food_mixtures.dm +++ b/code/modules/food_and_drinks/recipes/food_mixtures.dm @@ -1,5 +1,6 @@ /datum/crafting_recipe/food var/real_parts + category = CAT_FOOD /datum/crafting_recipe/food/New() real_parts = parts.Copy() diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm index d0682ced1eb..38882070119 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm @@ -11,7 +11,7 @@ /obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 3 ) result = /obj/item/weapon/reagent_containers/food/snacks/store/bread/meat - category = CAT_BREAD + subcategory = CAT_BREAD /datum/crafting_recipe/food/xenomeatbread name = "Xenomeat bread" @@ -21,7 +21,7 @@ /obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 3 ) result = /obj/item/weapon/reagent_containers/food/snacks/store/bread/xenomeat - category = CAT_BREAD + subcategory = CAT_BREAD /datum/crafting_recipe/food/spidermeatbread name = "Spidermeat bread" @@ -31,7 +31,7 @@ /obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 3 ) result = /obj/item/weapon/reagent_containers/food/snacks/store/bread/spidermeat - category = CAT_BREAD + subcategory = CAT_BREAD /datum/crafting_recipe/food/banananutbread name = "Banana nut bread" @@ -42,7 +42,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/banana = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/store/bread/banana - category = CAT_BREAD + subcategory = CAT_BREAD /datum/crafting_recipe/food/tofubread name = "Tofu bread" @@ -52,7 +52,7 @@ /obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 3 ) result = /obj/item/weapon/reagent_containers/food/snacks/store/bread/tofu - category = CAT_BREAD + subcategory = CAT_BREAD /datum/crafting_recipe/food/creamcheesebread name = "Cream cheese bread" @@ -62,7 +62,7 @@ /obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 2 ) result = /obj/item/weapon/reagent_containers/food/snacks/store/bread/creamcheese - category = CAT_BREAD + subcategory = CAT_BREAD /datum/crafting_recipe/food/mimanabread name = "Mimana bread" @@ -73,7 +73,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/banana/mime = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/store/bread/mimana - category = CAT_BREAD + subcategory = CAT_BREAD /datum/crafting_recipe/food/butteredtoast name = "Buttered Toast" @@ -82,7 +82,7 @@ /obj/item/weapon/reagent_containers/food/snacks/butter = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/butteredtoast - category = CAT_BREAD + subcategory = CAT_BREAD /datum/crafting_recipe/food/butterbiscuit name = "Butter Biscuit" @@ -91,5 +91,5 @@ /obj/item/weapon/reagent_containers/food/snacks/butter = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/butterbiscuit - category = CAT_BREAD + subcategory = CAT_BREAD diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm index 573574f4e9c..4a150faad77 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm @@ -14,7 +14,7 @@ /obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain/human = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/burger/human - category = CAT_BURGER + subcategory = CAT_BURGER /datum/crafting_recipe/food/burger name = "Burger" @@ -24,7 +24,7 @@ ) result = /obj/item/weapon/reagent_containers/food/snacks/burger/plain - category = CAT_BURGER + subcategory = CAT_BURGER /datum/crafting_recipe/food/corgiburger name = "Corgi burger" @@ -34,7 +34,7 @@ ) result = /obj/item/weapon/reagent_containers/food/snacks/burger/corgi - category = CAT_BURGER + subcategory = CAT_BURGER /datum/crafting_recipe/food/appendixburger name = "Appendix burger" @@ -43,7 +43,7 @@ /obj/item/weapon/reagent_containers/food/snacks/bun = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/burger/appendix - category = CAT_BURGER + subcategory = CAT_BURGER /datum/crafting_recipe/food/brainburger name = "Brain burger" @@ -52,7 +52,7 @@ /obj/item/weapon/reagent_containers/food/snacks/bun = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/burger/brain - category = CAT_BURGER + subcategory = CAT_BURGER /datum/crafting_recipe/food/xenoburger name = "Xeno burger" @@ -61,7 +61,7 @@ /obj/item/weapon/reagent_containers/food/snacks/bun = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/burger/xeno - category = CAT_BURGER + subcategory = CAT_BURGER /datum/crafting_recipe/food/bearger name = "Bearger" @@ -70,7 +70,7 @@ /obj/item/weapon/reagent_containers/food/snacks/bun = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/burger/bearger - category = CAT_BURGER + subcategory = CAT_BURGER /datum/crafting_recipe/food/fishburger name = "Fish burger" @@ -79,7 +79,7 @@ /obj/item/weapon/reagent_containers/food/snacks/bun = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/burger/fish - category = CAT_BURGER + subcategory = CAT_BURGER /datum/crafting_recipe/food/tofuburger name = "Tofu burger" @@ -88,7 +88,7 @@ /obj/item/weapon/reagent_containers/food/snacks/bun = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/burger/tofu - category = CAT_BURGER + subcategory = CAT_BURGER /datum/crafting_recipe/food/ghostburger name = "Ghost burger" @@ -97,7 +97,7 @@ /obj/item/weapon/reagent_containers/food/snacks/bun = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/burger/ghost - category = CAT_BURGER + subcategory = CAT_BURGER /datum/crafting_recipe/food/clownburger name = "Clown burger" @@ -106,7 +106,7 @@ /obj/item/weapon/reagent_containers/food/snacks/bun = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/burger/clown - category = CAT_BURGER + subcategory = CAT_BURGER /datum/crafting_recipe/food/mimeburger name = "Mime burger" @@ -115,7 +115,7 @@ /obj/item/weapon/reagent_containers/food/snacks/bun = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/burger/mime - category = CAT_BURGER + subcategory = CAT_BURGER /datum/crafting_recipe/food/redburger name = "Red burger" @@ -125,7 +125,7 @@ /obj/item/weapon/reagent_containers/food/snacks/bun = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/burger/red - category = CAT_BURGER + subcategory = CAT_BURGER /datum/crafting_recipe/food/orangeburger name = "Orange burger" @@ -135,7 +135,7 @@ /obj/item/weapon/reagent_containers/food/snacks/bun = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/burger/orange - category = CAT_BURGER + subcategory = CAT_BURGER /datum/crafting_recipe/food/yellowburger name = "Yellow burger" @@ -145,7 +145,7 @@ /obj/item/weapon/reagent_containers/food/snacks/bun = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/burger/yellow - category = CAT_BURGER + subcategory = CAT_BURGER /datum/crafting_recipe/food/greenburger name = "Green burger" @@ -155,7 +155,7 @@ /obj/item/weapon/reagent_containers/food/snacks/bun = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/burger/green - category = CAT_BURGER + subcategory = CAT_BURGER /datum/crafting_recipe/food/blueburger name = "Blue burger" @@ -165,7 +165,7 @@ /obj/item/weapon/reagent_containers/food/snacks/bun = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/burger/blue - category = CAT_BURGER + subcategory = CAT_BURGER /datum/crafting_recipe/food/purpleburger name = "Purple burger" @@ -175,7 +175,7 @@ /obj/item/weapon/reagent_containers/food/snacks/bun = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/burger/purple - category = CAT_BURGER + subcategory = CAT_BURGER /datum/crafting_recipe/food/spellburger name = "Spell burger" @@ -183,7 +183,7 @@ /obj/item/clothing/head/wizard/fake = 1, ) result = /obj/item/weapon/reagent_containers/food/snacks/burger/spell - category = CAT_BURGER + subcategory = CAT_BURGER /datum/crafting_recipe/food/spellburger2 name = "Spell burger" @@ -192,7 +192,7 @@ /obj/item/weapon/reagent_containers/food/snacks/bun = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/burger/spell - category = CAT_BURGER + subcategory = CAT_BURGER /datum/crafting_recipe/food/bigbiteburger name = "Big bite burger" @@ -201,7 +201,7 @@ /obj/item/weapon/reagent_containers/food/snacks/bun = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/burger/bigbite - category = CAT_BURGER + subcategory = CAT_BURGER /datum/crafting_recipe/food/superbiteburger name = "Super bite burger" @@ -216,7 +216,7 @@ ) result = /obj/item/weapon/reagent_containers/food/snacks/burger/superbite - category = CAT_BURGER + subcategory = CAT_BURGER /datum/crafting_recipe/food/slimeburger name = "Jelly burger" @@ -225,7 +225,7 @@ /obj/item/weapon/reagent_containers/food/snacks/bun = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/burger/jelly/slime - category = CAT_BURGER + subcategory = CAT_BURGER /datum/crafting_recipe/food/jellyburger name = "Jelly burger" @@ -234,7 +234,7 @@ /obj/item/weapon/reagent_containers/food/snacks/bun = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/burger/jelly/cherry - category = CAT_BURGER + subcategory = CAT_BURGER /datum/crafting_recipe/food/fivealarmburger name = "Five alarm burger" @@ -243,7 +243,7 @@ /obj/item/weapon/reagent_containers/food/snacks/bun = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/burger/fivealarm - category = CAT_BURGER + subcategory = CAT_BURGER /datum/crafting_recipe/food/ratburger name = "Rat burger" @@ -252,7 +252,7 @@ /obj/item/weapon/reagent_containers/food/snacks/bun = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/burger/rat - category = CAT_BURGER + subcategory = CAT_BURGER /datum/crafting_recipe/food/baseballburger name = "Home run baseball burger" @@ -261,7 +261,7 @@ /obj/item/weapon/reagent_containers/food/snacks/bun = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/burger/baseball - category = CAT_BURGER + subcategory = CAT_BURGER /datum/crafting_recipe/food/baconburger name = "Bacon Burger" @@ -272,4 +272,4 @@ ) result = /obj/item/weapon/reagent_containers/food/snacks/burger/baconburger - category = CAT_BURGER + subcategory = CAT_BURGER diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm index 439db2986b0..af288dddfc3 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm @@ -10,7 +10,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/carrot = 2 ) result = /obj/item/weapon/reagent_containers/food/snacks/store/cake/carrot - category = CAT_CAKE + subcategory = CAT_CAKE /datum/crafting_recipe/food/cheesecake name = "Cheese cake" @@ -19,7 +19,7 @@ /obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 2 ) result = /obj/item/weapon/reagent_containers/food/snacks/store/cake/cheese - category = CAT_CAKE + subcategory = CAT_CAKE /datum/crafting_recipe/food/applecake name = "Apple cake" @@ -28,7 +28,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/apple = 2 ) result = /obj/item/weapon/reagent_containers/food/snacks/store/cake/apple - category = CAT_CAKE + subcategory = CAT_CAKE /datum/crafting_recipe/food/orangecake name = "Orange cake" @@ -37,7 +37,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/citrus/orange = 2 ) result = /obj/item/weapon/reagent_containers/food/snacks/store/cake/orange - category = CAT_CAKE + subcategory = CAT_CAKE /datum/crafting_recipe/food/limecake name = "Lime cake" @@ -46,7 +46,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/citrus/lime = 2 ) result = /obj/item/weapon/reagent_containers/food/snacks/store/cake/lime - category = CAT_CAKE + subcategory = CAT_CAKE /datum/crafting_recipe/food/lemoncake name = "Lemon cake" @@ -55,7 +55,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/citrus/lemon = 2 ) result = /obj/item/weapon/reagent_containers/food/snacks/store/cake/lemon - category = CAT_CAKE + subcategory = CAT_CAKE /datum/crafting_recipe/food/chocolatecake name = "Chocolate cake" @@ -64,7 +64,7 @@ /obj/item/weapon/reagent_containers/food/snacks/chocolatebar = 2 ) result = /obj/item/weapon/reagent_containers/food/snacks/store/cake/chocolate - category = CAT_CAKE + subcategory = CAT_CAKE /datum/crafting_recipe/food/birthdaycake name = "Birthday cake" @@ -73,7 +73,7 @@ /obj/item/weapon/reagent_containers/food/snacks/store/cake/plain = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/store/cake/birthday - category = CAT_CAKE + subcategory = CAT_CAKE /datum/crafting_recipe/food/braincake name = "Brain cake" @@ -82,7 +82,7 @@ /obj/item/weapon/reagent_containers/food/snacks/store/cake/plain = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/store/cake/brain - category = CAT_CAKE + subcategory = CAT_CAKE /datum/crafting_recipe/food/slimecake name = "Slime cake" @@ -91,7 +91,7 @@ /obj/item/weapon/reagent_containers/food/snacks/store/cake/plain = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/store/cake/slimecake - category = CAT_CAKE + subcategory = CAT_CAKE /datum/crafting_recipe/food/pumpkinspicecake name = "Pumpkin spice cake" @@ -100,7 +100,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/pumpkin = 2 ) result = /obj/item/weapon/reagent_containers/food/snacks/store/cake/pumpkinspice - category = CAT_CAKE + subcategory = CAT_CAKE /datum/crafting_recipe/food/cak name = "Living cat/cake hybrid" @@ -114,4 +114,4 @@ /datum/reagent/teslium = 1 //To shock the whole thing into life ) result = /mob/living/simple_animal/pet/cat/cak - category = CAT_CAKE //Cat! Haha, get it? CAT? GET IT??? + subcategory = CAT_CAKE //Cat! Haha, get it? CAT? GET IT??? diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_egg.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_egg.dm index c03fbe47107..f1e96f526e8 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_egg.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_egg.dm @@ -11,7 +11,7 @@ /obj/item/weapon/reagent_containers/food/snacks/boiledegg = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/friedegg - category = CAT_EGG + subcategory = CAT_EGG /datum/crafting_recipe/food/omelette name = "omelette" @@ -20,7 +20,7 @@ /obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 2 ) result = /obj/item/weapon/reagent_containers/food/snacks/omelette - category = CAT_EGG + subcategory = CAT_EGG /datum/crafting_recipe/food/chocolateegg name = "Chocolate egg" @@ -29,7 +29,7 @@ /obj/item/weapon/reagent_containers/food/snacks/chocolatebar = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/chocolateegg - category = CAT_EGG + subcategory = CAT_EGG /datum/crafting_recipe/food/eggsbenedict name = "Eggs benedict" @@ -39,4 +39,4 @@ /obj/item/weapon/reagent_containers/food/snacks/breadslice/plain = 1, ) result = /obj/item/weapon/reagent_containers/food/snacks/benedict - category = CAT_EGG + subcategory = CAT_EGG diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm index 878dda18042..60d949bb9da 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm @@ -9,7 +9,7 @@ /obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain/human = 2 ) result = /obj/item/weapon/reagent_containers/food/snacks/kebab/human - category = CAT_MEAT + subcategory = CAT_MEAT /datum/crafting_recipe/food/kebab name = "Kebab" @@ -18,7 +18,7 @@ /obj/item/weapon/reagent_containers/food/snacks/meat/steak = 2 ) result = /obj/item/weapon/reagent_containers/food/snacks/kebab/monkey - category = CAT_MEAT + subcategory = CAT_MEAT /datum/crafting_recipe/food/tofukebab name = "Tofu kebab" @@ -27,7 +27,7 @@ /obj/item/weapon/reagent_containers/food/snacks/tofu = 2 ) result = /obj/item/weapon/reagent_containers/food/snacks/kebab/tofu - category = CAT_MEAT + subcategory = CAT_MEAT /datum/crafting_recipe/food/tailkebab name = "Lizard tail kebab" @@ -36,7 +36,7 @@ /obj/item/severedtail = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/kebab/tail - category = CAT_MEAT + subcategory = CAT_MEAT // see code/module/crafting/table.dm @@ -50,7 +50,7 @@ /obj/item/weapon/reagent_containers/food/snacks/carpmeat = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/cubancarp - category = CAT_MEAT + subcategory = CAT_MEAT /datum/crafting_recipe/food/fishandchips name = "Fish and chips" @@ -59,7 +59,7 @@ /obj/item/weapon/reagent_containers/food/snacks/carpmeat = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/fishandchips - category = CAT_MEAT + subcategory = CAT_MEAT /datum/crafting_recipe/food/fishfingers name = "Fish fingers" @@ -69,7 +69,7 @@ /obj/item/weapon/reagent_containers/food/snacks/carpmeat = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/fishfingers - category = CAT_MEAT + subcategory = CAT_MEAT /datum/crafting_recipe/food/sashimi name = "Sashimi" @@ -79,7 +79,7 @@ /obj/item/weapon/reagent_containers/food/snacks/carpmeat = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/sashimi - category = CAT_MEAT + subcategory = CAT_MEAT ////////////////////////////////////////////////MR SPIDER//////////////////////////////////////////////// @@ -91,7 +91,7 @@ /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet/spider = 2 ) result = /obj/item/weapon/reagent_containers/food/snacks/spidereggsham - category = CAT_MEAT + subcategory = CAT_MEAT ////////////////////////////////////////////////MISC RECIPE's//////////////////////////////////////////////// @@ -103,7 +103,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/cabbage = 2 ) result = /obj/item/weapon/reagent_containers/food/snacks/cornedbeef - category = CAT_MEAT + subcategory = CAT_MEAT /datum/crafting_recipe/food/bearsteak name = "Filet migrawr" @@ -113,7 +113,7 @@ ) tools = list(/obj/item/weapon/lighter) result = /obj/item/weapon/reagent_containers/food/snacks/bearsteak - category = CAT_MEAT + subcategory = CAT_MEAT /datum/crafting_recipe/food/enchiladas name = "Enchiladas" @@ -123,7 +123,7 @@ /obj/item/weapon/reagent_containers/food/snacks/tortilla = 2 ) result = /obj/item/weapon/reagent_containers/food/snacks/enchiladas - category = CAT_MEAT + subcategory = CAT_MEAT /datum/crafting_recipe/food/stewedsoymeat name = "Stewed soymeat" @@ -133,7 +133,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/tomato = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/stewedsoymeat - category = CAT_MEAT + subcategory = CAT_MEAT /datum/crafting_recipe/food/sausage name = "Sausage" @@ -142,7 +142,7 @@ /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet = 2 ) result = /obj/item/weapon/reagent_containers/food/snacks/sausage - category = CAT_MEAT + subcategory = CAT_MEAT /datum/crafting_recipe/food/nugget name = "Chicken nugget" @@ -150,7 +150,7 @@ /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/nugget - category = CAT_MEAT + subcategory = CAT_MEAT /datum/crafting_recipe/food/rawkhinkali name = "Raw Khinkali" @@ -159,7 +159,7 @@ /obj/item/weapon/reagent_containers/food/snacks/faggot = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/rawkhinkali - category = CAT_MEAT + subcategory = CAT_MEAT /datum/crafting_recipe/food/pigblanket name = "Pig in a Blanket" @@ -169,4 +169,4 @@ /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/pigblanket - category = CAT_MEAT + subcategory = CAT_MEAT diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm index e424a381404..5a7c3a1b312 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm @@ -10,7 +10,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/apple = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/candiedapple - category = CAT_MISCFOOD + subcategory = CAT_MISCFOOD /datum/crafting_recipe/food/chococoin name = "Choco coin" @@ -19,7 +19,7 @@ /obj/item/weapon/reagent_containers/food/snacks/chocolatebar = 1, ) result = /obj/item/weapon/reagent_containers/food/snacks/chococoin - category = CAT_MISCFOOD + subcategory = CAT_MISCFOOD /datum/crafting_recipe/food/fudgedice name = "Fudge dice" @@ -28,7 +28,7 @@ /obj/item/weapon/reagent_containers/food/snacks/chocolatebar = 1, ) result = /obj/item/weapon/reagent_containers/food/snacks/fudgedice - category = CAT_MISCFOOD + subcategory = CAT_MISCFOOD /datum/crafting_recipe/food/chocoorange name = "Choco orange" @@ -37,7 +37,7 @@ /obj/item/weapon/reagent_containers/food/snacks/chocolatebar = 1, ) result = /obj/item/weapon/reagent_containers/food/snacks/chocoorange - category = CAT_MISCFOOD + subcategory = CAT_MISCFOOD /datum/crafting_recipe/food/loadedbakedpotato name = "Loaded baked potato" @@ -47,7 +47,7 @@ /obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/loadedbakedpotato - category = CAT_MISCFOOD + subcategory = CAT_MISCFOOD /datum/crafting_recipe/food/cheesyfries name = "Cheesy fries" @@ -56,7 +56,7 @@ /obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/cheesyfries - category = CAT_MISCFOOD + subcategory = CAT_MISCFOOD /datum/crafting_recipe/food/wrap name = "Wrap" @@ -65,7 +65,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/cabbage = 1, ) result = /obj/item/weapon/reagent_containers/food/snacks/eggwrap - category = CAT_MISCFOOD + subcategory = CAT_MISCFOOD /datum/crafting_recipe/food/beans name = "Beans" @@ -74,7 +74,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/soybeans = 2 ) result = /obj/item/weapon/reagent_containers/food/snacks/beans - category = CAT_MISCFOOD + subcategory = CAT_MISCFOOD /datum/crafting_recipe/food/eggplantparm name ="Eggplant parmigiana" @@ -83,7 +83,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/eggplant = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/eggplantparm - category = CAT_MISCFOOD + subcategory = CAT_MISCFOOD /datum/crafting_recipe/food/baguette name = "Baguette" @@ -93,7 +93,7 @@ /obj/item/weapon/reagent_containers/food/snacks/pastrybase = 2 ) result = /obj/item/weapon/reagent_containers/food/snacks/baguette - category = CAT_MISCFOOD + subcategory = CAT_MISCFOOD ////////////////////////////////////////////////TOAST//////////////////////////////////////////////// @@ -104,7 +104,7 @@ /obj/item/weapon/reagent_containers/food/snacks/breadslice/plain = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/jelliedtoast/slime - category = CAT_MISCFOOD + subcategory = CAT_MISCFOOD /datum/crafting_recipe/food/jelliedyoast name = "Jellied toast" @@ -113,7 +113,7 @@ /obj/item/weapon/reagent_containers/food/snacks/breadslice/plain = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/jelliedtoast/cherry - category = CAT_MISCFOOD + subcategory = CAT_MISCFOOD /datum/crafting_recipe/food/twobread name = "Two bread" @@ -122,7 +122,7 @@ /obj/item/weapon/reagent_containers/food/snacks/breadslice/plain = 2 ) result = /obj/item/weapon/reagent_containers/food/snacks/twobread - category = CAT_MISCFOOD + subcategory = CAT_MISCFOOD /datum/crafting_recipe/food/burrito name ="Burrito" @@ -131,7 +131,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/soybeans = 2 ) result = /obj/item/weapon/reagent_containers/food/snacks/burrito - category = CAT_MISCFOOD + subcategory = CAT_MISCFOOD /datum/crafting_recipe/food/cheesyburrito name ="Cheesy burrito" @@ -141,7 +141,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/soybeans = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/cheesyburrito - category = CAT_MISCFOOD + subcategory = CAT_MISCFOOD /datum/crafting_recipe/food/carneburrito name ="Carne de asada burrito" @@ -151,7 +151,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/soybeans = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/carneburrito - category = CAT_MISCFOOD + subcategory = CAT_MISCFOOD /datum/crafting_recipe/food/fuegoburrito name ="Fuego plasma burrito" @@ -161,7 +161,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/soybeans = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/fuegoburrito - category = CAT_MISCFOOD + subcategory = CAT_MISCFOOD /datum/crafting_recipe/food/melonfruitbowl name ="Melon fruit bowl" @@ -174,7 +174,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/melonfruitbowl - category = CAT_MISCFOOD + subcategory = CAT_MISCFOOD /datum/crafting_recipe/food/spacefreezy name ="Space freezy" @@ -184,7 +184,7 @@ /obj/item/weapon/reagent_containers/food/snacks/icecream = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/spacefreezy - category = CAT_MISCFOOD + subcategory = CAT_MISCFOOD /datum/crafting_recipe/food/sundae name ="Sundae" @@ -195,7 +195,7 @@ /obj/item/weapon/reagent_containers/food/snacks/icecream = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/sundae - category = CAT_MISCFOOD + subcategory = CAT_MISCFOOD /datum/crafting_recipe/food/honkdae name ="Honkdae" @@ -207,7 +207,7 @@ /obj/item/weapon/reagent_containers/food/snacks/icecream = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/honkdae - category = CAT_MISCFOOD + subcategory = CAT_MISCFOOD /datum/crafting_recipe/food/nachos name ="Nachos" @@ -216,7 +216,7 @@ /obj/item/weapon/reagent_containers/food/snacks/tortilla = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/nachos - category = CAT_MISCFOOD + subcategory = CAT_MISCFOOD /datum/crafting_recipe/food/cheesynachos name ="Cheesy nachos" @@ -226,7 +226,7 @@ /obj/item/weapon/reagent_containers/food/snacks/tortilla = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/cheesynachos - category = CAT_MISCFOOD + subcategory = CAT_MISCFOOD /datum/crafting_recipe/food/cubannachos name ="Cuban nachos" @@ -236,7 +236,7 @@ /obj/item/weapon/reagent_containers/food/snacks/tortilla = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/cubannachos - category = CAT_MISCFOOD + subcategory = CAT_MISCFOOD /datum/crafting_recipe/food/melonkeg name ="Melon keg" @@ -247,7 +247,7 @@ ) parts = list(/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka = 1) result = /obj/item/weapon/reagent_containers/food/snacks/melonkeg - category = CAT_MISCFOOD + subcategory = CAT_MISCFOOD /datum/crafting_recipe/food/honeybar name = "Honey nut bar" @@ -256,7 +256,7 @@ /datum/reagent/consumable/honey = 5 ) result = /obj/item/weapon/reagent_containers/food/snacks/honeybar - category = CAT_MISCFOOD + subcategory = CAT_MISCFOOD /datum/crafting_recipe/food/stuffedlegion @@ -269,7 +269,7 @@ /datum/reagent/consumable/capsaicin = 2 ) result = /obj/item/weapon/reagent_containers/food/snacks/stuffedlegion - category = CAT_MISCFOOD + subcategory = CAT_MISCFOOD /datum/crafting_recipe/food/lizardwine @@ -280,7 +280,7 @@ /datum/reagent/consumable/ethanol = 100 ) result = /obj/item/weapon/reagent_containers/food/drinks/bottle/lizardwine - category = CAT_MISCFOOD + subcategory = CAT_MISCFOOD /datum/crafting_recipe/food/powercrepe @@ -294,7 +294,7 @@ /obj/item/weapon/melee/sabre = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/powercrepe - category = CAT_MISCFOOD + subcategory = CAT_MISCFOOD /datum/crafting_recipe/food/taco name ="Classic Taco" @@ -305,7 +305,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/cabbage = 1, ) result = /obj/item/weapon/reagent_containers/food/snacks/taco - category = CAT_MISCFOOD + subcategory = CAT_MISCFOOD /datum/crafting_recipe/food/tacoplain name ="Plain Taco" @@ -315,7 +315,7 @@ /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet = 1, ) result = /obj/item/weapon/reagent_containers/food/snacks/taco/plain - category = CAT_MISCFOOD + subcategory = CAT_MISCFOOD /datum/crafting_recipe/food/branrequests name = "Bran Requests Cereal" @@ -324,4 +324,4 @@ /obj/item/weapon/reagent_containers/food/snacks/no_raisin = 1, ) result = /obj/item/weapon/reagent_containers/food/snacks/branrequests - category = CAT_MISCFOOD + subcategory = CAT_MISCFOOD diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm index fd943379e0d..b20a957546a 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm @@ -11,7 +11,7 @@ /obj/item/weapon/reagent_containers/food/snacks/pastrybase = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/donut/chaos - category = CAT_PASTRY + subcategory = CAT_PASTRY /datum/crafting_recipe/food/donut time = 15 @@ -21,7 +21,7 @@ /obj/item/weapon/reagent_containers/food/snacks/pastrybase = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/donut - category = CAT_PASTRY + subcategory = CAT_PASTRY /datum/crafting_recipe/food/jellydonut name = "Jelly donut" @@ -30,7 +30,7 @@ /obj/item/weapon/reagent_containers/food/snacks/pastrybase = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/donut/jelly - category = CAT_PASTRY + subcategory = CAT_PASTRY /datum/crafting_recipe/food/cherryjellydonut name = "Cherry jelly donut" @@ -39,7 +39,7 @@ /obj/item/weapon/reagent_containers/food/snacks/pastrybase = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/donut/jelly/cherryjelly - category = CAT_PASTRY + subcategory = CAT_PASTRY /datum/crafting_recipe/food/slimejellydonut name = "Slime jelly donut" @@ -48,7 +48,7 @@ /obj/item/weapon/reagent_containers/food/snacks/pastrybase = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/donut/jelly/slimejelly - category = CAT_PASTRY + subcategory = CAT_PASTRY ////////////////////////////////////////////////WAFFLES//////////////////////////////////////////////// @@ -59,7 +59,7 @@ /obj/item/weapon/reagent_containers/food/snacks/pastrybase = 2 ) result = /obj/item/weapon/reagent_containers/food/snacks/waffles - category = CAT_PASTRY + subcategory = CAT_PASTRY /datum/crafting_recipe/food/soylenviridians @@ -69,7 +69,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/soybeans = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/soylenviridians - category = CAT_PASTRY + subcategory = CAT_PASTRY /datum/crafting_recipe/food/soylentgreen name = "Soylent green" @@ -78,7 +78,7 @@ /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human = 2 ) result = /obj/item/weapon/reagent_containers/food/snacks/soylentgreen - category = CAT_PASTRY + subcategory = CAT_PASTRY /datum/crafting_recipe/food/rofflewaffles @@ -88,7 +88,7 @@ /obj/item/weapon/reagent_containers/food/snacks/pastrybase = 2 ) result = /obj/item/weapon/reagent_containers/food/snacks/rofflewaffles - category = CAT_PASTRY + subcategory = CAT_PASTRY ////////////////////////////////////////////////DONKPOCCKETS//////////////////////////////////////////////// @@ -100,7 +100,7 @@ /obj/item/weapon/reagent_containers/food/snacks/faggot = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/donkpocket - category = CAT_PASTRY + subcategory = CAT_PASTRY /datum/crafting_recipe/food/dankpocket time = 15 @@ -110,7 +110,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/cannabis = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/dankpocket - category = CAT_PASTRY + subcategory = CAT_PASTRY ////////////////////////////////////////////////MUFFINS//////////////////////////////////////////////// @@ -122,7 +122,7 @@ /obj/item/weapon/reagent_containers/food/snacks/pastrybase = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/muffin - category = CAT_PASTRY + subcategory = CAT_PASTRY /datum/crafting_recipe/food/berrymuffin name = "Berry muffin" @@ -132,7 +132,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/berries = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/muffin/berry - category = CAT_PASTRY + subcategory = CAT_PASTRY /datum/crafting_recipe/food/booberrymuffin name = "Booberry muffin" @@ -143,7 +143,7 @@ /obj/item/weapon/ectoplasm = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/muffin/booberry - category = CAT_PASTRY + subcategory = CAT_PASTRY /datum/crafting_recipe/food/chawanmushi name = "Chawanmushi" @@ -154,7 +154,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/chanterelle = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/chawanmushi - category = CAT_PASTRY + subcategory = CAT_PASTRY ////////////////////////////////////////////OTHER//////////////////////////////////////////// @@ -166,7 +166,7 @@ /obj/item/weapon/reagent_containers/food/snacks/sausage = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/hotdog - category = CAT_PASTRY + subcategory = CAT_PASTRY /datum/crafting_recipe/food/meatbun name = "Meat bun" @@ -177,7 +177,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/cabbage = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/meatbun - category = CAT_PASTRY + subcategory = CAT_PASTRY /datum/crafting_recipe/food/khachapuri name = "Khachapuri" @@ -187,7 +187,7 @@ /obj/item/weapon/reagent_containers/food/snacks/store/bread/plain = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/khachapuri - category = CAT_PASTRY + subcategory = CAT_PASTRY /datum/crafting_recipe/food/sugarcookie time = 15 @@ -197,7 +197,7 @@ /obj/item/weapon/reagent_containers/food/snacks/pastrybase = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/sugarcookie - category = CAT_PASTRY + subcategory = CAT_PASTRY /datum/crafting_recipe/food/fortunecookie time = 15 @@ -210,7 +210,7 @@ /obj/item/weapon/paper = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/fortunecookie - category = CAT_PASTRY + subcategory = CAT_PASTRY /datum/crafting_recipe/food/poppypretzel time = 15 @@ -220,7 +220,7 @@ /obj/item/weapon/reagent_containers/food/snacks/pastrybase = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/poppypretzel - category = CAT_PASTRY + subcategory = CAT_PASTRY /datum/crafting_recipe/food/plumphelmetbiscuit time = 15 @@ -230,7 +230,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/plumphelmet = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit - category = CAT_PASTRY + subcategory = CAT_PASTRY /datum/crafting_recipe/food/cracker time = 15 @@ -240,7 +240,7 @@ /obj/item/weapon/reagent_containers/food/snacks/pastrybase = 1, ) result = /obj/item/weapon/reagent_containers/food/snacks/cracker - category = CAT_PASTRY + subcategory = CAT_PASTRY /datum/crafting_recipe/food/chococornet name = "Choco cornet" @@ -250,7 +250,7 @@ /obj/item/weapon/reagent_containers/food/snacks/chocolatebar = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/chococornet - category = CAT_PASTRY + subcategory = CAT_PASTRY /datum/crafting_recipe/food/oatmealcookie name = "Oatmeal cookie" @@ -268,7 +268,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/oat = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/raisincookie - category = CAT_PASTRY + subcategory = CAT_PASTRY /datum/crafting_recipe/food/cherrycupcake name = "Cherry cupcake" @@ -277,7 +277,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/cherries = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/cherrycupcake - category = CAT_PASTRY + subcategory = CAT_PASTRY /datum/crafting_recipe/food/bluecherrycupcake name = "Blue cherry cupcake" @@ -286,7 +286,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/bluecherries = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/bluecherrycupcake - category = CAT_PASTRY + subcategory = CAT_PASTRY /datum/crafting_recipe/food/honeybun name = "Honey bun" @@ -295,4 +295,4 @@ /datum/reagent/consumable/honey = 5 ) result = /obj/item/weapon/reagent_containers/food/snacks/honeybun - category = CAT_PASTRY + subcategory = CAT_PASTRY diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm index df47c64de7f..f1628d41bca 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm @@ -11,7 +11,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/banana = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/pie/cream - category = CAT_PIE + subcategory = CAT_PIE /datum/crafting_recipe/food/meatpie name = "Meat pie" @@ -22,7 +22,7 @@ /obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/pie/meatpie - category = CAT_PIE + subcategory = CAT_PIE /datum/crafting_recipe/food/tofupie name = "Tofu pie" @@ -31,7 +31,7 @@ /obj/item/weapon/reagent_containers/food/snacks/tofu = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/pie/tofupie - category = CAT_PIE + subcategory = CAT_PIE /datum/crafting_recipe/food/xenopie name = "Xeno pie" @@ -40,7 +40,7 @@ /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet/xeno = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/pie/xemeatpie - category = CAT_PIE + subcategory = CAT_PIE /datum/crafting_recipe/food/cherrypie name = "Cherry pie" @@ -49,7 +49,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/cherries = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/pie/cherrypie - category = CAT_PIE + subcategory = CAT_PIE /datum/crafting_recipe/food/berryclafoutis name = "Berry clafoutis" @@ -58,7 +58,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/berries = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/pie/berryclafoutis - category = CAT_PIE + subcategory = CAT_PIE /datum/crafting_recipe/food/bearypie name = "Beary Pie" @@ -68,7 +68,7 @@ /obj/item/weapon/reagent_containers/food/snacks/meat/steak/bear = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/pie/bearypie - category = CAT_PIE + subcategory = CAT_PIE /datum/crafting_recipe/food/amanitapie name = "Amanita pie" @@ -77,7 +77,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/amanita = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/pie/amanita_pie - category = CAT_PIE + subcategory = CAT_PIE /datum/crafting_recipe/food/plumppie name = "Plump pie" @@ -86,7 +86,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/plumphelmet = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/pie/plump_pie - category = CAT_PIE + subcategory = CAT_PIE /datum/crafting_recipe/food/applepie name = "Apple pie" @@ -95,7 +95,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/apple = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/pie/applepie - category = CAT_PIE + subcategory = CAT_PIE /datum/crafting_recipe/food/pumpkinpie name = "Pumpkin pie" @@ -106,7 +106,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/pumpkin = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/pie/pumpkinpie - category = CAT_PIE + subcategory = CAT_PIE /datum/crafting_recipe/food/goldenappletart name = "Golden apple tart" @@ -117,7 +117,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/apple/gold = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/pie/appletart - category = CAT_PIE + subcategory = CAT_PIE /datum/crafting_recipe/food/grapetart name = "Grape tart" @@ -128,7 +128,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/grapes = 3 ) result = /obj/item/weapon/reagent_containers/food/snacks/pie/grapetart - category = CAT_PIE + subcategory = CAT_PIE /datum/crafting_recipe/food/blumpkinpie name = "Blumpkin pie" @@ -139,7 +139,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/blumpkin = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/pie/blumpkinpie - category = CAT_PIE + subcategory = CAT_PIE /datum/crafting_recipe/food/dulcedebatata name = "Dulce de batata" @@ -149,7 +149,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/potato/sweet = 2 ) result = /obj/item/weapon/reagent_containers/food/snacks/pie/dulcedebatata - category = CAT_PIE + subcategory = CAT_PIE /datum/crafting_recipe/food/frostypie name = "Frosty pie" @@ -158,4 +158,4 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/bluecherries = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/pie/frostypie - category = CAT_PIE + subcategory = CAT_PIE diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pizza.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pizza.dm index 8bb73ad7c86..95580df603e 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pizza.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pizza.dm @@ -11,7 +11,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/tomato = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/pizza/margherita - category = CAT_PIZZA + subcategory = CAT_PIZZA /datum/crafting_recipe/food/meatpizza name = "Meat pizza" @@ -22,7 +22,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/tomato = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/pizza/meat - category = CAT_PIZZA + subcategory = CAT_PIZZA /datum/crafting_recipe/food/mushroompizza name = "Mushroom pizza" @@ -31,7 +31,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom = 5 ) result = /obj/item/weapon/reagent_containers/food/snacks/pizza/mushroom - category = CAT_PIZZA + subcategory = CAT_PIZZA /datum/crafting_recipe/food/vegetablepizza name = "Vegetable pizza" @@ -43,7 +43,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/tomato = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/pizza/vegetable - category = CAT_PIZZA + subcategory = CAT_PIZZA /datum/crafting_recipe/food/donpocketpizza name = "Donkpocket pizza" @@ -54,7 +54,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/tomato = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/pizza/donkpocket - category = CAT_PIZZA + subcategory = CAT_PIZZA /datum/crafting_recipe/food/dankpizza name = "Dank pizza" @@ -65,7 +65,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/tomato = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/pizza/dank - category = CAT_PIZZA + subcategory = CAT_PIZZA /datum/crafting_recipe/food/sassysagepizza name = "Sassysage pizza" @@ -76,4 +76,4 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/tomato = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/pizza/sassysage - category = CAT_PIZZA + subcategory = CAT_PIZZA diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_salad.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_salad.dm index d60fc340839..66ed6f40ee4 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_salad.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_salad.dm @@ -11,7 +11,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/apple = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/salad/herbsalad - category = CAT_SALAD + subcategory = CAT_SALAD /datum/crafting_recipe/food/aesirsalad name = "Aesir salad" @@ -21,7 +21,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/apple/gold = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/salad/aesirsalad - category = CAT_SALAD + subcategory = CAT_SALAD /datum/crafting_recipe/food/validsalad name = "Valid salad" @@ -32,7 +32,7 @@ /obj/item/weapon/reagent_containers/food/snacks/faggot = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/salad/validsalad - category = CAT_SALAD + subcategory = CAT_SALAD /datum/crafting_recipe/food/monkeysdelight name = "Monkeys delight" @@ -45,7 +45,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/banana = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/soup/monkeysdelight - category = CAT_SALAD + subcategory = CAT_SALAD /datum/crafting_recipe/food/oatmeal name = "Oatmeal" @@ -55,7 +55,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/oat = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/salad/oatmeal - category = CAT_SALAD + subcategory = CAT_SALAD /datum/crafting_recipe/food/fruitsalad name = "Fruit salad" @@ -68,7 +68,7 @@ ) result = /obj/item/weapon/reagent_containers/food/snacks/salad/fruit - category = CAT_SALAD + subcategory = CAT_SALAD /datum/crafting_recipe/food/junglesalad name = "Jungle salad" @@ -81,7 +81,7 @@ ) result = /obj/item/weapon/reagent_containers/food/snacks/salad/jungle - category = CAT_SALAD + subcategory = CAT_SALAD /datum/crafting_recipe/food/citrusdelight name = "Citrus delight" @@ -93,7 +93,7 @@ ) result = /obj/item/weapon/reagent_containers/food/snacks/salad/citrusdelight - category = CAT_SALAD + subcategory = CAT_SALAD /datum/crafting_recipe/food/ricepork name = "Rice and pork" @@ -102,7 +102,7 @@ /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet = 2 ) result = /obj/item/weapon/reagent_containers/food/snacks/salad/ricepork - category = CAT_SALAD + subcategory = CAT_SALAD /datum/crafting_recipe/food/eggbowl name = "Egg bowl" @@ -113,7 +113,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/corn = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/salad/eggbowl - category = CAT_SALAD + subcategory = CAT_SALAD /datum/crafting_recipe/food/ricepudding name = "Rice pudding" @@ -123,4 +123,4 @@ /obj/item/weapon/reagent_containers/food/snacks/salad/boiledrice = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/salad/ricepudding - category = CAT_SALAD + subcategory = CAT_SALAD diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm index 3880dbdeca6..f2ed7da6aa0 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm @@ -14,7 +14,7 @@ /obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/sandwich - category = CAT_SANDWICH + subcategory = CAT_SANDWICH /datum/crafting_recipe/food/grilledcheesesandwich name = "Grilled cheese sandwich" @@ -23,7 +23,7 @@ /obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 2 ) result = /obj/item/weapon/reagent_containers/food/snacks/grilledcheese - category = CAT_SANDWICH + subcategory = CAT_SANDWICH /datum/crafting_recipe/food/slimesandwich name = "Jelly sandwich" @@ -32,7 +32,7 @@ /obj/item/weapon/reagent_containers/food/snacks/breadslice/plain = 2, ) result = /obj/item/weapon/reagent_containers/food/snacks/jellysandwich/slime - category = CAT_SANDWICH + subcategory = CAT_SANDWICH /datum/crafting_recipe/food/cherrysandwich name = "Jelly sandwich" @@ -41,7 +41,7 @@ /obj/item/weapon/reagent_containers/food/snacks/breadslice/plain = 2, ) result = /obj/item/weapon/reagent_containers/food/snacks/jellysandwich/cherry - category = CAT_SANDWICH + subcategory = CAT_SANDWICH /datum/crafting_recipe/food/icecreamsandwich name = "Icecream sandwich" @@ -51,7 +51,7 @@ /obj/item/weapon/reagent_containers/food/snacks/icecream = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/icecreamsandwich - category = CAT_SANDWICH + subcategory = CAT_SANDWICH /datum/crafting_recipe/food/notasandwich name = "Not a sandwich" @@ -60,7 +60,7 @@ /obj/item/clothing/mask/fakemoustache = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/notasandwich - category = CAT_SANDWICH + subcategory = CAT_SANDWICH diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm index 8ab865f65db..9a2a39c8f29 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm @@ -13,7 +13,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/potato = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/soup/meatball - category = CAT_SOUP + subcategory = CAT_SOUP /datum/crafting_recipe/food/vegetablesoup name = "Vegetable soup" @@ -26,7 +26,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/potato = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/soup/vegetable - category = CAT_SOUP + subcategory = CAT_SOUP /datum/crafting_recipe/food/nettlesoup name = "Nettle soup" @@ -38,7 +38,7 @@ /obj/item/weapon/reagent_containers/food/snacks/boiledegg = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/soup/nettle - category = CAT_SOUP + subcategory = CAT_SOUP /datum/crafting_recipe/food/wingfangchu name = "Wingfangchu" @@ -48,7 +48,7 @@ /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet/xeno = 2 ) result = /obj/item/weapon/reagent_containers/food/snacks/soup/wingfangchu - category = CAT_SOUP + subcategory = CAT_SOUP /datum/crafting_recipe/food/wishsoup name = "Wish soup" @@ -57,7 +57,7 @@ /obj/item/weapon/reagent_containers/glass/bowl = 1 ) result= /obj/item/weapon/reagent_containers/food/snacks/soup/wish - category = CAT_SOUP + subcategory = CAT_SOUP /datum/crafting_recipe/food/hotchili name = "Hot chili" @@ -68,7 +68,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/tomato = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/soup/hotchili - category = CAT_SOUP + subcategory = CAT_SOUP /datum/crafting_recipe/food/coldchili name = "Cold chili" @@ -79,7 +79,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/tomato = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/soup/coldchili - category = CAT_SOUP + subcategory = CAT_SOUP /datum/crafting_recipe/food/tomatosoup name = "Tomato soup" @@ -89,7 +89,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/tomato = 2 ) result = /obj/item/weapon/reagent_containers/food/snacks/soup/tomato - category = CAT_SOUP + subcategory = CAT_SOUP /datum/crafting_recipe/food/eyeballsoup name = "Eyeball soup" @@ -100,7 +100,7 @@ /obj/item/organ/eyes = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/soup/tomato/eyeball - category = CAT_SOUP + subcategory = CAT_SOUP /datum/crafting_recipe/food/milosoup @@ -112,7 +112,7 @@ /obj/item/weapon/reagent_containers/food/snacks/tofu = 2 ) result = /obj/item/weapon/reagent_containers/food/snacks/soup/milo - category = CAT_SOUP + subcategory = CAT_SOUP /datum/crafting_recipe/food/bloodsoup name = "Blood soup" @@ -122,7 +122,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/tomato/blood = 2 ) result = /obj/item/weapon/reagent_containers/food/snacks/soup/blood - category = CAT_SOUP + subcategory = CAT_SOUP /datum/crafting_recipe/food/slimesoup name = "Slime soup" @@ -132,7 +132,7 @@ /obj/item/weapon/reagent_containers/glass/bowl = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/soup/slime - category = CAT_SOUP + subcategory = CAT_SOUP /datum/crafting_recipe/food/clownstears name = "Clowns tears" @@ -143,7 +143,7 @@ /obj/item/weapon/ore/bananium = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/soup/clownstears - category = CAT_SOUP + subcategory = CAT_SOUP /datum/crafting_recipe/food/mysterysoup name = "Mystery soup" @@ -156,7 +156,7 @@ /obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 1, ) result = /obj/item/weapon/reagent_containers/food/snacks/soup/mystery - category = CAT_SOUP + subcategory = CAT_SOUP /datum/crafting_recipe/food/mushroomsoup name = "Mushroom soup" @@ -167,7 +167,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/chanterelle = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/soup/mushroom - category = CAT_SOUP + subcategory = CAT_SOUP /datum/crafting_recipe/food/beetsoup name = "Beet soup" @@ -178,7 +178,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/cabbage = 1, ) result = /obj/item/weapon/reagent_containers/food/snacks/soup/beet - category = CAT_SOUP + subcategory = CAT_SOUP /datum/crafting_recipe/food/stew name = "Stew" @@ -193,7 +193,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/soup/stew - category = CAT_SOUP + subcategory = CAT_SOUP /datum/crafting_recipe/food/spacylibertyduff name = "Spacy liberty duff" @@ -203,7 +203,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/libertycap = 3 ) result = /obj/item/weapon/reagent_containers/food/snacks/soup/spacylibertyduff - category = CAT_SOUP + subcategory = CAT_SOUP /datum/crafting_recipe/food/amanitajelly name = "Amanita jelly" @@ -213,7 +213,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/amanita = 3 ) result = /obj/item/weapon/reagent_containers/food/snacks/soup/amanitajelly - category = CAT_SOUP + subcategory = CAT_SOUP /datum/crafting_recipe/food/sweetpotatosoup name = "Sweet potato soup" @@ -224,7 +224,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/potato/sweet = 2 ) result = /obj/item/weapon/reagent_containers/food/snacks/soup/sweetpotato - category = CAT_SOUP + subcategory = CAT_SOUP /datum/crafting_recipe/food/redbeetsoup name = "Red beet soup" @@ -235,4 +235,4 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/cabbage = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/soup/beet/red - category = CAT_SOUP + subcategory = CAT_SOUP diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_spaghetti.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_spaghetti.dm index 412157033bd..ed6dc4bf41f 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_spaghetti.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_spaghetti.dm @@ -10,7 +10,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/tomato = 2 ) result = /obj/item/weapon/reagent_containers/food/snacks/pastatomato - category = CAT_SPAGHETTI + subcategory = CAT_SPAGHETTI /datum/crafting_recipe/food/copypasta name = "Copypasta" @@ -18,7 +18,7 @@ /obj/item/weapon/reagent_containers/food/snacks/pastatomato = 2 ) result = /obj/item/weapon/reagent_containers/food/snacks/copypasta - category = CAT_SPAGHETTI + subcategory = CAT_SPAGHETTI /datum/crafting_recipe/food/spaghettimeatball name = "Spaghetti meatball" @@ -27,7 +27,7 @@ /obj/item/weapon/reagent_containers/food/snacks/faggot = 2 ) result = /obj/item/weapon/reagent_containers/food/snacks/meatballspaghetti - category = CAT_SPAGHETTI + subcategory = CAT_SPAGHETTI /datum/crafting_recipe/food/spesslaw name = "Spesslaw" @@ -36,7 +36,7 @@ /obj/item/weapon/reagent_containers/food/snacks/faggot = 4 ) result = /obj/item/weapon/reagent_containers/food/snacks/spesslaw - category = CAT_SPAGHETTI + subcategory = CAT_SPAGHETTI /datum/crafting_recipe/food/beefnoodle name = "Beef noodle" @@ -47,7 +47,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/cabbage = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/beefnoodle - category = CAT_SPAGHETTI + subcategory = CAT_SPAGHETTI /datum/crafting_recipe/food/chowmein name = "Chowmein" @@ -58,7 +58,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/carrot = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/chowmein - category = CAT_SPAGHETTI + subcategory = CAT_SPAGHETTI /datum/crafting_recipe/food/butternoodles name = "Butter Noodles" @@ -67,4 +67,4 @@ /obj/item/weapon/reagent_containers/food/snacks/butter = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/butternoodles - category = CAT_SPAGHETTI \ No newline at end of file + subcategory = CAT_SPAGHETTI \ No newline at end of file diff --git a/code/modules/jobs/access.dm b/code/modules/jobs/access.dm index 527b6ff7365..23655607a87 100644 --- a/code/modules/jobs/access.dm +++ b/code/modules/jobs/access.dm @@ -98,9 +98,9 @@ GLOBAL_VAR_CONST(access_away_generic3, 207) GLOBAL_VAR_CONST(access_away_generic4, 208) /obj/var/list/req_access = null -/obj/var/req_access_txt = "0" +/obj/var/req_access_txt = "0" as text /obj/var/list/req_one_access = null -/obj/var/req_one_access_txt = "0" +/obj/var/req_one_access_txt = "0" as text //returns 1 if this mob has sufficient access to use this object /obj/proc/allowed(mob/M) diff --git a/code/modules/mapping/map_template.dm b/code/modules/mapping/map_template.dm index e0588acf2b5..373a937be25 100644 --- a/code/modules/mapping/map_template.dm +++ b/code/modules/mapping/map_template.dm @@ -71,11 +71,11 @@ if(!bounds) return - //initialize things that are normally initialized after map load - initTemplateBounds(bounds) - if(!SSmapping.loading_ruins) //Will be done manually during mapping ss init repopulate_sorted_areas() + + //initialize things that are normally initialized after map load + initTemplateBounds(bounds) log_game("[name] loaded at at [T.x],[T.y],[T.z]") return TRUE diff --git a/code/modules/mining/equipment/goliath_hide.dm b/code/modules/mining/equipment/goliath_hide.dm index e76a053732f..e652bc6e940 100644 --- a/code/modules/mining/equipment/goliath_hide.dm +++ b/code/modules/mining/equipment/goliath_hide.dm @@ -4,6 +4,9 @@ desc = "Pieces of a goliath's rocky hide, these might be able to make your suit a bit more durable to attack from the local fauna." icon = 'icons/obj/mining.dmi' icon_state = "goliath_hide" + singular_name = "hide plate" + max_amount = 6 + novariants = FALSE flags = NOBLUDGEON w_class = WEIGHT_CLASS_NORMAL layer = MOB_LAYER diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm index 6d8a99c1a2f..7fca3a315b6 100644 --- a/code/modules/mining/equipment/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher.dm @@ -21,7 +21,7 @@ sharpness = IS_SHARP var/list/trophies = list() var/charged = TRUE - var/charge_time = 14 + var/charge_time = 15 /obj/item/weapon/twohanded/required/mining_hammer/Destroy() for(var/a in trophies) @@ -92,16 +92,21 @@ for(var/t in trophies) var/obj/item/crusher_trophy/T = t T.on_mark_detonation(target, user) - new /obj/effect/temp_visual/kinetic_blast(get_turf(L)) - var/backstab_dir = get_dir(user, L) - var/def_check = L.getarmor(type = "bomb") - if((user.dir & backstab_dir) && (L.dir & backstab_dir)) - L.apply_damage(80, BRUTE, blocked = def_check) - playsound(user, 'sound/weapons/Kenetic_accel.ogg', 100, 1) //Seriously who spelled it wrong - else - L.apply_damage(50, BRUTE, blocked = def_check) - if(!QDELETED(C) && !QDELETED(L)) - C.total_damage += target_health - L.health //we did some damage, but let's not assume how much we did + if(!QDELETED(L)) + if(!QDELETED(C)) + C.total_damage += target_health - L.health //we did some damage, but let's not assume how much we did + new /obj/effect/temp_visual/kinetic_blast(get_turf(L)) + var/backstab_dir = get_dir(user, L) + var/def_check = L.getarmor(type = "bomb") + if((user.dir & backstab_dir) && (L.dir & backstab_dir)) + if(!QDELETED(C)) + C.total_damage += 80 //cheat a little and add the total before killing it, so certain mobs don't have much lower chances of giving an item + L.apply_damage(80, BRUTE, blocked = def_check) + playsound(user, 'sound/weapons/Kenetic_accel.ogg', 100, 1) //Seriously who spelled it wrong + else + if(!QDELETED(C)) + C.total_damage += 50 + L.apply_damage(50, BRUTE, blocked = def_check) /obj/item/weapon/twohanded/required/mining_hammer/proc/Recharge() if(!charged) @@ -185,9 +190,70 @@ /obj/item/crusher_trophy/proc/on_mark_application(mob/living/target, datum/status_effect/crusher_mark/mark, had_mark) //the target, the mark applied, and if the target had a mark before /obj/item/crusher_trophy/proc/on_mark_detonation(mob/living/target, mob/living/user) //the target and the user +//goliath +/obj/item/crusher_trophy/goliath_tentacle + name = "goliath tentacle" + desc = "A sliced-off goliath tentacle. Suitable as a trophy for a kinetic crusher." + icon_state = "goliath_tentacle" + denied_type = /obj/item/crusher_trophy/goliath_tentacle + bonus_value = 2 + var/missing_health_ratio = 0.1 + var/missing_health_desc = 10 + +/obj/item/crusher_trophy/goliath_tentacle/effect_desc() + return "mark detonation to do [bonus_value] more damage for every [missing_health_desc] health you are missing" + +/obj/item/crusher_trophy/goliath_tentacle/on_mark_detonation(mob/living/target, mob/living/user) + var/missing_health = user.health - user.maxHealth + missing_health *= missing_health_ratio //bonus is active at all times, even if you're above 90 health + missing_health *= bonus_value //multiply the remaining amount by bonus_value + if(missing_health > 0) + target.adjustBruteLoss(missing_health) //and do that much damage + +//watcher +/obj/item/crusher_trophy/watcher_wing + name = "watcher wing" + desc = "A wing ripped from a watcher. Suitable as a trophy for a kinetic crusher." + icon_state = "watcher_wing" + denied_type = /obj/item/crusher_trophy/watcher_wing + bonus_value = 8 + +/obj/item/crusher_trophy/watcher_wing/effect_desc() + return "mark detonation to prevent certain creatures from using certain attacks for [bonus_value*0.1] second[bonus_value*0.1 == 1 ? "":"s"]" + +/obj/item/crusher_trophy/watcher_wing/on_mark_detonation(mob/living/target, mob/living/user) + if(ishostile(target)) + var/mob/living/simple_animal/hostile/H = target + if(H.ranged) //briefly delay ranged attacks + if(H.ranged_cooldown_time >= world.time) + H.ranged_cooldown_time += bonus_value + else + H.ranged_cooldown_time = bonus_value + world.time + +//legion +/obj/item/crusher_trophy/legion_skull + name = "legion skull" + desc = "A dead and lifeless legion skull. Suitable as a trophy for a kinetic crusher." + icon_state = "legion_skull" + denied_type = /obj/item/crusher_trophy/legion_skull + bonus_value = 3 + +/obj/item/crusher_trophy/legion_skull/effect_desc() + return "a kinetic crusher to recharge [bonus_value*0.1] second[bonus_value*0.1 == 1 ? "":"s"] faster" + +/obj/item/crusher_trophy/legion_skull/add_to(obj/item/weapon/twohanded/required/mining_hammer/H, mob/living/user) + . = ..() + if(.) + H.charge_time -= bonus_value + +/obj/item/crusher_trophy/legion_skull/remove_from(obj/item/weapon/twohanded/required/mining_hammer/H, mob/living/user) + . = ..() + if(.) + H.charge_time += bonus_value + //ash drake /obj/item/crusher_trophy/tail_spike - desc = "A spike taken from a ash drake's tail." + desc = "A spike taken from a ash drake's tail. Suitable as a trophy for a kinetic crusher." denied_type = /obj/item/crusher_trophy/tail_spike bonus_value = 5 @@ -210,7 +276,7 @@ //bubblegum /obj/item/crusher_trophy/demon_claws name = "demon claws" - desc = "A set of blood-drenched claws from a massive demon's hand." + desc = "A set of blood-drenched claws from a massive demon's hand. Suitable as a trophy for a kinetic crusher." icon_state = "demon_claws" gender = PLURAL denied_type = /obj/item/crusher_trophy/demon_claws @@ -244,7 +310,7 @@ //colossus /obj/item/crusher_trophy/blaster_tubes name = "blaster tubes" - desc = "The blaster tubes from a colossus's arm." + desc = "The blaster tubes from a colossus's arm. Suitable as a trophy for a kinetic crusher." icon_state = "blaster_tubes" gender = PLURAL denied_type = /obj/item/crusher_trophy/blaster_tubes @@ -273,7 +339,7 @@ //hierophant /obj/item/crusher_trophy/vortex_talisman name = "vortex talisman" - desc = "A glowing trinket that was originally the Hierophant's beacon." + desc = "A glowing trinket that was originally the Hierophant's beacon. Suitable as a trophy for a kinetic crusher." icon_state = "vortex_talisman" denied_type = /obj/item/crusher_trophy/vortex_talisman diff --git a/code/modules/mining/equipment/marker_beacons.dm b/code/modules/mining/equipment/marker_beacons.dm index ba9c0e0b42a..49e8adad68e 100644 --- a/code/modules/mining/equipment/marker_beacons.dm +++ b/code/modules/mining/equipment/marker_beacons.dm @@ -22,6 +22,7 @@ GLOBAL_LIST_INIT(marker_beacon_colors, list( icon_state = "marker" merge_type = /obj/item/stack/marker_beacon max_amount = 100 + novariants = TRUE var/picked_color = "random" /obj/item/stack/marker_beacon/ten //miners start with 10 of these diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 8dac513fcef..3778ffdc525 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -11,7 +11,7 @@ desc = "It's watching you suspiciously." /obj/structure/closet/crate/necropolis/tendril/PopulateContents() - var/loot = rand(1,27) + var/loot = rand(1,28) switch(loot) if(1) new /obj/item/device/shared_storage/red(src) @@ -28,7 +28,7 @@ if(7) new /obj/item/weapon/pickaxe/diamond(src) if(8) - new /obj/item/borg/upgrade/modkit/resonator_blasts(src) + new /obj/item/weapon/disk/design_disk/modkit_disc/resonator_blast(src) if(9) new /obj/item/organ/brain/alien(src) if(10) @@ -38,7 +38,7 @@ if(12) new /obj/item/clothing/suit/space/hardsuit/ert/paranormal/beserker(src) if(13) - new /obj/item/borg/upgrade/modkit/cooldown/repeater(src) + new /obj/item/weapon/disk/design_disk/modkit_disc/rapid_repeater(src) if(14) new /obj/item/weapon/nullrod/scythe/talking(src) if(15) @@ -46,7 +46,7 @@ if(16) new /obj/item/weapon/guardiancreator(src) if(17) - new /obj/item/borg/upgrade/modkit/aoe/turfs/andmobs(src) + new /obj/item/weapon/disk/design_disk/modkit_disc/mob_and_turf_aoe(src) if(18) new /obj/item/device/warp_cube/red(src) if(19) @@ -69,11 +69,71 @@ if(27) new /obj/item/borg/upgrade/modkit/lifesteal(src) new /obj/item/weapon/bedsheet/cult(src) + if(28) + new /obj/item/weapon/disk/design_disk/modkit_disc/bounty(src) +//KA modkit design discs +/obj/item/weapon/disk/design_disk/modkit_disc + name = "KA Mod Disk" + desc = "A design disc containing the design for a unique kinetic accelerator modkit." + icon_state = "datadisk1" + var/modkit_design = /datum/design/unique_modkit +/obj/item/weapon/disk/design_disk/modkit_disc/Initialize() + . = ..() + blueprints[1] = new modkit_design + +/obj/item/weapon/disk/design_disk/modkit_disc/mob_and_turf_aoe + name = "Offensive Mining Explosion Mod Disk" + modkit_design = /datum/design/unique_modkit/offensive_turf_aoe + +/obj/item/weapon/disk/design_disk/modkit_disc/rapid_repeater + name = "Rapid Repeater Mod Disk" + modkit_design = /datum/design/unique_modkit/rapid_repeater + +/obj/item/weapon/disk/design_disk/modkit_disc/resonator_blast + name = "Resonator Blast Mod Disk" + modkit_design = /datum/design/unique_modkit/resonator_blast + +/obj/item/weapon/disk/design_disk/modkit_disc/bounty + name = "Death Syphon Mod Disk" + modkit_design = /datum/design/unique_modkit/bounty + +/datum/design/unique_modkit + category = list("Mining Designs", "Cyborg Upgrade Modules") + req_tech = list("materials" = 12) //can't be normally obtained + build_type = PROTOLATHE | MECHFAB + +/datum/design/unique_modkit/offensive_turf_aoe + name = "Kinetic Accelerator Offensive Mining Explosion Mod" + desc = "A device which causes kinetic accelerators to fire AoE blasts that destroy rock and damage creatures." + id = "hyperaoemod" + materials = list(MAT_METAL = 7000, MAT_GLASS = 3000, MAT_SILVER = 3000, MAT_GOLD = 3000, MAT_DIAMOND = 4000) + build_path = /obj/item/borg/upgrade/modkit/aoe/turfs/andmobs + +/datum/design/unique_modkit/rapid_repeater + name = "Kinetic Accelerator Rapid Repeater Mod" + desc = "A device which greatly reduces a kinetic accelerator's cooldown on striking a living target or rock, but greatly increases its base cooldown." + id = "repeatermod" + materials = list(MAT_METAL = 5000, MAT_GLASS = 5000, MAT_URANIUM = 8000, MAT_BLUESPACE = 2000) + build_path = /obj/item/borg/upgrade/modkit/cooldown/repeater + +/datum/design/unique_modkit/resonator_blast + name = "Kinetic Accelerator Resonator Blast Mod" + desc = "A device which causes kinetic accelerators to fire shots that leave and detonate resonator blasts." + id = "resonatormod" + materials = list(MAT_METAL = 5000, MAT_GLASS = 5000, MAT_SILVER = 5000, MAT_URANIUM = 5000) + build_path = /obj/item/borg/upgrade/modkit/resonator_blasts + +/datum/design/unique_modkit/bounty + name = "Kinetic Accelerator Death Syphon Mod" + desc = "A device which causes kinetic accelerators to permenantly gain damage against creature types killed with it." + id = "bountymod" + materials = list(MAT_METAL = 4000, MAT_SILVER = 4000, MAT_GOLD = 4000, MAT_BLUESPACE = 4000) + reagents_list = list("blood" = 40) + build_path = /obj/item/borg/upgrade/modkit/bounty //Spooky special loot - /obj/item/device/wisp_lantern name = "spooky lantern" desc = "This lantern gives off no light, but is home to a friendly wisp." diff --git a/code/modules/mining/machine_redemption.dm b/code/modules/mining/machine_redemption.dm index ee60463d04d..6647ebfca98 100644 --- a/code/modules/mining/machine_redemption.dm +++ b/code/modules/mining/machine_redemption.dm @@ -17,7 +17,7 @@ var/ore_pickup_rate = 15 var/sheet_per_ore = 1 var/point_upgrade = 1 - var/list/ore_values = list("sand" = 1, "iron" = 1, "plasma" = 15, "silver" = 16, "gold" = 18, "titanium" = 30, "uranium" = 30, "diamond" = 50, "bluespace crystal" = 50, "bananium" = 60) + var/list/ore_values = list(MAT_GLASS = 1, MAT_METAL = 1, MAT_PLASMA = 15, MAT_SILVER = 16, MAT_GOLD = 18, MAT_TITANIUM = 30, MAT_URANIUM = 30, MAT_DIAMOND = 50, MAT_BLUESPACE = 50, MAT_BANANIUM = 60) speed_process = 1 var/message_sent = FALSE var/list/ore_buffer = list() @@ -94,7 +94,7 @@ if(!M || !redemption_mat) return 0 - var/smeltable_sheets = round(redemption_mat.amount / M) + var/smeltable_sheets = Floor(redemption_mat.amount / M) if(!smeltable_sheets) return 0 @@ -194,6 +194,12 @@ inserted_disk = W return TRUE + if(istype(W, /obj/item/stack/sheet)) + var/obj/item/stack/sheet/S = W + var/inserted = materials.insert_stack(S, S.amount) + to_chat(user, "You add [inserted] [S] sheets to \the [src].") + return + return ..() /obj/machinery/mineral/ore_redemption/on_deconstruction() @@ -205,142 +211,147 @@ return interact(user) -/obj/machinery/mineral/ore_redemption/interact(mob/user) - var/dat = "This machine only accepts ore. Gibtonite and Slag are not accepted.

" - dat += "Current unclaimed points: [points]
" +/obj/machinery/mineral/ore_redemption/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "ore_redemption_machine", "Ore Redemption Machine", 440, 550, master_ui, state) + ui.open() +/obj/machinery/mineral/ore_redemption/ui_data(mob/user) + var/list/data = list() + data["unclaimedPoints"] = points if(inserted_id) - dat += "You have [inserted_id.mining_points] mining points collected. Eject ID.
" - dat += "Claim points.

" - else - dat += "No ID inserted. Insert ID.

" + data["hasID"] = TRUE + data["claimedPoints"] = inserted_id.mining_points + data["materials"] = list() for(var/mat_id in materials.materials) var/datum/material/M = materials.materials[mat_id] - if(M.amount) - var/sheet_amount = M.amount / MINERAL_MATERIAL_AMOUNT - dat += "[capitalize(M.name)]: [sheet_amount] " - if(sheet_amount >= 1) - dat += "Release
" - else - dat += "Release
" - - dat += "
Alloys:
" + var/sheet_amount = M.amount ? M.amount / MINERAL_MATERIAL_AMOUNT : "0" + data["materials"] += list(list("name" = M.name, "id" = M.id, "amount" = sheet_amount, "value" = ore_values[M.id] * point_upgrade)) + data["alloys"] = list() for(var/v in files.known_designs) var/datum/design/D = files.known_designs[v] - if(can_smelt_alloy(D)) - dat += "[D.name]: Smelt
" - else - dat += "[D.name]: Smelt
" - - dat += "
Mineral Value List:
[get_ore_values()]
" - + data["alloys"] += list(list("name" = D.name, "id" = D.id, "amount" = can_smelt_alloy(D))) + data["diskDesigns"] = list() if(inserted_disk) - dat += "Eject disk
" - dat += "
Uploadable designs:
" + data["hasDisk"] = TRUE + if(inserted_disk.blueprints.len) + var/index = 1 + for (var/datum/design/thisdesign in inserted_disk.blueprints) + if(thisdesign) + data["diskDesigns"] += list(list("name" = thisdesign.name, "index" = index, "canupload" = thisdesign.build_type&SMELTER)) + index++ + return data - for(var/i in 1 to inserted_disk.max_blueprints) - if(inserted_disk.blueprints[i]) - var/datum/design/D = inserted_disk.blueprints[i] - if(D.build_type & SMELTER) - dat += "Name: [D.name] Upload to smelter" - - dat += "

" - else - dat += "Insert design disk

" - - var/datum/browser/popup = new(user, "ore_redemption_machine", "Ore Redemption Machine", 400, 500) - popup.set_content(dat) - popup.open() - return - -/obj/machinery/mineral/ore_redemption/proc/get_ore_values() - var/dat = "" - for(var/ore in ore_values) - var/value = ore_values[ore] - dat += "" - dat += "
[capitalize(ore)][value * point_upgrade]
" - return dat - -/obj/machinery/mineral/ore_redemption/Topic(href, href_list) +/obj/machinery/mineral/ore_redemption/ui_act(action, params) if(..()) return - if(href_list["eject_id"]) - usr.put_in_hands(inserted_id) - inserted_id = null - if(href_list["claim"]) - if(inserted_id) - if(req_access_reclaim in inserted_id.access) + switch(action) + if("Eject") + if(!inserted_id) + return + usr.put_in_hands(inserted_id) + inserted_id = null + return TRUE + if("Insert") + var/obj/item/weapon/card/id/I = usr.get_active_held_item() + if(istype(I)) + if(!usr.transferItemToLoc(I,src)) + return + inserted_id = I + else + to_chat(usr, "Not a valid ID!") + return TRUE + if("Claim") + if(inserted_id) inserted_id.mining_points += points points = 0 + return TRUE + if("Release") + + if(check_access(inserted_id) || allowed(usr)) //Check the ID inside, otherwise check the user + var/out = get_step(src, output_dir) + if(params["id"] == "all") + materials.retrieve_all(out) + else + var/mat_id = params["id"] + if(!materials.materials[mat_id]) + return + var/datum/material/mat = materials.materials[mat_id] + var/stored_amount = mat.amount / MINERAL_MATERIAL_AMOUNT + + if(!stored_amount) + return + + var/desired = 0 + if (params["sheets"]) + desired = text2num(params["sheets"]) + else + desired = input("How many sheets?", "How many sheets would you like to smelt?", 1) as null|num + + var/sheets_to_remove = round(min(desired,50,stored_amount)) + materials.retrieve_sheets(sheets_to_remove, mat_id, out) + else to_chat(usr, "Required access not found.") - else if(href_list["insert_id"]) - var/obj/item/weapon/card/id/I = usr.get_active_held_item() - if(istype(I)) - if(!usr.transferItemToLoc(I,src)) - return - inserted_id = I - else - to_chat(usr, "Not a valid ID!") - if(href_list["eject_disk"]) - if(inserted_disk) - inserted_disk.forceMove(loc) - inserted_disk = null - if(href_list["insert_disk"]) - var/obj/item/weapon/disk/design_disk/D = usr.get_active_held_item() - if(istype(D)) - if(!usr.transferItemToLoc(D,src)) - return - inserted_disk = D - if(href_list["upload"]) - var/n = text2num(href_list["upload"]) - if(inserted_disk && inserted_disk.blueprints && inserted_disk.blueprints[n]) - files.AddDesign2Known(inserted_disk.blueprints[n]) - - if(href_list["release"]) - if(check_access(inserted_id) || allowed(usr)) //Check the ID inside, otherwise check the user - var/mat_id = href_list["release"] - if(!materials.materials[mat_id]) - return - - var/datum/material/mat = materials.materials[mat_id] - var/stored_amount = mat.amount / MINERAL_MATERIAL_AMOUNT - - if(!stored_amount) - return - - var/desired = input("How many sheets?", "How many sheets to eject?", 1) as null|num - var/sheets_to_remove = round(min(desired,50,stored_amount)) - - var/out = get_step(src, output_dir) - materials.retrieve_sheets(sheets_to_remove, mat_id, out) - - else - to_chat(usr, "Required access not found.") - - if(href_list["alloy"]) - var/alloy_id = href_list["alloy"] - var/datum/design/alloy = files.FindDesignByID(alloy_id) - if((check_access(inserted_id) || allowed(usr)) && alloy) - var/desired = input("How many sheets?", "How many sheets would you like to smelt?", 1) as null|num - var/smelt_amount = can_smelt_alloy(alloy) - var/amount = round(min(desired,50,smelt_amount)) - materials.use_amount(alloy.materials, amount) - - var/output = new alloy.build_path(src) - if(istype(output, /obj/item/stack/sheet)) - var/obj/item/stack/sheet/mineral/produced_alloy = output - produced_alloy.amount = amount - unload_mineral(produced_alloy) + return TRUE + if("diskInsert") + var/obj/item/weapon/disk/design_disk/disk = usr.get_active_held_item() + if(istype(disk)) + if(!usr.transferItemToLoc(disk,src)) + return + inserted_disk = disk else - unload_mineral(output) - - else - to_chat(usr, "Required access not found.") - updateUsrDialog() - return + to_chat(usr, "Not a valid Design Disk!") + return TRUE + if("diskEject") + if(inserted_disk) + usr.put_in_hands(inserted_disk) + inserted_disk = null + return TRUE + if("diskUpload") + var/n = text2num(params["design"]) + if(inserted_disk && inserted_disk.blueprints && inserted_disk.blueprints[n]) + files.AddDesign2Known(inserted_disk.blueprints[n]) + return TRUE + if("Smelt") + var/alloy_id = params["id"] + var/datum/design/alloy = files.FindDesignByID(alloy_id) + if((check_access(inserted_id) || allowed(usr)) && alloy) + var/smelt_amount = can_smelt_alloy(alloy) + var/desired = 0 + if (params["sheets"]) + desired = text2num(params["sheets"]) + else + desired = input("How many sheets?", "How many sheets would you like to smelt?", 1) as null|num + var/amount = round(min(desired,50,smelt_amount)) + materials.use_amount(alloy.materials, amount) + var/output = new alloy.build_path(src) + if(istype(output, /obj/item/stack/sheet)) + var/obj/item/stack/sheet/produced_alloy = output + produced_alloy.amount = amount + unload_mineral(produced_alloy) + else + unload_mineral(output) + else + to_chat(usr, "Required access not found.") + return TRUE + if("SmeltAll") + var/alloy_id = params["id"] + var/datum/design/alloy = files.FindDesignByID(alloy_id) + if((check_access(inserted_id) || allowed(usr)) && alloy) + var/smelt_amount = can_smelt_alloy(alloy) + while(smelt_amount > 0) + materials.use_amount(alloy.materials) + smelt_amount-- + var/output = new alloy.build_path(src) + unload_mineral(output) + CHECK_TICK + else + to_chat(usr, "Required access not found.") + return TRUE /obj/machinery/mineral/ore_redemption/ex_act(severity, target) do_sparks(5, TRUE, src) @@ -355,4 +366,4 @@ icon_state = initial(icon_state) else icon_state = "[initial(icon_state)]-off" - return \ No newline at end of file + return diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index f5214e48362..595df2a3df9 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -260,7 +260,6 @@ else user.visible_message("[user] strikes \the [src], causing a chain reaction!", "You strike \the [src], causing a chain reaction.") log_game("[key_name(user)] has primed a [name] for detonation at [A][COORD(bombturf)]") - spawn(det_time) if(primed) if(quality == 3) explosion(src.loc,2,4,9,adminlog = notify_admins) diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 5dfea0aaa8b..2a4cd1ba2ca 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -322,28 +322,9 @@ if(isliving(equip)) //Borgs get borged in the equip, so we need to make sure we handle the new mob. character = equip - var/D - if(GLOB.latejoin.len) - D = get_turf(pick(GLOB.latejoin)) - if(!D) - for(var/turf/T in get_area_turfs(/area/shuttle/arrival)) - if(!T.density) - var/clear = 1 - for(var/obj/O in T) - if(O.density) - clear = 0 - break - if(clear) - D = T - continue - - character.loc = D + SSjob.SendToLateJoin(character) character.update_parallax_teleport() - var/atom/movable/chair = locate(/obj/structure/chair) in character.loc - if(chair) - chair.buckle_mob(character) - SSticker.minds += character.mind var/mob/living/carbon/human/humanc diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm index 13ed9e26d48..6f0b7d375d0 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm @@ -38,7 +38,7 @@ #define MAX_ALIEN_LEAP_DIST 7 /mob/living/carbon/alien/humanoid/hunter/proc/leap_at(atom/A) - if(pounce_cooldown) + if(pounce_cooldown > world.time) to_chat(src, "You are too fatigued to pounce right now!") return @@ -83,9 +83,7 @@ Weaken(2, 1, 1) toggle_leap(0) - pounce_cooldown = !pounce_cooldown - spawn(pounce_cooldown_time) //3s by default - pounce_cooldown = !pounce_cooldown + pounce_cooldown = world.time + pounce_cooldown_time else if(A.density && !A.CanPass(src)) visible_message("[src] smashes into [A]!", "[src] smashes into [A]!") Weaken(2, 1, 1) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 6206f7f2f41..8222c1f46b2 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -36,9 +36,6 @@ //initialise organs create_internal_organs() - if(mind) - mind.martial_art = mind.default_martial_art - handcrafting = new() ..() diff --git a/code/modules/mob/living/carbon/human/status_procs.dm b/code/modules/mob/living/carbon/human/status_procs.dm index f1ff497a2a9..cc32be6f2f7 100644 --- a/code/modules/mob/living/carbon/human/status_procs.dm +++ b/code/modules/mob/living/carbon/human/status_procs.dm @@ -6,17 +6,20 @@ /mob/living/carbon/human/Weaken(amount, updating = 1, ignore_canstun = 0) amount = dna.species.spec_stun(src,amount) return ..() - + /mob/living/carbon/human/Paralyse(amount, updating = 1, ignore_canstun = 0) amount = dna.species.spec_stun(src,amount) return ..() - + /mob/living/carbon/human/cure_husk() . = ..() if(.) update_hair() /mob/living/carbon/human/become_husk() + if(istype(dna.species, /datum/species/skeleton)) //skeletons shouldn't be husks. + cure_husk() + return . = ..() if(.) update_hair() diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 30205e262f5..80f0eff3144 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -53,7 +53,7 @@ var/control_disabled = 0 // Set to 1 to stop AI from interacting via Click() var/malfhacking = 0 // More or less a copy of the above var, so that malf AIs can hack and still get new cyborgs -- NeoFite - var/malf_cooldown = 0 //Cooldown var for malf modules + var/malf_cooldown = 0 //Cooldown var for malf modules, stores a worldtime + cooldown var/obj/machinery/power/apc/malfhack = null var/explosive = 0 //does the AI explode when it dies? diff --git a/code/modules/mob/living/silicon/ai/death.dm b/code/modules/mob/living/silicon/ai/death.dm index d9b157b024a..1b6c67ecc63 100644 --- a/code/modules/mob/living/silicon/ai/death.dm +++ b/code/modules/mob/living/silicon/ai/death.dm @@ -25,7 +25,7 @@ spawn(10) explosion(src.loc, 3, 6, 12, 15) - for(var/obj/machinery/ai_status_display/O in world) //change status + for(var/obj/machinery/ai_status_display/O in GLOB.ai_status_displays) //change status if(src.key) O.mode = 2 if(istype(loc, /obj/item/device/aicard)) @@ -42,4 +42,4 @@ if(doomsday_device) doomsday_device.timing = FALSE SSshuttle.clearHostileEnvironment(doomsday_device) - qdel(doomsday_device) \ No newline at end of file + qdel(doomsday_device) diff --git a/code/modules/mob/living/silicon/ai/login.dm b/code/modules/mob/living/silicon/ai/login.dm index 5fd5965f401..109abfe4099 100644 --- a/code/modules/mob/living/silicon/ai/login.dm +++ b/code/modules/mob/living/silicon/ai/login.dm @@ -6,7 +6,7 @@ client.images += blood if(stat != DEAD) - for(var/obj/machinery/ai_status_display/O in GLOB.machines) //change status + for(var/obj/machinery/ai_status_display/O in GLOB.ai_status_displays) //change status O.mode = 1 O.emotion = "Neutral" view_core() diff --git a/code/modules/mob/living/silicon/ai/logout.dm b/code/modules/mob/living/silicon/ai/logout.dm index 7a7670cfcb4..fe5ea98c49e 100644 --- a/code/modules/mob/living/silicon/ai/logout.dm +++ b/code/modules/mob/living/silicon/ai/logout.dm @@ -1,5 +1,5 @@ /mob/living/silicon/ai/Logout() ..() - for(var/obj/machinery/ai_status_display/O in world) //change status + for(var/obj/machinery/ai_status_display/O in GLOB.ai_status_displays) //change status O.mode = 0 view_core() diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index aa14cd1c789..291ab0fbdb5 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -250,7 +250,7 @@ ratvar_modules = list( /obj/item/clockwork/slab/cyborg, /obj/item/clockwork/ratvarian_spear/cyborg, - /obj/item/clockwork/clockwork_proselytizer/cyborg) + /obj/item/clockwork/replica_fabricator/cyborg) moduleselect_icon = "standard" feedback_key = "cyborg_standard" hat_offset = -3 @@ -314,7 +314,7 @@ emag_modules = list(/obj/item/borg/stun) ratvar_modules = list( /obj/item/clockwork/slab/cyborg/engineer, - /obj/item/clockwork/clockwork_proselytizer/cyborg) + /obj/item/clockwork/replica_fabricator/cyborg) cyborg_base_icon = "engineer" moduleselect_icon = "engineer" feedback_key = "cyborg_engineering" @@ -393,7 +393,7 @@ emag_modules = list(/obj/item/weapon/reagent_containers/spray/cyborg_lube) ratvar_modules = list( /obj/item/clockwork/slab/cyborg/janitor, - /obj/item/clockwork/clockwork_proselytizer/cyborg) + /obj/item/clockwork/replica_fabricator/cyborg) cyborg_base_icon = "janitor" moduleselect_icon = "janitor" feedback_key = "cyborg_janitor" diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm index 8d21cfb7f62..11c660224ca 100644 --- a/code/modules/mob/living/silicon/say.dm +++ b/code/modules/mob/living/silicon/say.dm @@ -4,6 +4,7 @@ /mob/living/proc/robot_talk(message) log_say("[key_name(src)] : [message]") + log_message(message, INDIVIDUAL_SAY_LOG) var/desig = "Default Cyborg" //ezmode for taters if(issilicon(src)) var/mob/living/silicon/S = src diff --git a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm index 5c78995be9e..66d8a0520cb 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm @@ -121,14 +121,14 @@ hacked = TRUE visualAppearence = CLOCKDRONE can_be_held = FALSE - flavortext = "You are a cogscarab, a clockwork creation of Ratvar. As a cogscarab, you have low health, an inbuilt proselytizer that can convert brass \ - to liquified alloy, a set of relatively fast tools, can communicate over the Hierophant Network with :b, and are immune to extreme \ + flavortext = "You are a cogscarab, a clockwork creation of Ratvar. As a cogscarab, you have low health, an inbuilt fabricator that can convert brass \ + to power, a set of relatively fast tools, can communicate over the Hierophant Network with :b, and are immune to extreme \ temperatures and pressures. \nYour goal is to serve the Justiciar and his servants by repairing and defending all they create." -/mob/living/simple_animal/drone/cogscarab/ratvar //a subtype for spawning when ratvar is alive, has a slab that it can use and a normal proselytizer +/mob/living/simple_animal/drone/cogscarab/ratvar //a subtype for spawning when ratvar is alive, has a slab that it can use and a normal fabricator default_storage = /obj/item/weapon/storage/toolbox/brass/prefilled/ratvar -/mob/living/simple_animal/drone/cogscarab/admin //an admin-only subtype of cogscarab with a no-cost proselytizer and slab in its box +/mob/living/simple_animal/drone/cogscarab/admin //an admin-only subtype of cogscarab with a no-cost fabricator and slab in its box default_storage = /obj/item/weapon/storage/toolbox/brass/prefilled/ratvar/admin /mob/living/simple_animal/drone/cogscarab/Initialize() @@ -168,9 +168,7 @@ ..() /mob/living/simple_animal/drone/cogscarab/can_use_guns(obj/item/weapon/gun/G) - if(!GLOB.ratvar_awakens) - changeNext_move(CLICK_CD_RANGE*4) //about as much delay as an unupgraded kinetic accelerator - return TRUE + return GLOB.ratvar_awakens /mob/living/simple_animal/drone/cogscarab/get_armor_effectiveness() if(GLOB.ratvar_awakens) diff --git a/code/modules/mob/living/simple_animal/guardian/types/fire.dm b/code/modules/mob/living/simple_animal/guardian/types/fire.dm index abcc9cf6a33..523d990ad1b 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/fire.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/fire.dm @@ -21,7 +21,7 @@ /mob/living/simple_animal/hostile/guardian/fire/AttackingTarget() . = ..() if(. && ishuman(target) && target != summoner) - new /obj/effect/hallucination/delusion(target.loc,target,force_kind="custom",duration=200,skip_nearby=0, custom_icon = src.icon_state, custom_icon_file = src.icon) + new /obj/effect/hallucination/delusion(target.loc,target,"custom",200,0, icon_state,icon) /mob/living/simple_animal/hostile/guardian/fire/Crossed(AM as mob|obj) ..() diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm index 9c65618a0ed..320cafc8003 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -124,6 +124,11 @@ Difficulty: Hard adjustHealth(-L.maxHealth*0.5) L.dust() +/mob/living/simple_animal/hostile/megafauna/hierophant/CanAttack(atom/the_target) + . = ..() + if(istype(the_target, /mob/living/simple_animal/hostile/asteroid/hivelordbrood)) //ignore temporary targets in favor of more permenant targets + return FALSE + /mob/living/simple_animal/hostile/megafauna/hierophant/GiveTarget(new_target) var/targets_the_same = (new_target == target) . = ..() diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm index 19b35b98666..a379b0e8ac7 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm @@ -76,5 +76,9 @@ stat_attack = UNCONSCIOUS movement_type = FLYING robust_searching = 1 + crusher_loot = /obj/item/crusher_trophy/watcher_wing loot = list() butcher_results = list(/obj/item/weapon/ore/diamond = 2, /obj/item/stack/sheet/sinew = 2, /obj/item/stack/sheet/bone = 1) + +/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/tendril + fromtendril = TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm index e95012b5197..2c0758fe81b 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm @@ -85,11 +85,15 @@ icon_dead = "goliath_dead" throw_message = "does nothing to the tough hide of the" pre_attack_icon = "goliath2" + crusher_loot = /obj/item/crusher_trophy/goliath_tentacle butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat/slab/goliath = 2, /obj/item/stack/sheet/animalhide/goliath_hide = 1, /obj/item/stack/sheet/bone = 2) loot = list() stat_attack = UNCONSCIOUS robust_searching = 1 +/mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril + fromtendril = TRUE + //tentacles /obj/effect/goliath_tentacle name = "Goliath tentacle" diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm index fbea8d0f791..3b1cc00b2d2 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm @@ -46,6 +46,9 @@ OpenFire() return TRUE +/mob/living/simple_animal/hostile/asteroid/hivelord/spawn_crusher_loot() + loot += crusher_loot //we don't butcher + /mob/living/simple_animal/hostile/asteroid/hivelord/death(gibbed) mouse_opacity = 1 ..(gibbed) @@ -101,6 +104,7 @@ speak_emote = list("echoes") attack_sound = 'sound/weapons/pierce.ogg' throw_message = "bounces harmlessly off of" + crusher_loot = /obj/item/crusher_trophy/legion_skull loot = list(/obj/item/organ/regenerative_core/legion) brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion del_on_death = 1 @@ -115,10 +119,15 @@ if(stored_mob) stored_mob.forceMove(get_turf(src)) stored_mob = null + else if(fromtendril) + new /obj/effect/mob_spawn/human/corpse/charredskeleton(T) else - new /obj/effect/mob_spawn/human/corpse/damaged(T) + new /obj/effect/mob_spawn/human/corpse/damaged/legioninfested(T) ..(gibbed) +/mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril + fromtendril = TRUE + //Legion skull /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion name = "legion" @@ -202,7 +211,7 @@ layer = MOB_LAYER del_on_death = TRUE sentience_type = SENTIENCE_BOSS - loot = list(/obj/item/organ/regenerative_core/legion = 3, /obj/effect/mob_spawn/human/corpse/damaged = 5) + loot = list(/obj/item/organ/regenerative_core/legion = 3, /obj/effect/mob_spawn/human/corpse/damaged/legioninfested = 5) move_to_delay = 14 vision_range = 5 aggro_vision_range = 9 @@ -214,3 +223,122 @@ environment_smash = ENVIRONMENT_SMASH_STRUCTURES see_in_dark = 8 lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + +//Tendril-spawned Legion remains, the charred skeletons of those whose bodies sank into laval or fell into chasms. +/obj/effect/mob_spawn/human/corpse/charredskeleton + name = "charred skeletal remains" + burn_damage = 1000 + mob_name = "ashen skeleton" + mob_gender = NEUTER + husk = FALSE + mob_species = /datum/species/skeleton + mob_color = "#454545" + +//Legion infested mobs + +/obj/effect/mob_spawn/human/corpse/damaged/legioninfested/Initialize() + var/type = pickweight(list("Miner" = 66, "Ashwalker" = 10, "Golem" = 10,"Clown" = 10, pick(list("Shadow", "YeOlde","Operative", "Cultist")) = 4)) + switch(type) + if("Miner") + mob_species = pickweight(list(/datum/species/human = 70, /datum/species/lizard = 26, /datum/species/fly = 2, /datum/species/plasmaman = 2)) + if(mob_species == /datum/species/plasmaman) + uniform = /obj/item/clothing/under/plasmaman + head = /obj/item/clothing/head/helmet/space/plasmaman + belt = /obj/item/weapon/tank/internals/plasmaman/belt + else + uniform = /obj/item/clothing/under/rank/miner/lavaland + if (prob(4)) + belt = pickweight(list(/obj/item/weapon/storage/belt/mining = 2, /obj/item/weapon/storage/belt/mining/alt = 2)) + else if(prob(10)) + belt = pickweight(list(/obj/item/weapon/pickaxe = 8, /obj/item/weapon/pickaxe/mini = 4, /obj/item/weapon/pickaxe/silver = 2, /obj/item/weapon/pickaxe/diamond = 1)) + else + belt = /obj/item/weapon/tank/internals/emergency_oxygen/engi + if(mob_species != /datum/species/lizard) + shoes = /obj/item/clothing/shoes/workboots/mining + gloves = /obj/item/clothing/gloves/color/black + mask = /obj/item/clothing/mask/gas/explorer + if(prob(20)) + suit = pickweight(list(/obj/item/clothing/suit/hooded/explorer = 18, /obj/item/clothing/suit/hooded/cloak/goliath = 2)) + if(prob(30)) + r_pocket = pickweight(list(/obj/item/stack/marker_beacon = 20, /obj/item/stack/spacecash/c1000 = 7,/obj/item/weapon/reagent_containers/hypospray/medipen/survival = 2, /obj/item/borg/upgrade/modkit/damage = 1 )) + if(prob(10)) + l_pocket = pickweight(list(/obj/item/stack/spacecash/c1000 = 7,/obj/item/weapon/reagent_containers/hypospray/medipen/survival = 2, /obj/item/borg/upgrade/modkit/cooldown = 1 )) + if("Ashwalker") + mob_species = /datum/species/lizard/ashwalker + uniform = /obj/item/clothing/under/gladiator/ash_walker + if(prob(95)) + head = /obj/item/clothing/head/helmet/gladiator + else + head = /obj/item/clothing/head/helmet/skull + suit = /obj/item/clothing/suit/armor/bone + gloves = /obj/item/clothing/gloves/bracer + if(prob(5)) + back = pickweight(list(/obj/item/weapon/twohanded/bonespear = 3,/obj/item/weapon/twohanded/fireaxe/boneaxe = 2)) + if(prob(10)) + belt = /obj/item/weapon/storage/belt/mining/primitive + if(prob(30)) + r_pocket = /obj/item/weapon/kitchen/knife/combat/bone + if(prob(30)) + l_pocket = /obj/item/weapon/kitchen/knife/combat/bone + if("Clown") + name = pick(GLOB.clown_names) + outfit = /datum/outfit/job/clown + belt = null + backpack_contents = list() + if(prob(70)) + backpack_contents += pick(list(/obj/item/weapon/stamp/clown = 1, /obj/item/weapon/reagent_containers/spray/waterflower = 1,/obj/item/weapon/reagent_containers/food/snacks/grown/banana = 1, /obj/item/device/megaphone/clown = 1,/obj/item/weapon/reagent_containers/food/drinks/soda_cans/canned_laughter = 1,/obj/item/weapon/pneumatic_cannon/pie = 1)) + if(prob(30)) + backpack_contents += list(/obj/item/stack/sheet/mineral/bananium = pickweight(list( 1 = 3, 2 = 2, 3 = 1))) + if(prob(10)) + l_pocket = pickweight(list(/obj/item/weapon/bikehorn/golden = 3, /obj/item/weapon/bikehorn/airhorn= 1 )) + if(prob(10)) + r_pocket = /obj/item/weapon/implanter/sad_trombone + if("Golem") + mob_species = pick(list(/datum/species/golem/adamantine, /datum/species/golem/plasma, /datum/species/golem/diamond, /datum/species/golem/gold, /datum/species/golem/silver, /datum/species/golem/plasteel, /datum/species/golem/titanium, /datum/species/golem/plastitanium)) + if(prob(30)) + glasses = pickweight(list(/obj/item/clothing/glasses/meson = 2, /obj/item/clothing/glasses/hud/health = 2,/obj/item/clothing/glasses/hud/diagnostic =2, /obj/item/clothing/glasses/science = 2, /obj/item/clothing/glasses/welding = 2, /obj/item/clothing/glasses/night = 1)) + if(prob(10)) + belt = pick(list(/obj/item/weapon/storage/belt/mining/vendor,/obj/item/weapon/storage/belt/utility/full)) + if(prob(50)) + neck = /obj/item/weapon/bedsheet/rd/royal_cape + if(prob(10)) + l_pocket = pick(list(/obj/item/weapon/crowbar/power, /obj/item/weapon/wrench/power, /obj/item/weapon/weldingtool/experimental)) + if("YeOlde") + mob_gender = FEMALE + uniform = /obj/item/clothing/under/maid + gloves = /obj/item/clothing/gloves/color/white + shoes = /obj/item/clothing/shoes/laceup + head = /obj/item/clothing/head/helmet/knight + suit = /obj/item/clothing/suit/armor/riot/knight + back = /obj/item/weapon/shield/riot/buckler + belt = /obj/item/weapon/nullrod/claymore + r_pocket = /obj/item/weapon/tank/internals/emergency_oxygen + mask = /obj/item/clothing/mask/breath + if("Operative") + id_job = "Operative" + id_access_list = list(GLOB.access_syndicate) + outfit = /datum/outfit/syndicatecommandocorpse + if("Shadow") + mob_species = /datum/species/shadow + r_pocket = /obj/item/weapon/reagent_containers/pill/shadowtoxin + neck = /obj/item/clothing/tie/medal/nobel_science + uniform = /obj/item/clothing/under/color/black + shoes = /obj/item/clothing/shoes/sneakers/black + suit = /obj/item/clothing/suit/toggle/labcoat + glasses = /obj/item/clothing/glasses/sunglasses/blindfold + back = /obj/item/weapon/tank/internals/oxygen + mask = /obj/item/clothing/mask/breath + if("Cultist") + uniform = /obj/item/clothing/under/roman + suit = /obj/item/clothing/suit/cultrobes + head = /obj/item/clothing/head/culthood + suit_store = /obj/item/weapon/tome + r_pocket = /obj/item/weapon/restraints/legcuffs/bola/cult + l_pocket = /obj/item/weapon/melee/cultblade/dagger + glasses = /obj/item/clothing/glasses/night/cultblind + backpack_contents = list(/obj/item/weapon/reagent_containers/food/drinks/bottle/unholywater = 1, /obj/item/device/cult_shift = 1, /obj/item/device/flashlight/flare/culttorch = 1, /obj/item/stack/sheet/runed_metal = 15) + . = ..() + + + + diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm index 1e768602676..5788a6fdc6d 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm @@ -13,12 +13,18 @@ response_harm = "strikes" status_flags = 0 a_intent = INTENT_HARM + var/crusher_loot var/throw_message = "bounces off of" var/icon_aggro = null // for swapping to when we get aggressive + var/fromtendril = FALSE see_in_dark = 8 lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE mob_size = MOB_SIZE_LARGE +/mob/living/simple_animal/hostile/asteroid/Initialize(mapload) + . = ..() + apply_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING) + /mob/living/simple_animal/hostile/asteroid/Aggro() ..() if(vision_range != aggro_vision_range) @@ -44,14 +50,20 @@ if(!stat) Aggro() if(T.throwforce <= 20) - visible_message("The [T.name] [src.throw_message] [src.name]!") + visible_message("The [T.name] [throw_message] [src.name]!") return ..() /mob/living/simple_animal/hostile/asteroid/death(gibbed) SSblackbox.add_details("mobs_killed_mining","[src.type]") + var/datum/status_effect/crusher_damage/C = has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING) + if(C && crusher_loot && prob((C.total_damage/maxHealth)) * 5) //on average, you'll need to kill 20 creatures before getting the item + spawn_crusher_loot() ..(gibbed) +/mob/living/simple_animal/hostile/asteroid/proc/spawn_crusher_loot() + butcher_results[crusher_loot] = 1 + /mob/living/simple_animal/hostile/asteroid/handle_temperature_damage() if(bodytemperature < minbodytemp) adjustBruteLoss(2) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/necropolis_tendril.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/necropolis_tendril.dm index 1ef8dd9f13a..02257193ffa 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/necropolis_tendril.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/necropolis_tendril.dm @@ -17,7 +17,7 @@ maxHealth = 250 max_mobs = 3 spawn_time = 300 //30 seconds default - mob_type = /mob/living/simple_animal/hostile/asteroid/basilisk/watcher + mob_type = /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/tendril spawn_text = "emerges from" atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 @@ -28,10 +28,10 @@ var/obj/effect/light_emitter/tendril/emitted_light /mob/living/simple_animal/hostile/spawner/lavaland/goliath - mob_type = /mob/living/simple_animal/hostile/asteroid/goliath/beast + mob_type = /mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril /mob/living/simple_animal/hostile/spawner/lavaland/legion - mob_type = /mob/living/simple_animal/hostile/asteroid/hivelord/legion + mob_type = /mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril /mob/living/simple_animal/hostile/spawner/lavaland/Initialize() . = ..() diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm index eaee4a6b622..e60f4f1b791 100644 --- a/code/modules/mob/living/simple_animal/slime/life.dm +++ b/code/modules/mob/living/simple_animal/slime/life.dm @@ -309,11 +309,11 @@ if(Target) --target_patience - if (target_patience <= 0 || SStun || Discipline || attacked || docile) // Tired of chasing or something draws out attention + if (target_patience <= 0 || SStun > world.time || Discipline || attacked || docile) // Tired of chasing or something draws out attention target_patience = 0 Target = null - if(AIproc && SStun) + if(AIproc && SStun > world.time) return var/hungry = 0 // determines if the slime is hungry diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm index 6eb688d38fb..6c12b6d9841 100644 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -394,11 +394,7 @@ if(buckled) Feedstop(silent=1) //we unbuckle the slime from the mob it latched onto. - spawn(0) - SStun = 1 - sleep(rand(20,60)) - SStun = 0 - + SStun = world.time + rand(20,60) spawn(0) canmove = 0 if(user) diff --git a/code/modules/modular_computers/file_system/programs/card.dm b/code/modules/modular_computers/file_system/programs/card.dm index 74590339b42..5eab5f5c43b 100644 --- a/code/modules/modular_computers/file_system/programs/card.dm +++ b/code/modules/modular_computers/file_system/programs/card.dm @@ -41,6 +41,9 @@ /datum/computer_file/program/card_mod/New() ..() + addtimer(CALLBACK(src, .proc/SetConfigCooldown), 0) + +/datum/computer_file/program/card_mod/proc/SetConfigCooldown() change_position_cooldown = config.id_console_jobslot_delay /datum/computer_file/program/card_mod/event_idremoved(background, slot) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 0dcbf89ab51..bdf720b50f6 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -99,8 +99,6 @@ /obj/machinery/power/apc/connect_to_network() //Override because the APC does not directly connect to the network; it goes through a terminal. //The terminal is what the power computer looks for anyway. - if(!terminal) - make_terminal() if(terminal) terminal.connect_to_network() @@ -241,6 +239,8 @@ icon_state = "apcemag" else if(update_state & UPSTATE_WIREEXP) icon_state = "apcewires" + else if(update_state & UPSTATE_MAINT) + icon_state = "apc0" if(!(update_state & UPSTATE_ALLGOOD)) cut_overlays() @@ -448,6 +448,8 @@ update_icon() else if(emagged) to_chat(user, "The interface is broken!") + else if((stat & MAINT) && !opened) + ..() //its an empty closed frame... theres no wires to expose! else panel_open = !panel_open to_chat(user, "The wires have been [panel_open ? "exposed" : "unexposed"]") @@ -630,6 +632,8 @@ charging = 0 src.update_icon() return + if((stat & MAINT) && !opened) //no board; no interface + return ..() /obj/machinery/power/apc/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \ diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 8ab42aebe7a..69cc104d78d 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -509,6 +509,7 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restrai slot_flags = SLOT_BELT attack_verb = list("whipped", "lashed", "disciplined", "flogged") singular_name = "cable piece" + full_w_class = WEIGHT_CLASS_SMALL /obj/item/stack/cable_coil/cyborg is_cyborg = 1 diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index dea263231ac..3e35e3a42d2 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -23,7 +23,8 @@ #define SEVERE_POWER_PENALTY_THRESHOLD 7000 //Same as above, but causes more dangerous effects #define CRITICAL_POWER_PENALTY_THRESHOLD 9000 //Even more dangerous effects, threshold for tesla delamination #define HEAT_PENALTY_THRESHOLD 40 //Higher == Crystal safe operational temperature is higher. -#define DAMAGE_HARDCAP 0.01 +#define DAMAGE_HARDCAP 0.0025 +#define DAMAGE_INCREASE_MULTIPLIER 0.25 #define THERMAL_RELEASE_MODIFIER 5 //Higher == less heat released during reaction, not to be confused with the above values @@ -214,9 +215,9 @@ damage_archived = damage if(takes_damage) //causing damage - damage = max(damage + (max(removed.temperature - ((T0C + HEAT_PENALTY_THRESHOLD)*dynamic_heat_resistance), 0) * mole_heat_penalty / 150 ), 0) - damage = max(damage + (max(power - POWER_PENALTY_THRESHOLD, 0)/500), 0) - damage = max(damage + (max(combined_gas - MOLE_PENALTY_THRESHOLD, 0)/80), 0) + damage = max(damage + (max(removed.temperature - ((T0C + HEAT_PENALTY_THRESHOLD)*dynamic_heat_resistance), 0) * mole_heat_penalty / 150 ) * DAMAGE_INCREASE_MULTIPLIER, 0) + damage = max(damage + (max(power - POWER_PENALTY_THRESHOLD, 0)/500) * DAMAGE_INCREASE_MULTIPLIER, 0) + damage = max(damage + (max(combined_gas - MOLE_PENALTY_THRESHOLD, 0)/80) * DAMAGE_INCREASE_MULTIPLIER, 0) //healing damage if(combined_gas < MOLE_PENALTY_THRESHOLD) diff --git a/code/modules/procedural_mapping/mapGenerators/repair.dm b/code/modules/procedural_mapping/mapGenerators/repair.dm index e2f658648c0..d568b83e806 100644 --- a/code/modules/procedural_mapping/mapGenerators/repair.dm +++ b/code/modules/procedural_mapping/mapGenerators/repair.dm @@ -1,9 +1,10 @@ /datum/mapGeneratorModule/bottomLayer/repairFloorPlasteel spawnableTurfs = list(/turf/open/floor/plasteel = 100) var/ignore_wall = FALSE + allowAtomsOnSpace = TRUE /datum/mapGeneratorModule/bottomLayer/repairFloorPlasteel/place(turf/T) - if(isclosedturf(T)) + if(isclosedturf(T) && !ignore_wall) return FALSE return TRUE @@ -13,6 +14,7 @@ /datum/mapGeneratorModule/border/normalWalls spawnableAtoms = list() spawnableTurfs = list(/turf/closed/wall = 100) + allowAtomsOnSpace = TRUE /datum/mapGenerator/repair modules = list(/datum/mapGeneratorModule/bottomLayer/repairFloorPlasteel, diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm index 376e372cb6c..d91859f1983 100644 --- a/code/modules/projectiles/ammunition/ammo_casings.dm +++ b/code/modules/projectiles/ammunition/ammo_casings.dm @@ -76,11 +76,6 @@ caliber = "4.6x30mm" projectile_type = /obj/item/projectile/bullet/incendiary/firebullet -/obj/item/ammo_casing/c46carbine - desc = "A 4.6x30mm bullet casing." - caliber = "4.6x30mm" - projectile_type = /obj/item/projectile/bullet/carbinebullet - /obj/item/ammo_casing/c45 desc = "A .45 bullet casing." caliber = ".45" diff --git a/code/modules/projectiles/boxes_magazines/external_mag.dm b/code/modules/projectiles/boxes_magazines/external_mag.dm index 8ebcd1eab36..3bfb90224dd 100644 --- a/code/modules/projectiles/boxes_magazines/external_mag.dm +++ b/code/modules/projectiles/boxes_magazines/external_mag.dm @@ -186,14 +186,6 @@ max_ammo = 30 multiple_sprites = 2 -/obj/item/ammo_box/magazine/carbine - name = "carbine magazine (4.6x30mm)" - icon_state = "oldrifle" - origin_tech = "combat=5" - ammo_type = /obj/item/ammo_casing/c46carbine - caliber = "4.6x30mm" - max_ammo = 32 - /obj/item/ammo_box/magazine/m12g name = "shotgun magazine (12g taser slugs)" desc = "A drum magazine." diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index 0503a011b36..abc4aeaa191 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -234,17 +234,6 @@ burst_size = 3 fire_delay = 1 -/obj/item/weapon/gun/ballistic/automatic/carbine - name = "\improper Marine Carbine" - desc = "Standard issue weapon used by Iron Hawk Marines in space to space combat. Due to modifications for space combat, the weapon has a very limited firing range." - icon_state = "oldrifle" - item_state = "arg" - mag_type = /obj/item/ammo_box/magazine/carbine - fire_sound = 'sound/weapons/Gunshot_smg.ogg' - can_suppress = 0 - burst_size = 0 - fire_delay = 2 - // Bulldog shotgun // /obj/item/weapon/gun/ballistic/automatic/shotgun/bulldog @@ -253,6 +242,7 @@ icon_state = "bulldog" item_state = "bulldog" w_class = WEIGHT_CLASS_NORMAL + weapon_weight = WEAPON_MEDIUM origin_tech = "combat=6;materials=4;syndicate=6" mag_type = /obj/item/ammo_box/magazine/m12g fire_sound = 'sound/weapons/Gunshot.ogg' @@ -270,8 +260,8 @@ update_icon() /obj/item/weapon/gun/ballistic/automatic/shotgun/bulldog/update_icon() + cut_overlays() if(magazine) - cut_overlays() add_overlay("[magazine.icon_state]") icon_state = "bulldog[chambered ? "" : "-e"]" diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index 79557a81964..11e8027d376 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -263,6 +263,7 @@ icon_state = "dshotgun" item_state = "shotgun" w_class = WEIGHT_CLASS_BULKY + weapon_weight = WEAPON_MEDIUM force = 10 flags = CONDUCT slot_flags = SLOT_BACK diff --git a/code/modules/projectiles/guns/beam_rifle.dm b/code/modules/projectiles/guns/beam_rifle.dm index e7dd94f5b0f..ca3468446d4 100644 --- a/code/modules/projectiles/guns/beam_rifle.dm +++ b/code/modules/projectiles/guns/beam_rifle.dm @@ -32,10 +32,11 @@ canMouseDown = TRUE pin = null var/aiming = FALSE - var/aiming_time = 10 + var/aiming_time = 7 var/aiming_time_fire_threshold = 2 var/aiming_time_left = 7 var/aiming_time_increase_user_movement = 3 + var/scoped_slow = 1 var/aiming_time_increase_angle_multiplier = 0.6 var/lastangle = 0 @@ -85,8 +86,14 @@ projectile_setting_pierce = !projectile_setting_pierce to_chat(user, "You set \the [src] to [projectile_setting_pierce? "pierce":"impact"] mode.") -/obj/item/weapon/gun/energy/beam_rifle/New() - ..() +/obj/item/weapon/gun/energy/beam_rifle/proc/update_slowdown() + if(scoped) + slowdown = scoped_slow + else + slowdown = initial(slowdown) + +/obj/item/weapon/gun/energy/beam_rifle/Initialize() + . = ..() START_PROCESSING(SSfastprocess, src) /obj/item/weapon/gun/energy/beam_rifle/Destroy() @@ -116,6 +123,7 @@ recoil = hipfire_recoil scoped = FALSE user << "You lower your [src]." + update_slowdown() /obj/item/weapon/gun/energy/beam_rifle/can_trigger_gun(var/mob/living/user) if(!scoped && !noscope) @@ -154,14 +162,23 @@ var/obj/effect/temp_visual/projectile_beam/PB = I qdel(PB) +/obj/item/weapon/gun/energy/beam_rifle/proc/terminate_aiming() + stop_aiming() + clear_tracers() + /obj/item/weapon/gun/energy/beam_rifle/process() if(!aiming) return + if(!istype(current_user) || !isturf(current_user.loc) || !(src in current_user.held_items) || current_user.incapacitated()) //Doesn't work if you're not holding it! + terminate_aiming() + return if(aiming_time_left > 0) aiming_time_left-- aiming_beam() if(current_user.client.mouseParams) var/list/mouse_control = params2list(current_user.client.mouseParams) + if(isturf(current_user.client.mouseLocation)) + current_user.face_atom(current_user.client.mouseLocation) if(mouse_control["screen-loc"]) var/list/screen_loc_params = splittext(mouse_control["screen-loc"], ",") var/list/screen_loc_X = splittext(screen_loc_params[1],":") @@ -233,11 +250,13 @@ var/structure_piercing = 2 var/structure_bleed_coeff = 0.7 var/do_pierce = TRUE + var/obj/item/weapon/gun/energy/beam_rifle/host /obj/item/ammo_casing/energy/beam_rifle/proc/sync_stats() var/obj/item/weapon/gun/energy/beam_rifle/BR = loc - if(!BR) + if(!istype(BR)) stack_trace("Beam rifle syncing error") + host = BR do_pierce = BR.projectile_setting_pierce wall_pierce_amount = BR.wall_pierce_amount wall_devastate = BR.wall_devastate @@ -273,6 +292,7 @@ HS_BB.structure_pierce_amount = structure_piercing HS_BB.structure_bleed_coeff = structure_bleed_coeff HS_BB.do_pierce = do_pierce + HS_BB.gun = host /obj/item/ammo_casing/energy/beam_rifle/hitscan projectile_type = /obj/item/projectile/beam/beam_rifle/hitscan @@ -457,7 +477,7 @@ cached = get_turf(src) /obj/item/projectile/beam/beam_rifle/hitscan/proc/spawn_tracer_effect() - new tracer_type(loc, time = 5, angle_override = Angle, p_x = pixel_x, p_y = pixel_y, color_override = color) + QDEL_IN((new tracer_type(loc, time = 5, angle_override = Angle, p_x = pixel_x, p_y = pixel_y, color_override = color)), 5) /obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam tracer_type = /obj/effect/temp_visual/projectile_beam/tracer/aiming diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index db5efe45644..b0753c027a9 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -163,6 +163,7 @@ range = 3 log_override = TRUE + var/pressure_decrease_active = FALSE var/pressure_decrease = 0.25 var/obj/item/weapon/gun/energy/kinetic_accelerator/kinetic_gun @@ -179,6 +180,7 @@ if(pressure > 50) name = "weakened [name]" damage = damage * pressure_decrease + pressure_decrease_active = TRUE . = ..() /obj/item/projectile/kinetic/on_range() @@ -194,7 +196,10 @@ if(!target_turf) target_turf = get_turf(src) if(kinetic_gun) //hopefully whoever shot this was not very, very unfortunate. - for(var/obj/item/borg/upgrade/modkit/M in kinetic_gun.get_modkits()) + var/list/mods = kinetic_gun.get_modkits() + for(var/obj/item/borg/upgrade/modkit/M in mods) + M.projectile_strike_predamage(src, target_turf, target, kinetic_gun) + for(var/obj/item/borg/upgrade/modkit/M in mods) M.projectile_strike(src, target_turf, target, kinetic_gun) if(ismineralturf(target_turf)) var/turf/closed/mineral/M = target_turf @@ -210,6 +215,7 @@ icon = 'icons/obj/objects.dmi' icon_state = "modkit" origin_tech = "programming=2;materials=2;magnets=4" + w_class = WEIGHT_CLASS_SMALL require_module = 1 module_type = /obj/item/weapon/robot_module/miner var/denied_type = null @@ -264,6 +270,9 @@ /obj/item/borg/upgrade/modkit/proc/modify_projectile(obj/item/projectile/kinetic/K) +//use this one for effects you want to trigger before mods that do damage +/obj/item/borg/upgrade/modkit/proc/projectile_strike_predamage(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA) +//and this one for things that don't need to trigger before other damage-dealing mods /obj/item/borg/upgrade/modkit/proc/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA) //Range @@ -313,7 +322,7 @@ . = ..() if(.) for(var/obj/item/borg/upgrade/modkit/aoe/AOE in KA.modkits) //make sure only one of the aoe modules has values if somebody has multiple - if(AOE.stats_stolen) + if(AOE.stats_stolen || AOE == src) continue modifier += AOE.modifier //take its modifiers AOE.modifier = 0 @@ -393,7 +402,7 @@ modifier = -14 //Makes the cooldown 3 seconds(with no cooldown mods) if you miss. Don't miss. cost = 50 -/obj/item/borg/upgrade/modkit/cooldown/repeater/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA) +/obj/item/borg/upgrade/modkit/cooldown/repeater/projectile_strike_predamage(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA) var/valid_repeat = FALSE if(isliving(target)) var/mob/living/L = target @@ -403,7 +412,7 @@ valid_repeat = TRUE if(valid_repeat) KA.overheat = FALSE - KA.attempt_reload(KA.overheat_time * 0.25) //If you hit, the cooldown drops to 0.75 seconds. + KA.attempt_reload(KA.overheat_time * 0.25) //If you hit, the cooldown drops to 0.75 seconds. /obj/item/borg/upgrade/modkit/lifesteal name = "lifesteal crystal" @@ -414,7 +423,7 @@ cost = 20 var/static/list/damage_heal_order = list(BRUTE, BURN, OXY) -/obj/item/borg/upgrade/modkit/lifesteal/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA) +/obj/item/borg/upgrade/modkit/lifesteal/projectile_strike_predamage(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA) if(isliving(target) && isliving(K.firer)) var/mob/living/L = target if(L.stat == DEAD) @@ -438,6 +447,42 @@ return new /obj/effect/temp_visual/resonance(target_turf, K.firer, null, 30) +/obj/item/borg/upgrade/modkit/bounty + name = "death syphon" + desc = "Killing or assisting in killing a creature permenantly increases your damage against that type of creature." + denied_type = /obj/item/borg/upgrade/modkit/bounty + modifier = 1.25 + cost = 30 + var/maximum_bounty = 25 + var/list/bounties_reaped = list() + +/obj/item/borg/upgrade/modkit/bounty/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA) + if(isliving(target)) + var/mob/living/L = target + var/list/existing_marks = L.has_status_effect_list(STATUS_EFFECT_SYPHONMARK) + for(var/i in existing_marks) + var/datum/status_effect/syphon_mark/SM = i + if(SM.reward_target == src) //we want to allow multiple people with bounty modkits to use them, but we need to replace our own marks so we don't multi-reward + SM.reward_target = null + qdel(SM) + var/datum/status_effect/syphon_mark/SM = L.apply_status_effect(STATUS_EFFECT_SYPHONMARK) + SM.reward_target = src + if(bounties_reaped[L.type]) + var/kill_modifier = 1 + if(K.pressure_decrease_active) + kill_modifier *= K.pressure_decrease + var/armor = L.run_armor_check(K.def_zone, K.flag, "", "", K.armour_penetration) + L.apply_damage(bounties_reaped[L.type]*kill_modifier, K.damage_type, K.def_zone, armor) + +/obj/item/borg/upgrade/modkit/bounty/proc/get_kill(mob/living/L) + var/bonus_mod = 1 + if(ismegafauna(L)) //megafauna reward + bonus_mod = 4 + if(!bounties_reaped[L.type]) + bounties_reaped[L.type] = min(modifier * bonus_mod, maximum_bounty) + else + bounties_reaped[L.type] = min(bounties_reaped[L.type] + (modifier * bonus_mod), maximum_bounty) + //Indoors /obj/item/borg/upgrade/modkit/indoors name = "decrease pressure penalty" diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index e420be18d0b..600fe4f2be7 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -20,10 +20,6 @@ /obj/item/projectile/bullet/weakbullet3 damage = 20 -/obj/item/projectile/bullet/carbinebullet - damage = 20 - range = 5 - /obj/item/projectile/bullet/toxinbullet damage = 15 damage_type = TOX diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index 99056eb1dca..9974caea27a 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -9,8 +9,9 @@ idle_power_usage = 40 interact_offline = 1 resistance_flags = FIRE_PROOF | ACID_PROOF - var/energy = 100 - var/max_energy = 100 + var/cell_type = /obj/item/weapon/stock_parts/cell/high + var/obj/item/weapon/stock_parts/cell/cell + var/powerefficiency = 0.01 var/amount = 30 var/recharged = 0 var/recharge_delay = 5 @@ -54,6 +55,7 @@ /obj/machinery/chem_dispenser/Initialize() . = ..() + cell = new cell_type recharge() dispensable_reagents = sortList(dispensable_reagents) @@ -67,10 +69,8 @@ /obj/machinery/chem_dispenser/proc/recharge() if(stat & (BROKEN|NOPOWER)) return - var/addenergy = 1 - var/oldenergy = energy - energy = min(energy + addenergy, max_energy) - if(energy != oldenergy) + var/usedpower = cell.give( 1 / powerefficiency) //Should always be a gain of one on the UI. + if(usedpower) use_power(2500) /obj/machinery/chem_dispenser/emag_act(mob/user) @@ -106,8 +106,8 @@ /obj/machinery/chem_dispenser/ui_data() var/data = list() data["amount"] = amount - data["energy"] = energy - data["maxEnergy"] = max_energy + data["energy"] = cell.charge ? cell.charge * powerefficiency : "0" //To prevent NaN in the UI. + data["maxEnergy"] = cell.maxcharge * powerefficiency data["isBeakerLoaded"] = beaker ? 1 : 0 var beakerContents[0] @@ -149,10 +149,10 @@ if(beaker && dispensable_reagents.Find(reagent)) var/datum/reagents/R = beaker.reagents var/free = R.maximum_volume - R.total_volume - var/actual = min(amount, energy * 10, free) + var/actual = min(amount, (cell.charge * powerefficiency)*10, free) R.add_reagent(reagent, actual) - energy = max(energy - actual / 10, 0) + cell.use((actual / 10) / powerefficiency) . = TRUE if("remove") var/amount = text2num(params["amount"]) @@ -184,20 +184,40 @@ beaker.loc = src to_chat(user, "You add \the [B] to the machine.") - beaker_overlay = beaker_overlay || mutable_appearance(icon, "disp_beaker") + beaker_overlay = beaker_overlay || mutable_appearance(icon, "disp_beaker") beaker_overlay.pixel_x = rand(-10, 5)//randomize beaker overlay position. add_overlay(beaker_overlay) else if(user.a_intent != INTENT_HARM && !istype(I, /obj/item/weapon/card/emag)) to_chat(user, "You can't load \the [I] into the machine!") + return ..() else return ..() +/obj/machinery/chem_dispenser/get_cell() + return cell + +/obj/machinery/chem_dispenser/emp_act(severity) + var/list/datum/reagents/R = list() + var/total = min(rand(7,15), Floor(cell.charge*powerefficiency)) + var/datum/reagents/Q = new(total*10) + if(beaker && beaker.reagents) + R += beaker.reagents + for(var/i in 1 to total) + Q.add_reagent(pick(dispensable_reagents), 10) + R += Q + chem_splash(get_turf(src), 3, R) + if(beaker && beaker.reagents) + beaker.reagents.remove_all() + cell.use(total/powerefficiency) + cell.emp_act() + visible_message(" The [src] malfunctions, spraying chemicals everywhere!") + ..() + /obj/machinery/chem_dispenser/constructable name = "portable chem dispenser" icon = 'icons/obj/chemical.dmi' icon_state = "minidispenser" - energy = 10 - max_energy = 10 + powerefficiency = 0.001 amount = 5 recharge_delay = 30 dispensable_reagents = list() @@ -263,16 +283,13 @@ /obj/machinery/chem_dispenser/constructable/RefreshParts() var/time = 0 - var/temp_energy = 0 var/i + for(var/obj/item/weapon/stock_parts/cell/P in component_parts) + cell = P for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts) - temp_energy += M.rating - temp_energy-- - max_energy = temp_energy * 5 //max energy = (bin1.rating + bin2.rating - 1) * 5, 5 on lowest 25 on highest + time += M.rating for(var/obj/item/weapon/stock_parts/capacitor/C in component_parts) time += C.rating - for(var/obj/item/weapon/stock_parts/cell/P in component_parts) - time += round(P.maxcharge, 10000) / 10000 recharge_delay /= time/2 //delay between recharges, double the usual time on lowest 50% less than usual on highest for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) for(i=1, i<=M.rating, i++) @@ -370,6 +387,19 @@ /obj/machinery/chem_dispenser/mutagensaltpeter - name = "mutagen and saltpeter dispenser" - desc = "Creates and dispenses mutagen and even saltpeter." - dispensable_reagents = list("mutagen", "saltpetre") + name = "botanical chemical dispenser" + desc = "Creates and dispenses chemicals useful for botany." + dispensable_reagents = list( + "mutagen", + "saltpetre", + "eznutriment", + "left4zednutriment", + "robustharvestnutriment", + "water", + "plantbgone", + "weedkiller", + "pestkiller", + "cryoxadone", + "ammonia", + "ash", + "diethylamine") diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm index 0bc843a6054..3ba5519a9c0 100644 --- a/code/modules/reagents/chemistry/recipes/others.dm +++ b/code/modules/reagents/chemistry/recipes/others.dm @@ -121,8 +121,8 @@ /datum/chemical_reaction/nitrous_oxide name = "Nitrous Oxide" id = "nitrous_oxide" - results = list("nitrous_oxide" = 2, "water" = 4) - required_reagents = list("ammonia" = 3, "nitrogen" = 1, "oxygen" = 2) + results = list("nitrous_oxide" = 5) + required_reagents = list("ammonia" = 2, "nitrogen" = 1, "oxygen" = 2) required_temp = 525 ////////////////////////////////// Mutation Toxins /////////////////////////////////// diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index f7399fc4b74..43d7de2e20b 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -142,3 +142,10 @@ icon_state = "pill18" list_reagents = list("insulin" = 50) roundstart = 1 + +/obj/item/weapon/reagent_containers/pill/shadowtoxin + name = "black pill" + desc = "I wouldn't eat this if I were you." + icon_state = "pill9" + color = "#454545" + list_reagents = list("shadowmutationtoxin" = 1) \ No newline at end of file diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index 7fbc8309a8f..dbe9e372e46 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -216,7 +216,7 @@ /datum/design/rglass name = "Reinforced Glass" id = "rglass" - build_type = AUTOLATHE + build_type = AUTOLATHE | SMELTER materials = list(MAT_METAL = 1000, MAT_GLASS = MINERAL_MATERIAL_AMOUNT) build_path = /obj/item/stack/sheet/rglass category = list("initial","Construction") @@ -783,7 +783,7 @@ materials = list(MAT_METAL = 2000, MAT_GLASS = 1000) build_path = /obj/item/device/modular_computer/tablet category = list("initial","Misc") - + /datum/design/slime_scanner name = "Slime Scanner" id = "slime_scanner" @@ -791,4 +791,3 @@ materials = list(MAT_METAL = 300, MAT_GLASS = 200) build_path = /obj/item/device/slime_scanner category = list("initial", "Misc") - \ No newline at end of file diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm index f5a59234276..3d94ccef58a 100644 --- a/code/modules/research/designs/weapon_designs.dm +++ b/code/modules/research/designs/weapon_designs.dm @@ -56,7 +56,7 @@ name = "Beam Marksman Rifle" desc = "A powerful long ranged anti-material rifle that fires charged particle beams to obliterate targets." id = "beamrifle" - req_tech = list("combat" = 5, "magnets" = 5, "powerstorage" = 5, "materials" = 6, "programming" = 5) + req_tech = list("combat" = 7, "magnets" = 5, "powerstorage" = 5, "materials" = 7, "programming" = 5) build_type = PROTOLATHE materials = list(MAT_METAL = 10000, MAT_GLASS = 5000, MAT_DIAMOND = 5000, MAT_URANIUM = 8000, MAT_SILVER = 4500, MAT_GOLD = 5000) build_path = /obj/item/weapon/gun/energy/beam_rifle @@ -258,4 +258,4 @@ build_type = PROTOLATHE materials = list(MAT_METAL = 5000, MAT_GLASS = 1500, MAT_URANIUM = 1500, MAT_SILVER = 1500) build_path = /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow/large - category = list("Weapons") \ No newline at end of file + category = list("Weapons") diff --git a/code/modules/ruins/lavaland_ruin_code.dm b/code/modules/ruins/lavaland_ruin_code.dm index 8ead387a8e9..805d46b9c72 100644 --- a/code/modules/ruins/lavaland_ruin_code.dm +++ b/code/modules/ruins/lavaland_ruin_code.dm @@ -133,7 +133,7 @@ death = FALSE icon = 'icons/obj/Cryogenic2.dmi' icon_state = "sleeper_s" - flavour_text = "You are a syndicate agent, employed in a top secret research facility developing biological weapons. Unfortunately, your hated enemy, Nanotrasen, has begun mining in this sector. Continue your research as best you can, and try to keep a low profile. Do not abandon the base without good cause. The base is rigged with explosives should the worst happen, do not let the base fall into enemy hands!" + flavour_text = "You are a syndicate agent, employed in a top secret research facility developing biological weapons. Unfortunately, your hated enemy, Nanotrasen, has begun mining in this sector. Continue your research as best you can, and try to keep a low profile. DON'T abandon the base without good cause. The base is rigged with explosives should the worst happen, do not let the base fall into enemy hands!" id_access_list = list(GLOB.access_syndicate) outfit = /datum/outfit/lavaland_syndicate @@ -148,13 +148,14 @@ back = /obj/item/weapon/storage/backpack r_pocket = /obj/item/weapon/gun/ballistic/automatic/pistol id = /obj/item/weapon/card/id + implants = list(/obj/item/weapon/implant/weapons_auth) /datum/outfit/lavaland_syndicate/post_equip(mob/living/carbon/human/H) H.faction |= "syndicate" /obj/effect/mob_spawn/human/lavaland_syndicate/comms name = "Syndicate Comms Agent" - flavour_text = "You are a syndicate agent, employed in a top secret research facility developing biological weapons. Unfortunately, your hated enemy, Nanotrasen, has begun mining in this sector. Monitor enemy activity as best you can, and try to keep a low profile. Do not abandon the base without good cause. Use the communication equipment to provide support to any field agents, and sow disinformation to throw Nanotrasen off your trail. Do not let the base fall into enemy hands!" + flavour_text = "You are a syndicate agent, employed in a top secret research facility developing biological weapons. Unfortunately, your hated enemy, Nanotrasen, has begun mining in this sector. Monitor enemy activity as best you can, and try to keep a low profile. DON'T abandon the base without good cause. Use the communication equipment to provide support to any field agents, and sow disinformation to throw Nanotrasen off your trail. Do not let the base fall into enemy hands!" outfit = /datum/outfit/lavaland_syndicate/comms /datum/outfit/lavaland_syndicate/comms diff --git a/code/modules/server_tools/server_tools.dm b/code/modules/server_tools/server_tools.dm index 725c9f82c09..106f4c7aa9e 100644 --- a/code/modules/server_tools/server_tools.dm +++ b/code/modules/server_tools/server_tools.dm @@ -64,7 +64,12 @@ GLOBAL_PROTECT(reboot_mode) var/status = "Admins: [allmins.len] (Active: [english_list(adm["present"])] AFK: [english_list(adm["afk"])] Stealth: [english_list(adm["stealth"])] Skipped: [english_list(adm["noflags"])]). " status += "Players: [GLOB.clients.len] (Active: [get_active_player_count(0,1,0)]). Mode: [SSticker.mode ? SSticker.mode.name : "Not started"]." return status - + if(SERVICE_CMD_IRC_CHECK) + var/rtod = REALTIMEOFDAY + if(rtod - last_irc_status < IRC_STATUS_THROTTLE) + return + last_irc_status = rtod + return "[GLOB.clients.len] players on [SSmapping.config.map_name], Mode: [GLOB.master_mode]; Round [SSticker.HasRoundStarted() ? (SSticker.IsRoundInProgress() ? "Active" : "Finishing") : "Starting"] -- [config.server ? config.server : "byond://[address]:[port]"]" if(SERVICE_CMD_ADMIN_MSG) return IrcPm(params[SERVICE_CMD_PARAM_TARGET], params[SERVICE_CMD_PARAM_MESSAGE], params[SERVICE_CMD_PARAM_SENDER]) diff --git a/code/modules/shuttle/arrivals.dm b/code/modules/shuttle/arrivals.dm index 9aa0041a657..25dfa135975 100644 --- a/code/modules/shuttle/arrivals.dm +++ b/code/modules/shuttle/arrivals.dm @@ -43,16 +43,16 @@ console = locate(/obj/machinery/requests_console) in A areas += A - if(GLOB.latejoin.len) + if(SSjob.latejoin_trackers.len) WARNING("Map contains predefined latejoin spawn points and an arrivals shuttle. Using the arrivals shuttle.") if(!new_latejoin.len) WARNING("Arrivals shuttle contains no chairs for spawn points. Reverting to latejoin landmarks.") - if(!GLOB.latejoin.len) + if(!SSjob.latejoin_trackers.len) WARNING("No latejoin landmarks exist. Players will spawn unbuckled on the shuttle.") return - GLOB.latejoin = new_latejoin + SSjob.latejoin_trackers = new_latejoin /obj/docking_port/mobile/arrivals/dockRoundstart() SSshuttle.generate_transit_dock(src) @@ -109,7 +109,7 @@ Launch(FALSE) /obj/docking_port/mobile/arrivals/proc/CheckTurfsPressure() - for(var/I in GLOB.latejoin) + for(var/I in SSjob.latejoin_trackers) var/turf/open/T = get_turf(I) var/pressure = T.air.return_pressure() if(pressure < HAZARD_LOW_PRESSURE || pressure > HAZARD_HIGH_PRESSURE) //simple safety check diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm index f022e0338fe..e5957e7cdef 100644 --- a/code/modules/spells/spell.dm +++ b/code/modules/spells/spell.dm @@ -134,7 +134,7 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th return 0 var/turf/T = get_turf(user) - if(T.z == ZLEVEL_CENTCOM && (!centcom_cancast || SSticker.mode.name == "ragin' mages")) //Certain spells are not allowed on the centcom zlevel + if(T.z == ZLEVEL_CENTCOM && !centcom_cancast) //Certain spells are not allowed on the centcom zlevel to_chat(user, "You can't cast this spell here.") return 0 diff --git a/code/modules/spells/spell_types/rod_form.dm b/code/modules/spells/spell_types/rod_form.dm index 5046da7c34d..dc77615307f 100644 --- a/code/modules/spells/spell_types/rod_form.dm +++ b/code/modules/spells/spell_types/rod_form.dm @@ -17,6 +17,7 @@ var/obj/effect/immovablerod/wizard/W = new(start, get_ranged_target_turf(M, M.dir, (15 + spell_level * 3))) W.wizard = M W.max_distance += spell_level * 3 //You travel farther when you upgrade the spell + W.damage_bonus += spell_level * 20 //You do more damage when you upgrade the spell W.start_turf = start M.forceMove(W) M.notransform = 1 @@ -26,6 +27,7 @@ /obj/effect/immovablerod/wizard var/max_distance = 13 + var/damage_bonus = 0 var/mob/living/wizard var/turf/start_turf notify = FALSE @@ -41,3 +43,7 @@ wizard.notransform = 0 wizard.forceMove(get_turf(src)) return ..() + +/obj/effect/immovablerod/wizard/penetrate(mob/living/L) + L.visible_message("[L] is penetrated by an immovable rod!" , "The rod penetrates you!" , "You hear a CLANG!") + L.adjustBruteLoss(70 + damage_bonus) diff --git a/code/modules/station_goals/bsa.dm b/code/modules/station_goals/bsa.dm index 5f808035fd3..52919c996d1 100644 --- a/code/modules/station_goals/bsa.dm +++ b/code/modules/station_goals/bsa.dm @@ -326,7 +326,7 @@ var/datum/effect_system/smoke_spread/s = new s.set_up(4,get_turf(centerpiece)) s.start() - var/obj/machinery/bsa/full/cannon = new(get_turf(centerpiece),cannon_direction=centerpiece.get_cannon_direction()) + var/obj/machinery/bsa/full/cannon = new(get_turf(centerpiece),centerpiece.get_cannon_direction()) qdel(centerpiece.front) qdel(centerpiece.back) qdel(centerpiece) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index b4154c8e9c8..a166be04a47 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -292,7 +292,7 @@ cooldown = COOLDOWN_MEME for(var/V in listeners) var/mob/living/L = V - new /obj/effect/hallucination/delusion(get_turf(L),L,duration=150 * power_multiplier,skip_nearby=0) + new /obj/effect/hallucination/delusion(get_turf(L),L,null,150 * power_multiplier,0) //WAKE UP else if((findtext(message, wakeup_words))) diff --git a/code/modules/surgery/prosthetic_replacement.dm b/code/modules/surgery/prosthetic_replacement.dm index 4be7b84a6c6..af1d6e47431 100644 --- a/code/modules/surgery/prosthetic_replacement.dm +++ b/code/modules/surgery/prosthetic_replacement.dm @@ -82,7 +82,7 @@ target_zone == "r_arm" ? target.put_in_r_hand(new_arm) : target.put_in_l_hand(new_arm) return 1 else if(istype(tool, /obj/item/weapon/melee/synthetic_arm_blade)) - var/obj/item/weapon/melee/arm_blade/new_arm = new(target, silent = TRUE, synthetic = TRUE) + var/obj/item/weapon/melee/arm_blade/new_arm = new(target,TRUE,TRUE) target_zone == "r_arm" ? target.put_in_r_hand(new_arm) : target.put_in_l_hand(new_arm) return 1 diff --git a/code/modules/uplink/uplink_item.dm b/code/modules/uplink/uplink_item.dm index 853c055c351..31fe5e3390c 100644 --- a/code/modules/uplink/uplink_item.dm +++ b/code/modules/uplink/uplink_item.dm @@ -203,7 +203,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. /datum/uplink_item/dangerous/shotgun name = "Bulldog Shotgun" desc = "A fully-loaded semi-automatic drum-fed shotgun. Compatiable with all 12g rounds. Designed for close \ - quarter anti-personel engagements." + quarter anti-personnel engagements." item = /obj/item/weapon/gun/ballistic/automatic/shotgun/bulldog cost = 8 surplus = 40 @@ -297,7 +297,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. /datum/uplink_item/dangerous/powerfist name = "Power Fist" desc = "The power-fist is a metal gauntlet with a built-in piston-ram powered by an external gas supply.\ - Upon hitting a target, the piston-ram will extend foward to make contact for some serious damage. \ + Upon hitting a target, the piston-ram will extend forward to make contact for some serious damage. \ Using a wrench on the piston valve will allow you to tweak the amount of gas used per punch to \ deal extra damage and hit targets further. Use a screwdriver to take out any attached tanks." item = /obj/item/weapon/melee/powerfist @@ -898,7 +898,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. /datum/uplink_item/device_tools/military_belt name = "Chest Rig" - desc = "A robust seven-slot set of webbing that is capable of holding all manner of tatical equipment." + desc = "A robust seven-slot set of webbing that is capable of holding all manner of tactical equipment." item = /obj/item/weapon/storage/belt/military cost = 1 exclude_modes = list(/datum/game_mode/nuclear) @@ -1014,7 +1014,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. /datum/uplink_item/device_tools/powersink name = "Power Sink" desc = "When screwed to wiring attached to a power grid and activated, this large device places excessive \ - load on the grid, causing a stationwide blackout. The sink is large and cannot be stored in most \ + load on the grid, causing a station-wide blackout. The sink is large and cannot be stored in most \ traditional bags and boxes." item = /obj/item/device/powersink cost = 6 @@ -1052,7 +1052,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. /datum/uplink_item/device_tools/rad_laser name = "Radioactive Microlaser" desc = "A radioactive microlaser disguised as a standard Nanotrasen health analyzer. When used, it emits a \ - powerful burst of radiation, which, after a short delay, can incapitate all but the most protected \ + powerful burst of radiation, which, after a short delay, can incapacitate all but the most protected \ of humanoids. It has two settings: intensity, which controls the power of the radiation, \ and wavelength, which controls how long the radiation delay is." item = /obj/item/device/healthanalyzer/rad_laser @@ -1121,14 +1121,14 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. /datum/uplink_item/device_tools/codespeak_manual name = "Codespeak Manual" - desc = "Syndicate agents can be trained to use a series of codewords to comvey complex information, which sounds like random concepts and drinks to anyone listening. This manual teaches you this Codespeak. You can also hit someone else with the manual in order to teach them. One use." + desc = "Syndicate agents can be trained to use a series of codewords to convey complex information, which sounds like random concepts and drinks to anyone listening. This manual teaches you this Codespeak. You can also hit someone else with the manual in order to teach them. One use." item = /obj/item/weapon/codespeak_manual cost = 2 exclude_modes = list(/datum/game_mode/nuclear) /datum/uplink_item/device_tools/codespeak_manual_deluxe name = "Deluxe Codespeak Manual" - desc = "Syndicate agents can be trained to use a series of codewords to comvey complex information, which sounds like random concepts and drinks to anyone listening. This manual teaches you this Codespeak. You can also hit someone else with the manual in order to teach them. This is the deluxe edition, which has unlimited uses." + desc = "Syndicate agents can be trained to use a series of codewords to convey complex information, which sounds like random concepts and drinks to anyone listening. This manual teaches you this Codespeak. You can also hit someone else with the manual in order to teach them. This is the deluxe edition, which has unlimited uses." cost = 8 include_modes = list(/datum/game_mode/nuclear) @@ -1247,7 +1247,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. /datum/uplink_item/role_restricted/mimery name = "Guide to Advanced Mimery Series" - desc = "The classical two part series on how to further hone your mime skills. Upon studying the series, the user should be able to make 3x1 invisble walls, and shoot bullets out of their fingers. Obviously only works for Mimes." + desc = "The classical two part series on how to further hone your mime skills. Upon studying the series, the user should be able to make 3x1 invisible walls, and shoot bullets out of their fingers. Obviously only works for Mimes." cost = 12 item = /obj/item/weapon/storage/box/syndie_kit/mimery restricted_roles = list("Mime") @@ -1359,7 +1359,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. /datum/uplink_item/badass/surplus name = "Syndicate Surplus Crate" - desc = "A dusty crate from the back of the Syndicate warehouse. Rumored to contain a valuable assortion of items, \ + desc = "A dusty crate from the back of the Syndicate warehouse. Rumored to contain a valuable assortment of items, \ but you never know. Contents are sorted to always be worth 50 TC." item = /obj/structure/closet/crate cost = 20 diff --git a/config/game_options.txt b/config/game_options.txt index fca46c529d1..87c4ed5c14b 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -87,7 +87,6 @@ PROBABILITY CHANGELING 2 PROBABILITY WIZARD 4 PROBABILITY MALFUNCTION 1 PROBABILITY BLOB 2 -PROBABILITY RAGINMAGES 2 PROBABILITY MONKEY 0 PROBABILITY METEOR 0 PROBABILITY EXTENDED 0 @@ -114,7 +113,6 @@ CONTINUOUS WIZARD CONTINUOUS MALFUNCTION CONTINUOUS BLOB CONTINUOUS ABDUCTION -#CONTINUOUS RAGINMAGES #CONTINUOUS MONKEY ##Note: do not toggle continuous off for these modes, as they have no antagonists and would thus end immediately! @@ -139,7 +137,6 @@ MIDROUND_ANTAG WIZARD MIDROUND_ANTAG MALFUNCTION MIDROUND_ANTAG BLOB MIDROUND_ANTAG ABDUCTION -#MIDROUND_ANTAG RAGINMAGES #MIDROUND_ANTAG MONKEY ## Uncomment these for overrides of the minimum / maximum number of players in a round type. diff --git a/config/lavaruinblacklist.txt b/config/lavaruinblacklist.txt index 5afb96f6cdc..aec26764a59 100644 --- a/config/lavaruinblacklist.txt +++ b/config/lavaruinblacklist.txt @@ -14,7 +14,6 @@ #_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm #_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm #_maps/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm -#_maps/RandomRuins/LavaRuins/lavaland_surface_surface_ueg_crash1.dmm ##SIN #_maps/RandomRuins/LavaRuins/lavaland_surface_envy.dmm diff --git a/html/changelog.html b/html/changelog.html index 3d39c458b16..1ce1f4107f7 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,158 @@ -->
+

06 June 2017

+

Joan updated:

+
    +
  • Added a new unique Kinetic Accelerator module to necropolis chests.
  • +
  • Renames Clockwork Proselytizers to Replica Fabricators.
  • +
  • Replica Fabricators can directly consume floor tiles, rods, metal, and plasteel for power instead of needing to convert to brass first.
  • +
  • Cogscarabs can no longer use guns.
  • +
+

PKPenguin321 updated:

+
    +
  • The fake pits that the arcade machines can vend now vend properly, for real this time.
  • +
+

Robustin updated:

+
    +
  • The cult master has finally acquired their 3rd spell, Eldritch Pulse. This ability allows the cult master to quickly teleport any cultist or cult structure in visual range to another tile in visual range. This spell has an obvious spell effect that will indicate where the target has gone but without explicitly revealing who the master is. This spell should assist with moving obstinate cultists off an important rune, getting wandering cultists back onto an important rune, save a cultist from an untimely arrest/summary execution, assist in getting your allies into secure areas, etc.
  • +
  • The void torch now only works on items that have been placed on surfaces, this prevents the inventory bugs associated with this item.
  • +
+

thefastfoodguy updated:

+
    +
  • you can burn your brains out with a flashlight if you're tired of life
  • +
+ +

05 June 2017

+

Expletive updated:

+
    +
  • The Ore Redemption Machine has been ported to TGUI. New features include the addition of "Release All" and "Smelt All" buttons.
  • +
  • The Ore Redemption Machine now be loaded with sheets of material.
  • +
  • The Ore Redemption Machine can now 'smelt' Reinforced Glass.
  • +
+

Joan updated:

+
    +
  • Only human and silicon servants can help recite multi-invoker scriptures. This means cogscarabs, clockwork marauders, and anima fragments DO NOT COUNT for scriptures that require multiple invokers.
  • +
  • Clockcult scripture tiers can no longer be lost by dipping below their requirements once they are unlocked.
  • +
  • Removes Revenant scriptures entirely.
  • +
+

MMMiracles updated:

+
    +
  • Deepstorage ruin has been redone to be more self-sufficient and up to better mapping standards.
  • +
+ +

04 June 2017

+

Expletive updated:

+
    +
  • Many stacks now update their sprite based on their amount.
  • +
  • Stacks will now weigh less if they're less than full.
  • +
  • Added new icon states for glass, reinforced glass, metal, plasteel, plastic, plasma, plastitanium, titanium, gold, silver, adamantine, brass, bruise packs, ointment, gauze, cloth, leather, wet leather, hairless hide, human hide, ash drake hide, goliath hide, bones, sandstone blocks, and snow blocks.
  • +
  • Some lavaland stacks' max amounts have been reduced.
  • +
  • Bulldog Shotguns should update their sprite properly when you remove the magazine.
  • +
  • Riot suits no longer hide jumpsuits.
  • +
+

Joan updated:

+
    +
  • Rod Form now costs 2 points, from 3.
  • +
  • Rod Form now does 70 damage, from 160, but gains 20 damage, per upgrade, when upgraded. This means you'll need to spend 6 points on it to instantly crit people from full health.
  • +
+

Swindly updated:

+
    +
  • Chemical grenades are no longer permanently disabled after being unlocked by wirecutters after being primed.
  • +
+ +

03 June 2017

+

Expletive updated:

+
    +
  • Chem Dispensers now store their power in their batteries.
  • +
  • Instead of being based on battery and capacitor ratings, recharge delay for portable chem dispensers is now based on their capacitor and matter bin ratings.
  • +
  • The Seed Vault's chemical dispenser now has all the chemicals a pod person could want.
  • +
  • The crafting menu now has subcategories!
  • +
  • Food recipe categories have been combined as subcategories of the Foods category.
  • +
  • Weaponry and Ammunition have been combined as subcategories of the Weaponry category.
  • +
+

Improvedname updated:

+
    +
  • Janitors now start with a flyswatter
  • +
+

Mothership Epsilon updated:

+
    +
  • All your base are belong to us.
  • +
+

Penguaro updated:

+
    +
  • [Box] Removes extra/unattached vent from Xeno Lab
  • +
+

Planned Spaceparenthood updated:

+
    +
  • We would like to apologize for mislabeled cloning pod buttons.
  • +
+

WJohnston updated:

+
    +
  • Deltastation's south nuke op shuttle location should no longer be possible to teleport into by moving off the map and back on, and moved the rest closer to the station.
  • +
+

p440 updated:

+
    +
  • Fixed duping cable coils with magic APC terminals
  • +
  • Fixed invalid icon state for empty APCs
  • +
+ +

02 June 2017

+

Cyberboss updated:

+
    +
  • New server backend!
  • +
  • Test merged PRs now show the commit of the PR at which they were merged
  • +
+

Expletive updated:

+
    +
  • Adds the NT75 Electromagnetic Power Inducer, a tool which can be used to quickly recharge many devices! They can be found in Electrical Closets, the CE's locker, ordered by cargo, or created in RnD.
  • +
+

Goodstuff updated:

+
    +
  • Fixes the crafting recipe for black carpet
  • +
  • Removed a random white dot on the black carpet sprite
  • +
+

Joan updated:

+
    +
  • Goliaths, Watchers, and Legions have a small chance of dropping a kinetic crusher trophy item when killed with a kinetic crusher. Like the boss trophy items, these give various effects.
  • +
  • Kinetic crushers recharge very slightly slower.
  • +
  • Three unique Kinetic Accelerator modules will now appear in necropolis chests.
  • +
+

MMMiracles (Cerestation) updated:

+
    +
  • CereStation's Security department has been overhauled entirely thanks to the tireless efforts of Nanotrasen's construction division.
  • +
+

Nanotrasen Mining Alert updated:

+
    +
  • Nanotrasen's mining operations have created far more corpses than an entire galaxy of cooks could hope to deal with. To solve this, we decided to just dump them all from orbit onto the barren lava planet. Unfortunately, the creatures called "Legion" have infested a great number of them, and you can now commonly find the bodies of former Nanotrasen employees left behind. Additionally, there are reports of natives, other settlers, and even stranger things found among the corpses.
  • +
+

QualityVan updated:

+
    +
  • The tactical rigging in op closets is more tacticool
  • +
+

Shadowlight213 updated:

+
    +
  • The reset wire on borgs must now be cut to reset a borg's module instead of pulsed.
  • +
  • Portable pump max pressure has been lowered.
  • +
+

Steelpoint updated:

+
    +
  • Iron Hawk Marine no longer has Centcom all access. My mistake.
  • +
  • Fixes Iron Hawk marine carbine not having a visible sprite.
  • +
+

Swindly updated:

+
    +
  • Nitrous oxide no longer produces water as a by-product, requires 2 parts ammonia instead of 3, and produces 5 parts when made instead of 2.
  • +
+

kevinz000 updated:

+
    +
  • Gang turrets now follow the mouse of the person using them! Yay!
  • +
+

octareenroon91 updated:

+
    +
  • Attempts to add items to a storage container beyond its slots limit will now obtain a failure message again.
  • +
+

30 May 2017

Expletive updated:

    @@ -1348,85 +1500,6 @@
    • Emergency shuttles will now forget early launch authorizations if they cannot launch due to a hostile environment.
    - -

    02 April 2017

    -

    BeeSting12 updated:

    -
      -
    • Metastation's northeast radiation collector is now connected to the grid. Nanotrasen would like to apologize for any inconvenience caused to engineers, but copper is expensive.
    • -
    • Boxstation's HoP office now has a PDA tech.
    • -
    -

    Cyberboss updated:

    -
      -
    • Firedoors no longer operate automatically without power
    • -
    • Blood and other decals will no longer remain on turfs they shouldn't
    • -
    • The splashscreen is working again
    • -
    • False alarms are now guaranteed to actually announce something
    • -
    -

    Incoming5643 updated:

    -
      -
    • Lighting visuals have been changed slightly to reduce it's cost to the client. If you had trouble running the new lighting, it might run a little better now.
    • -
    -

    MMMiracles (CereStation) updated:

    -
      -
    • Added a patrol path for bots, includes 2 round-start securitrons placed on opposite sites of station.
    • -
    • Due to map size, mulebots are still somewhat unreliable on longer distances. Disposals are still advised, but mule bots are now technically an option for delivery.
    • -
    • Added multiple status displays, extinguishers, and appropriate newscasters to hallways.
    • -
    • A drone dispenser is now located underneath Engineering in maintenance.
    • -
    • Each security checkpoint now has a disposal chute that directs to a waiting cell in the Brig for rapid processing of criminals. Why run half-way across the station with some petty thief when you can just shove him in the criminal chute and have the warden deal with him?
    • -
    • Security's mail chute no longer leads into the armory. This was probably not the best idea in hindsight.
    • -
    • Virology has a bathroom now.
    • -
    • Genetics monkey pen is a bit more green now.
    • -
    • Lawyer now has access the brig cells so he can complain more effectively.
    • -
    • Xenobio kill chamber is now in range of a camera.
    • -
    • Removed rogue bits of Vault area.
    • -
    • Medbay escape pod no longer juts out far enough to block the disposal's path.
    • -
    • Captain's spare ID is now real and not just a gold ID card.
    • -
    -

    Penguaro updated:

    -
      -
    • [Meta] The Chapel Security Hatches were very intimidating. They have been changed to more inviting glass doors.
    • -
    • [Meta] The maintenance tunnels in the Xeno Lab now have radiation shielding. The Slime Euthanization Chamber will not have radiation shielding at this time as dead slimes will not mind radiation.
    • -
    -

    coiax updated:

    -
      -
    • Adds seperate languages to the game. Now Ratvarian, Drone, Machine, Swarmer, Human (now called Galactic Common), Slime and Monkey are separate languages. Each languages has its own comma prefix, for example, Galcom has the ,0 prefix, while Ratvarian has the ,r prefix. If you don't understand a language when it is spoken to you, you will hear a scrambled version that will vary depending on the language that you're not understanding.
    • -
    • This does not change who can understand what.
    • -
    • Removed the talk wheel feature.
    • -
    • Clicking the speech bubble icon now opens the Language Menu, allowing you to review which languages you speak, their keys, and letting you set which language you speak by default. Admins have additional abilities to add and remove languages from mobs using this menu.
    • -
    -

    ktccd updated:

    -
      -
    • Ninja suits have received a new software update, making them able to **actually steal tech levels** from R&D consoles and servers, thus avoid being forced to honourably kill themselves for failing their objective.
    • -
    - -

    01 April 2017

    -

    Cyberboss updated:

    -
      -
    • The contents of the shelterpod smart fridge work again
    • -
    -

    XDTM updated:

    -
      -
    • Facehuggers no longer rip masks from people protected by helmets.
    • -
    - -

    31 March 2017

    -

    Cobby updated:

    -
      -
    • Shot glasses are now more ambiguous [EASIER TO MAINTAIN]
    • -
    -

    Cyberboss updated:

    -
      -
    • Temperature changes will now properly cause atmospherics simulation to activate
    • -
    • The command report for random xeno eggs will now be delivered along with the rest of the roundstart reports
    • -
    • Drones can no longer be irradiated
    • -
    - -

    30 March 2017

    -

    coiax updated:

    -
      -
    • Autoimplanters have been renamed to autosurgeons. Currently only the CMO and nuclear operatives have access to autosurgeons. What is the CMO hiding?
    • -
    • All upgraded organs for purchase by nuclear operatives now actually come in an autosurgeon, for speed of surgery.
    • -
GoonStation 13 Development Team diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index cb5fee5d4d6..091a293167e 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -11581,3 +11581,136 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - rscdel: However, someone tripped and pulled out the power cord while your servers were being updated with the latest revision of accelerator laser cannons. All data have been lost... +2017-06-02: + Cyberboss: + - experiment: New server backend! + - tweak: Test merged PRs now show the commit of the PR at which they were merged + Expletive: + - rscadd: Adds the NT75 Electromagnetic Power Inducer, a tool which can be used + to quickly recharge many devices! They can be found in Electrical Closets, the + CE's locker, ordered by cargo, or created in RnD. + Goodstuff: + - bugfix: Fixes the crafting recipe for black carpet + - bugfix: Removed a random white dot on the black carpet sprite + Joan: + - rscadd: Goliaths, Watchers, and Legions have a small chance of dropping a kinetic + crusher trophy item when killed with a kinetic crusher. Like the boss trophy + items, these give various effects. + - tweak: Kinetic crushers recharge very slightly slower. + - rscadd: Three unique Kinetic Accelerator modules will now appear in necropolis + chests. + MMMiracles (Cerestation): + - rscadd: CereStation's Security department has been overhauled entirely thanks + to the tireless efforts of Nanotrasen's construction division. + Nanotrasen Mining Alert: + - rscadd: Nanotrasen's mining operations have created far more corpses than an entire + galaxy of cooks could hope to deal with. To solve this, we decided to just dump + them all from orbit onto the barren lava planet. Unfortunately, the creatures + called "Legion" have infested a great number of them, and you can now commonly + find the bodies of former Nanotrasen employees left behind. Additionally, there + are reports of natives, other settlers, and even stranger things found among + the corpses. + QualityVan: + - tweak: The tactical rigging in op closets is more tacticool + Shadowlight213: + - balance: The reset wire on borgs must now be cut to reset a borg's module instead + of pulsed. + - tweak: Portable pump max pressure has been lowered. + Steelpoint: + - tweak: Iron Hawk Marine no longer has Centcom all access. My mistake. + - bugfix: Fixes Iron Hawk marine carbine not having a visible sprite. + Swindly: + - balance: Nitrous oxide no longer produces water as a by-product, requires 2 parts + ammonia instead of 3, and produces 5 parts when made instead of 2. + kevinz000: + - experiment: Gang turrets now follow the mouse of the person using them! Yay! + octareenroon91: + - bugfix: Attempts to add items to a storage container beyond its slots limit will + now obtain a failure message again. +2017-06-03: + Expletive: + - tweak: Chem Dispensers now store their power in their batteries. + - tweak: Instead of being based on battery and capacitor ratings, recharge delay + for portable chem dispensers is now based on their capacitor and matter bin + ratings. + - tweak: The Seed Vault's chemical dispenser now has all the chemicals a pod person + could want. + - rscadd: The crafting menu now has subcategories! + - rscadd: Food recipe categories have been combined as subcategories of the Foods + category. + - rscadd: Weaponry and Ammunition have been combined as subcategories of the Weaponry + category. + Improvedname: + - rscadd: Janitors now start with a flyswatter + Mothership Epsilon: + - tweak: All your base are belong to us. + Penguaro: + - bugfix: '[Box] Removes extra/unattached vent from Xeno Lab' + Planned Spaceparenthood: + - bugfix: We would like to apologize for mislabeled cloning pod buttons. + WJohnston: + - bugfix: Deltastation's south nuke op shuttle location should no longer be possible + to teleport into by moving off the map and back on, and moved the rest closer + to the station. + p440: + - bugfix: Fixed duping cable coils with magic APC terminals + - bugfix: Fixed invalid icon state for empty APCs +2017-06-04: + Expletive: + - rscadd: Many stacks now update their sprite based on their amount. + - rscadd: Stacks will now weigh less if they're less than full. + - imageadd: Added new icon states for glass, reinforced glass, metal, plasteel, + plastic, plasma, plastitanium, titanium, gold, silver, adamantine, brass, bruise + packs, ointment, gauze, cloth, leather, wet leather, hairless hide, human hide, + ash drake hide, goliath hide, bones, sandstone blocks, and snow blocks. + - tweak: Some lavaland stacks' max amounts have been reduced. + - bugfix: Bulldog Shotguns should update their sprite properly when you remove the + magazine. + - bugfix: Riot suits no longer hide jumpsuits. + Joan: + - balance: Rod Form now costs 2 points, from 3. + - balance: Rod Form now does 70 damage, from 160, but gains 20 damage, per upgrade, + when upgraded. This means you'll need to spend 6 points on it to instantly crit + people from full health. + Swindly: + - balance: Chemical grenades are no longer permanently disabled after being unlocked + by wirecutters after being primed. +2017-06-05: + Expletive: + - rscadd: The Ore Redemption Machine has been ported to TGUI. New features include + the addition of "Release All" and "Smelt All" buttons. + - rscadd: The Ore Redemption Machine now be loaded with sheets of material. + - rscadd: The Ore Redemption Machine can now 'smelt' Reinforced Glass. + Joan: + - balance: Only human and silicon servants can help recite multi-invoker scriptures. + This means cogscarabs, clockwork marauders, and anima fragments DO NOT COUNT + for scriptures that require multiple invokers. + - balance: Clockcult scripture tiers can no longer be lost by dipping below their + requirements once they are unlocked. + - rscdel: Removes Revenant scriptures entirely. + MMMiracles: + - tweak: Deepstorage ruin has been redone to be more self-sufficient and up to better + mapping standards. +2017-06-06: + Joan: + - rscadd: Added a new unique Kinetic Accelerator module to necropolis chests. + - spellcheck: Renames Clockwork Proselytizers to Replica Fabricators. + - balance: Replica Fabricators can directly consume floor tiles, rods, metal, and + plasteel for power instead of needing to convert to brass first. + - balance: Cogscarabs can no longer use guns. + PKPenguin321: + - bugfix: The fake pits that the arcade machines can vend now vend properly, for + real this time. + Robustin: + - rscadd: The cult master has finally acquired their 3rd spell, Eldritch Pulse. + This ability allows the cult master to quickly teleport any cultist or cult + structure in visual range to another tile in visual range. This spell has an + obvious spell effect that will indicate where the target has gone but without + explicitly revealing who the master is. This spell should assist with moving + obstinate cultists off an important rune, getting wandering cultists back onto + an important rune, save a cultist from an untimely arrest/summary execution, + assist in getting your allies into secure areas, etc. + - bugfix: The void torch now only works on items that have been placed on surfaces, + this prevents the inventory bugs associated with this item. + thefastfoodguy: + - tweak: you can burn your brains out with a flashlight if you're tired of life diff --git a/html/changelogs/AutoChangeLog-pr-26534.yml b/html/changelogs/AutoChangeLog-pr-26534.yml deleted file mode 100644 index 3bd71de62aa..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26534.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Cyberboss" -delete-after: True -changes: - - experiment: "New server backend!" - - tweak: "Test merged PRs now show the commit of the PR at which they were merged" diff --git a/html/changelogs/AutoChangeLog-pr-27653.yml b/html/changelogs/AutoChangeLog-pr-27653.yml deleted file mode 100644 index 5e149ddd2a7..00000000000 --- a/html/changelogs/AutoChangeLog-pr-27653.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Expletive" -delete-after: True -changes: - - rscadd: "Adds the NT75 Electromagnetic Power Inducer, a tool which can be used to quickly recharge many devices! They can be found in Electrical Closets, the CE's locker, ordered by cargo, or created in RnD." diff --git a/html/changelogs/AutoChangeLog-pr-27868.yml b/html/changelogs/AutoChangeLog-pr-27868.yml deleted file mode 100644 index 68b9f35b3a7..00000000000 --- a/html/changelogs/AutoChangeLog-pr-27868.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "kevinz000" -delete-after: True -changes: - - experiment: "Gang turrets now follow the mouse of the person using them! Yay!" diff --git a/html/changelogs/AutoChangeLog-pr-27880.yml b/html/changelogs/AutoChangeLog-pr-27880.yml deleted file mode 100644 index 50369541969..00000000000 --- a/html/changelogs/AutoChangeLog-pr-27880.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Shadowlight213" -delete-after: True -changes: - - balance: "The reset wire on borgs must now be cut to reset a borg's module instead of pulsed." diff --git a/html/changelogs/AutoChangeLog-pr-27884.yml b/html/changelogs/AutoChangeLog-pr-27884.yml deleted file mode 100644 index 6bbbff08ecb..00000000000 --- a/html/changelogs/AutoChangeLog-pr-27884.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "MMMiracles (Cerestation)" -delete-after: True -changes: - - rscadd: "CereStation's Security department has been overhauled entirely thanks to the tireless efforts of Nanotrasen's construction division." diff --git a/html/changelogs/AutoChangeLog-pr-27891.yml b/html/changelogs/AutoChangeLog-pr-27891.yml deleted file mode 100644 index 85eddc62fc1..00000000000 --- a/html/changelogs/AutoChangeLog-pr-27891.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Goodstuff" -delete-after: True -changes: - - bugfix: "Fixes the crafting recipe for black carpet" - - bugfix: "Removed a random white dot on the black carpet sprite" diff --git a/html/changelogs/AutoChangeLog-pr-27894.yml b/html/changelogs/AutoChangeLog-pr-27894.yml deleted file mode 100644 index a1fdeb38c5e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-27894.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Shadowlight213" -delete-after: True -changes: - - tweak: "Portable pump max pressure has been lowered." diff --git a/html/changelogs/AutoChangeLog-pr-27906.yml b/html/changelogs/AutoChangeLog-pr-27906.yml deleted file mode 100644 index 5971468fd25..00000000000 --- a/html/changelogs/AutoChangeLog-pr-27906.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Joan" -delete-after: True -changes: - - rscadd: "Three unique Kinetic Accelerator modules will now appear in necropolis chests." diff --git a/html/changelogs/AutoChangeLog-pr-27907.yml b/html/changelogs/AutoChangeLog-pr-27907.yml deleted file mode 100644 index cd94cc798df..00000000000 --- a/html/changelogs/AutoChangeLog-pr-27907.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Steelpoint" -delete-after: True -changes: - - tweak: "Iron Hawk Marine no longer has Centcom all access. My mistake." diff --git a/html/changelogs/AutoChangeLog-pr-27908.yml b/html/changelogs/AutoChangeLog-pr-27908.yml deleted file mode 100644 index 8844fa8dd72..00000000000 --- a/html/changelogs/AutoChangeLog-pr-27908.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Steelpoint" -delete-after: True -changes: - - bugfix: "Fixes Iron Hawk marine carbine not having a visible sprite." diff --git a/html/changelogs/AutoChangeLog-pr-28098.yml b/html/changelogs/AutoChangeLog-pr-28098.yml new file mode 100644 index 00000000000..646ebab943f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-28098.yml @@ -0,0 +1,4 @@ +author: "Joan" +delete-after: True +changes: + - tweak: "KA modkits in necropolis chests are now design discs with designs for those modkits, to force miners to bring back minerals." diff --git a/icons/effects/119x268.dmi b/icons/effects/119x268.dmi new file mode 100644 index 00000000000..6685901db46 Binary files /dev/null and b/icons/effects/119x268.dmi differ diff --git a/icons/effects/166x195.dmi b/icons/effects/166x195.dmi new file mode 100644 index 00000000000..ef49baf9f54 Binary files /dev/null and b/icons/effects/166x195.dmi differ diff --git a/icons/effects/187x381.dmi b/icons/effects/187x381.dmi deleted file mode 100644 index dd43297db53..00000000000 Binary files a/icons/effects/187x381.dmi and /dev/null differ diff --git a/icons/effects/211x247.dmi b/icons/effects/211x247.dmi deleted file mode 100644 index 35b25ffe146..00000000000 Binary files a/icons/effects/211x247.dmi and /dev/null differ diff --git a/icons/effects/237x321.dmi b/icons/effects/237x321.dmi new file mode 100644 index 00000000000..089c08d9a20 Binary files /dev/null and b/icons/effects/237x321.dmi differ diff --git a/icons/effects/254x361.dmi b/icons/effects/254x361.dmi deleted file mode 100644 index 4fd6543c32d..00000000000 Binary files a/icons/effects/254x361.dmi and /dev/null differ diff --git a/icons/effects/274x385.dmi b/icons/effects/274x385.dmi new file mode 100644 index 00000000000..9a8ba55f915 Binary files /dev/null and b/icons/effects/274x385.dmi differ diff --git a/icons/effects/340x428.dmi b/icons/effects/340x428.dmi deleted file mode 100644 index eb735c0ba92..00000000000 Binary files a/icons/effects/340x428.dmi and /dev/null differ diff --git a/icons/effects/cult_effects.dmi b/icons/effects/cult_effects.dmi index 58a2d3c9c97..925950b9a39 100644 Binary files a/icons/effects/cult_effects.dmi and b/icons/effects/cult_effects.dmi differ diff --git a/icons/effects/station_explosion.dmi b/icons/effects/station_explosion.dmi index 385818b0117..d8ced1f544b 100644 Binary files a/icons/effects/station_explosion.dmi and b/icons/effects/station_explosion.dmi differ diff --git a/icons/effects/throw_target.dmi b/icons/effects/throw_target.dmi new file mode 100644 index 00000000000..660eafbf2b1 Binary files /dev/null and b/icons/effects/throw_target.dmi differ diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi index c8fc98d4f50..214bfd744ea 100644 Binary files a/icons/mob/actions.dmi and b/icons/mob/actions.dmi differ diff --git a/icons/mob/belt.dmi b/icons/mob/belt.dmi index 8fbd06a23be..f73a54ab1d1 100644 Binary files a/icons/mob/belt.dmi and b/icons/mob/belt.dmi differ diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index 68f8caac6bd..2fb1c07f773 100644 Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi index 262c802ca1c..aa0bd962d1f 100644 Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi index a3dd1e21bd2..6e620cd92d8 100644 Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ diff --git a/icons/obj/clockwork_objects.dmi b/icons/obj/clockwork_objects.dmi index a7c80ba5361..02e07435931 100644 Binary files a/icons/obj/clockwork_objects.dmi and b/icons/obj/clockwork_objects.dmi differ diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi index 441f334ca77..2043111e605 100644 Binary files a/icons/obj/clothing/belts.dmi and b/icons/obj/clothing/belts.dmi differ diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi index 327d2749f76..deb0908fed5 100644 Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi index bffa20e6aab..88cfcd39d60 100644 Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ diff --git a/icons/obj/lavaland/artefacts.dmi b/icons/obj/lavaland/artefacts.dmi index 41c1ba56cd3..ca254e47e75 100644 Binary files a/icons/obj/lavaland/artefacts.dmi and b/icons/obj/lavaland/artefacts.dmi differ diff --git a/icons/obj/machines/dominator.dmi b/icons/obj/machines/dominator.dmi index 9f743174e74..42337dc1c80 100644 Binary files a/icons/obj/machines/dominator.dmi and b/icons/obj/machines/dominator.dmi differ diff --git a/icons/obj/mining.dmi b/icons/obj/mining.dmi index a5fe40431ed..3de64f610a1 100644 Binary files a/icons/obj/mining.dmi and b/icons/obj/mining.dmi differ diff --git a/icons/obj/tiles.dmi b/icons/obj/tiles.dmi index 1c0ac03abec..8b439d2bad3 100644 Binary files a/icons/obj/tiles.dmi and b/icons/obj/tiles.dmi differ diff --git a/strings/tips.txt b/strings/tips.txt index 4db52bbed2b..591ba0c04b8 100644 --- a/strings/tips.txt +++ b/strings/tips.txt @@ -161,13 +161,13 @@ As a Servant, the Judicial Visor is an effective defensive combat tool in small As a Servant, making, and protecting, Tinkerer's Caches is extremely important, as caches are required to unlock scripture and share components. As a Servant, Ocular Wardens, while fragile, do very high, rapid damage to a target non-servant that can see them and will even attack mechs that contain heretics. Place them behind objects that don't block vision to get the most use out of them. As a Servant, Clockwork Structures that require power will draw power from the APC if they cannot find a different source of power, and most power-using Structures will rapidly drain the APC. -As a Servant, you can repair Servant cyborgs, Clockwork Constructs, and Clockwork Structures with a Clockwork Proselytizer at a rate of 25W power to 1 health. +As a Servant, you can repair Servant cyborgs, Clockwork Constructs, and Clockwork Structures with a Replica Fabricator at a rate of 25W power to 1 health. As a Servant, securing a reliable source of component generation is high-priority, as simply handing out slabs will slowly become inefficient. Try placing Tinkerer's Caches near clockwork walls or creating and powering Tinkerer's Daemons. As a Servant, only a single held Clockwork Slab will generate components, no matter how many you're holding. In addition, slabs will generate components slower with large amounts of servants; you can see the exact time with Recollection. As a Servant, you can use Geis to easily convert single targets, as it binds them in place, preventing escape unless they react quickly enough. Having another Servant apply Geis to someone already bound will prevent their escape and mute them, even if they reacted quickly. As a Servant, placing components in a slab or cache places those components in a globally-accessable storage that slabs will draw from to invoke scripture. As a Servant, you can stack different types of Sigils on the same turf; try stacking a Sigil of Transgression and a Sigil of Submission for a subtle conversion trap. -As a Servant, you can deconstruct a Clockwork Wall with a Clockwork Proselytizer to regain 1000W power. You can also construct Clockwork Walls on Clockwork Floors for a cost of 1000W power. +As a Servant, you can deconstruct a Clockwork Wall with a Replica Fabricator to regain 1000W power. You can also construct Clockwork Walls on Clockwork Floors for a cost of 1000W power. As a Servant, Volt Void will drain power from nearby Sigils of Transmission to up to double the damage of each volt ray. It'll even use your own power if you happen to be a cyborg! As a Servant, Fellowship Armory invokes much faster for each nearby servant and attempts to provide each affected servant with powerful armor against melee, bullet, and bomb attacks. The gauntlets provided are also immune to elecricity. As a Servant, Spatial Gateway can teleport to any living Servant or Clockwork Obelisk, and gains additional uses and duration for each Servant assisting in the invocation. @@ -177,7 +177,7 @@ As a Servant, you can impale human targets with a Ratvarian Spear by pulling the As a Servant, Sentinel's Compromise can instantly return you or another Servant to a fighting state by converting half of all their brute, burn, and oxygen damage to toxin, effectively halving the damage they have. Clockwork Floors will also rapidly heal toxin damage in Servants, allowing the Compromise more effectiveness. As a Servant, Belligerent and Taunting Tirade are extremely powerful for disabling and disrupting large groups of enemies, though they render you somewhat vulnerable, as Belligerent requires that you stand still, and Taunting Tirade makes you extremely obvious. As a Servant, Soul Vessels can be placed in cyborg shells, mecha, Cogscarab shells, and Anima Fragment shells. -As a Servant, you can unwrench Clockwork Structures, but doing so will damage them, severely weakening them until repaired with a Proselytizer or Mending Mantra. Damage from other sources will also similarly weaken structures. +As a Servant, you can unwrench Clockwork Structures, but doing so will damage them, severely weakening them until repaired with a Replica Fabricator or Mending Mantra. Damage from other sources will also similarly weaken structures. You can deconvert Cultists of Nar-Sie and Servants of Ratvar by feeding them large amounts of holy water. As a Wizard, you can turn people to stone, then animate the resulting statue with a staff of animation to create an extremely powerful minion, for all of 5 minutes at least. As a Wizard, the fireball spell performs very poorly at close range, as it can easily catch you in the blast. It is best used as a form of artillery down long hallways. diff --git a/tgstation.dme b/tgstation.dme index e2d0d2db384..5855bb0f9cc 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -238,6 +238,8 @@ #include "code\datums\antagonists\antag_datum.dm" #include "code\datums\antagonists\datum_clockcult.dm" #include "code\datums\antagonists\datum_cult.dm" +#include "code\datums\antagonists\datum_internal_affairs.dm" +#include "code\datums\antagonists\datum_traitor.dm" #include "code\datums\antagonists\ninja.dm" #include "code\datums\diseases\_disease.dm" #include "code\datums\diseases\_MobProcs.dm" @@ -409,17 +411,17 @@ #include "code\game\gamemodes\clock_cult\clock_effects\spatial_gateway.dm" #include "code\game\gamemodes\clock_cult\clock_helpers\clock_powerdrain.dm" #include "code\game\gamemodes\clock_cult\clock_helpers\component_helpers.dm" +#include "code\game\gamemodes\clock_cult\clock_helpers\fabrication_helpers.dm" #include "code\game\gamemodes\clock_cult\clock_helpers\hierophant_network.dm" -#include "code\game\gamemodes\clock_cult\clock_helpers\proselytizer_helpers.dm" #include "code\game\gamemodes\clock_cult\clock_helpers\ratvarian_language.dm" #include "code\game\gamemodes\clock_cult\clock_helpers\scripture_checks.dm" #include "code\game\gamemodes\clock_cult\clock_helpers\slab_abilities.dm" #include "code\game\gamemodes\clock_cult\clock_items\clock_components.dm" #include "code\game\gamemodes\clock_cult\clock_items\clockwork_armor.dm" -#include "code\game\gamemodes\clock_cult\clock_items\clockwork_proselytizer.dm" #include "code\game\gamemodes\clock_cult\clock_items\clockwork_slab.dm" #include "code\game\gamemodes\clock_cult\clock_items\judicial_visor.dm" #include "code\game\gamemodes\clock_cult\clock_items\ratvarian_spear.dm" +#include "code\game\gamemodes\clock_cult\clock_items\replica_fabricator.dm" #include "code\game\gamemodes\clock_cult\clock_items\soul_vessel.dm" #include "code\game\gamemodes\clock_cult\clock_items\wraith_spectacles.dm" #include "code\game\gamemodes\clock_cult\clock_mobs\anima_fragment.dm" @@ -428,7 +430,6 @@ #include "code\game\gamemodes\clock_cult\clock_scriptures\scripture_cyborg.dm" #include "code\game\gamemodes\clock_cult\clock_scriptures\scripture_drivers.dm" #include "code\game\gamemodes\clock_cult\clock_scriptures\scripture_judgement.dm" -#include "code\game\gamemodes\clock_cult\clock_scriptures\scripture_revenant.dm" #include "code\game\gamemodes\clock_cult\clock_scriptures\scripture_scripts.dm" #include "code\game\gamemodes\clock_cult\clock_structures\ark_of_the_clockwork_justicar.dm" #include "code\game\gamemodes\clock_cult\clock_structures\clock_shells.dm" @@ -508,7 +509,6 @@ #include "code\game\gamemodes\traitor\double_agents.dm" #include "code\game\gamemodes\traitor\traitor.dm" #include "code\game\gamemodes\wizard\artefact.dm" -#include "code\game\gamemodes\wizard\raginmages.dm" #include "code\game\gamemodes\wizard\soulstone.dm" #include "code\game\gamemodes\wizard\spellbook.dm" #include "code\game\gamemodes\wizard\wizard.dm" diff --git a/tgui/assets/tgui.css b/tgui/assets/tgui.css index 531fb00530b..ffe61666b99 100644 --- a/tgui/assets/tgui.css +++ b/tgui/assets/tgui.css @@ -1 +1 @@ -@charset "utf-8";body,html{box-sizing:border-box;height:100%;margin:0}html{overflow:hidden;cursor:default}body{overflow:auto;font-family:Verdana,Geneva,sans-serif;font-size:12px;color:#fff;background-color:#2a2a2a;background-image:linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff2a2a2a",endColorstr="#ff202020",GradientType=0)}*,:after,:before{box-sizing:inherit}h1,h2,h3,h4{display:inline-block;margin:0;padding:6px 0}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}h4{font-size:12px}body.clockwork{background:linear-gradient(180deg,#b18b25 0,#5f380e);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ffb18b25",endColorstr="#ff5f380e",GradientType=0)}body.clockwork .normal{color:#b18b25}body.clockwork .good{color:#cfba47}body.clockwork .average{color:#896b19}body.clockwork .bad{color:#5f380e}body.clockwork .highlight{color:#b18b25}body.clockwork main{display:block;margin-top:32px;padding:2px 6px 0}body.clockwork hr{height:2px;background-color:#b18b25;border:none}body.clockwork .hidden{display:none}body.clockwork .bar .barText,body.clockwork span.button{color:#b18b25;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.clockwork .bold{font-weight:700}body.clockwork .italic{font-style:italic}body.clockwork [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.clockwork div[data-tooltip],body.clockwork span[data-tooltip]{position:relative}body.clockwork div[data-tooltip]:after,body.clockwork span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #170800;background-color:#2d1400}body.clockwork div[data-tooltip]:hover:after,body.clockwork span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.clockwork div[data-tooltip].tooltip-top:after,body.clockwork span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.clockwork div[data-tooltip].tooltip-top:hover:after,body.clockwork span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.clockwork div[data-tooltip].tooltip-bottom:after,body.clockwork span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.clockwork div[data-tooltip].tooltip-bottom:hover:after,body.clockwork span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.clockwork div[data-tooltip].tooltip-left:after,body.clockwork span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-left:hover:after,body.clockwork span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-right:after,body.clockwork span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-right:hover:after,body.clockwork span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.clockwork .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #170800;background:#2d1400}body.clockwork .bar .barText{position:absolute;top:0;right:3px}body.clockwork .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#b18b25}body.clockwork .bar .barFill.good{background-color:#cfba47}body.clockwork .bar .barFill.average{background-color:#896b19}body.clockwork .bar .barFill.bad{background-color:#5f380e}body.clockwork span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #170800}body.clockwork span.button .fa{padding-right:2px}body.clockwork span.button.normal{transition:background-color .5s;background-color:#5f380e}body.clockwork span.button.normal.active:focus,body.clockwork span.button.normal.active:hover{transition:background-color .25s;background-color:#704211;outline:0}body.clockwork span.button.disabled{transition:background-color .5s;background-color:#2d1400}body.clockwork span.button.disabled.active:focus,body.clockwork span.button.disabled.active:hover{transition:background-color .25s;background-color:#441e00;outline:0}body.clockwork span.button.selected{transition:background-color .5s;background-color:#cfba47}body.clockwork span.button.selected.active:focus,body.clockwork span.button.selected.active:hover{transition:background-color .25s;background-color:#d1bd50;outline:0}body.clockwork span.button.toggle{transition:background-color .5s;background-color:#cfba47}body.clockwork span.button.toggle.active:focus,body.clockwork span.button.toggle.active:hover{transition:background-color .25s;background-color:#d1bd50;outline:0}body.clockwork span.button.caution{transition:background-color .5s;background-color:#be6209}body.clockwork span.button.caution.active:focus,body.clockwork span.button.caution.active:hover{transition:background-color .25s;background-color:#cd6a0a;outline:0}body.clockwork span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.clockwork span.button.danger.active:focus,body.clockwork span.button.danger.active:hover{transition:background-color .25s;background-color:#abaf00;outline:0}body.clockwork span.button.gridable{width:125px;margin:2px 0}body.clockwork span.button+span:not(.button),body.clockwork span:not(.button)+span.button{margin-left:5px}body.clockwork div.display{width:100%;padding:4px;margin:6px 0;background-color:#2d1400;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#e62d1400,endColorStr=#e62d1400)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#e62d1400,endColorStr=#e62d1400);background-color:rgba(45,20,0,.9);box-shadow:inset 0 0 5px rgba(0,0,0,.3)}body.clockwork div.display header,body.clockwork div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#cfba47;border-bottom:2px solid #b18b25}body.clockwork div.display header .buttonRight,body.clockwork div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.clockwork div.display article,body.clockwork div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.clockwork input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#b18b25;background-color:#cfba47;border:1px solid #272727}body.clockwork input::-webkit-input-placeholder{color:#999}body.clockwork input:-ms-input-placeholder{color:#999}body.clockwork input::placeholder{color:#999}body.clockwork input::-ms-clear{display:none}body.clockwork svg.linegraph{overflow:hidden}body.clockwork div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#2d1400;font-weight:700;font-style:italic;background-color:#000;background-image:repeating-linear-gradient(-45deg,#000,#000 10px,#170800 0,#170800 20px)}body.clockwork div.notice .label{color:#2d1400}body.clockwork div.notice .content:only-of-type{padding:0}body.clockwork div.notice hr{background-color:#896b19}body.clockwork div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #5f380e;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.clockwork section .content,body.clockwork section .label,body.clockwork section .line,body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.clockwork section{display:table-row;width:100%}body.clockwork section:not(:first-child){padding-top:4px}body.clockwork section.candystripe:nth-child(2n){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.clockwork section .label{width:1%;padding-right:32px;white-space:nowrap;color:#b18b25}body.clockwork section .content:not(:last-child){padding-right:16px}body.clockwork section .line{width:100%}body.clockwork div.subdisplay{width:100%;margin:0}body.clockwork header.titlebar .close,body.clockwork header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#cfba47}body.clockwork header.titlebar .close:hover,body.clockwork header.titlebar .minimize:hover{color:#d1bd50}body.clockwork header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#5f380e;border-bottom:1px solid #170800;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.clockwork header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.clockwork header.titlebar .title{position:absolute;top:6px;left:46px;color:#cfba47;font-size:16px;white-space:nowrap}body.clockwork header.titlebar .minimize{position:absolute;top:6px;right:46px}body.clockwork header.titlebar .close{position:absolute;top:4px;right:12px}body.nanotrasen{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgNDI1IDIwMCIgb3BhY2l0eT0iLjMzIj4NCiAgPHBhdGggZD0ibSAxNzguMDAzOTksMC4wMzg2OSAtNzEuMjAzOTMsMCBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgLTYuNzYxMzQsNi4wMjU1NSBsIDAsMTg3Ljg3MTQ3IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA2Ljc2MTM0LDYuMDI1NTQgbCA1My4xMDcyLDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xMDEuNTQ0MDE4IDcyLjIxNjI4LDEwNC42OTkzOTggYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDUuNzYwMTUsMi44NzAxNiBsIDczLjU1NDg3LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xODcuODcxNDcgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTM1LC02LjAyNTU1IGwgLTU0LjcxNjQ0LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTMzLDYuMDI1NTUgbCAwLDEwMi42MTkzNSBMIDE4My43NjQxMywyLjkwODg2IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNS43NjAxNCwtMi44NzAxNyB6IiAvPg0KICA8cGF0aCBkPSJNIDQuODQ0NjMzMywyMi4xMDg3NSBBIDEzLjQxMjAzOSwxMi41MDE4NDIgMCAwIDEgMTMuNDc3NTg4LDAuMDM5MjQgbCA2Ni4xMTgzMTUsMCBhIDUuMzY0ODE1OCw1LjAwMDczNyAwIDAgMSA1LjM2NDgyMyw1LjAwMDczIGwgMCw3OS44NzkzMSB6IiAvPg0KICA8cGF0aCBkPSJtIDQyMC4xNTUzNSwxNzcuODkxMTkgYSAxMy40MTIwMzgsMTIuNTAxODQyIDAgMCAxIC04LjYzMjk1LDIyLjA2OTUxIGwgLTY2LjExODMyLDAgYSA1LjM2NDgxNTIsNS4wMDA3MzcgMCAwIDEgLTUuMzY0ODIsLTUuMDAwNzQgbCAwLC03OS44NzkzMSB6IiAvPg0KPC9zdmc+DQo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4NCjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4NCg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff2a2a2a",endColorstr="#ff202020",GradientType=0)}body.nanotrasen .normal{color:#40628a}body.nanotrasen .good{color:#537d29}body.nanotrasen .average{color:#be6209}body.nanotrasen .bad{color:#b00e0e}body.nanotrasen .highlight{color:#8ba5c4}body.nanotrasen main{display:block;margin-top:32px;padding:2px 6px 0}body.nanotrasen hr{height:2px;background-color:#40628a;border:none}body.nanotrasen .hidden{display:none}body.nanotrasen .bar .barText,body.nanotrasen span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.nanotrasen .bold{font-weight:700}body.nanotrasen .italic{font-style:italic}body.nanotrasen [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.nanotrasen div[data-tooltip],body.nanotrasen span[data-tooltip]{position:relative}body.nanotrasen div[data-tooltip]:after,body.nanotrasen span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.nanotrasen div[data-tooltip]:hover:after,body.nanotrasen span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.nanotrasen div[data-tooltip].tooltip-top:after,body.nanotrasen span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-top:hover:after,body.nanotrasen span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:after,body.nanotrasen span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:hover:after,body.nanotrasen span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-left:after,body.nanotrasen span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-left:hover:after,body.nanotrasen span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:after,body.nanotrasen span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:hover:after,body.nanotrasen span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #40628a;background:#272727}body.nanotrasen .bar .barText{position:absolute;top:0;right:3px}body.nanotrasen .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#40628a}body.nanotrasen .bar .barFill.good{background-color:#537d29}body.nanotrasen .bar .barFill.average{background-color:#be6209}body.nanotrasen .bar .barFill.bad{background-color:#b00e0e}body.nanotrasen span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.nanotrasen span.button .fa{padding-right:2px}body.nanotrasen span.button.normal{transition:background-color .5s;background-color:#40628a}body.nanotrasen span.button.normal.active:focus,body.nanotrasen span.button.normal.active:hover{transition:background-color .25s;background-color:#4f78aa;outline:0}body.nanotrasen span.button.disabled{transition:background-color .5s;background-color:#999}body.nanotrasen span.button.disabled.active:focus,body.nanotrasen span.button.disabled.active:hover{transition:background-color .25s;background-color:#a8a8a8;outline:0}body.nanotrasen span.button.selected{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.selected.active:focus,body.nanotrasen span.button.selected.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.toggle{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.toggle.active:focus,body.nanotrasen span.button.toggle.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.caution{transition:background-color .5s;background-color:#9a9d00}body.nanotrasen span.button.caution.active:focus,body.nanotrasen span.button.caution.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.nanotrasen span.button.danger{transition:background-color .5s;background-color:#9d0808}body.nanotrasen span.button.danger.active:focus,body.nanotrasen span.button.danger.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.nanotrasen span.button.gridable{width:125px;margin:2px 0}body.nanotrasen span.button+span:not(.button),body.nanotrasen span:not(.button)+span.button{margin-left:5px}body.nanotrasen div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000);background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5)}body.nanotrasen div.display header,body.nanotrasen div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #40628a}body.nanotrasen div.display header .buttonRight,body.nanotrasen div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.nanotrasen div.display article,body.nanotrasen div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.nanotrasen input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#000;background-color:#fff;border:1px solid #272727}body.nanotrasen input::-webkit-input-placeholder{color:#999}body.nanotrasen input:-ms-input-placeholder{color:#999}body.nanotrasen input::placeholder{color:#999}body.nanotrasen input::-ms-clear{display:none}body.nanotrasen svg.linegraph{overflow:hidden}body.nanotrasen div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg,#bb9b68,#bb9b68 10px,#b1905d 0,#b1905d 20px)}body.nanotrasen div.notice .label{color:#000}body.nanotrasen div.notice .content:only-of-type{padding:0}body.nanotrasen div.notice hr{background-color:#272727}body.nanotrasen div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.nanotrasen section{display:table-row;width:100%}body.nanotrasen section:not(:first-child){padding-top:4px}body.nanotrasen section.candystripe:nth-child(2n){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.nanotrasen section .label{width:1%;padding-right:32px;white-space:nowrap;color:#8ba5c4}body.nanotrasen section .content:not(:last-child){padding-right:16px}body.nanotrasen section .line{width:100%}body.nanotrasen div.subdisplay{width:100%;margin:0}body.nanotrasen header.titlebar .close,body.nanotrasen header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#8ba5c4}body.nanotrasen header.titlebar .close:hover,body.nanotrasen header.titlebar .minimize:hover{color:#9cb2cd}body.nanotrasen header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.nanotrasen header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.nanotrasen header.titlebar .title{position:absolute;top:6px;left:46px;color:#8ba5c4;font-size:16px;white-space:nowrap}body.nanotrasen header.titlebar .minimize{position:absolute;top:6px;right:46px}body.nanotrasen header.titlebar .close{position:absolute;top:4px;right:12px}body.syndicate{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgMjAwIDI4OS43NDIiIG9wYWNpdHk9Ii4zMyI+DQogIDxwYXRoIGQ9Im0gOTMuNTM3Njc3LDAgYyAtMTguMTEzMTI1LDAgLTM0LjIyMDEzMywzLjExMTY0IC00OC4zMjM0ODQsOS4zMzQzNyAtMTMuOTY1MDkyLDYuMjIxNjcgLTI0LjYxMjQ0MiwxNS4wNzExNCAtMzEuOTQwNjUxLDI2LjU0NzEgLTcuMTg5OTM5OCwxMS4zMzc4OSAtMTAuMzAxMjI2NiwyNC43NDkxMSAtMTAuMzAxMjI2Niw0MC4yMzQ3OCAwLDEwLjY0NjYyIDIuNzI1MDAyNiwyMC40NjQ2NSA4LjE3NTExMTYsMjkuNDUyNTggNS42MTUyNzcsOC45ODY4NiAxNC4wMzgyNzcsMTcuMzUyMDQgMjUuMjY4ODIxLDI1LjA5NDM2IDExLjIzMDU0NCw3LjYwNTMxIDI2LjUwNzQyMSwxNS40MTgzNSA0NS44MzA1MTQsMjMuNDM3ODIgMTkuOTgzNzQ4LDguMjk1NTcgMzQuODQ4ODQ4LDE1LjU1NDcxIDQ0LjU5Mjk5OCwyMS43NzYzOCA5Ljc0NDE0LDYuMjIyNzMgMTYuNzYxNywxMi44NTg1IDIxLjA1NTcyLDE5LjkwOTUxIDQuMjk0MDQsNy4wNTIwOCA2LjQ0MTkzLDE1Ljc2NDA4IDYuNDQxOTMsMjYuMTM0NTkgMCwxNi4xNzcwMiAtNS4yMDE5NiwyOC40ODIyMiAtMTUuNjA2NzMsMzYuOTE2ODIgLTEwLjIzOTYsOC40MzQ3IC0yNS4wMjIwMywxMi42NTIzIC00NC4zNDUxNjksMTIuNjUyMyAtMTQuMDM4MTcxLDAgLTI1LjUxNTI0NywtMS42NTk0IC0zNC40MzM2MTgsLTQuOTc3NyAtOC45MTgzNywtMy40NTY2IC0xNi4xODU1NzIsLTguNzExMyAtMjEuODAwODM5LC0xNS43NjMzIC01LjYxNTI3NywtNy4wNTIxIC0xMC4wNzQ3OTUsLTE2LjY2MDg4IC0xMy4zNzc4OTksLTI4LjgyODEyIGwgLTI0Ljc3MzE2MjYyOTM5NDUsMCAwLDU2LjgyNjMyIEMgMzMuODU2NzY5LDI4Ni4wNzYwMSA2My43NDkwNCwyODkuNzQyMDEgODkuNjc4MzgzLDI4OS43NDIwMSBjIDE2LjAyMDAyNywwIDMwLjcxOTc4NywtMS4zODI3IDQ0LjA5NzMzNywtNC4xNDc5IDEzLjU0MjcyLC0yLjkwNDMgMjUuMTA0MSwtNy40Njc2IDM0LjY4MzA5LC0xMy42ODkzIDkuNzQ0MTMsLTYuMzU5NyAxNy4zNDA0MiwtMTQuNTE5NSAyMi43OTA1MiwtMjQuNDc0OCA1LjQ1MDEsLTEwLjA5MzMyIDguMTc1MTEsLTIyLjM5OTU5IDguMTc1MTEsLTM2LjkxNjgyIDAsLTEyLjk5NzY0IC0zLjMwMjEsLTI0LjMzNTM5IC05LjkwODI5LC0zNC4wMTQ2IC02LjQ0MTA1LC05LjgxNzI1IC0xNS41MjU0NSwtMTguNTI3MDcgLTI3LjI1MTQ2LC0yNi4xMzEzMyAtMTEuNTYwODUsLTcuNjA0MjcgLTI3LjkxMDgzLC0xNS44MzE0MiAtNDkuMDUwNjYsLTI0LjY4MDIyIC0xNy41MDY0NCwtNy4xOTAxMiAtMzAuNzE5NjY4LC0xMy42ODk0OCAtMzkuNjM4MDM4LC0xOS40OTcwMSAtOC45MTgzNzEsLTUuODA3NTIgLTE4LjYwNzQ3NCwtMTIuNDM0MDkgLTI0LjA5NjUyNCwtMTguODc0MTcgLTUuNDI2MDQzLC02LjM2NjE2IC05LjY1ODgyNiwtMTUuMDcwMDMgLTkuNjU4ODI2LC0yNC44ODcyOSAwLC05LjI2NDAxIDIuMDc1NDE0LC0xNy4yMTM0NSA2LjIyMzQ1NCwtMjMuODUwMzMgMTEuMDk4Mjk4LC0xNC4zOTc0OCA0MS4yODY2MzgsLTEuNzk1MDcgNDUuMDc1NjA5LDI0LjM0NzYyIDQuODM5MzkyLDYuNzc0OTEgOC44NDkzNSwxNi4yNDcyOSAxMi4wMjk1MTUsMjguNDE1NiBsIDIwLjUzMjM0LDAgMCwtNTUuOTk5NjcgYyAtNC40NzgyNSwtNS45MjQ0OCAtOS45NTQ4OCwtMTAuNjMyMjIgLTE1LjkwODM3LC0xNC4zNzQxMSAxLjY0MDU1LDAuNDc5MDUgMy4xOTAzOSwxLjAyMzc2IDQuNjM4NjUsMS42NDAyNCA2LjQ5ODYxLDIuNjI2MDcgMTIuMTY3OTMsNy4zMjc0NyAxNy4wMDczLDE0LjEwMzQ1IDQuODM5MzksNi43NzQ5MSA4Ljg0OTM1LDE2LjI0NTY3IDEyLjAyOTUyLDI4LjQxMzk3IDAsMCA4LjQ4MTI4LC0wLjEyODk0IDguNDg5NzgsLTAuMDAyIDAuNDE3NzYsNi40MTQ5NCAtMS43NTMzOSw5LjQ1Mjg2IC00LjEyMzQyLDEyLjU2MTA0IC0yLjQxNzQsMy4xNjk3OCAtNS4xNDQ4Niw2Ljc4OTczIC00LjAwMjc4LDEzLjAwMjkgMS41MDc4Niw4LjIwMzE4IDEwLjE4MzU0LDEwLjU5NjQyIDE0LjYyMTk0LDkuMzExNTQgLTMuMzE4NDIsLTAuNDk5MTEgLTUuMzE4NTUsLTEuNzQ5NDggLTUuMzE4NTUsLTEuNzQ5NDggMCwwIDEuODc2NDYsMC45OTg2OCA1LjY1MTE3LC0xLjM1OTgxIC0zLjI3Njk1LDAuOTU1NzEgLTEwLjcwNTI5LC0wLjc5NzM4IC0xMS44MDEyNSwtNi43NjMxMyAtMC45NTc1MiwtNS4yMDg2MSAwLjk0NjU0LC03LjI5NTE0IDMuNDAxMTMsLTEwLjUxNDgyIDIuNDU0NjIsLTMuMjE5NjggNS4yODQyNiwtNi45NTgzMSA0LjY4NDMsLTE0LjQ4ODI0IGwgMC4wMDMsMC4wMDIgOC45MjY3NiwwIDAsLTU1Ljk5OTY3IGMgLTE1LjA3MTI1LC0zLjg3MTY4IC0yNy42NTMxNCwtNi4zNjA0MiAtMzcuNzQ2NzEsLTcuNDY1ODYgLTkuOTU1MzEsLTEuMTA3NTUgLTIwLjE4ODIzLC0xLjY1OTgxIC0zMC42OTY2MTMsLTEuNjU5ODEgeiBtIDcwLjMyMTYwMywxNy4zMDg5MyAwLjIzODA1LDQwLjMwNDkgYyAxLjMxODA4LDEuMjI2NjYgMi40Mzk2NSwyLjI3ODE1IDMuMzQwODEsMy4xMDYwMiA0LjgzOTM5LDYuNzc0OTEgOC44NDkzNCwxNi4yNDU2NiAxMi4wMjk1MSwyOC40MTM5NyBsIDIwLjUzMjM0LDAgMCwtNTUuOTk5NjcgYyAtNi42NzczMSwtNC41OTM4MSAtMTkuODM2NDMsLTEwLjQ3MzA5IC0zNi4xNDA3MSwtMTUuODI1MjIgeiBtIC0yOC4xMjA0OSw1LjYwNTUxIDguNTY0NzksMTcuNzE2NTUgYyAtMTEuOTcwMzcsLTYuNDY2OTcgLTEzLjg0Njc4LC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk3MDUsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IG0gMTUuMjIxOTUsMjQuMDA4NDggOC41NjQ3OSwxNy43MTY1NSBjIC0xMS45NzAzOCwtNi40NjY5NyAtMTMuODQ2NzksLTkuNzE3MjYgLTguNTY0NzksLTE3LjcxNjU1IHogbSAyMi43OTcwNCwwIGMgMi43NzE1LDcuOTk5MjkgMS43ODc0MSwxMS4yNDk1OCAtNC40OTM1NCwxNy43MTY1NSBsIDQuNDkzNTQsLTE3LjcxNjU1IHogbSAtOTkuMTEzODQsMi4yMDc2NCA4LjU2NDc5LDE3LjcxNjU1IGMgLTExLjk3MDM4MiwtNi40NjY5NyAtMTMuODQ2NzgyLC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk1NDIsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IiAvPg0KPC9zdmc+DQo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4NCjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4NCg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#750000 0,#340404);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff750000",endColorstr="#ff340404",GradientType=0)}body.syndicate .normal{color:#40628a}body.syndicate .good{color:#73e573}body.syndicate .average{color:#be6209}body.syndicate .bad{color:#b00e0e}body.syndicate .highlight{color:#000}body.syndicate main{display:block;margin-top:32px;padding:2px 6px 0}body.syndicate hr{height:2px;background-color:#272727;border:none}body.syndicate .hidden{display:none}body.syndicate .bar .barText,body.syndicate span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.syndicate .bold{font-weight:700}body.syndicate .italic{font-style:italic}body.syndicate [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.syndicate div[data-tooltip],body.syndicate span[data-tooltip]{position:relative}body.syndicate div[data-tooltip]:after,body.syndicate span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.syndicate div[data-tooltip]:hover:after,body.syndicate span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.syndicate div[data-tooltip].tooltip-top:after,body.syndicate span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-top:hover:after,body.syndicate span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:after,body.syndicate span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:hover:after,body.syndicate span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-left:after,body.syndicate span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-left:hover:after,body.syndicate span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:after,body.syndicate span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:hover:after,body.syndicate span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #000;background:#272727}body.syndicate .bar .barText{position:absolute;top:0;right:3px}body.syndicate .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#000}body.syndicate .bar .barFill.good{background-color:#73e573}body.syndicate .bar .barFill.average{background-color:#be6209}body.syndicate .bar .barFill.bad{background-color:#b00e0e}body.syndicate span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.syndicate span.button .fa{padding-right:2px}body.syndicate span.button.normal{transition:background-color .5s;background-color:#397439}body.syndicate span.button.normal.active:focus,body.syndicate span.button.normal.active:hover{transition:background-color .25s;background-color:#4a964a;outline:0}body.syndicate span.button.disabled{transition:background-color .5s;background-color:#363636}body.syndicate span.button.disabled.active:focus,body.syndicate span.button.disabled.active:hover{transition:background-color .25s;background-color:#545454;outline:0}body.syndicate span.button.selected{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.selected.active:focus,body.syndicate span.button.selected.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.toggle{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.toggle.active:focus,body.syndicate span.button.toggle.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.caution{transition:background-color .5s;background-color:#be6209}body.syndicate span.button.caution.active:focus,body.syndicate span.button.caution.active:hover{transition:background-color .25s;background-color:#eb790b;outline:0}body.syndicate span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.syndicate span.button.danger.active:focus,body.syndicate span.button.danger.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.syndicate span.button.gridable{width:125px;margin:2px 0}body.syndicate span.button+span:not(.button),body.syndicate span:not(.button)+span.button{margin-left:5px}body.syndicate div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000);background-color:rgba(0,0,0,.5);box-shadow:inset 0 0 5px rgba(0,0,0,.75)}body.syndicate div.display header,body.syndicate div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #272727}body.syndicate div.display header .buttonRight,body.syndicate div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.syndicate div.display article,body.syndicate div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.syndicate input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#fff;background-color:#9d0808;border:1px solid #272727}body.syndicate input::-webkit-input-placeholder{color:#999}body.syndicate input:-ms-input-placeholder{color:#999}body.syndicate input::placeholder{color:#999}body.syndicate input::-ms-clear{display:none}body.syndicate svg.linegraph{overflow:hidden}body.syndicate div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#750000;background-image:repeating-linear-gradient(-45deg,#750000,#750000 10px,#910101 0,#910101 20px)}body.syndicate div.notice .label{color:#000}body.syndicate div.notice .content:only-of-type{padding:0}body.syndicate div.notice hr{background-color:#272727}body.syndicate div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.syndicate section{display:table-row;width:100%}body.syndicate section:not(:first-child){padding-top:4px}body.syndicate section.candystripe:nth-child(2n){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.syndicate section .label{width:1%;padding-right:32px;white-space:nowrap;color:#fff}body.syndicate section .content:not(:last-child){padding-right:16px}body.syndicate section .line{width:100%}body.syndicate div.subdisplay{width:100%;margin:0}body.syndicate header.titlebar .close,body.syndicate header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#e74242}body.syndicate header.titlebar .close:hover,body.syndicate header.titlebar .minimize:hover{color:#eb5e5e}body.syndicate header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.syndicate header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.syndicate header.titlebar .title{position:absolute;top:6px;left:46px;color:#e74242;font-size:16px;white-space:nowrap}body.syndicate header.titlebar .minimize{position:absolute;top:6px;right:46px}body.syndicate header.titlebar .close{position:absolute;top:4px;right:12px}.no-icons header.titlebar .statusicon{font-size:20px}.no-icons header.titlebar .statusicon:after{content:"O"}.no-icons header.titlebar .minimize{top:-2px;font-size:20px}.no-icons header.titlebar .minimize:after{content:"—"}.no-icons header.titlebar .close{font-size:20px}.no-icons header.titlebar .close:after{content:"X"} \ No newline at end of file +@charset "utf-8";body,html{box-sizing:border-box;height:100%;margin:0}html{overflow:hidden;cursor:default}body{overflow:auto;font-family:Verdana,Geneva,sans-serif;font-size:12px;color:#fff;background-color:#2a2a2a;background-image:linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff2a2a2a",endColorstr="#ff202020",GradientType=0)}*,:after,:before{box-sizing:inherit}h1,h2,h3,h4{display:inline-block;margin:0;padding:6px 0}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}h4{font-size:12px}body.clockwork{background:linear-gradient(180deg,#b18b25 0,#5f380e);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ffb18b25",endColorstr="#ff5f380e",GradientType=0)}body.clockwork .normal{color:#b18b25}body.clockwork .good{color:#cfba47}body.clockwork .average{color:#896b19}body.clockwork .bad{color:#5f380e}body.clockwork .highlight{color:#b18b25}body.clockwork main{display:block;margin-top:32px;padding:2px 6px 0}body.clockwork hr{height:2px;background-color:#b18b25;border:none}body.clockwork .hidden{display:none}body.clockwork .bar .barText,body.clockwork span.button{color:#b18b25;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.clockwork .bold{font-weight:700}body.clockwork .italic{font-style:italic}body.clockwork [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.clockwork div[data-tooltip],body.clockwork span[data-tooltip]{position:relative}body.clockwork div[data-tooltip]:after,body.clockwork span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #170800;background-color:#2d1400}body.clockwork div[data-tooltip]:hover:after,body.clockwork span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.clockwork div[data-tooltip].tooltip-top:after,body.clockwork span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.clockwork div[data-tooltip].tooltip-top:hover:after,body.clockwork span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.clockwork div[data-tooltip].tooltip-bottom:after,body.clockwork span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.clockwork div[data-tooltip].tooltip-bottom:hover:after,body.clockwork span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.clockwork div[data-tooltip].tooltip-left:after,body.clockwork span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-left:hover:after,body.clockwork span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-right:after,body.clockwork span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-right:hover:after,body.clockwork span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.clockwork .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #170800;background:#2d1400}body.clockwork .bar .barText{position:absolute;top:0;right:3px}body.clockwork .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#b18b25}body.clockwork .bar .barFill.good{background-color:#cfba47}body.clockwork .bar .barFill.average{background-color:#896b19}body.clockwork .bar .barFill.bad{background-color:#5f380e}body.clockwork span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #170800}body.clockwork span.button .fa{padding-right:2px}body.clockwork span.button.normal{transition:background-color .5s;background-color:#5f380e}body.clockwork span.button.normal.active:focus,body.clockwork span.button.normal.active:hover{transition:background-color .25s;background-color:#704211;outline:0}body.clockwork span.button.disabled{transition:background-color .5s;background-color:#2d1400}body.clockwork span.button.disabled.active:focus,body.clockwork span.button.disabled.active:hover{transition:background-color .25s;background-color:#441e00;outline:0}body.clockwork span.button.selected{transition:background-color .5s;background-color:#cfba47}body.clockwork span.button.selected.active:focus,body.clockwork span.button.selected.active:hover{transition:background-color .25s;background-color:#d1bd50;outline:0}body.clockwork span.button.toggle{transition:background-color .5s;background-color:#cfba47}body.clockwork span.button.toggle.active:focus,body.clockwork span.button.toggle.active:hover{transition:background-color .25s;background-color:#d1bd50;outline:0}body.clockwork span.button.caution{transition:background-color .5s;background-color:#be6209}body.clockwork span.button.caution.active:focus,body.clockwork span.button.caution.active:hover{transition:background-color .25s;background-color:#cd6a0a;outline:0}body.clockwork span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.clockwork span.button.danger.active:focus,body.clockwork span.button.danger.active:hover{transition:background-color .25s;background-color:#abaf00;outline:0}body.clockwork span.button.gridable{width:125px;margin:2px 0}body.clockwork span.button.gridable.center{text-align:center;width:75px}body.clockwork span.button+span:not(.button),body.clockwork span:not(.button)+span.button{margin-left:5px}body.clockwork div.display{width:100%;padding:4px;margin:6px 0;background-color:#2d1400;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#e62d1400,endColorStr=#e62d1400)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#e62d1400,endColorStr=#e62d1400);background-color:rgba(45,20,0,.9);box-shadow:inset 0 0 5px rgba(0,0,0,.3)}body.clockwork div.display.tabular{padding:0;margin:0}body.clockwork div.display header,body.clockwork div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#cfba47;border-bottom:2px solid #b18b25}body.clockwork div.display header .buttonRight,body.clockwork div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.clockwork div.display article,body.clockwork div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.clockwork input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#b18b25;background-color:#cfba47;border:1px solid #272727}body.clockwork input.number{width:35px}body.clockwork input::-webkit-input-placeholder{color:#999}body.clockwork input:-ms-input-placeholder{color:#999}body.clockwork input::placeholder{color:#999}body.clockwork input::-ms-clear{display:none}body.clockwork svg.linegraph{overflow:hidden}body.clockwork div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#2d1400;font-weight:700;font-style:italic;background-color:#000;background-image:repeating-linear-gradient(-45deg,#000,#000 10px,#170800 0,#170800 20px)}body.clockwork div.notice .label{color:#2d1400}body.clockwork div.notice .content:only-of-type{padding:0}body.clockwork div.notice hr{background-color:#896b19}body.clockwork div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #5f380e;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.clockwork section .cell,body.clockwork section .content,body.clockwork section .label,body.clockwork section .line,body.nanotrasen section .cell,body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .cell,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.clockwork section{display:table-row;width:100%}body.clockwork section:not(:first-child){padding-top:4px}body.clockwork section.candystripe:nth-child(2n){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.clockwork section .label{width:1%;padding-right:32px;white-space:nowrap;color:#b18b25}body.clockwork section .content:not(:last-child){padding-right:16px}body.clockwork section .line{width:100%}body.clockwork section .cell:not(:first-child){text-align:center;padding-top:0}body.clockwork section .cell span.button{width:75px}body.clockwork section:not(:last-child){padding-right:4px}body.clockwork div.subdisplay{width:100%;margin:0}body.clockwork header.titlebar .close,body.clockwork header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#cfba47}body.clockwork header.titlebar .close:hover,body.clockwork header.titlebar .minimize:hover{color:#d1bd50}body.clockwork header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#5f380e;border-bottom:1px solid #170800;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.clockwork header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.clockwork header.titlebar .title{position:absolute;top:6px;left:46px;color:#cfba47;font-size:16px;white-space:nowrap}body.clockwork header.titlebar .minimize{position:absolute;top:6px;right:46px}body.clockwork header.titlebar .close{position:absolute;top:4px;right:12px}body.nanotrasen{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgNDI1IDIwMCIgb3BhY2l0eT0iLjMzIj4NCiAgPHBhdGggZD0ibSAxNzguMDAzOTksMC4wMzg2OSAtNzEuMjAzOTMsMCBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgLTYuNzYxMzQsNi4wMjU1NSBsIDAsMTg3Ljg3MTQ3IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA2Ljc2MTM0LDYuMDI1NTQgbCA1My4xMDcyLDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xMDEuNTQ0MDE4IDcyLjIxNjI4LDEwNC42OTkzOTggYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDUuNzYwMTUsMi44NzAxNiBsIDczLjU1NDg3LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xODcuODcxNDcgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTM1LC02LjAyNTU1IGwgLTU0LjcxNjQ0LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTMzLDYuMDI1NTUgbCAwLDEwMi42MTkzNSBMIDE4My43NjQxMywyLjkwODg2IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNS43NjAxNCwtMi44NzAxNyB6IiAvPg0KICA8cGF0aCBkPSJNIDQuODQ0NjMzMywyMi4xMDg3NSBBIDEzLjQxMjAzOSwxMi41MDE4NDIgMCAwIDEgMTMuNDc3NTg4LDAuMDM5MjQgbCA2Ni4xMTgzMTUsMCBhIDUuMzY0ODE1OCw1LjAwMDczNyAwIDAgMSA1LjM2NDgyMyw1LjAwMDczIGwgMCw3OS44NzkzMSB6IiAvPg0KICA8cGF0aCBkPSJtIDQyMC4xNTUzNSwxNzcuODkxMTkgYSAxMy40MTIwMzgsMTIuNTAxODQyIDAgMCAxIC04LjYzMjk1LDIyLjA2OTUxIGwgLTY2LjExODMyLDAgYSA1LjM2NDgxNTIsNS4wMDA3MzcgMCAwIDEgLTUuMzY0ODIsLTUuMDAwNzQgbCAwLC03OS44NzkzMSB6IiAvPg0KPC9zdmc+DQo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4NCjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4NCg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff2a2a2a",endColorstr="#ff202020",GradientType=0)}body.nanotrasen .normal{color:#40628a}body.nanotrasen .good{color:#537d29}body.nanotrasen .average{color:#be6209}body.nanotrasen .bad{color:#b00e0e}body.nanotrasen .highlight{color:#8ba5c4}body.nanotrasen main{display:block;margin-top:32px;padding:2px 6px 0}body.nanotrasen hr{height:2px;background-color:#40628a;border:none}body.nanotrasen .hidden{display:none}body.nanotrasen .bar .barText,body.nanotrasen span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.nanotrasen .bold{font-weight:700}body.nanotrasen .italic{font-style:italic}body.nanotrasen [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.nanotrasen div[data-tooltip],body.nanotrasen span[data-tooltip]{position:relative}body.nanotrasen div[data-tooltip]:after,body.nanotrasen span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.nanotrasen div[data-tooltip]:hover:after,body.nanotrasen span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.nanotrasen div[data-tooltip].tooltip-top:after,body.nanotrasen span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-top:hover:after,body.nanotrasen span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:after,body.nanotrasen span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:hover:after,body.nanotrasen span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-left:after,body.nanotrasen span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-left:hover:after,body.nanotrasen span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:after,body.nanotrasen span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:hover:after,body.nanotrasen span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #40628a;background:#272727}body.nanotrasen .bar .barText{position:absolute;top:0;right:3px}body.nanotrasen .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#40628a}body.nanotrasen .bar .barFill.good{background-color:#537d29}body.nanotrasen .bar .barFill.average{background-color:#be6209}body.nanotrasen .bar .barFill.bad{background-color:#b00e0e}body.nanotrasen span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.nanotrasen span.button .fa{padding-right:2px}body.nanotrasen span.button.normal{transition:background-color .5s;background-color:#40628a}body.nanotrasen span.button.normal.active:focus,body.nanotrasen span.button.normal.active:hover{transition:background-color .25s;background-color:#4f78aa;outline:0}body.nanotrasen span.button.disabled{transition:background-color .5s;background-color:#999}body.nanotrasen span.button.disabled.active:focus,body.nanotrasen span.button.disabled.active:hover{transition:background-color .25s;background-color:#a8a8a8;outline:0}body.nanotrasen span.button.selected{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.selected.active:focus,body.nanotrasen span.button.selected.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.toggle{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.toggle.active:focus,body.nanotrasen span.button.toggle.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.caution{transition:background-color .5s;background-color:#9a9d00}body.nanotrasen span.button.caution.active:focus,body.nanotrasen span.button.caution.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.nanotrasen span.button.danger{transition:background-color .5s;background-color:#9d0808}body.nanotrasen span.button.danger.active:focus,body.nanotrasen span.button.danger.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.nanotrasen span.button.gridable{width:125px;margin:2px 0}body.nanotrasen span.button.gridable.center{text-align:center;width:75px}body.nanotrasen span.button+span:not(.button),body.nanotrasen span:not(.button)+span.button{margin-left:5px}body.nanotrasen div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000);background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5)}body.nanotrasen div.display.tabular{padding:0;margin:0}body.nanotrasen div.display header,body.nanotrasen div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #40628a}body.nanotrasen div.display header .buttonRight,body.nanotrasen div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.nanotrasen div.display article,body.nanotrasen div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.nanotrasen input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#000;background-color:#fff;border:1px solid #272727}body.nanotrasen input.number{width:35px}body.nanotrasen input::-webkit-input-placeholder{color:#999}body.nanotrasen input:-ms-input-placeholder{color:#999}body.nanotrasen input::placeholder{color:#999}body.nanotrasen input::-ms-clear{display:none}body.nanotrasen svg.linegraph{overflow:hidden}body.nanotrasen div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg,#bb9b68,#bb9b68 10px,#b1905d 0,#b1905d 20px)}body.nanotrasen div.notice .label{color:#000}body.nanotrasen div.notice .content:only-of-type{padding:0}body.nanotrasen div.notice hr{background-color:#272727}body.nanotrasen div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.nanotrasen section .cell,body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .cell,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.nanotrasen section{display:table-row;width:100%}body.nanotrasen section:not(:first-child){padding-top:4px}body.nanotrasen section.candystripe:nth-child(2n){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.nanotrasen section .label{width:1%;padding-right:32px;white-space:nowrap;color:#8ba5c4}body.nanotrasen section .content:not(:last-child){padding-right:16px}body.nanotrasen section .line{width:100%}body.nanotrasen section .cell:not(:first-child){text-align:center;padding-top:0}body.nanotrasen section .cell span.button{width:75px}body.nanotrasen section:not(:last-child){padding-right:4px}body.nanotrasen div.subdisplay{width:100%;margin:0}body.nanotrasen header.titlebar .close,body.nanotrasen header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#8ba5c4}body.nanotrasen header.titlebar .close:hover,body.nanotrasen header.titlebar .minimize:hover{color:#9cb2cd}body.nanotrasen header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.nanotrasen header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.nanotrasen header.titlebar .title{position:absolute;top:6px;left:46px;color:#8ba5c4;font-size:16px;white-space:nowrap}body.nanotrasen header.titlebar .minimize{position:absolute;top:6px;right:46px}body.nanotrasen header.titlebar .close{position:absolute;top:4px;right:12px}body.syndicate{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgMjAwIDI4OS43NDIiIG9wYWNpdHk9Ii4zMyI+DQogIDxwYXRoIGQ9Im0gOTMuNTM3Njc3LDAgYyAtMTguMTEzMTI1LDAgLTM0LjIyMDEzMywzLjExMTY0IC00OC4zMjM0ODQsOS4zMzQzNyAtMTMuOTY1MDkyLDYuMjIxNjcgLTI0LjYxMjQ0MiwxNS4wNzExNCAtMzEuOTQwNjUxLDI2LjU0NzEgLTcuMTg5OTM5OCwxMS4zMzc4OSAtMTAuMzAxMjI2NiwyNC43NDkxMSAtMTAuMzAxMjI2Niw0MC4yMzQ3OCAwLDEwLjY0NjYyIDIuNzI1MDAyNiwyMC40NjQ2NSA4LjE3NTExMTYsMjkuNDUyNTggNS42MTUyNzcsOC45ODY4NiAxNC4wMzgyNzcsMTcuMzUyMDQgMjUuMjY4ODIxLDI1LjA5NDM2IDExLjIzMDU0NCw3LjYwNTMxIDI2LjUwNzQyMSwxNS40MTgzNSA0NS44MzA1MTQsMjMuNDM3ODIgMTkuOTgzNzQ4LDguMjk1NTcgMzQuODQ4ODQ4LDE1LjU1NDcxIDQ0LjU5Mjk5OCwyMS43NzYzOCA5Ljc0NDE0LDYuMjIyNzMgMTYuNzYxNywxMi44NTg1IDIxLjA1NTcyLDE5LjkwOTUxIDQuMjk0MDQsNy4wNTIwOCA2LjQ0MTkzLDE1Ljc2NDA4IDYuNDQxOTMsMjYuMTM0NTkgMCwxNi4xNzcwMiAtNS4yMDE5NiwyOC40ODIyMiAtMTUuNjA2NzMsMzYuOTE2ODIgLTEwLjIzOTYsOC40MzQ3IC0yNS4wMjIwMywxMi42NTIzIC00NC4zNDUxNjksMTIuNjUyMyAtMTQuMDM4MTcxLDAgLTI1LjUxNTI0NywtMS42NTk0IC0zNC40MzM2MTgsLTQuOTc3NyAtOC45MTgzNywtMy40NTY2IC0xNi4xODU1NzIsLTguNzExMyAtMjEuODAwODM5LC0xNS43NjMzIC01LjYxNTI3NywtNy4wNTIxIC0xMC4wNzQ3OTUsLTE2LjY2MDg4IC0xMy4zNzc4OTksLTI4LjgyODEyIGwgLTI0Ljc3MzE2MjYyOTM5NDUsMCAwLDU2LjgyNjMyIEMgMzMuODU2NzY5LDI4Ni4wNzYwMSA2My43NDkwNCwyODkuNzQyMDEgODkuNjc4MzgzLDI4OS43NDIwMSBjIDE2LjAyMDAyNywwIDMwLjcxOTc4NywtMS4zODI3IDQ0LjA5NzMzNywtNC4xNDc5IDEzLjU0MjcyLC0yLjkwNDMgMjUuMTA0MSwtNy40Njc2IDM0LjY4MzA5LC0xMy42ODkzIDkuNzQ0MTMsLTYuMzU5NyAxNy4zNDA0MiwtMTQuNTE5NSAyMi43OTA1MiwtMjQuNDc0OCA1LjQ1MDEsLTEwLjA5MzMyIDguMTc1MTEsLTIyLjM5OTU5IDguMTc1MTEsLTM2LjkxNjgyIDAsLTEyLjk5NzY0IC0zLjMwMjEsLTI0LjMzNTM5IC05LjkwODI5LC0zNC4wMTQ2IC02LjQ0MTA1LC05LjgxNzI1IC0xNS41MjU0NSwtMTguNTI3MDcgLTI3LjI1MTQ2LC0yNi4xMzEzMyAtMTEuNTYwODUsLTcuNjA0MjcgLTI3LjkxMDgzLC0xNS44MzE0MiAtNDkuMDUwNjYsLTI0LjY4MDIyIC0xNy41MDY0NCwtNy4xOTAxMiAtMzAuNzE5NjY4LC0xMy42ODk0OCAtMzkuNjM4MDM4LC0xOS40OTcwMSAtOC45MTgzNzEsLTUuODA3NTIgLTE4LjYwNzQ3NCwtMTIuNDM0MDkgLTI0LjA5NjUyNCwtMTguODc0MTcgLTUuNDI2MDQzLC02LjM2NjE2IC05LjY1ODgyNiwtMTUuMDcwMDMgLTkuNjU4ODI2LC0yNC44ODcyOSAwLC05LjI2NDAxIDIuMDc1NDE0LC0xNy4yMTM0NSA2LjIyMzQ1NCwtMjMuODUwMzMgMTEuMDk4Mjk4LC0xNC4zOTc0OCA0MS4yODY2MzgsLTEuNzk1MDcgNDUuMDc1NjA5LDI0LjM0NzYyIDQuODM5MzkyLDYuNzc0OTEgOC44NDkzNSwxNi4yNDcyOSAxMi4wMjk1MTUsMjguNDE1NiBsIDIwLjUzMjM0LDAgMCwtNTUuOTk5NjcgYyAtNC40NzgyNSwtNS45MjQ0OCAtOS45NTQ4OCwtMTAuNjMyMjIgLTE1LjkwODM3LC0xNC4zNzQxMSAxLjY0MDU1LDAuNDc5MDUgMy4xOTAzOSwxLjAyMzc2IDQuNjM4NjUsMS42NDAyNCA2LjQ5ODYxLDIuNjI2MDcgMTIuMTY3OTMsNy4zMjc0NyAxNy4wMDczLDE0LjEwMzQ1IDQuODM5MzksNi43NzQ5MSA4Ljg0OTM1LDE2LjI0NTY3IDEyLjAyOTUyLDI4LjQxMzk3IDAsMCA4LjQ4MTI4LC0wLjEyODk0IDguNDg5NzgsLTAuMDAyIDAuNDE3NzYsNi40MTQ5NCAtMS43NTMzOSw5LjQ1Mjg2IC00LjEyMzQyLDEyLjU2MTA0IC0yLjQxNzQsMy4xNjk3OCAtNS4xNDQ4Niw2Ljc4OTczIC00LjAwMjc4LDEzLjAwMjkgMS41MDc4Niw4LjIwMzE4IDEwLjE4MzU0LDEwLjU5NjQyIDE0LjYyMTk0LDkuMzExNTQgLTMuMzE4NDIsLTAuNDk5MTEgLTUuMzE4NTUsLTEuNzQ5NDggLTUuMzE4NTUsLTEuNzQ5NDggMCwwIDEuODc2NDYsMC45OTg2OCA1LjY1MTE3LC0xLjM1OTgxIC0zLjI3Njk1LDAuOTU1NzEgLTEwLjcwNTI5LC0wLjc5NzM4IC0xMS44MDEyNSwtNi43NjMxMyAtMC45NTc1MiwtNS4yMDg2MSAwLjk0NjU0LC03LjI5NTE0IDMuNDAxMTMsLTEwLjUxNDgyIDIuNDU0NjIsLTMuMjE5NjggNS4yODQyNiwtNi45NTgzMSA0LjY4NDMsLTE0LjQ4ODI0IGwgMC4wMDMsMC4wMDIgOC45MjY3NiwwIDAsLTU1Ljk5OTY3IGMgLTE1LjA3MTI1LC0zLjg3MTY4IC0yNy42NTMxNCwtNi4zNjA0MiAtMzcuNzQ2NzEsLTcuNDY1ODYgLTkuOTU1MzEsLTEuMTA3NTUgLTIwLjE4ODIzLC0xLjY1OTgxIC0zMC42OTY2MTMsLTEuNjU5ODEgeiBtIDcwLjMyMTYwMywxNy4zMDg5MyAwLjIzODA1LDQwLjMwNDkgYyAxLjMxODA4LDEuMjI2NjYgMi40Mzk2NSwyLjI3ODE1IDMuMzQwODEsMy4xMDYwMiA0LjgzOTM5LDYuNzc0OTEgOC44NDkzNCwxNi4yNDU2NiAxMi4wMjk1MSwyOC40MTM5NyBsIDIwLjUzMjM0LDAgMCwtNTUuOTk5NjcgYyAtNi42NzczMSwtNC41OTM4MSAtMTkuODM2NDMsLTEwLjQ3MzA5IC0zNi4xNDA3MSwtMTUuODI1MjIgeiBtIC0yOC4xMjA0OSw1LjYwNTUxIDguNTY0NzksMTcuNzE2NTUgYyAtMTEuOTcwMzcsLTYuNDY2OTcgLTEzLjg0Njc4LC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk3MDUsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IG0gMTUuMjIxOTUsMjQuMDA4NDggOC41NjQ3OSwxNy43MTY1NSBjIC0xMS45NzAzOCwtNi40NjY5NyAtMTMuODQ2NzksLTkuNzE3MjYgLTguNTY0NzksLTE3LjcxNjU1IHogbSAyMi43OTcwNCwwIGMgMi43NzE1LDcuOTk5MjkgMS43ODc0MSwxMS4yNDk1OCAtNC40OTM1NCwxNy43MTY1NSBsIDQuNDkzNTQsLTE3LjcxNjU1IHogbSAtOTkuMTEzODQsMi4yMDc2NCA4LjU2NDc5LDE3LjcxNjU1IGMgLTExLjk3MDM4MiwtNi40NjY5NyAtMTMuODQ2NzgyLC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk1NDIsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IiAvPg0KPC9zdmc+DQo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4NCjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4NCg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#750000 0,#340404);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff750000",endColorstr="#ff340404",GradientType=0)}body.syndicate .normal{color:#40628a}body.syndicate .good{color:#73e573}body.syndicate .average{color:#be6209}body.syndicate .bad{color:#b00e0e}body.syndicate .highlight{color:#000}body.syndicate main{display:block;margin-top:32px;padding:2px 6px 0}body.syndicate hr{height:2px;background-color:#272727;border:none}body.syndicate .hidden{display:none}body.syndicate .bar .barText,body.syndicate span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.syndicate .bold{font-weight:700}body.syndicate .italic{font-style:italic}body.syndicate [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.syndicate div[data-tooltip],body.syndicate span[data-tooltip]{position:relative}body.syndicate div[data-tooltip]:after,body.syndicate span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.syndicate div[data-tooltip]:hover:after,body.syndicate span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.syndicate div[data-tooltip].tooltip-top:after,body.syndicate span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-top:hover:after,body.syndicate span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:after,body.syndicate span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:hover:after,body.syndicate span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-left:after,body.syndicate span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-left:hover:after,body.syndicate span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:after,body.syndicate span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:hover:after,body.syndicate span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #000;background:#272727}body.syndicate .bar .barText{position:absolute;top:0;right:3px}body.syndicate .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#000}body.syndicate .bar .barFill.good{background-color:#73e573}body.syndicate .bar .barFill.average{background-color:#be6209}body.syndicate .bar .barFill.bad{background-color:#b00e0e}body.syndicate span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.syndicate span.button .fa{padding-right:2px}body.syndicate span.button.normal{transition:background-color .5s;background-color:#397439}body.syndicate span.button.normal.active:focus,body.syndicate span.button.normal.active:hover{transition:background-color .25s;background-color:#4a964a;outline:0}body.syndicate span.button.disabled{transition:background-color .5s;background-color:#363636}body.syndicate span.button.disabled.active:focus,body.syndicate span.button.disabled.active:hover{transition:background-color .25s;background-color:#545454;outline:0}body.syndicate span.button.selected{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.selected.active:focus,body.syndicate span.button.selected.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.toggle{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.toggle.active:focus,body.syndicate span.button.toggle.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.caution{transition:background-color .5s;background-color:#be6209}body.syndicate span.button.caution.active:focus,body.syndicate span.button.caution.active:hover{transition:background-color .25s;background-color:#eb790b;outline:0}body.syndicate span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.syndicate span.button.danger.active:focus,body.syndicate span.button.danger.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.syndicate span.button.gridable{width:125px;margin:2px 0}body.syndicate span.button.gridable.center{text-align:center;width:75px}body.syndicate span.button+span:not(.button),body.syndicate span:not(.button)+span.button{margin-left:5px}body.syndicate div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000);background-color:rgba(0,0,0,.5);box-shadow:inset 0 0 5px rgba(0,0,0,.75)}body.syndicate div.display.tabular{padding:0;margin:0}body.syndicate div.display header,body.syndicate div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #272727}body.syndicate div.display header .buttonRight,body.syndicate div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.syndicate div.display article,body.syndicate div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.syndicate input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#fff;background-color:#9d0808;border:1px solid #272727}body.syndicate input.number{width:35px}body.syndicate input::-webkit-input-placeholder{color:#999}body.syndicate input:-ms-input-placeholder{color:#999}body.syndicate input::placeholder{color:#999}body.syndicate input::-ms-clear{display:none}body.syndicate svg.linegraph{overflow:hidden}body.syndicate div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#750000;background-image:repeating-linear-gradient(-45deg,#750000,#750000 10px,#910101 0,#910101 20px)}body.syndicate div.notice .label{color:#000}body.syndicate div.notice .content:only-of-type{padding:0}body.syndicate div.notice hr{background-color:#272727}body.syndicate div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.syndicate section .cell,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.syndicate section{display:table-row;width:100%}body.syndicate section:not(:first-child){padding-top:4px}body.syndicate section.candystripe:nth-child(2n){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.syndicate section .label{width:1%;padding-right:32px;white-space:nowrap;color:#fff}body.syndicate section .content:not(:last-child){padding-right:16px}body.syndicate section .line{width:100%}body.syndicate section .cell:not(:first-child){text-align:center;padding-top:0}body.syndicate section .cell span.button{width:75px}body.syndicate section:not(:last-child){padding-right:4px}body.syndicate div.subdisplay{width:100%;margin:0}body.syndicate header.titlebar .close,body.syndicate header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#e74242}body.syndicate header.titlebar .close:hover,body.syndicate header.titlebar .minimize:hover{color:#eb5e5e}body.syndicate header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.syndicate header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.syndicate header.titlebar .title{position:absolute;top:6px;left:46px;color:#e74242;font-size:16px;white-space:nowrap}body.syndicate header.titlebar .minimize{position:absolute;top:6px;right:46px}body.syndicate header.titlebar .close{position:absolute;top:4px;right:12px}.no-icons header.titlebar .statusicon{font-size:20px}.no-icons header.titlebar .statusicon:after{content:"O"}.no-icons header.titlebar .minimize{top:-2px;font-size:20px}.no-icons header.titlebar .minimize:after{content:"—"}.no-icons header.titlebar .close{font-size:20px}.no-icons header.titlebar .close:after{content:"X"} \ No newline at end of file diff --git a/tgui/assets/tgui.js b/tgui/assets/tgui.js index 92e66d41678..48d0948b969 100644 --- a/tgui/assets/tgui.js +++ b/tgui/assets/tgui.js @@ -1,16 +1,16 @@ -require=function t(e,n,a){function r(o,s){if(!n[o]){if(!e[o]){var u="function"==typeof require&&require;if(!s&&u)return u(o,!0);if(i)return i(o,!0);var p=Error("Cannot find module '"+o+"'");throw p.code="MODULE_NOT_FOUND",p}var c=n[o]={exports:{}};e[o][0].call(c.exports,function(t){var n=e[o][1][t];return r(n?n:t)},c,c.exports,t,e,n,a)}return n[o].exports}for(var i="function"==typeof require&&require,o=0;o2?p[2]:void 0,l=Math.min((void 0===c?o:r(c,o))-u,o-s),f=1;for(s>u&&u+l>s&&(f=-1,u+=l-1,s+=l-1);l-- >0;)u in n?n[s]=n[u]:delete n[s],s+=f,u+=f;return n}},{76:76,79:79,80:80}],6:[function(t,e,n){"use strict";var a=t(80),r=t(76),i=t(79);e.exports=[].fill||function(t){for(var e=a(this),n=i(e.length),o=arguments,s=o.length,u=r(s>1?o[1]:void 0,n),p=s>2?o[2]:void 0,c=void 0===p?n:r(p,n);c>u;)e[u++]=t;return e}},{76:76,79:79,80:80}],7:[function(t,e,n){var a=t(78),r=t(79),i=t(76);e.exports=function(t){return function(e,n,o){var s,u=a(e),p=r(u.length),c=i(o,p);if(t&&n!=n){for(;p>c;)if(s=u[c++],s!=s)return!0}else for(;p>c;c++)if((t||c in u)&&u[c]===n)return t||c;return!t&&-1}}},{76:76,78:78,79:79}],8:[function(t,e,n){var a=t(17),r=t(34),i=t(80),o=t(79),s=t(9);e.exports=function(t){var e=1==t,n=2==t,u=3==t,p=4==t,c=6==t,l=5==t||c;return function(f,d,h){for(var m,v,g=i(f),b=r(g),y=a(d,h,3),x=o(b.length),_=0,w=e?s(f,x):n?s(f,0):void 0;x>_;_++)if((l||_ in b)&&(m=b[_],v=y(m,_,g),t))if(e)w[_]=v;else if(v)switch(t){case 3:return!0;case 5:return m;case 6:return _;case 2:w.push(m)}else if(p)return!1;return c?-1:u||p?p:w}}},{17:17,34:34,79:79,80:80,9:9}],9:[function(t,e,n){var a=t(38),r=t(36),i=t(83)("species");e.exports=function(t,e){var n;return r(t)&&(n=t.constructor,"function"!=typeof n||n!==Array&&!r(n.prototype)||(n=void 0),a(n)&&(n=n[i],null===n&&(n=void 0))),new(void 0===n?Array:n)(e)}},{36:36,38:38,83:83}],10:[function(t,e,n){var a=t(11),r=t(83)("toStringTag"),i="Arguments"==a(function(){return arguments}());e.exports=function(t){var e,n,o;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=(e=Object(t))[r])?n:i?a(e):"Object"==(o=a(e))&&"function"==typeof e.callee?"Arguments":o}},{11:11,83:83}],11:[function(t,e,n){var a={}.toString;e.exports=function(t){return a.call(t).slice(8,-1)}},{}],12:[function(t,e,n){"use strict";var a=t(46),r=t(31),i=t(60),o=t(17),s=t(69),u=t(18),p=t(27),c=t(42),l=t(44),f=t(82)("id"),d=t(30),h=t(38),m=t(65),v=t(19),g=Object.isExtensible||h,b=v?"_s":"size",y=0,x=function(t,e){if(!h(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!d(t,f)){if(!g(t))return"F";if(!e)return"E";r(t,f,++y)}return"O"+t[f]},_=function(t,e){var n,a=x(e);if("F"!==a)return t._i[a];for(n=t._f;n;n=n.n)if(n.k==e)return n};e.exports={getConstructor:function(t,e,n,r){var c=t(function(t,i){s(t,c,e),t._i=a.create(null),t._f=void 0,t._l=void 0,t[b]=0,void 0!=i&&p(i,n,t[r],t)});return i(c.prototype,{clear:function(){for(var t=this,e=t._i,n=t._f;n;n=n.n)n.r=!0,n.p&&(n.p=n.p.n=void 0),delete e[n.i];t._f=t._l=void 0,t[b]=0},"delete":function(t){var e=this,n=_(e,t);if(n){var a=n.n,r=n.p;delete e._i[n.i],n.r=!0,r&&(r.n=a),a&&(a.p=r),e._f==n&&(e._f=a),e._l==n&&(e._l=r),e[b]--}return!!n},forEach:function(t){for(var e,n=o(t,arguments.length>1?arguments[1]:void 0,3);e=e?e.n:this._f;)for(n(e.v,e.k,this);e&&e.r;)e=e.p},has:function(t){return!!_(this,t)}}),v&&a.setDesc(c.prototype,"size",{get:function(){return u(this[b])}}),c},def:function(t,e,n){var a,r,i=_(t,e);return i?i.v=n:(t._l=i={i:r=x(e,!0),k:e,v:n,p:a=t._l,n:void 0,r:!1},t._f||(t._f=i),a&&(a.n=i),t[b]++,"F"!==r&&(t._i[r]=i)),t},getEntry:_,setStrong:function(t,e,n){c(t,e,function(t,e){this._t=t,this._k=e,this._l=void 0},function(){for(var t=this,e=t._k,n=t._l;n&&n.r;)n=n.p;return t._t&&(t._l=n=n?n.n:t._t._f)?"keys"==e?l(0,n.k):"values"==e?l(0,n.v):l(0,[n.k,n.v]):(t._t=void 0,l(1))},n?"entries":"values",!n,!0),m(e)}}},{17:17,18:18,19:19,27:27,30:30,31:31,38:38,42:42,44:44,46:46,60:60,65:65,69:69,82:82}],13:[function(t,e,n){var a=t(27),r=t(10);e.exports=function(t){return function(){if(r(this)!=t)throw TypeError(t+"#toJSON isn't generic");var e=[];return a(this,!1,e.push,e),e}}},{10:10,27:27}],14:[function(t,e,n){"use strict";var a=t(31),r=t(60),i=t(4),o=t(38),s=t(69),u=t(27),p=t(8),c=t(30),l=t(82)("weak"),f=Object.isExtensible||o,d=p(5),h=p(6),m=0,v=function(t){return t._l||(t._l=new g)},g=function(){this.a=[]},b=function(t,e){return d(t.a,function(t){return t[0]===e})};g.prototype={get:function(t){var e=b(this,t);return e?e[1]:void 0},has:function(t){return!!b(this,t)},set:function(t,e){var n=b(this,t);n?n[1]=e:this.a.push([t,e])},"delete":function(t){var e=h(this.a,function(e){return e[0]===t});return~e&&this.a.splice(e,1),!!~e}},e.exports={getConstructor:function(t,e,n,a){var i=t(function(t,r){s(t,i,e),t._i=m++,t._l=void 0,void 0!=r&&u(r,n,t[a],t)});return r(i.prototype,{"delete":function(t){return o(t)?f(t)?c(t,l)&&c(t[l],this._i)&&delete t[l][this._i]:v(this)["delete"](t):!1},has:function(t){return o(t)?f(t)?c(t,l)&&c(t[l],this._i):v(this).has(t):!1}}),i},def:function(t,e,n){return f(i(e))?(c(e,l)||a(e,l,{}),e[l][t._i]=n):v(t).set(e,n),t},frozenStore:v,WEAK:l}},{27:27,30:30,31:31,38:38,4:4,60:60,69:69,8:8,82:82}],15:[function(t,e,n){"use strict";var a=t(29),r=t(22),i=t(61),o=t(60),s=t(27),u=t(69),p=t(38),c=t(24),l=t(43),f=t(66);e.exports=function(t,e,n,d,h,m){var v=a[t],g=v,b=h?"set":"add",y=g&&g.prototype,x={},_=function(t){var e=y[t];i(y,t,"delete"==t?function(t){return m&&!p(t)?!1:e.call(this,0===t?0:t)}:"has"==t?function(t){return m&&!p(t)?!1:e.call(this,0===t?0:t)}:"get"==t?function(t){return m&&!p(t)?void 0:e.call(this,0===t?0:t)}:"add"==t?function(t){return e.call(this,0===t?0:t),this}:function(t,n){return e.call(this,0===t?0:t,n),this})};if("function"==typeof g&&(m||y.forEach&&!c(function(){(new g).entries().next()}))){var w,k=new g,E=k[b](m?{}:-0,1)!=k,S=c(function(){k.has(1)}),C=l(function(t){new g(t)});C||(g=e(function(e,n){u(e,g,t);var a=new v;return void 0!=n&&s(n,h,a[b],a),a}),g.prototype=y,y.constructor=g),m||k.forEach(function(t,e){w=1/e===-(1/0)}),(S||w)&&(_("delete"),_("has"),h&&_("get")),(w||E)&&_(b),m&&y.clear&&delete y.clear}else g=d.getConstructor(e,t,h,b),o(g.prototype,n);return f(g,t),x[t]=g,r(r.G+r.W+r.F*(g!=v),x),m||d.setStrong(g,t,h),g}},{22:22,24:24,27:27,29:29,38:38,43:43,60:60,61:61,66:66,69:69}],16:[function(t,e,n){var a=e.exports={version:"1.2.6"};"number"==typeof __e&&(__e=a)},{}],17:[function(t,e,n){var a=t(2);e.exports=function(t,e,n){if(a(t),void 0===e)return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,a){return t.call(e,n,a)};case 3:return function(n,a,r){return t.call(e,n,a,r)}}return function(){return t.apply(e,arguments)}}},{2:2}],18:[function(t,e,n){e.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},{}],19:[function(t,e,n){e.exports=!t(24)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},{24:24}],20:[function(t,e,n){var a=t(38),r=t(29).document,i=a(r)&&a(r.createElement);e.exports=function(t){return i?r.createElement(t):{}}},{29:29,38:38}],21:[function(t,e,n){var a=t(46);e.exports=function(t){var e=a.getKeys(t),n=a.getSymbols;if(n)for(var r,i=n(t),o=a.isEnum,s=0;i.length>s;)o.call(t,r=i[s++])&&e.push(r);return e}},{46:46}],22:[function(t,e,n){var a=t(29),r=t(16),i=t(31),o=t(61),s=t(17),u="prototype",p=function(t,e,n){var c,l,f,d,h=t&p.F,m=t&p.G,v=t&p.S,g=t&p.P,b=t&p.B,y=m?a:v?a[e]||(a[e]={}):(a[e]||{})[u],x=m?r:r[e]||(r[e]={}),_=x[u]||(x[u]={});m&&(n=e);for(c in n)l=!h&&y&&c in y,f=(l?y:n)[c],d=b&&l?s(f,a):g&&"function"==typeof f?s(Function.call,f):f,y&&!l&&o(y,c,f),x[c]!=f&&i(x,c,d),g&&_[c]!=f&&(_[c]=f)};a.core=r,p.F=1,p.G=2,p.S=4,p.P=8,p.B=16,p.W=32,e.exports=p},{16:16,17:17,29:29,31:31,61:61}],23:[function(t,e,n){var a=t(83)("match");e.exports=function(t){var e=/./;try{"/./"[t](e)}catch(n){try{return e[a]=!1,!"/./"[t](e)}catch(r){}}return!0}},{83:83}],24:[function(t,e,n){e.exports=function(t){try{return!!t()}catch(e){return!0}}},{}],25:[function(t,e,n){"use strict";var a=t(31),r=t(61),i=t(24),o=t(18),s=t(83);e.exports=function(t,e,n){var u=s(t),p=""[t];i(function(){var e={};return e[u]=function(){return 7},7!=""[t](e)})&&(r(String.prototype,t,n(o,u,p)),a(RegExp.prototype,u,2==e?function(t,e){return p.call(t,this,e)}:function(t){return p.call(t,this)}))}},{18:18,24:24,31:31,61:61,83:83}],26:[function(t,e,n){"use strict";var a=t(4);e.exports=function(){var t=a(this),e="";return t.global&&(e+="g"),t.ignoreCase&&(e+="i"),t.multiline&&(e+="m"),t.unicode&&(e+="u"),t.sticky&&(e+="y"),e}},{4:4}],27:[function(t,e,n){var a=t(17),r=t(40),i=t(35),o=t(4),s=t(79),u=t(84);e.exports=function(t,e,n,p){var c,l,f,d=u(t),h=a(n,p,e?2:1),m=0;if("function"!=typeof d)throw TypeError(t+" is not iterable!");if(i(d))for(c=s(t.length);c>m;m++)e?h(o(l=t[m])[0],l[1]):h(t[m]);else for(f=d.call(t);!(l=f.next()).done;)r(f,h,l.value,e)}},{17:17,35:35,4:4,40:40,79:79,84:84}],28:[function(t,e,n){var a=t(78),r=t(46).getNames,i={}.toString,o="object"==typeof window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],s=function(t){try{return r(t)}catch(e){return o.slice()}};e.exports.get=function(t){return o&&"[object Window]"==i.call(t)?s(t):r(a(t))}},{46:46,78:78}],29:[function(t,e,n){var a=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=a)},{}],30:[function(t,e,n){var a={}.hasOwnProperty;e.exports=function(t,e){return a.call(t,e)}},{}],31:[function(t,e,n){var a=t(46),r=t(59);e.exports=t(19)?function(t,e,n){return a.setDesc(t,e,r(1,n))}:function(t,e,n){return t[e]=n,t}},{19:19,46:46,59:59}],32:[function(t,e,n){e.exports=t(29).document&&document.documentElement},{29:29}],33:[function(t,e,n){e.exports=function(t,e,n){var a=void 0===n;switch(e.length){case 0:return a?t():t.call(n);case 1:return a?t(e[0]):t.call(n,e[0]);case 2:return a?t(e[0],e[1]):t.call(n,e[0],e[1]);case 3:return a?t(e[0],e[1],e[2]):t.call(n,e[0],e[1],e[2]);case 4:return a?t(e[0],e[1],e[2],e[3]):t.call(n,e[0],e[1],e[2],e[3])}return t.apply(n,e)}},{}],34:[function(t,e,n){var a=t(11);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==a(t)?t.split(""):Object(t)}},{11:11}],35:[function(t,e,n){var a=t(45),r=t(83)("iterator"),i=Array.prototype;e.exports=function(t){return void 0!==t&&(a.Array===t||i[r]===t)}},{45:45,83:83}],36:[function(t,e,n){var a=t(11);e.exports=Array.isArray||function(t){return"Array"==a(t)}},{11:11}],37:[function(t,e,n){var a=t(38),r=Math.floor;e.exports=function(t){return!a(t)&&isFinite(t)&&r(t)===t}},{38:38}],38:[function(t,e,n){e.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},{}],39:[function(t,e,n){var a=t(38),r=t(11),i=t(83)("match");e.exports=function(t){var e;return a(t)&&(void 0!==(e=t[i])?!!e:"RegExp"==r(t))}},{11:11,38:38,83:83}],40:[function(t,e,n){var a=t(4);e.exports=function(t,e,n,r){try{return r?e(a(n)[0],n[1]):e(n)}catch(i){var o=t["return"];throw void 0!==o&&a(o.call(t)),i}}},{4:4}],41:[function(t,e,n){"use strict";var a=t(46),r=t(59),i=t(66),o={};t(31)(o,t(83)("iterator"),function(){return this}),e.exports=function(t,e,n){t.prototype=a.create(o,{next:r(1,n)}),i(t,e+" Iterator")}},{31:31,46:46,59:59,66:66,83:83}],42:[function(t,e,n){"use strict";var a=t(48),r=t(22),i=t(61),o=t(31),s=t(30),u=t(45),p=t(41),c=t(66),l=t(46).getProto,f=t(83)("iterator"),d=!([].keys&&"next"in[].keys()),h="@@iterator",m="keys",v="values",g=function(){return this};e.exports=function(t,e,n,b,y,x,_){p(n,e,b);var w,k,E=function(t){if(!d&&t in A)return A[t];switch(t){case m:return function(){return new n(this,t)};case v:return function(){return new n(this,t)}}return function(){return new n(this,t)}},S=e+" Iterator",C=y==v,P=!1,A=t.prototype,O=A[f]||A[h]||y&&A[y],T=O||E(y);if(O){var j=l(T.call(new t));c(j,S,!0),!a&&s(A,h)&&o(j,f,g),C&&O.name!==v&&(P=!0,T=function(){return O.call(this)})}if(a&&!_||!d&&!P&&A[f]||o(A,f,T),u[e]=T,u[S]=g,y)if(w={values:C?T:E(v),keys:x?T:E(m),entries:C?E("entries"):T},_)for(k in w)k in A||i(A,k,w[k]);else r(r.P+r.F*(d||P),e,w);return w}},{22:22,30:30,31:31,41:41,45:45,46:46,48:48,61:61,66:66,83:83}],43:[function(t,e,n){var a=t(83)("iterator"),r=!1;try{var i=[7][a]();i["return"]=function(){r=!0},Array.from(i,function(){throw 2})}catch(o){}e.exports=function(t,e){if(!e&&!r)return!1;var n=!1;try{var i=[7],o=i[a]();o.next=function(){return{done:n=!0}},i[a]=function(){return o},t(i)}catch(s){}return n}},{83:83}],44:[function(t,e,n){e.exports=function(t,e){return{value:e,done:!!t}}},{}],45:[function(t,e,n){e.exports={}},{}],46:[function(t,e,n){var a=Object;e.exports={create:a.create,getProto:a.getPrototypeOf,isEnum:{}.propertyIsEnumerable,getDesc:a.getOwnPropertyDescriptor,setDesc:a.defineProperty,setDescs:a.defineProperties,getKeys:a.keys,getNames:a.getOwnPropertyNames,getSymbols:a.getOwnPropertySymbols,each:[].forEach}},{}],47:[function(t,e,n){var a=t(46),r=t(78);e.exports=function(t,e){for(var n,i=r(t),o=a.getKeys(i),s=o.length,u=0;s>u;)if(i[n=o[u++]]===e)return n}},{46:46,78:78}],48:[function(t,e,n){e.exports=!1},{}],49:[function(t,e,n){e.exports=Math.expm1||function(t){return 0==(t=+t)?t:t>-1e-6&&1e-6>t?t+t*t/2:Math.exp(t)-1}},{}],50:[function(t,e,n){e.exports=Math.log1p||function(t){return(t=+t)>-1e-8&&1e-8>t?t-t*t/2:Math.log(1+t)}},{}],51:[function(t,e,n){e.exports=Math.sign||function(t){return 0==(t=+t)||t!=t?t:0>t?-1:1}},{}],52:[function(t,e,n){var a,r,i,o=t(29),s=t(75).set,u=o.MutationObserver||o.WebKitMutationObserver,p=o.process,c=o.Promise,l="process"==t(11)(p),f=function(){var t,e,n;for(l&&(t=p.domain)&&(p.domain=null,t.exit());a;)e=a.domain,n=a.fn,e&&e.enter(),n(),e&&e.exit(),a=a.next;r=void 0,t&&t.enter()};if(l)i=function(){p.nextTick(f)};else if(u){var d=1,h=document.createTextNode("");new u(f).observe(h,{characterData:!0}),i=function(){h.data=d=-d}}else i=c&&c.resolve?function(){c.resolve().then(f)}:function(){s.call(o,f)};e.exports=function(t){var e={fn:t,next:void 0,domain:l&&p.domain};r&&(r.next=e),a||(a=e,i()),r=e}},{11:11,29:29,75:75}],53:[function(t,e,n){var a=t(46),r=t(80),i=t(34);e.exports=t(24)(function(){var t=Object.assign,e={},n={},a=Symbol(),r="abcdefghijklmnopqrst";return e[a]=7,r.split("").forEach(function(t){n[t]=t}),7!=t({},e)[a]||Object.keys(t({},n)).join("")!=r})?function(t,e){for(var n=r(t),o=arguments,s=o.length,u=1,p=a.getKeys,c=a.getSymbols,l=a.isEnum;s>u;)for(var f,d=i(o[u++]),h=c?p(d).concat(c(d)):p(d),m=h.length,v=0;m>v;)l.call(d,f=h[v++])&&(n[f]=d[f]);return n}:Object.assign},{24:24,34:34,46:46,80:80}],54:[function(t,e,n){var a=t(22),r=t(16),i=t(24);e.exports=function(t,e){var n=(r.Object||{})[t]||Object[t],o={};o[t]=e(n),a(a.S+a.F*i(function(){n(1)}),"Object",o)}},{16:16,22:22,24:24}],55:[function(t,e,n){var a=t(46),r=t(78),i=a.isEnum;e.exports=function(t){return function(e){for(var n,o=r(e),s=a.getKeys(o),u=s.length,p=0,c=[];u>p;)i.call(o,n=s[p++])&&c.push(t?[n,o[n]]:o[n]);return c}}},{46:46,78:78}],56:[function(t,e,n){var a=t(46),r=t(4),i=t(29).Reflect;e.exports=i&&i.ownKeys||function(t){var e=a.getNames(r(t)),n=a.getSymbols;return n?e.concat(n(t)):e}},{29:29,4:4,46:46}],57:[function(t,e,n){"use strict";var a=t(58),r=t(33),i=t(2);e.exports=function(){for(var t=i(this),e=arguments.length,n=Array(e),o=0,s=a._,u=!1;e>o;)(n[o]=arguments[o++])===s&&(u=!0);return function(){var a,i=this,o=arguments,p=o.length,c=0,l=0;if(!u&&!p)return r(t,n,i);if(a=n.slice(),u)for(;e>c;c++)a[c]===s&&(a[c]=o[l++]);for(;p>l;)a.push(o[l++]);return r(t,a,i)}}},{2:2,33:33,58:58}],58:[function(t,e,n){e.exports=t(29)},{29:29}],59:[function(t,e,n){e.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},{}],60:[function(t,e,n){var a=t(61);e.exports=function(t,e){for(var n in e)a(t,n,e[n]);return t}},{61:61}],61:[function(t,e,n){var a=t(29),r=t(31),i=t(82)("src"),o="toString",s=Function[o],u=(""+s).split(o);t(16).inspectSource=function(t){return s.call(t)},(e.exports=function(t,e,n,o){"function"==typeof n&&(n.hasOwnProperty(i)||r(n,i,t[e]?""+t[e]:u.join(e+"")),n.hasOwnProperty("name")||r(n,"name",e)),t===a?t[e]=n:(o||delete t[e],r(t,e,n))})(Function.prototype,o,function(){return"function"==typeof this&&this[i]||s.call(this)})},{16:16,29:29,31:31,82:82}],62:[function(t,e,n){e.exports=function(t,e){var n=e===Object(e)?function(t){return e[t]}:e;return function(e){return(e+"").replace(t,n)}}},{}],63:[function(t,e,n){e.exports=Object.is||function(t,e){return t===e?0!==t||1/t===1/e:t!=t&&e!=e}},{}],64:[function(t,e,n){var a=t(46).getDesc,r=t(38),i=t(4),o=function(t,e){if(i(t),!r(e)&&null!==e)throw TypeError(e+": can't set as prototype!")};e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,n,r){try{r=t(17)(Function.call,a(Object.prototype,"__proto__").set,2),r(e,[]),n=!(e instanceof Array)}catch(i){n=!0}return function(t,e){return o(t,e),n?t.__proto__=e:r(t,e),t}}({},!1):void 0),check:o}},{17:17,38:38,4:4,46:46}],65:[function(t,e,n){"use strict";var a=t(29),r=t(46),i=t(19),o=t(83)("species");e.exports=function(t){var e=a[t];i&&e&&!e[o]&&r.setDesc(e,o,{configurable:!0,get:function(){return this}})}},{19:19,29:29,46:46,83:83}],66:[function(t,e,n){var a=t(46).setDesc,r=t(30),i=t(83)("toStringTag");e.exports=function(t,e,n){t&&!r(t=n?t:t.prototype,i)&&a(t,i,{configurable:!0,value:e})}},{30:30,46:46,83:83}],67:[function(t,e,n){var a=t(29),r="__core-js_shared__",i=a[r]||(a[r]={});e.exports=function(t){return i[t]||(i[t]={})}},{29:29}],68:[function(t,e,n){var a=t(4),r=t(2),i=t(83)("species");e.exports=function(t,e){var n,o=a(t).constructor;return void 0===o||void 0==(n=a(o)[i])?e:r(n)}},{2:2,4:4,83:83}],69:[function(t,e,n){e.exports=function(t,e,n){if(!(t instanceof e))throw TypeError(n+": use the 'new' operator!");return t}},{}],70:[function(t,e,n){var a=t(77),r=t(18);e.exports=function(t){return function(e,n){var i,o,s=r(e)+"",u=a(n),p=s.length;return 0>u||u>=p?t?"":void 0:(i=s.charCodeAt(u),55296>i||i>56319||u+1===p||(o=s.charCodeAt(u+1))<56320||o>57343?t?s.charAt(u):i:t?s.slice(u,u+2):(i-55296<<10)+(o-56320)+65536)}}},{18:18,77:77}],71:[function(t,e,n){var a=t(39),r=t(18);e.exports=function(t,e,n){if(a(e))throw TypeError("String#"+n+" doesn't accept regex!");return r(t)+""}},{18:18,39:39}],72:[function(t,e,n){var a=t(79),r=t(73),i=t(18);e.exports=function(t,e,n,o){var s=i(t)+"",u=s.length,p=void 0===n?" ":n+"",c=a(e);if(u>=c)return s;""==p&&(p=" ");var l=c-u,f=r.call(p,Math.ceil(l/p.length));return f.length>l&&(f=f.slice(0,l)),o?f+s:s+f}},{18:18,73:73,79:79}],73:[function(t,e,n){"use strict";var a=t(77),r=t(18);e.exports=function(t){var e=r(this)+"",n="",i=a(t);if(0>i||i==1/0)throw RangeError("Count can't be negative");for(;i>0;(i>>>=1)&&(e+=e))1&i&&(n+=e);return n}},{18:18,77:77}],74:[function(t,e,n){var a=t(22),r=t(18),i=t(24),o=" \n\x0B\f\r   ᠎              \u2028\u2029\ufeff",s="["+o+"]",u="​…",p=RegExp("^"+s+s+"*"),c=RegExp(s+s+"*$"),l=function(t,e){var n={};n[t]=e(f),a(a.P+a.F*i(function(){return!!o[t]()||u[t]()!=u}),"String",n)},f=l.trim=function(t,e){return t=r(t)+"",1&e&&(t=t.replace(p,"")),2&e&&(t=t.replace(c,"")),t};e.exports=l},{18:18,22:22,24:24}],75:[function(t,e,n){var a,r,i,o=t(17),s=t(33),u=t(32),p=t(20),c=t(29),l=c.process,f=c.setImmediate,d=c.clearImmediate,h=c.MessageChannel,m=0,v={},g="onreadystatechange",b=function(){var t=+this;if(v.hasOwnProperty(t)){var e=v[t];delete v[t],e()}},y=function(t){b.call(t.data)};f&&d||(f=function(t){for(var e=[],n=1;arguments.length>n;)e.push(arguments[n++]);return v[++m]=function(){s("function"==typeof t?t:Function(t),e)},a(m),m},d=function(t){delete v[t]},"process"==t(11)(l)?a=function(t){l.nextTick(o(b,t,1))}:h?(r=new h,i=r.port2,r.port1.onmessage=y,a=o(i.postMessage,i,1)):c.addEventListener&&"function"==typeof postMessage&&!c.importScripts?(a=function(t){c.postMessage(t+"","*")},c.addEventListener("message",y,!1)):a=g in p("script")?function(t){u.appendChild(p("script"))[g]=function(){u.removeChild(this),b.call(t)}}:function(t){setTimeout(o(b,t,1),0)}),e.exports={set:f,clear:d}},{11:11,17:17,20:20,29:29,32:32,33:33}],76:[function(t,e,n){var a=t(77),r=Math.max,i=Math.min;e.exports=function(t,e){return t=a(t),0>t?r(t+e,0):i(t,e)}},{77:77}],77:[function(t,e,n){var a=Math.ceil,r=Math.floor;e.exports=function(t){return isNaN(t=+t)?0:(t>0?r:a)(t)}},{}],78:[function(t,e,n){var a=t(34),r=t(18);e.exports=function(t){return a(r(t))}},{18:18,34:34}],79:[function(t,e,n){var a=t(77),r=Math.min;e.exports=function(t){return t>0?r(a(t),9007199254740991):0}},{77:77}],80:[function(t,e,n){var a=t(18);e.exports=function(t){return Object(a(t))}},{18:18}],81:[function(t,e,n){var a=t(38);e.exports=function(t,e){if(!a(t))return t;var n,r;if(e&&"function"==typeof(n=t.toString)&&!a(r=n.call(t)))return r;if("function"==typeof(n=t.valueOf)&&!a(r=n.call(t)))return r;if(!e&&"function"==typeof(n=t.toString)&&!a(r=n.call(t)))return r;throw TypeError("Can't convert object to primitive value")}},{38:38}],82:[function(t,e,n){var a=0,r=Math.random();e.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++a+r).toString(36))}},{}],83:[function(t,e,n){var a=t(67)("wks"),r=t(82),i=t(29).Symbol;e.exports=function(t){return a[t]||(a[t]=i&&i[t]||(i||r)("Symbol."+t))}},{29:29,67:67,82:82}],84:[function(t,e,n){var a=t(10),r=t(83)("iterator"),i=t(45);e.exports=t(16).getIteratorMethod=function(t){return void 0!=t?t[r]||t["@@iterator"]||i[a(t)]:void 0}},{10:10,16:16,45:45,83:83}],85:[function(t,e,n){"use strict";var a,r=t(46),i=t(22),o=t(19),s=t(59),u=t(32),p=t(20),c=t(30),l=t(11),f=t(33),d=t(24),h=t(4),m=t(2),v=t(38),g=t(80),b=t(78),y=t(77),x=t(76),_=t(79),w=t(34),k=t(82)("__proto__"),E=t(8),S=t(7)(!1),C=Object.prototype,P=Array.prototype,A=P.slice,O=P.join,T=r.setDesc,j=r.getDesc,R=r.setDescs,M={};o||(a=!d(function(){return 7!=T(p("div"),"a",{get:function(){return 7}}).a}),r.setDesc=function(t,e,n){if(a)try{return T(t,e,n)}catch(r){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(h(t)[e]=n.value),t},r.getDesc=function(t,e){if(a)try{return j(t,e)}catch(n){}return c(t,e)?s(!C.propertyIsEnumerable.call(t,e),t[e]):void 0},r.setDescs=R=function(t,e){h(t);for(var n,a=r.getKeys(e),i=a.length,o=0;i>o;)r.setDesc(t,n=a[o++],e[n]);return t}),i(i.S+i.F*!o,"Object",{getOwnPropertyDescriptor:r.getDesc,defineProperty:r.setDesc,defineProperties:R});var L="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","),N=L.concat("length","prototype"),D=L.length,F=function(){var t,e=p("iframe"),n=D,a=">";for(e.style.display="none",u.appendChild(e),e.src="javascript:",t=e.contentWindow.document,t.open(),t.write("