The bar layout for the station is very old. We've decided to give it a facelift after our partnership with IKEA Intergalactic?.
We added some sweet retro arcade machines and much more seating area. We removed the stage since it hasn't ever been used.
You can run this place like a restaurant now that you have tables. Go whip up a menu with the Chef. You have a condiments table and your Requests Console has been moved so a noticeboard can be placed there. Take tickets from customers and pin them on the noticeboard for the Chef.
We hope you like the new bar! b>";
- name = "Renovation Notice - Bar";
- pixel_x = -5;
- pixel_y = 3
- },
-/obj/item/reagent_containers/food/drinks/shaker,
-/obj/item/stack/spacecash/c100,
-/obj/item/stack/spacecash/c100,
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"aNv" = (
-/obj/effect/turf_decal/plaque{
- icon_state = "L4"
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"aNw" = (
-/obj/effect/turf_decal/plaque{
- icon_state = "L2"
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"aNx" = (
-/obj/effect/landmark/observer_start,
-/obj/effect/turf_decal/plaque{
- icon_state = "L8"
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"aNy" = (
-/obj/machinery/navbeacon{
- codes_txt = "patrol;next_patrol=Lockers";
- location = "EVA"
- },
-/obj/effect/turf_decal/plaque{
- icon_state = "L6"
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"aNz" = (
-/obj/effect/turf_decal/plaque{
- icon_state = "L12"
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"aNA" = (
-/obj/machinery/navbeacon{
- codes_txt = "patrol;next_patrol=Security";
- location = "EVA2"
- },
-/obj/effect/turf_decal/plaque{
- icon_state = "L10"
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"aNB" = (
-/obj/effect/turf_decal/plaque{
- icon_state = "L14"
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"aNC" = (
-/obj/machinery/navbeacon{
- codes_txt = "patrol;next_patrol=EVA2";
- location = "Dorm"
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"aNE" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
- },
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"aNF" = (
-/obj/structure/chair/comfy/brown,
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"aNI" = (
-/obj/machinery/light/small{
- dir = 4;
- light_color = "#d8b1b1"
- },
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"aNK" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 8
- },
-/mob/living/simple_animal/hostile/retaliate/goat{
- name = "Pete"
- },
-/turf/open/floor/plasteel/showroomfloor,
-/area/crew_quarters/kitchen)
-"aNL" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall,
-/area/hydroponics)
-"aNM" = (
-/obj/structure/kitchenspike,
-/obj/machinery/light/small{
- dir = 8
- },
-/turf/open/floor/plasteel/showroomfloor,
-/area/crew_quarters/kitchen)
-"aNN" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/public/glass{
- name = "Hydroponics";
- req_access_txt = "35"
- },
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/hydroponics)
-"aNO" = (
-/obj/machinery/light/small{
- dir = 4
- },
-/obj/machinery/airalarm{
- dir = 8;
- pixel_x = 24
- },
-/obj/machinery/vending/wardrobe/chef_wardrobe,
-/turf/open/floor/plasteel/showroomfloor,
-/area/crew_quarters/kitchen)
-"aNP" = (
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/wood,
-/area/library)
-"aNQ" = (
-/obj/effect/spawner/structure/window,
-/turf/open/floor/plating,
-/area/hydroponics)
-"aNR" = (
-/obj/structure/table/wood,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/item/paicard,
-/turf/open/floor/carpet,
-/area/hallway/secondary/entry)
-"aNS" = (
-/obj/machinery/bookbinder,
-/turf/open/floor/wood,
-/area/library)
-"aNT" = (
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/port)
-"aNU" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/camera{
- c_tag = "Port Hallway";
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/port)
-"aNV" = (
-/obj/machinery/photocopier,
-/turf/open/floor/wood,
-/area/library)
-"aNW" = (
-/obj/machinery/door/airlock/public/glass{
- name = "Chapel Office";
- req_access_txt = "22"
- },
-/turf/open/floor/plasteel/dark,
-/area/chapel/office)
-"aNX" = (
-/obj/item/radio/intercom{
- broadcasting = 1;
- frequency = 1480;
- name = "Confessional Intercom";
- pixel_x = 25
- },
-/obj/structure/chair,
-/turf/open/floor/plasteel/dark,
-/area/chapel/main)
-"aNY" = (
-/obj/machinery/door/morgue{
- name = "Confession Booth (Chaplain)";
- req_access_txt = "22"
- },
-/turf/open/floor/plasteel/dark,
-/area/chapel/main)
-"aNZ" = (
-/obj/structure/chair,
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/exit)
-"aOa" = (
-/obj/machinery/light{
- dir = 1
- },
-/obj/structure/chair,
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/exit)
-"aOb" = (
-/obj/structure/chair,
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/exit)
-"aOc" = (
-/obj/structure/chair,
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/exit)
-"aOd" = (
-/obj/structure/chair,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/exit)
-"aOe" = (
-/obj/item/beacon,
-/obj/machinery/camera{
- c_tag = "Arrivals Bay 1 South"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/entry)
-"aOf" = (
-/obj/machinery/vending/snack/random,
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/entry)
-"aOg" = (
-/obj/structure/closet/emcloset,
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/entry)
-"aOh" = (
-/obj/structure/closet/emcloset,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/entry)
-"aOi" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/port)
-"aOj" = (
-/obj/structure/table/wood,
-/obj/item/storage/fancy/cigarettes{
- pixel_y = 2
- },
-/obj/item/lighter/greyscale{
- pixel_x = 4;
- pixel_y = 2
- },
-/turf/open/floor/plasteel/grimy,
-/area/hallway/secondary/entry)
-"aOk" = (
-/obj/machinery/vending/cola/random,
-/turf/open/floor/plasteel/dark,
-/area/hallway/secondary/entry)
-"aOl" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/port)
-"aOm" = (
-/obj/structure/disposalpipe/segment{
- dir = 6
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/port)
-"aOn" = (
-/obj/machinery/light,
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/port)
-"aOo" = (
-/obj/machinery/firealarm{
- dir = 1;
- pixel_y = -24
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/port)
-"aOp" = (
-/obj/machinery/camera{
- c_tag = "Port Hallway 3";
- dir = 1
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/port)
-"aOq" = (
-/obj/structure/disposalpipe/junction{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/port)
-"aOr" = (
-/obj/structure/disposalpipe/junction/flip{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/port)
-"aOs" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/door/firedoor,
-/turf/open/floor/plasteel,
-/area/hallway/primary/port)
-"aOt" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/light,
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/port)
-"aOv" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/port)
-"aOw" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/turf/open/floor/plasteel,
-/area/hallway/primary/port)
-"aOx" = (
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/port)
-"aOy" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/turf/open/floor/plasteel,
-/area/hallway/primary/port)
-"aOz" = (
-/obj/structure/sign/directions/security{
- dir = 4;
- pixel_x = 32;
- pixel_y = -24
- },
-/obj/structure/sign/directions/evac{
- dir = 4;
- pixel_x = 32;
- pixel_y = -32
- },
-/obj/structure/sign/directions/engineering{
- pixel_x = 32;
- pixel_y = -40
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/port)
-"aOA" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/port)
-"aOB" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/public/glass{
- name = "Central Access"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"aOC" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/port)
-"aOD" = (
-/obj/machinery/navbeacon{
- codes_txt = "patrol;next_patrol=QM";
- location = "CHW"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"aOE" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"aOF" = (
-/obj/machinery/light,
-/obj/structure/sign/warning/electricshock{
- pixel_y = -32
- },
-/obj/machinery/door/firedoor,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"aOG" = (
-/obj/structure/sign/warning/electricshock{
- pixel_y = -32
- },
-/obj/machinery/door/firedoor,
-/obj/machinery/light,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"aOH" = (
-/obj/structure/window/reinforced,
-/turf/open/floor/wood,
-/area/crew_quarters/theatre)
-"aOI" = (
-/obj/structure/kitchenspike,
-/turf/open/floor/plasteel/showroomfloor,
-/area/crew_quarters/kitchen)
-"aOJ" = (
-/obj/structure/chair/comfy/brown{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"aOL" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"aOM" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
- },
-/turf/open/floor/plasteel/showroomfloor,
-/area/crew_quarters/kitchen)
-"aON" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 8
- },
-/turf/open/floor/plasteel/showroomfloor,
-/area/crew_quarters/kitchen)
-"aOO" = (
-/obj/machinery/door/airlock{
- name = "Bar Storage";
- req_access_txt = "25"
- },
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"aOP" = (
-/obj/effect/landmark/blobstart,
-/obj/item/toy/beach_ball/holoball,
-/turf/open/floor/plating,
-/area/crew_quarters/bar)
-"aOQ" = (
-/obj/machinery/requests_console{
- department = "Hydroponics";
- departmentType = 2;
- pixel_y = 30
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/dark,
-/area/hydroponics)
-"aOR" = (
-/obj/structure/disposalpipe/segment{
- dir = 5
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/dark,
-/area/hydroponics)
-"aOS" = (
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/carpet,
-/area/library)
-"aOT" = (
-/obj/machinery/gibber,
-/turf/open/floor/plasteel/showroomfloor,
-/area/crew_quarters/kitchen)
-"aOU" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/exit)
-"aOV" = (
-/obj/structure/sink{
- dir = 8;
- pixel_x = -12;
- pixel_y = 2
- },
-/turf/open/floor/plasteel/dark,
-/area/hydroponics)
-"aOW" = (
-/obj/machinery/hydroponics/constructable,
-/obj/machinery/camera{
- c_tag = "Hydroponics North"
- },
-/turf/open/floor/plasteel/dark,
-/area/hydroponics)
-"aOX" = (
-/obj/machinery/hydroponics/constructable,
-/turf/open/floor/plasteel/dark,
-/area/hydroponics)
-"aOY" = (
-/obj/structure/chair/comfy/beige{
- dir = 1
- },
-/obj/effect/landmark/start/assistant,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/grimy,
-/area/hallway/secondary/entry)
-"aOZ" = (
-/obj/machinery/disposal/bin,
-/obj/structure/disposalpipe/trunk{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/hydroponics)
-"aPa" = (
-/obj/structure/chair/comfy/beige{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/grimy,
-/area/hallway/secondary/entry)
-"aPb" = (
-/obj/structure/bookcase/random/religion,
-/turf/open/floor/wood,
-/area/library)
-"aPc" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/hallway/primary/port)
-"aPd" = (
-/obj/structure/bookcase/random/reference,
-/turf/open/floor/wood,
-/area/library)
-"aPe" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"aPf" = (
-/obj/machinery/computer/libraryconsole,
-/obj/structure/table/wood,
-/turf/open/floor/wood,
-/area/library)
-"aPg" = (
-/obj/structure/chair/comfy/brown,
-/turf/open/floor/carpet,
-/area/library)
-"aPk" = (
-/turf/open/floor/plasteel/chapel{
- dir = 4
- },
-/area/chapel/main)
-"aPl" = (
-/turf/open/floor/plasteel/chapel{
- dir = 1
- },
-/area/chapel/main)
-"aPm" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/chapel{
- dir = 4
- },
-/area/chapel/main)
-"aPn" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/chapel{
- dir = 1
- },
-/area/chapel/main)
-"aPo" = (
-/obj/effect/spawner/structure/window/reinforced/tinted,
-/turf/open/floor/plasteel/dark,
-/area/chapel/main)
-"aPp" = (
-/obj/machinery/camera{
- c_tag = "Escape Arm Holding Area";
- dir = 4
- },
-/obj/item/radio/intercom{
- dir = 8;
- name = "Station Intercom (General)";
- pixel_x = -28
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/exit)
-"aPq" = (
-/turf/open/floor/plasteel,
-/area/hallway/secondary/exit)
-"aPr" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/turf/open/floor/plasteel,
-/area/hallway/secondary/exit)
-"aPs" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/exit)
-"aPt" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/obj/item/twohanded/required/kirbyplants{
- icon_state = "plant-20"
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/entry)
-"aPu" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/entry)
-"aPv" = (
-/obj/item/radio/intercom{
- name = "Station Intercom (General)";
- pixel_y = 20
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/entry)
-"aPx" = (
-/obj/structure/chair/comfy/beige{
- dir = 1
- },
-/turf/open/floor/plasteel/grimy,
-/area/hallway/secondary/entry)
-"aPy" = (
-/obj/machinery/vending/snack/random,
-/turf/open/floor/plasteel/dark,
-/area/hallway/secondary/entry)
-"aPz" = (
-/turf/closed/wall,
-/area/maintenance/port)
-"aPA" = (
-/turf/closed/wall,
-/area/crew_quarters/locker)
-"aPB" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"aPC" = (
-/obj/machinery/door/firedoor,
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"aPD" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/door/firedoor,
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"aPE" = (
-/obj/machinery/status_display/evac,
-/turf/closed/wall,
-/area/crew_quarters/locker)
-"aPF" = (
-/obj/effect/spawner/structure/window,
-/turf/open/floor/plating,
-/area/storage/art)
-"aPG" = (
-/turf/closed/wall,
-/area/storage/art)
-"aPH" = (
-/obj/machinery/door/airlock/public/glass{
- name = "Art Storage"
- },
-/turf/open/floor/plasteel,
-/area/storage/art)
-"aPI" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/port)
-"aPJ" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/closed/wall,
-/area/storage/art)
-"aPK" = (
-/turf/closed/wall,
-/area/storage/emergency/port)
-"aPL" = (
-/obj/structure/table,
-/turf/open/floor/plasteel,
-/area/hallway/primary/port)
-"aPM" = (
-/obj/structure/closet/emcloset,
-/turf/open/floor/plasteel,
-/area/hallway/primary/port)
-"aPN" = (
-/obj/structure/table,
-/obj/machinery/airalarm{
- dir = 1;
- pixel_y = -22
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/port)
-"aPO" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/hallway/primary/port)
-"aPQ" = (
-/turf/closed/wall,
-/area/storage/tools)
-"aPR" = (
-/turf/closed/wall/r_wall,
-/area/bridge)
-"aPS" = (
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/preopen{
- id = "bridge blast";
- name = "bridge blast door"
- },
-/turf/open/floor/plating,
-/area/bridge)
-"aPT" = (
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/machinery/door/poddoor/preopen{
- id = "bridge blast";
- name = "bridge blast door"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/bridge)
-"aPU" = (
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/preopen{
- id = "bridge blast";
- name = "bridge blast door"
- },
-/turf/open/floor/plating,
-/area/bridge)
-"aPV" = (
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/preopen{
- id = "bridge blast";
- name = "bridge blast door"
- },
-/turf/open/floor/plating,
-/area/bridge)
-"aPX" = (
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/preopen{
- id = "bridge blast";
- name = "bridge blast door"
- },
-/turf/open/floor/plating,
-/area/bridge)
-"aPY" = (
-/obj/structure/table,
-/obj/item/reagent_containers/food/condiment/saltshaker{
- pixel_x = -3;
- pixel_y = 9
- },
-/obj/item/reagent_containers/food/condiment/peppermill{
- dir = 1;
- pixel_x = 3;
- pixel_y = 9
- },
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"aPZ" = (
-/obj/structure/table,
-/obj/item/reagent_containers/food/drinks/britcup,
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"aQa" = (
-/obj/machinery/computer/arcade/battle,
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"aQb" = (
-/obj/structure/chair/sofa/right,
-/obj/structure/window{
- dir = 1
- },
-/obj/structure/sign/poster/contraband/pwr_game{
- pixel_x = -32
- },
-/obj/effect/landmark/start/assistant,
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"aQc" = (
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
-"aQd" = (
-/obj/structure/window,
-/obj/structure/chair/sofa/right{
- dir = 1
- },
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"aQe" = (
-/obj/effect/landmark/event_spawn,
-/obj/effect/landmark/xmastree,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"aQf" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/tile/green{
- dir = 1
- },
-/obj/effect/turf_decal/tile/green{
- dir = 4
- },
-/obj/effect/turf_decal/tile/green{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hydroponics)
-"aQg" = (
-/obj/effect/spawner/structure/window,
-/obj/machinery/door/poddoor/preopen{
- id = "barShutters";
- name = "privacy shutters"
- },
-/turf/open/floor/plating,
-/area/crew_quarters/bar)
-"aQh" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/tile/green{
- dir = 1
- },
-/obj/effect/turf_decal/tile/green,
-/obj/effect/turf_decal/tile/green{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hydroponics)
-"aQi" = (
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
-"aQj" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall,
-/area/crew_quarters/kitchen)
-"aQk" = (
-/obj/machinery/door/airlock{
- name = "Kitchen cold room";
- req_access_txt = "28"
- },
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/showroomfloor,
-/area/crew_quarters/kitchen)
-"aQl" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 8
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/entry)
-"aQm" = (
-/obj/effect/turf_decal/tile/green{
- dir = 1
- },
-/obj/effect/turf_decal/tile/green{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hydroponics)
-"aQn" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 5
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/entry)
-"aQo" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/entry)
-"aQp" = (
-/obj/machinery/light/small{
- dir = 8
- },
-/turf/open/floor/wood,
-/area/library)
-"aQq" = (
-/obj/machinery/light/small{
- dir = 4
- },
-/turf/open/floor/wood,
-/area/library)
-"aQr" = (
-/obj/machinery/light/small,
-/obj/structure/table/wood/fancy,
-/turf/open/floor/carpet,
-/area/library)
-"aQs" = (
-/obj/structure/bed,
-/obj/item/bedsheet/black,
-/turf/open/floor/carpet,
-/area/library)
-"aQu" = (
-/turf/open/floor/plasteel/chapel,
-/area/chapel/main)
-"aQv" = (
-/turf/open/floor/plasteel/chapel{
- dir = 8
- },
-/area/chapel/main)
-"aQw" = (
-/obj/structure/table/wood,
-/turf/open/floor/plasteel/dark,
-/area/chapel/main)
-"aQx" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/chapel,
-/area/chapel/main)
-"aQy" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/chapel{
- dir = 8
- },
-/area/chapel/main)
-"aQz" = (
-/obj/item/radio/intercom{
- broadcasting = 1;
- frequency = 1480;
- name = "Confessional Intercom";
- pixel_x = 25
- },
-/obj/structure/chair{
- dir = 1
- },
-/turf/open/floor/plasteel/dark,
-/area/chapel/main)
-"aQA" = (
-/obj/machinery/door/morgue{
- name = "Confession Booth"
- },
-/turf/open/floor/plasteel/dark,
-/area/chapel/main)
-"aQB" = (
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/exit)
-"aQC" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/hallway/secondary/exit)
-"aQD" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/entry)
-"aQE" = (
-/turf/open/floor/plating,
-/area/hallway/secondary/exit)
-"aQF" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/obj/machinery/door/airlock/external{
- name = "Security Escape Airlock";
- req_access_txt = "2"
- },
-/turf/open/floor/plating,
-/area/hallway/secondary/exit)
-"aQG" = (
-/obj/structure/sign/warning/vacuum/external{
- pixel_y = 32
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/entry)
-"aQH" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/entry)
-"aQI" = (
-/obj/machinery/door/firedoor,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/entry)
-"aQJ" = (
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/entry)
-"aQK" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 8
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/entry)
-"aQL" = (
-/obj/structure/closet,
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/plating,
-/area/maintenance/port)
-"aQM" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plating,
-/area/maintenance/port)
-"aQN" = (
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"aQO" = (
-/obj/structure/closet/wardrobe/white,
-/obj/item/clothing/suit/ghost_sheet,
-/obj/item/clothing/suit/ghost_sheet,
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"aQP" = (
-/obj/machinery/light_switch{
- pixel_y = 28
- },
-/obj/machinery/vending/cigarette,
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"aQR" = (
-/obj/machinery/vending/cola/pwr_game,
-/obj/structure/sign/poster/contraband/pwr_game{
- pixel_y = 32
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"aQS" = (
-/obj/machinery/vending/coffee,
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"aQT" = (
-/obj/structure/disposalpipe/segment{
- dir = 5
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"aQV" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/vending/clothing,
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"aQW" = (
-/obj/structure/closet/secure_closet/personal,
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"aQX" = (
-/obj/machinery/firealarm{
- pixel_y = 24
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/vending/kink,
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"aQY" = (
-/obj/structure/table,
-/obj/item/storage/toolbox/artistic{
- pixel_y = 10
- },
-/obj/item/storage/toolbox/artistic,
-/obj/item/storage/toolbox/electrical{
- pixel_y = -10
- },
-/turf/open/floor/plasteel,
-/area/storage/art)
-"aQZ" = (
-/obj/machinery/light/small{
- dir = 4
- },
-/obj/machinery/light_switch{
- pixel_x = 27
- },
-/turf/open/floor/plasteel,
-/area/storage/art)
-"aRa" = (
-/turf/open/floor/plasteel,
-/area/storage/art)
-"aRb" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/port)
-"aRc" = (
-/obj/machinery/door/airlock{
- name = "Port Emergency Storage"
- },
-/turf/open/floor/plating,
-/area/storage/emergency/port)
-"aRd" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/entry)
-"aRe" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/storage/tools)
-"aRf" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/public/glass{
- name = "Auxiliary Tool Storage";
- req_access_txt = "12"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/storage/tools)
-"aRg" = (
-/obj/machinery/vending/boozeomat,
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
-"aRh" = (
-/obj/machinery/light{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"aRi" = (
-/obj/machinery/computer/atmos_alert,
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aRj" = (
-/obj/structure/table/reinforced,
-/obj/item/storage/secure/briefcase,
-/obj/item/storage/box/PDAs{
- pixel_x = 4;
- pixel_y = 4
- },
-/obj/item/storage/box/ids,
-/turf/open/floor/plasteel,
-/area/bridge)
-"aRk" = (
-/obj/machinery/computer/monitor{
- name = "bridge power monitoring console"
- },
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aRl" = (
-/obj/machinery/computer/station_alert,
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aRm" = (
-/obj/machinery/computer/communications,
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aRn" = (
-/obj/machinery/computer/shuttle/labor,
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aRo" = (
-/obj/machinery/modular_computer/console/preset/command,
-/obj/effect/turf_decal/tile/green{
- dir = 1
- },
-/obj/effect/turf_decal/tile/green,
-/obj/effect/turf_decal/tile/green{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aRp" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/computer/shuttle/mining,
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aRq" = (
-/obj/machinery/computer/med_data,
-/obj/effect/turf_decal/tile/green,
-/obj/effect/turf_decal/tile/green{
- dir = 4
- },
-/obj/effect/turf_decal/tile/green{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aRr" = (
-/obj/machinery/computer/crew,
-/obj/effect/turf_decal/tile/green,
-/obj/effect/turf_decal/tile/green{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aRs" = (
-/obj/structure/table/reinforced,
-/obj/item/storage/toolbox/emergency,
-/obj/item/wrench,
-/obj/item/assembly/timer,
-/obj/item/assembly/signaler,
-/obj/item/assembly/signaler,
-/turf/open/floor/plasteel,
-/area/bridge)
-"aRt" = (
-/obj/machinery/light{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"aRu" = (
-/obj/machinery/light{
- dir = 8
- },
-/obj/structure/window,
-/obj/structure/sign/poster/official/high_class_martini{
- pixel_x = -32
- },
-/obj/effect/landmark/start/assistant,
-/obj/structure/chair/sofa/left{
- dir = 1
- },
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"aRx" = (
-/obj/machinery/computer/arcade/minesweeper,
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"aRy" = (
-/obj/structure/extinguisher_cabinet{
- pixel_x = -5;
- pixel_y = 30
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/kitchen)
-"aRz" = (
-/obj/machinery/light{
- dir = 4
- },
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
-"aRA" = (
-/obj/machinery/vending/dinnerware{
- contraband = list(/obj/item/kitchen/rollingpin = 2, /obj/item/kitchen/knife/butcher = 2, /obj/item/reagent_containers/food/condiment/flour = 4)
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/kitchen)
-"aRB" = (
-/obj/item/radio/intercom{
- pixel_y = 25
- },
-/obj/machinery/camera{
- c_tag = "Kitchen"
- },
-/obj/structure/closet/secure_closet/freezer/fridge,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/kitchen)
-"aRC" = (
-/obj/structure/sink/kitchen{
- pixel_y = 28
- },
-/obj/machinery/food_cart,
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/kitchen)
-"aRD" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/kitchen)
-"aRE" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/tile/green{
- dir = 1
- },
-/obj/effect/turf_decal/tile/green{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hydroponics)
-"aRF" = (
-/obj/structure/table,
-/obj/machinery/microwave{
- pixel_x = -3;
- pixel_y = 6
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/kitchen)
-"aRG" = (
-/obj/structure/table,
-/obj/machinery/microwave{
- pixel_x = -3;
- pixel_y = 6
- },
-/obj/machinery/airalarm{
- pixel_y = 24
- },
-/obj/machinery/light{
- dir = 1
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/kitchen)
-"aRH" = (
-/obj/structure/closet/secure_closet/freezer/kitchen,
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/kitchen)
-"aRI" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/tile/green,
-/obj/effect/turf_decal/tile/green{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hydroponics)
-"aRJ" = (
-/turf/open/floor/plasteel,
-/area/hydroponics)
-"aRK" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/power/apc{
- areastring = "/area/library";
- dir = 4;
- name = "Library APC";
- pixel_x = 24
- },
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
-"aRL" = (
-/obj/machinery/door/airlock/security/glass{
- name = "Holding Area";
- req_access_txt = "2"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/hallway/secondary/exit)
-"aRM" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/hallway/secondary/entry)
-"aRN" = (
-/obj/structure/bookcase/random/fiction,
-/turf/open/floor/wood,
-/area/library)
-"aRO" = (
-/obj/structure/displaycase/trophy,
-/turf/open/floor/wood,
-/area/library)
-"aRP" = (
-/obj/machinery/camera{
- c_tag = "Library South";
- dir = 8
- },
-/turf/open/floor/wood,
-/area/library)
-"aRQ" = (
-/obj/machinery/door/morgue{
- name = "Private Study";
- req_access_txt = "37"
- },
-/turf/open/floor/engine/cult,
-/area/library)
-"aRR" = (
-/obj/machinery/firealarm{
- dir = 4;
- pixel_x = -24
- },
-/turf/open/floor/plasteel/dark,
-/area/chapel/main)
-"aRS" = (
-/turf/open/floor/carpet,
-/area/chapel/main)
-"aRT" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/structure/rack,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/item/electronics/apc,
-/obj/item/electronics/airlock,
-/turf/open/floor/plasteel,
-/area/storage/tools)
-"aRU" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/hallway/secondary/exit)
-"aRV" = (
-/obj/machinery/power/apc{
- areastring = "/area/storage/tools";
- dir = 1;
- name = "Auxiliary Tool Storage APC";
- pixel_y = 24
- },
-/obj/machinery/firealarm{
- dir = 4;
- pixel_x = -24
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/structure/table,
-/obj/item/stack/sheet/glass/fifty,
-/obj/item/stack/rods/fifty,
-/turf/open/floor/plasteel,
-/area/storage/tools)
-"aRW" = (
-/obj/structure/sign/warning/docking,
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/hallway/secondary/exit)
-"aRX" = (
-/obj/machinery/light,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/white/corner,
-/area/hallway/secondary/entry)
-"aRY" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/white/corner,
-/area/hallway/secondary/entry)
-"aRZ" = (
-/turf/open/floor/plasteel/white/corner{
- dir = 8
- },
-/area/hallway/secondary/entry)
-"aSa" = (
-/obj/machinery/light_switch{
- pixel_y = 28
- },
-/obj/machinery/camera{
- c_tag = "Auxiliary Tool Storage"
- },
-/obj/structure/table,
-/obj/item/stack/sheet/metal/fifty,
-/obj/item/stack/sheet/metal/fifty,
-/obj/item/storage/box/lights/mixed,
-/turf/open/floor/plasteel,
-/area/storage/tools)
-"aSb" = (
-/obj/machinery/airalarm{
- dir = 1;
- pixel_y = -22
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/entry)
-"aSc" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/storage/tools)
-"aSd" = (
-/obj/machinery/firealarm{
- dir = 1;
- pixel_y = -24
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/entry)
-"aSe" = (
-/obj/machinery/light,
-/turf/open/floor/plasteel,
-/area/hallway/secondary/entry)
-"aSf" = (
-/obj/machinery/camera{
- c_tag = "Arrivals Hallway";
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/entry)
-"aSg" = (
-/turf/open/floor/plating,
-/area/maintenance/port)
-"aSh" = (
-/obj/structure/closet/wardrobe/mixed,
-/obj/item/radio/intercom{
- name = "Station Intercom (General)";
- pixel_x = -27
- },
-/obj/item/clothing/head/russobluecamohat,
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"aSi" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"aSk" = (
-/obj/structure/table,
-/obj/item/stack/cable_coil/random,
-/obj/item/stack/cable_coil/random,
-/obj/item/stack/cable_coil,
-/obj/item/paper_bin/construction,
-/obj/item/stack/cable_coil,
-/obj/item/pen/fourcolor,
-/turf/open/floor/plasteel,
-/area/storage/art)
-"aSl" = (
-/obj/machinery/light_switch{
- pixel_y = 28
- },
-/obj/item/storage/box/lights/mixed,
-/turf/open/floor/plating,
-/area/storage/emergency/port)
-"aSm" = (
-/turf/open/floor/plating,
-/area/storage/emergency/port)
-"aSn" = (
-/obj/item/extinguisher,
-/turf/open/floor/plating,
-/area/storage/emergency/port)
-"aSq" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/structure/chair/comfy/brown{
- dir = 8
- },
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"aSr" = (
-/turf/open/floor/plasteel,
-/area/storage/tools)
-"aSs" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/storage/tools)
-"aSt" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/storage/tools)
-"aSu" = (
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aSv" = (
-/obj/structure/table/reinforced,
-/obj/item/assembly/flash/handheld,
-/obj/item/assembly/flash/handheld,
-/turf/open/floor/plasteel,
-/area/bridge)
-"aSw" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aSx" = (
-/obj/structure/chair{
- dir = 1;
- name = "Engineering Station"
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aSy" = (
-/obj/structure/chair{
- dir = 1;
- name = "Command Station"
- },
-/obj/machinery/button/door{
- id = "bridge blast";
- name = "Bridge Blast Door Control";
- pixel_x = 28;
- pixel_y = -2;
- req_access_txt = "19"
- },
-/obj/machinery/keycard_auth{
- pixel_x = 29;
- pixel_y = 8
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aSz" = (
-/obj/structure/table/reinforced,
-/obj/item/aicard,
-/obj/item/multitool,
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aSA" = (
-/obj/effect/turf_decal/tile/green{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aSB" = (
-/obj/structure/table/reinforced,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aSC" = (
-/obj/effect/turf_decal/tile/green{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aSD" = (
-/obj/structure/chair{
- dir = 1;
- name = "Crew Station"
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aSE" = (
-/obj/structure/table/reinforced,
-/obj/item/storage/fancy/donut_box,
-/turf/open/floor/plasteel,
-/area/bridge)
-"aSF" = (
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/mob/living/carbon/monkey/punpun,
-/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
-"aSH" = (
-/obj/machinery/light{
- dir = 1
- },
-/obj/structure/table/wood/fancy,
-/obj/item/reagent_containers/food/condiment/peppermill{
- pixel_x = -9
- },
-/obj/item/reagent_containers/food/condiment/peppermill{
- dir = 1;
- pixel_x = -3
- },
-/obj/item/reagent_containers/food/condiment/saltshaker{
- pixel_x = -9;
- pixel_y = 9
- },
-/obj/item/reagent_containers/food/condiment/saltshaker{
- pixel_x = -3;
- pixel_y = 9
- },
-/obj/item/reagent_containers/food/condiment/pack/ketchup{
- pixel_x = 5
- },
-/obj/item/reagent_containers/food/condiment/pack/ketchup{
- pixel_x = 5
- },
-/obj/item/reagent_containers/food/condiment/pack/ketchup{
- pixel_x = 5
- },
-/obj/item/reagent_containers/food/condiment/pack/hotsauce{
- pixel_x = 10
- },
-/obj/item/reagent_containers/food/condiment/pack/hotsauce{
- pixel_x = 10
- },
-/obj/item/reagent_containers/food/condiment/pack/mustard{
- pixel_x = 10
- },
-/obj/item/reagent_containers/food/condiment/pack/mustard{
- pixel_x = 10
- },
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"aSI" = (
-/obj/machinery/door/airlock/public/glass{
- name = "Kitchen";
- req_access_txt = "28"
- },
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/kitchen)
-"aSJ" = (
-/obj/effect/landmark/start/cook,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/kitchen)
-"aSK" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/kitchen)
-"aSL" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 5
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/kitchen)
-"aSM" = (
-/obj/structure/disposalpipe/segment{
- dir = 5
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/kitchen)
-"aSN" = (
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 8
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/kitchen)
-"aSO" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/kitchen)
-"aSP" = (
-/obj/machinery/smartfridge,
-/turf/closed/wall,
-/area/crew_quarters/kitchen)
-"aSQ" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
- },
-/obj/effect/turf_decal/tile/green{
- dir = 1
- },
-/obj/effect/turf_decal/tile/green{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hydroponics)
-"aSR" = (
-/turf/open/floor/plasteel/dark,
-/area/hydroponics)
-"aSS" = (
-/obj/machinery/seed_extractor,
-/turf/open/floor/plasteel/dark,
-/area/hydroponics)
-"aST" = (
-/obj/machinery/biogenerator,
-/turf/open/floor/plasteel/dark,
-/area/hydroponics)
-"aSU" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
- },
-/obj/effect/turf_decal/tile/green,
-/obj/effect/turf_decal/tile/green{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hydroponics)
-"aSV" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"aSW" = (
-/obj/structure/extinguisher_cabinet{
- pixel_x = -27
- },
-/turf/open/floor/plasteel,
-/area/storage/tools)
-"aSX" = (
-/obj/machinery/power/apc{
- areastring = "/area/storage/art";
- dir = 1;
- name = "Art Storage";
- pixel_y = 24
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/port)
-"aSY" = (
-/obj/structure/table/reinforced,
-/obj/item/clothing/head/that,
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
-"aSZ" = (
-/obj/effect/landmark/start/bartender,
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
-"aTb" = (
-/obj/machinery/newscaster{
- pixel_y = 32
- },
-/turf/open/floor/wood,
-/area/library)
-"aTc" = (
-/obj/machinery/door/window/northright{
- dir = 8;
- name = "Library Desk Door";
- req_access_txt = "37"
- },
-/turf/open/floor/wood,
-/area/library)
-"aTd" = (
-/obj/structure/table/wood,
-/obj/machinery/computer/libraryconsole/bookmanagement,
-/obj/machinery/light_switch{
- pixel_y = 28
- },
-/turf/open/floor/wood,
-/area/library)
-"aTe" = (
-/obj/machinery/light{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/chapel/main)
-"aTf" = (
-/obj/structure/chair/stool,
-/turf/open/floor/plasteel/chapel,
-/area/chapel/main)
-"aTg" = (
-/obj/structure/chair/stool,
-/turf/open/floor/plasteel/chapel{
- dir = 8
- },
-/area/chapel/main)
-"aTh" = (
-/obj/structure/chair/stool,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/chapel,
-/area/chapel/main)
-"aTi" = (
-/obj/structure/chair/stool,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/landmark/start/assistant,
-/turf/open/floor/plasteel/chapel{
- dir = 8
- },
-/area/chapel/main)
-"aTj" = (
-/obj/machinery/light{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/chapel/main)
-"aTk" = (
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/exit)
-"aTl" = (
-/obj/machinery/vending/cola/random,
-/obj/machinery/status_display/evac{
- layer = 4;
- pixel_y = 32
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel/white/corner{
- dir = 1
- },
-/area/hallway/secondary/exit)
-"aTm" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/hallway/secondary/exit)
-"aTn" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/obj/machinery/door/airlock/external{
- name = "Escape Airlock"
- },
-/obj/structure/sign/warning/vacuum/external{
- pixel_y = 32
- },
-/turf/open/floor/plating,
-/area/hallway/secondary/exit)
-"aTo" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/obj/machinery/door/airlock/external{
- name = "Escape Airlock"
- },
-/turf/open/floor/plating,
-/area/hallway/secondary/exit)
-"aTr" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/status_display/evac{
- pixel_x = 32
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/entry)
-"aTs" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/closed/wall,
-/area/security/vacantoffice)
-"aTt" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall,
-/area/security/vacantoffice)
-"aTu" = (
-/obj/structure/disposalpipe/segment{
- dir = 6
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"aTv" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"aTw" = (
-/obj/structure/closet/wardrobe/green,
-/obj/machinery/light{
- dir = 8
- },
-/obj/item/clothing/under/costume/kilt,
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"aTy" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"aTz" = (
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/structure/window{
- dir = 1
- },
-/obj/structure/window{
- dir = 8
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/landmark/start/assistant,
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"aTB" = (
-/obj/structure/chair/stool{
- pixel_y = 8
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"aTC" = (
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/structure/window{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/effect/turf_decal/tile/red,
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"aTD" = (
-/obj/machinery/airalarm{
- dir = 8;
- pixel_x = 24
- },
-/obj/machinery/camera{
- c_tag = "Locker Room East";
- dir = 8
- },
-/obj/machinery/light{
- dir = 4
- },
-/obj/structure/table,
-/obj/item/reagent_containers/rag/towel/random,
-/obj/item/razor,
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"aTE" = (
-/obj/structure/table,
-/obj/item/hand_labeler,
-/turf/open/floor/plasteel,
-/area/storage/art)
-"aTF" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/obj/structure/table,
-/obj/item/camera_film,
-/obj/item/camera,
-/turf/open/floor/plasteel,
-/area/storage/art)
-"aTG" = (
-/obj/structure/table,
-/obj/item/storage/crayons,
-/obj/item/storage/crayons,
-/turf/open/floor/plasteel,
-/area/storage/art)
-"aTH" = (
-/obj/machinery/portable_atmospherics/canister/air,
-/turf/open/floor/plating,
-/area/storage/emergency/port)
-"aTI" = (
-/obj/machinery/space_heater,
-/turf/open/floor/plating,
-/area/storage/emergency/port)
-"aTJ" = (
-/obj/machinery/light/small,
-/obj/structure/reagent_dispensers/watertank,
-/turf/open/floor/plating,
-/area/storage/emergency/port)
-"aTK" = (
-/obj/structure/rack,
-/obj/item/tank/internals/emergency_oxygen,
-/obj/item/tank/internals/emergency_oxygen,
-/obj/item/clothing/mask/breath,
-/obj/item/clothing/mask/breath,
-/turf/open/floor/plating,
-/area/storage/emergency/port)
-"aTL" = (
-/obj/structure/table,
-/obj/item/storage/toolbox/artistic{
- icon_state = "yellow";
- item_state = "toolbox_yellow";
- name = "Cable Toolbox";
- pixel_y = 6
- },
-/obj/item/storage/toolbox/emergency,
-/turf/open/floor/plasteel,
-/area/storage/tools)
-"aTM" = (
-/obj/structure/table,
-/obj/item/reagent_containers/food/snacks/mint,
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/kitchen)
-"aTN" = (
-/obj/structure/table,
-/obj/item/reagent_containers/food/condiment/flour,
-/obj/item/kitchen/rollingpin,
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/kitchen)
-"aTO" = (
-/obj/structure/table,
-/obj/item/book/manual/chef_recipes,
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/kitchen)
-"aTP" = (
-/obj/structure/rack,
-/obj/item/clothing/gloves/color/fyellow,
-/obj/item/clothing/suit/hazardvest,
-/obj/item/multitool,
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/plasteel,
-/area/storage/tools)
-"aTQ" = (
-/turf/closed/wall,
-/area/bridge)
-"aTR" = (
-/obj/machinery/computer/prisoner/management,
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aTS" = (
-/obj/machinery/computer/secure_data,
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aTT" = (
-/obj/machinery/computer/security,
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aTU" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/turf/open/floor/plasteel,
-/area/bridge)
-"aTV" = (
-/obj/structure/table/reinforced,
-/obj/machinery/recharger,
-/turf/open/floor/plasteel,
-/area/bridge)
-"aTW" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aTX" = (
-/turf/open/floor/plasteel,
-/area/bridge)
-"aTY" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aTZ" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aUa" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/turf/open/floor/plasteel,
-/area/bridge)
-"aUb" = (
-/obj/machinery/modular_computer/console/preset/engineering,
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/obj/effect/turf_decal/tile/brown,
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aUc" = (
-/obj/structure/table/reinforced,
-/obj/item/storage/firstaid/regular,
-/turf/open/floor/plasteel,
-/area/bridge)
-"aUd" = (
-/obj/machinery/computer/security/mining,
-/obj/effect/turf_decal/tile/brown,
-/obj/effect/turf_decal/tile/brown{
- dir = 4
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aUe" = (
-/obj/machinery/computer/cargo/request,
-/obj/effect/turf_decal/tile/brown,
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aUg" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/chair/comfy/brown,
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"aUh" = (
-/obj/structure/table/reinforced,
-/obj/machinery/door/window/eastleft{
- name = "Hydroponics Desk";
- req_access_txt = "35"
- },
-/obj/machinery/door/firedoor,
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
-/area/crew_quarters/kitchen)
-"aUi" = (
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/hydroponics)
-"aUj" = (
-/obj/machinery/vending/hydronutrients,
-/turf/open/floor/plasteel/dark,
-/area/hydroponics)
-"aUk" = (
-/obj/machinery/vending/hydroseeds{
- slogan_delay = 700
- },
-/turf/open/floor/plasteel/dark,
-/area/hydroponics)
-"aUl" = (
-/obj/structure/chair/office/dark{
- dir = 8
- },
-/turf/open/floor/wood,
-/area/security/vacantoffice)
-"aUm" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/wood,
-/area/security/vacantoffice)
-"aUn" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"aUo" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"aUp" = (
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/structure/window{
- dir = 8
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"aUs" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"aUt" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"aUu" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"aUv" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"aUw" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
- },
-/obj/machinery/light/small,
-/obj/machinery/space_heater,
-/turf/open/floor/plasteel,
-/area/storage/tools)
-"aUx" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
-"aUy" = (
-/obj/machinery/camera{
- c_tag = "Vacant Office";
- dir = 4
- },
-/turf/open/floor/wood,
-/area/security/vacantoffice)
-"aUz" = (
-/obj/machinery/hydroponics/constructable,
-/obj/machinery/airalarm{
- dir = 8;
- pixel_x = 24
- },
-/turf/open/floor/plasteel/dark,
-/area/hydroponics)
-"aUA" = (
-/obj/structure/table/wood,
-/obj/item/flashlight/lamp,
-/turf/open/floor/wood,
-/area/security/vacantoffice)
-"aUB" = (
-/obj/structure/bookcase/random/adult,
-/turf/open/floor/wood,
-/area/library)
-"aUD" = (
-/obj/structure/table/wood,
-/obj/item/flashlight/lamp/green{
- pixel_x = 1;
- pixel_y = 5
- },
-/turf/open/floor/wood,
-/area/library)
-"aUE" = (
-/obj/machinery/libraryscanner,
-/turf/open/floor/wood,
-/area/library)
-"aUF" = (
-/obj/effect/landmark/start/librarian,
-/obj/structure/chair/office/dark,
-/turf/open/floor/wood,
-/area/library)
-"aUG" = (
-/obj/machinery/airalarm{
- dir = 4;
- pixel_x = -22
- },
-/turf/open/floor/plasteel/dark,
-/area/chapel/main)
-"aUH" = (
-/obj/structure/chair/stool,
-/obj/effect/landmark/start/assistant,
-/turf/open/floor/plasteel/chapel{
- dir = 4
- },
-/area/chapel/main)
-"aUI" = (
-/obj/structure/chair/stool,
-/turf/open/floor/plasteel/chapel{
- dir = 1
- },
-/area/chapel/main)
-"aUJ" = (
-/obj/structure/chair/stool,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/chapel{
- dir = 4
- },
-/area/chapel/main)
-"aUK" = (
-/obj/structure/chair/stool,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/chapel{
- dir = 1
- },
-/area/chapel/main)
-"aUL" = (
-/obj/machinery/computer/arcade,
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel/white/corner{
- dir = 1
- },
-/area/hallway/secondary/exit)
-"aUM" = (
-/obj/machinery/camera{
- c_tag = "Arrivals Bay 2";
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/entry)
-"aUN" = (
-/obj/structure/chair/office/dark{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/wood,
-/area/security/vacantoffice)
-"aUO" = (
-/turf/open/floor/wood,
-/area/security/vacantoffice)
-"aUQ" = (
-/obj/structure/table/wood,
-/turf/open/floor/wood,
-/area/security/vacantoffice)
-"aUR" = (
-/obj/structure/table/wood,
-/obj/item/pen/red,
-/turf/open/floor/wood,
-/area/security/vacantoffice)
-"aUS" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"aUT" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"aUU" = (
-/obj/structure/closet/wardrobe/grey,
-/obj/machinery/requests_console{
- department = "Locker Room";
- pixel_x = -32
- },
-/turf/open/floor/plasteel,
-/area/space)
-"aUW" = (
-/obj/structure/table/wood,
-/obj/item/flashlight/lamp/green,
-/turf/open/floor/wood,
-/area/security/vacantoffice)
-"aUX" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"aUY" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"aUZ" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"aVa" = (
-/obj/machinery/airalarm{
- dir = 4;
- pixel_x = -22
- },
-/obj/structure/closet/toolcloset,
-/turf/open/floor/plasteel,
-/area/storage/tools)
-"aVb" = (
-/obj/structure/sign/warning/electricshock{
- pixel_y = 32
- },
-/obj/machinery/door/firedoor,
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"aVc" = (
-/obj/structure/sign/warning/securearea{
- pixel_x = 32
- },
-/obj/machinery/door/firedoor,
-/obj/machinery/door/poddoor/preopen{
- id = "bridge blast";
- name = "bridge blast door"
- },
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
-/area/bridge)
-"aVd" = (
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/bridge)
-"aVe" = (
-/obj/machinery/camera{
- c_tag = "Bridge West";
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aVf" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aVg" = (
-/obj/structure/chair{
- dir = 1;
- name = "Security Station"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aVh" = (
-/obj/machinery/power/apc{
- areastring = "/area/hallway/primary/fore";
- dir = 8;
- name = "Fore Primary Hallway APC";
- pixel_x = -24
- },
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/machinery/camera{
- c_tag = "Fore Primary Hallway";
- dir = 4
- },
-/obj/effect/landmark/event_spawn,
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/fore)
-"aVi" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aVj" = (
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aVk" = (
-/obj/machinery/holopad,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aVl" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aVm" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aVn" = (
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aVo" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aVp" = (
-/obj/item/beacon,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aVq" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aVr" = (
-/obj/machinery/camera{
- c_tag = "Bridge East";
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aVs" = (
-/obj/structure/chair{
- dir = 1;
- name = "Logistics Station"
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aVt" = (
-/obj/structure/sign/warning/securearea{
- pixel_x = -32
- },
-/obj/machinery/door/firedoor,
-/obj/machinery/door/poddoor/preopen{
- id = "bridge blast";
- name = "bridge blast door"
- },
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
-/area/bridge)
-"aVu" = (
-/obj/structure/sign/warning/electricshock{
- pixel_y = 32
- },
-/obj/machinery/door/firedoor,
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"aVv" = (
-/obj/machinery/camera{
- c_tag = "Bridge East Entrance"
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"aVy" = (
-/obj/structure/table/reinforced,
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
-"aVz" = (
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/kitchen)
-"aVA" = (
-/obj/structure/table/reinforced,
-/obj/machinery/door/firedoor,
-/obj/item/reagent_containers/food/snacks/pie/cream,
-/obj/structure/noticeboard{
- desc = "Tickets for food orders will be placed here. The Chef should make the order and hand it to a waiter, waitress or just let the barkeep serve it.";
- name = "Food Orders";
- pixel_y = 26
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/kitchen)
-"aVB" = (
-/obj/structure/table,
-/obj/item/reagent_containers/food/condiment/enzyme{
- layer = 5
- },
-/obj/item/stack/packageWrap,
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/kitchen)
-"aVC" = (
-/obj/machinery/meter,
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"aVD" = (
-/obj/structure/table,
-/obj/item/reagent_containers/food/condiment/saltshaker{
- pixel_x = -9;
- pixel_y = 9
- },
-/obj/item/reagent_containers/food/condiment/saltshaker{
- pixel_x = -3;
- pixel_y = 9
- },
-/obj/item/reagent_containers/food/condiment/peppermill{
- dir = 1;
- pixel_x = -3
- },
-/obj/item/reagent_containers/food/condiment/peppermill{
- pixel_x = -9
- },
-/obj/item/sharpener{
- pixel_x = 10
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/kitchen)
-"aVE" = (
-/obj/structure/table,
-/obj/item/storage/box/donkpockets{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/item/reagent_containers/glass/beaker{
- pixel_x = 5
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/kitchen)
-"aVF" = (
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/kitchen)
-"aVH" = (
-/obj/machinery/processor,
-/obj/machinery/firealarm{
- dir = 8;
- pixel_x = 24
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/kitchen)
-"aVI" = (
-/obj/effect/turf_decal/tile/green{
- dir = 1
- },
-/obj/effect/turf_decal/tile/green{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hydroponics)
-"aVJ" = (
-/obj/machinery/light{
- dir = 8
- },
-/obj/machinery/hydroponics/constructable,
-/turf/open/floor/plasteel/dark,
-/area/hydroponics)
-"aVK" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 8
- },
-/obj/effect/landmark/start/botanist,
-/turf/open/floor/plasteel,
-/area/hydroponics)
-"aVL" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/sorting/mail/flip{
- dir = 2;
- sortType = 16
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"aVM" = (
-/obj/machinery/hydroponics/constructable,
-/obj/machinery/light{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/hydroponics)
-"aVN" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"aVO" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/airalarm{
- pixel_y = 25
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"aVQ" = (
-/obj/structure/chair/comfy/black{
- dir = 8
- },
-/turf/open/floor/wood,
-/area/library)
-"aVS" = (
-/obj/structure/table/wood,
-/obj/item/camera_film,
-/obj/item/camera_film,
-/obj/item/taperecorder,
-/obj/item/camera,
-/turf/open/floor/wood,
-/area/library)
-"aVT" = (
-/obj/structure/table/wood,
-/obj/item/paper_bin/bundlenatural{
- pixel_x = 6;
- pixel_y = 4
- },
-/obj/item/paper_bin{
- pixel_x = -6;
- pixel_y = 4
- },
-/obj/item/pen/fountain,
-/obj/item/pen/fourcolor,
-/turf/open/floor/wood,
-/area/library)
-"aVU" = (
-/obj/structure/chair/stool,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/chapel{
- dir = 8
- },
-/area/chapel/main)
-"aVV" = (
-/obj/machinery/camera{
- c_tag = "Chapel South";
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/chapel/main)
-"aVW" = (
-/obj/item/radio/intercom{
- pixel_x = -25
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel/white/corner{
- dir = 1
- },
-/area/hallway/secondary/exit)
-"aVX" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/exit)
-"aVY" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/carpet,
-/area/library)
-"aVZ" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/public/glass{
- name = "Library"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/carpet,
-/area/library)
-"aWa" = (
-/obj/structure/sign/warning/vacuum/external,
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/hallway/secondary/entry)
-"aWb" = (
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/carpet,
-/area/library)
-"aWc" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/entry)
-"aWd" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 8
- },
-/turf/open/floor/carpet,
-/area/library)
-"aWe" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/public/glass{
- name = "Chapel"
- },
-/turf/open/floor/carpet,
-/area/chapel/main)
-"aWf" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/wood,
-/area/security/vacantoffice)
-"aWg" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 5
- },
-/turf/open/floor/carpet,
-/area/chapel/main)
-"aWh" = (
-/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden,
-/obj/item/beacon,
-/turf/open/floor/plasteel,
-/area/hallway/secondary/exit)
-"aWi" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 8
- },
-/turf/open/floor/wood,
-/area/security/vacantoffice)
-"aWj" = (
-/obj/structure/grille,
-/obj/structure/window{
- dir = 8
- },
-/obj/structure/window,
-/turf/open/floor/plating,
-/area/maintenance/port)
-"aWk" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"aWl" = (
-/obj/structure/grille,
-/obj/structure/window{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"aWm" = (
-/obj/machinery/light{
- dir = 8
- },
-/obj/machinery/light_switch{
- pixel_x = -28
- },
-/turf/open/floor/wood,
-/area/security/vacantoffice)
-"aWn" = (
-/obj/structure/closet/wardrobe/black,
-/obj/item/clothing/shoes/jackboots,
-/obj/item/clothing/head/beret/black,
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"aWo" = (
-/obj/machinery/camera{
- c_tag = "Locker Room West";
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"aWp" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"aWq" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"aWr" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
- },
-/turf/open/floor/carpet,
-/area/security/vacantoffice)
-"aWs" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
- },
-/turf/open/floor/carpet,
-/area/security/vacantoffice)
-"aWt" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/wood,
-/area/security/vacantoffice)
-"aWu" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"aWv" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"aWx" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"aWy" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall,
-/area/crew_quarters/toilet/locker)
-"aWz" = (
-/obj/machinery/power/apc{
- areastring = "/area/storage/emergency/port";
- dir = 1;
- name = "Port Emergency Storage APC";
- pixel_y = 24
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"aWA" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"aWB" = (
-/obj/machinery/door/airlock/maintenance{
- name = "Detective Maintenance";
- req_access_txt = "4"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"aWC" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/closed/wall,
-/area/quartermaster/warehouse)
-"aWD" = (
-/obj/structure/reagent_dispensers/fueltank,
-/turf/open/floor/plasteel,
-/area/storage/tools)
-"aWE" = (
-/obj/machinery/computer/med_data,
-/obj/machinery/newscaster{
- pixel_y = 32
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/grimy,
-/area/security/detectives_office)
-"aWF" = (
-/obj/structure/closet/toolcloset,
-/turf/open/floor/plasteel,
-/area/storage/tools)
-"aWG" = (
-/obj/machinery/computer/secure_data,
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10
- },
-/turf/open/floor/plasteel/grimy,
-/area/security/detectives_office)
-"aWH" = (
-/obj/machinery/door/firedoor,
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"aWI" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/door/firedoor,
-/obj/machinery/door/poddoor/preopen{
- id = "bridge blast";
- name = "bridge blast door"
- },
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
-/area/bridge)
-"aWJ" = (
-/obj/structure/cable,
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/obj/machinery/door/airlock/command/glass{
- name = "Bridge";
- req_access_txt = "19"
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aWK" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/bridge)
-"aWL" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/obj/machinery/door/airlock/command/glass{
- name = "Bridge";
- req_access_txt = "19"
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aWM" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aWN" = (
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aWO" = (
-/obj/structure/extinguisher_cabinet{
- pixel_x = 5;
- pixel_y = -32
- },
-/obj/machinery/light,
-/obj/machinery/light_switch{
- pixel_x = -6;
- pixel_y = -22
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aWP" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue,
-/turf/open/floor/plasteel,
-/area/bridge)
-"aWQ" = (
-/obj/machinery/airalarm{
- dir = 1;
- pixel_y = -22
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aWR" = (
-/obj/structure/fireaxecabinet{
- pixel_y = -32
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aWS" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aWT" = (
-/obj/machinery/requests_console{
- announcementConsole = 1;
- department = "Bridge";
- departmentType = 5;
- name = "Bridge RC";
- pixel_y = -30
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aWU" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aWV" = (
-/obj/machinery/turretid{
- control_area = "/area/ai_monitored/turret_protected/ai_upload";
- name = "AI Upload turret control";
- pixel_y = -25
- },
-/obj/machinery/camera{
- c_tag = "Bridge Center";
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aWW" = (
-/obj/machinery/power/apc/highcap/five_k{
- areastring = "/area/bridge";
- name = "Bridge APC";
- pixel_y = -24
- },
-/obj/structure/cable,
-/obj/machinery/light,
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aWX" = (
-/obj/machinery/newscaster{
- pixel_y = -32
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aWY" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aWZ" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/bridge)
-"aXa" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/structure/disposalpipe/segment{
- dir = 6
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aXb" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/door/firedoor,
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/door/poddoor/preopen{
- id = "bridge blast";
- name = "bridge blast door"
- },
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
-/area/bridge)
-"aXc" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/obj/machinery/door/airlock/command/glass{
- name = "Bridge";
- req_access_txt = "19"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aXd" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/door/firedoor,
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"aXe" = (
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/structure/cable,
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/obj/machinery/door/airlock/command/glass{
- name = "Bridge";
- req_access_txt = "19"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aXf" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"aXg" = (
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"aXh" = (
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"aXi" = (
-/obj/structure/chair/sofa/right,
-/obj/structure/window{
- dir = 1
- },
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"aXj" = (
-/obj/structure/table/reinforced,
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/obj/item/paper_bin/bundlenatural{
- pixel_x = 6;
- pixel_y = 4
- },
-/obj/item/pen/fountain{
- pixel_x = 6
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/item/pen/fourcolor,
-/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
-"aXk" = (
-/obj/structure/table/reinforced,
-/obj/machinery/computer/security/telescreen/entertainment{
- pixel_x = 32
- },
-/obj/item/book/manual/wiki/barman_recipes,
-/obj/item/reagent_containers/rag,
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
-"aXl" = (
-/obj/machinery/door/window/southright{
- name = "Bar Door";
- req_one_access_txt = "25;28"
- },
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
-"aXm" = (
-/obj/effect/landmark/start/cook,
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/kitchen)
-"aXn" = (
-/obj/structure/table,
-/obj/machinery/reagentgrinder,
-/obj/machinery/requests_console{
- department = "Kitchen";
- departmentType = 2;
- pixel_x = 30
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/kitchen)
-"aXo" = (
-/obj/effect/turf_decal/tile/green,
-/obj/effect/turf_decal/tile/green{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hydroponics)
-"aXp" = (
-/obj/machinery/door/airlock{
- name = "Unisex Restrooms"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/toilet/locker)
-"aXq" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"aXr" = (
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/structure/window{
- dir = 8
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"aXt" = (
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"aXu" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/carpet,
-/area/library)
-"aXv" = (
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"aXw" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue,
-/obj/structure/window{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"aXy" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/public/glass{
- name = "Chapel"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/carpet,
-/area/chapel/main)
-"aXz" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/carpet,
-/area/chapel/main)
-"aXB" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 1
- },
-/turf/open/floor/carpet,
-/area/chapel/main)
-"aXC" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/exit)
-"aXD" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel/white/corner{
- dir = 1
- },
-/area/hallway/secondary/exit)
-"aXE" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
-/turf/closed/wall,
-/area/quartermaster/warehouse)
-"aXF" = (
-/obj/structure/sign/warning/fire{
- desc = "A sign that states the labeled room's number.";
- dir = 10;
- icon_state = "roomnum";
- name = "Room Number 6";
- pixel_y = 24
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/machinery/washing_machine{
- pixel_x = 7;
- pixel_y = 7
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
-"aXG" = (
-/obj/machinery/light{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/item/twohanded/required/kirbyplants{
- icon_state = "plant-05"
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/exit)
-"aXI" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/obj/machinery/door/airlock/external{
- name = "Port Docking Bay 2"
- },
-/turf/open/floor/plating,
-/area/hallway/secondary/entry)
-"aXJ" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/closed/wall,
-/area/quartermaster/warehouse)
-"aXK" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/closed/wall,
-/area/security/detectives_office)
-"aXL" = (
-/turf/open/floor/carpet,
-/area/security/vacantoffice)
-"aXM" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 1
- },
-/obj/machinery/door/airlock/maintenance{
- name = "Cargo Bay Warehouse Maintenance";
- req_access_txt = "31"
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"aXN" = (
-/obj/machinery/light{
- dir = 4
- },
-/obj/structure/filingcabinet/chestdrawer,
-/turf/open/floor/wood,
-/area/security/vacantoffice)
-"aXP" = (
-/obj/machinery/portable_atmospherics/canister/air,
-/turf/open/floor/plating,
-/area/maintenance/port)
-"aXQ" = (
-/turf/closed/wall,
-/area/crew_quarters/toilet/locker)
-"aXR" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/light{
- dir = 8
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"aXS" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 8
- },
-/turf/closed/wall,
-/area/hydroponics)
-"aXT" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/public/glass{
- name = "Library"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/carpet,
-/area/library)
-"aXU" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
- },
-/turf/open/floor/carpet,
-/area/library)
-"aXV" = (
-/obj/machinery/holopad,
-/turf/open/floor/carpet,
-/area/library)
-"aXW" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
- },
-/turf/open/floor/carpet,
-/area/chapel/main)
-"aXX" = (
-/obj/machinery/door/airlock/engineering/abandoned{
- abandoned = 0;
- name = "Vacant Office A";
- req_access_txt = "32"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/wood,
-/area/security/vacantoffice)
-"aXY" = (
-/obj/structure/chair/office/dark,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/wood,
-/area/security/vacantoffice)
-"aXZ" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/carpet,
-/area/security/vacantoffice)
-"aYb" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"aYc" = (
-/obj/machinery/power/apc{
- areastring = "/area/maintenance/port";
- dir = 8;
- name = "Port Maintenance APC";
- pixel_x = -27;
- pixel_y = 2
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/disposalpipe/segment{
- dir = 6
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"aYd" = (
-/obj/structure/chair/office/dark,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/wood,
-/area/security/vacantoffice)
-"aYe" = (
-/obj/machinery/light_switch{
- pixel_y = 28
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/toilet/locker)
-"aYf" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"aYg" = (
-/obj/effect/landmark/xeno_spawn,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/construction)
-"aYi" = (
-/obj/structure/closet/secure_closet/detective,
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/grimy,
-/area/security/detectives_office)
-"aYj" = (
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
-/obj/machinery/button/door{
- id = "kanyewest";
- name = "Privacy Shutters";
- pixel_y = 24
- },
-/obj/structure/rack,
-/obj/item/storage/briefcase,
-/turf/open/floor/plasteel/grimy,
-/area/security/detectives_office)
-"aYk" = (
-/obj/machinery/light,
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"aYl" = (
-/obj/effect/turf_decal/tile/blue,
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"aYm" = (
-/obj/machinery/door/firedoor,
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"aYn" = (
-/obj/machinery/camera{
- c_tag = "Bridge West Entrance";
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"aYo" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/poddoor/preopen{
- id = "bridge blast";
- name = "bridge blast door"
- },
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
-/area/bridge)
-"aYp" = (
-/obj/structure/cable,
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/bridge)
-"aYq" = (
-/obj/structure/closet/emcloset,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aYr" = (
-/obj/item/radio/intercom{
- name = "Station Intercom (General)";
- pixel_y = -29
- },
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aYs" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aYt" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6
- },
-/turf/closed/wall/r_wall,
-/area/ai_monitored/turret_protected/ai_upload)
-"aYu" = (
-/obj/machinery/firealarm{
- dir = 1;
- pixel_y = -24
- },
-/obj/structure/table,
-/obj/item/paper_bin{
- pixel_x = -3;
- pixel_y = 7
- },
-/obj/item/pen,
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aYv" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/closed/wall/r_wall,
-/area/ai_monitored/turret_protected/ai_upload)
-"aYw" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/highsecurity{
- name = "AI Upload Access";
- req_access_txt = "16"
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/ai_upload)
-"aYx" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
- },
-/turf/closed/wall/r_wall,
-/area/ai_monitored/turret_protected/ai_upload)
-"aYy" = (
-/obj/machinery/status_display/ai,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/closed/wall/r_wall,
-/area/ai_monitored/turret_protected/ai_upload)
-"aYz" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 5
- },
-/turf/closed/wall/r_wall,
-/area/ai_monitored/turret_protected/ai_upload)
-"aYA" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
- },
-/turf/closed/wall/r_wall,
-/area/ai_monitored/turret_protected/ai_upload)
-"aYB" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/closed/wall/r_wall,
-/area/ai_monitored/turret_protected/ai_upload)
-"aYC" = (
-/obj/machinery/firealarm{
- dir = 1;
- pixel_y = -24
- },
-/obj/structure/filingcabinet/filingcabinet,
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aYD" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/bridge)
-"aYE" = (
-/obj/machinery/door/firedoor,
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"aYF" = (
-/obj/machinery/power/apc{
- areastring = "/area/hallway/primary/central";
- name = "Central Hall APC";
- pixel_y = -24
- },
-/obj/structure/cable,
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"aYG" = (
-/obj/structure/disposalpipe/segment,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"aYJ" = (
-/obj/machinery/light_switch{
- pixel_y = -25
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/kitchen)
-"aYK" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock{
- name = "Kitchen";
- req_access_txt = "28"
- },
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/kitchen)
-"aYL" = (
-/obj/machinery/light,
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/kitchen)
-"aYM" = (
-/obj/structure/disposalpipe/segment{
- dir = 5
- },
-/obj/machinery/button/door{
- id = "kitchen";
- name = "Kitchen Shutters Control";
- pixel_x = -1;
- pixel_y = -24;
- req_access_txt = "28"
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/kitchen)
-"aYN" = (
-/obj/machinery/disposal/bin,
-/obj/structure/disposalpipe/trunk{
- dir = 8
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/kitchen)
-"aYO" = (
-/obj/item/reagent_containers/glass/bucket,
-/turf/open/floor/plasteel,
-/area/hydroponics)
-"aYQ" = (
-/obj/machinery/hydroponics/constructable,
-/obj/effect/turf_decal/tile/green{
- dir = 1
- },
-/obj/effect/turf_decal/tile/green{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hydroponics)
-"aYR" = (
-/obj/structure/chair/stool,
-/obj/effect/landmark/start/botanist,
-/turf/open/floor/plasteel,
-/area/hydroponics)
-"aYS" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/effect/turf_decal/tile/blue,
-/obj/structure/window,
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"aYT" = (
-/obj/machinery/camera{
- c_tag = "Hydroponics South";
- dir = 8
- },
-/obj/structure/reagent_dispensers/watertank/high,
-/turf/open/floor/plasteel,
-/area/hydroponics)
-"aYU" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"aYV" = (
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"aYW" = (
-/turf/open/floor/carpet,
-/area/library)
-"aYY" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/carpet,
-/area/library)
-"aYZ" = (
-/obj/structure/table/wood,
-/obj/item/storage/box/evidence,
-/obj/item/hand_labeler{
- pixel_x = 5
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/item/taperecorder,
-/turf/open/floor/plasteel/grimy,
-/area/security/detectives_office)
-"aZa" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
- },
-/turf/open/floor/plasteel/grimy,
-/area/security/detectives_office)
-"aZb" = (
-/obj/machinery/camera{
- c_tag = "Bar South";
- dir = 1
- },
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"aZc" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"aZd" = (
-/obj/machinery/firealarm{
- dir = 1;
- pixel_y = -24
- },
-/obj/item/twohanded/required/kirbyplants{
- icon_state = "plant-08"
- },
-/turf/open/floor/wood,
-/area/library)
-"aZe" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/public/glass{
- name = "Chapel"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/carpet,
-/area/chapel/main)
-"aZf" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/carpet,
-/area/chapel/main)
-"aZg" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/turf/open/floor/carpet,
-/area/chapel/main)
-"aZh" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/carpet,
-/area/chapel/main)
-"aZi" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/exit)
-"aZj" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel/white/corner{
- dir = 1
- },
-/area/hallway/secondary/exit)
-"aZk" = (
-/obj/machinery/holopad,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/hallway/secondary/exit)
-"aZl" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/exit)
-"aZm" = (
-/obj/machinery/camera{
- c_tag = "Escape Arm Airlocks";
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/exit)
-"aZn" = (
-/obj/structure/table/wood,
-/obj/item/folder/blue,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/wood,
-/area/security/vacantoffice)
-"aZp" = (
-/obj/structure/rack,
-/obj/item/electronics/apc,
-/obj/item/stock_parts/cell{
- maxcharge = 2000
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/quartermaster/warehouse)
-"aZq" = (
-/obj/machinery/button/door{
- id = "heads_meeting";
- name = "Security Shutters";
- pixel_y = 24
- },
-/turf/open/floor/wood,
-/area/bridge/meeting_room)
-"aZr" = (
-/obj/machinery/light/small{
- dir = 8
- },
-/obj/machinery/atmospherics/components/unary/tank/air{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"aZs" = (
-/obj/machinery/meter,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"aZt" = (
-/obj/structure/toilet/secret/low_loot{
- dir = 4
- },
-/obj/structure/mirror{
- pixel_y = 32
- },
-/obj/structure/sink{
- dir = 1;
- pixel_y = 25
- },
-/obj/machinery/button/door{
- id = "LockerShitter1";
- name = "Door Bolt Control";
- normaldoorcontrol = 1;
- pixel_x = 14;
- pixel_y = 38;
- specialfunctions = 4
- },
-/obj/machinery/light/small{
- dir = 8
- },
-/turf/open/floor/mineral/titanium/blue,
-/area/crew_quarters/toilet/locker)
-"aZu" = (
-/obj/machinery/photocopier,
-/turf/open/floor/wood,
-/area/bridge/meeting_room)
-"aZv" = (
-/obj/machinery/door/airlock{
- id_tag = "LockerShitter1";
- name = "Unit 1"
- },
-/turf/open/floor/mineral/titanium/blue,
-/area/crew_quarters/toilet/locker)
-"aZw" = (
-/obj/effect/landmark/blobstart,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/toilet/locker)
-"aZx" = (
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/obj/structure/window,
-/obj/structure/window{
- dir = 8
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"aZy" = (
-/obj/machinery/camera{
- c_tag = "Conference Room"
- },
-/turf/open/floor/wood,
-/area/bridge/meeting_room)
-"aZz" = (
-/obj/machinery/newscaster{
- pixel_y = 32
- },
-/turf/open/floor/wood,
-/area/bridge/meeting_room)
-"aZA" = (
-/obj/machinery/portable_atmospherics/scrubber,
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"aZB" = (
-/obj/machinery/portable_atmospherics/pump,
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"aZC" = (
-/obj/machinery/light_switch{
- pixel_y = 28
- },
-/obj/machinery/light{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/wood,
-/area/bridge/meeting_room)
-"aZD" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"aZE" = (
-/turf/closed/wall,
-/area/quartermaster/storage)
-"aZF" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall,
-/area/quartermaster/warehouse)
-"aZG" = (
-/obj/machinery/light_switch{
- pixel_y = 28
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/wood,
-/area/crew_quarters/heads/captain)
-"aZH" = (
-/obj/machinery/conveyor{
- dir = 4;
- id = "packageSort2"
- },
-/turf/open/floor/plating,
-/area/quartermaster/sorting)
-"aZI" = (
-/obj/structure/rack,
-/obj/item/stack/sheet/cardboard,
-/obj/item/stack/rods/fifty,
-/turf/open/floor/plasteel,
-/area/quartermaster/warehouse)
-"aZJ" = (
-/obj/structure/table/wood,
-/obj/item/camera/detective,
-/turf/open/floor/carpet,
-/area/security/detectives_office)
-"aZK" = (
-/turf/closed/wall,
-/area/quartermaster/sorting)
-"aZL" = (
-/obj/machinery/light_switch{
- pixel_x = 27
- },
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plasteel/grimy,
-/area/security/detectives_office)
-"aZM" = (
-/turf/closed/wall/r_wall,
-/area/bridge/meeting_room)
-"aZN" = (
-/obj/machinery/door/firedoor,
-/obj/effect/turf_decal/tile/blue,
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"aZO" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall,
-/area/bridge/meeting_room)
-"aZP" = (
-/turf/closed/wall,
-/area/bridge/meeting_room)
-"aZQ" = (
-/obj/machinery/door/airlock/command{
- name = "Conference Room";
- req_access_txt = "19"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/wood,
-/area/bridge/meeting_room)
-"aZR" = (
-/turf/open/floor/circuit,
-/area/ai_monitored/turret_protected/ai_upload)
-"aZS" = (
-/obj/machinery/porta_turret/ai{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/ai_upload)
-"aZT" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/ai_upload)
-"aZU" = (
-/obj/machinery/porta_turret/ai{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/ai_upload)
-"aZV" = (
-/turf/closed/wall/r_wall,
-/area/crew_quarters/heads/captain)
-"aZW" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall/r_wall,
-/area/crew_quarters/heads/captain)
-"aZX" = (
-/obj/machinery/door/airlock/command{
- name = "Captain's Office";
- req_access_txt = "20"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/wood,
-/area/crew_quarters/heads/captain)
-"aZY" = (
-/obj/machinery/door/firedoor,
-/obj/structure/disposalpipe/segment,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"aZZ" = (
-/obj/structure/chair/sofa{
- dir = 1
- },
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"baa" = (
-/obj/structure/chair/sofa/left{
- dir = 1
- },
-/obj/effect/landmark/start/assistant,
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"bab" = (
-/obj/machinery/light,
-/obj/machinery/firealarm{
- dir = 1;
- pixel_y = -24
- },
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"bac" = (
-/obj/structure/noticeboard{
- pixel_y = -27
- },
-/obj/structure/chair/sofa/right{
- dir = 1
- },
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"bad" = (
-/obj/machinery/light,
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"baf" = (
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 8
- },
-/turf/open/floor/wood,
-/area/crew_quarters/heads/captain)
-"bag" = (
-/obj/machinery/airalarm{
- dir = 1;
- pixel_y = -22
- },
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"bah" = (
-/obj/structure/extinguisher_cabinet{
- pixel_y = -30
- },
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"bai" = (
-/obj/machinery/light/small,
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"baj" = (
-/obj/structure/table/reinforced,
-/obj/item/storage/fancy/donut_box,
-/obj/machinery/door/firedoor,
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "kitchen";
- name = "kitchen shutters"
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/kitchen)
-"bak" = (
-/obj/structure/table/reinforced,
-/obj/machinery/door/firedoor,
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "kitchen";
- name = "kitchen shutters"
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/kitchen)
-"bal" = (
-/obj/structure/sink{
- dir = 8;
- pixel_x = -12;
- pixel_y = 2
- },
-/obj/machinery/firealarm{
- dir = 4;
- pixel_x = -24
- },
-/turf/open/floor/plasteel,
-/area/hydroponics)
-"bam" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/hydroponics)
-"ban" = (
-/obj/structure/table/reinforced,
-/obj/machinery/door/firedoor,
-/obj/machinery/door/window/northleft{
- name = "Hydroponics Desk";
- req_access_txt = "35"
- },
-/turf/open/floor/plasteel,
-/area/hydroponics)
-"bao" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/computer/security/telescreen/entertainment{
- pixel_y = 32
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
- },
-/turf/open/floor/carpet,
-/area/crew_quarters/heads/captain)
-"bap" = (
-/obj/structure/table/reinforced,
-/obj/machinery/door/firedoor,
-/obj/machinery/door/window/westright{
- dir = 1;
- name = "Hydroponics Desk";
- req_access_txt = "35"
- },
-/turf/open/floor/plasteel,
-/area/hydroponics)
-"baq" = (
-/obj/machinery/status_display/ai{
- pixel_y = 32
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/carpet,
-/area/crew_quarters/heads/captain)
-"bar" = (
-/obj/structure/chair{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"bas" = (
-/obj/machinery/vending/coffee,
-/turf/open/floor/wood,
-/area/library)
-"bat" = (
-/obj/structure/table/wood,
-/obj/item/pen/red,
-/turf/open/floor/wood,
-/area/library)
-"bau" = (
-/obj/structure/chair/comfy/black{
- dir = 4
- },
-/obj/machinery/airalarm{
- dir = 1;
- pixel_y = -22
- },
-/turf/open/floor/wood,
-/area/library)
-"bav" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
- },
-/turf/open/floor/wood,
-/area/library)
-"baw" = (
-/obj/machinery/camera{
- c_tag = "Locker Room Toilets";
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/toilet/locker)
-"bax" = (
-/obj/structure/chair/comfy/black{
- dir = 4
- },
-/turf/open/floor/wood,
-/area/library)
-"bay" = (
-/obj/structure/chair/comfy/black,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/carpet,
-/area/bridge/meeting_room)
-"baz" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
- },
-/turf/open/floor/plasteel/dark,
-/area/chapel/main)
-"baA" = (
-/turf/open/floor/carpet{
- icon_state = "carpetsymbol"
- },
-/area/chapel/main)
-"baB" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
- },
-/turf/open/floor/plasteel/dark,
-/area/chapel/main)
-"baC" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/exit)
-"baD" = (
-/obj/machinery/power/apc{
- areastring = "/area/hallway/secondary/exit";
- dir = 8;
- name = "Escape Hallway APC";
- pixel_x = -25
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel/white/corner{
- dir = 1
- },
-/area/hallway/secondary/exit)
-"baE" = (
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/hallway/secondary/exit)
-"baF" = (
-/obj/structure/closet/emcloset,
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/entry)
-"baG" = (
-/obj/structure/extinguisher_cabinet{
- pixel_x = 27
- },
-/obj/machinery/light{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/entry)
-"baH" = (
-/obj/structure/table/wood,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/wood,
-/area/security/vacantoffice)
-"baI" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/turf/open/floor/carpet,
-/area/bridge/meeting_room)
-"baJ" = (
-/obj/item/radio/intercom{
- name = "Station Intercom (General)";
- pixel_y = -29
- },
-/turf/open/floor/wood,
-/area/security/vacantoffice)
-"baK" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/carpet,
-/area/bridge/meeting_room)
-"baL" = (
-/obj/machinery/atmospherics/components/unary/tank/air{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"baM" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/power/apc{
- areastring = "/area/crew_quarters/toilet/locker";
- dir = 4;
- name = "Locker Restrooms APC";
- pixel_x = 27;
- pixel_y = 2
- },
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"baN" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"baO" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/sink{
- dir = 4;
- pixel_x = 11
- },
-/obj/structure/mirror{
- pixel_x = 28
- },
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/toilet/locker)
-"baP" = (
-/obj/structure/table/wood,
-/obj/item/storage/fancy/donut_box,
-/turf/open/floor/carpet,
-/area/crew_quarters/heads/captain)
-"baQ" = (
-/obj/structure/chair/comfy/brown{
- dir = 4
- },
-/turf/open/floor/carpet,
-/area/crew_quarters/heads/captain)
-"baR" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"baS" = (
-/turf/open/floor/plasteel,
-/area/quartermaster/warehouse)
-"baT" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"baU" = (
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plasteel/grimy,
-/area/security/detectives_office)
-"baV" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/security{
- name = "Detective's Office";
- req_access_txt = "4"
- },
-/turf/open/floor/plasteel/grimy,
-/area/security/detectives_office)
-"baW" = (
-/obj/item/storage/secure/safe{
- pixel_x = -23
- },
-/turf/open/floor/plasteel/grimy,
-/area/security/detectives_office)
-"baX" = (
-/obj/structure/chair/comfy/brown,
-/obj/effect/landmark/start/detective,
-/turf/open/floor/carpet,
-/area/security/detectives_office)
-"baY" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/closet/crate,
-/turf/open/floor/plasteel,
-/area/quartermaster/warehouse)
-"baZ" = (
-/obj/machinery/status_display/evac{
- layer = 4;
- pixel_y = 32
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"bba" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"bbb" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/entry)
-"bbc" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bbd" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bbe" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bbf" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bbg" = (
-/obj/effect/landmark/blobstart,
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bbh" = (
-/obj/machinery/disposal/bin,
-/obj/structure/disposalpipe/trunk{
- dir = 8
- },
-/turf/open/floor/wood,
-/area/bridge/meeting_room)
-"bbi" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment{
- dir = 6
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/wood,
-/area/bridge/meeting_room)
-"bbj" = (
-/obj/structure/table,
-/obj/item/aiModule/reset,
-/obj/machinery/light{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/ai_upload)
-"bbk" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall/r_wall,
-/area/ai_monitored/turret_protected/ai_upload)
-"bbl" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
-"bbm" = (
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/ai_upload)
-"bbn" = (
-/obj/structure/table,
-/obj/machinery/light{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/ai_upload)
-"bbo" = (
-/obj/machinery/disposal/bin,
-/obj/structure/disposalpipe/trunk{
- dir = 4
- },
-/turf/open/floor/wood,
-/area/crew_quarters/heads/captain)
-"bbp" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/closed/wall/r_wall,
-/area/ai_monitored/turret_protected/ai_upload)
-"bbq" = (
-/obj/machinery/light{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/toilet/locker)
-"bbs" = (
-/obj/structure/window/reinforced{
- dir = 8
- },
-/obj/machinery/light,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"bbt" = (
-/obj/structure/closet/crate,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/quartermaster/warehouse)
-"bbu" = (
-/obj/machinery/power/apc{
- areastring = "/area/crew_quarters/heads/captain";
- dir = 1;
- name = "Captain's Office APC";
- pixel_y = 24
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/turf/open/floor/wood,
-/area/crew_quarters/heads/captain)
-"bbv" = (
-/obj/machinery/status_display/evac{
- pixel_y = 32
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/turf/open/floor/carpet,
-/area/crew_quarters/heads/captain)
-"bbw" = (
-/turf/open/floor/wood,
-/area/crew_quarters/heads/captain)
-"bbx" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/public/glass{
- name = "Diner"
- },
-/turf/open/floor/plasteel/dark,
-/area/crew_quarters/bar)
-"bby" = (
-/obj/structure/sign/barsign,
-/turf/closed/wall,
-/area/crew_quarters/bar)
-"bbz" = (
-/turf/open/floor/plasteel/white/corner{
- dir = 1
- },
-/area/hallway/primary/starboard)
-"bbA" = (
-/obj/machinery/camera{
- c_tag = "Starboard Primary Hallway 2"
- },
-/obj/structure/sign/poster/contraband/eat{
- pixel_y = 32;
- poster_item_desc = "This poster promotes obesity, it also promotes giving the Chef a reason to keep their job."
- },
-/turf/open/floor/plasteel/white/corner{
- dir = 1
- },
-/area/hallway/primary/starboard)
-"bbB" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/public/glass{
- name = "Hydroponics";
- req_access_txt = "35"
- },
-/turf/open/floor/plasteel,
-/area/hydroponics)
-"bbC" = (
-/obj/structure/chair/comfy/black{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/carpet,
-/area/bridge/meeting_room)
-"bbD" = (
-/obj/effect/spawner/structure/window,
-/turf/open/floor/plating,
-/area/library)
-"bbE" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/closed/wall,
-/area/library)
-"bbF" = (
-/obj/effect/spawner/structure/window,
-/turf/open/floor/plating,
-/area/chapel/main)
-"bbG" = (
-/obj/machinery/firealarm{
- dir = 4;
- pixel_x = -24
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel/white/corner{
- dir = 1
- },
-/area/hallway/secondary/exit)
-"bbH" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/hallway/secondary/exit)
-"bbI" = (
-/obj/machinery/power/apc{
- areastring = "/area/security/vacantoffice";
- dir = 8;
- name = "Vacant Office APC";
- pixel_x = -24
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bbJ" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bbK" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bbL" = (
-/obj/machinery/door/airlock{
- id_tag = "LockerShitter2";
- name = "Unit 2"
- },
-/turf/open/floor/mineral/titanium/blue,
-/area/crew_quarters/toilet/locker)
-"bbM" = (
-/obj/item/book/manual/wiki/security_space_law,
-/obj/structure/table/wood,
-/turf/open/floor/carpet,
-/area/bridge/meeting_room)
-"bbO" = (
-/obj/machinery/washing_machine,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/locker)
-"bbP" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/warehouse)
-"bbQ" = (
-/obj/structure/table/wood,
-/obj/item/reagent_containers/food/drinks/bottle/whiskey{
- pixel_x = 3
- },
-/obj/item/lighter,
-/obj/item/restraints/handcuffs,
-/turf/open/floor/carpet,
-/area/security/detectives_office)
-"bbR" = (
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"bbS" = (
-/obj/structure/closet/crate,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/warehouse)
-"bbT" = (
-/obj/structure/table/wood,
-/obj/item/flashlight/lamp/green,
-/turf/open/floor/carpet,
-/area/security/detectives_office)
-"bbV" = (
-/obj/machinery/firealarm{
- dir = 4;
- pixel_x = -24
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bbW" = (
-/obj/machinery/door/poddoor/preopen{
- id = "heads_meeting";
- name = "privacy shutters"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/bridge/meeting_room)
-"bbX" = (
-/turf/open/floor/wood,
-/area/bridge/meeting_room)
-"bbY" = (
-/obj/machinery/recharger{
- pixel_y = 4
- },
-/obj/structure/table,
-/turf/open/floor/wood,
-/area/bridge/meeting_room)
-"bca" = (
-/turf/open/floor/carpet,
-/area/bridge/meeting_room)
-"bcb" = (
-/obj/structure/disposalpipe/segment{
- dir = 6
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"bcc" = (
-/obj/machinery/vending/snack/random,
-/turf/open/floor/wood,
-/area/bridge/meeting_room)
-"bcd" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/wood,
-/area/bridge/meeting_room)
-"bce" = (
-/obj/structure/table,
-/obj/item/aiModule/supplied/quarantine,
-/obj/machinery/camera/motion{
- dir = 4;
- network = list("aiupload")
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/ai_upload)
-"bcf" = (
-/obj/machinery/holopad,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/ai_upload)
-"bcg" = (
-/obj/structure/table,
-/obj/item/aiModule/supplied/freeform,
-/obj/structure/sign/plaques/kiddie{
- pixel_x = 32
- },
-/obj/machinery/camera/motion{
- dir = 8;
- network = list("aiupload")
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/ai_upload)
-"bch" = (
-/obj/machinery/vending/cigarette,
-/turf/open/floor/wood,
-/area/crew_quarters/heads/captain)
-"bci" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"bcj" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/junction{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"bck" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"bcl" = (
-/obj/structure/disposalpipe/segment,
-/turf/closed/wall,
-/area/maintenance/disposal)
-"bcm" = (
-/obj/structure/chair/comfy/brown{
- dir = 8
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/carpet,
-/area/crew_quarters/heads/captain)
-"bcn" = (
-/obj/structure/displaycase/captain,
-/turf/open/floor/wood,
-/area/crew_quarters/heads/captain)
-"bco" = (
-/obj/machinery/navbeacon{
- codes_txt = "patrol;next_patrol=Dorm";
- location = "HOP2"
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bcp" = (
-/obj/structure/sign/directions/evac{
- dir = 4;
- pixel_x = 32;
- pixel_y = 28
- },
-/obj/structure/sign/directions/security{
- dir = 1;
- pixel_x = 32;
- pixel_y = 36
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bcq" = (
-/obj/machinery/door/firedoor,
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"bcr" = (
-/obj/machinery/camera{
- c_tag = "Starboard Primary Hallway"
- },
-/obj/item/radio/intercom{
- pixel_y = 25
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"bcs" = (
-/obj/machinery/firealarm{
- pixel_y = 24
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"bct" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
- },
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/toilet/locker)
-"bcu" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/door/airlock/maintenance{
- name = "Locker Room Maintenance";
- req_access_txt = "12"
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bcv" = (
-/obj/structure/extinguisher_cabinet{
- pixel_x = -5;
- pixel_y = 30
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"bcw" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall,
-/area/crew_quarters/locker)
-"bcx" = (
-/obj/machinery/camera{
- c_tag = "Starboard Primary Hallway 5"
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"bcy" = (
-/obj/machinery/door/firedoor,
-/turf/open/floor/plasteel/white/corner{
- dir = 4
- },
-/area/hallway/secondary/exit)
-"bcz" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/hallway/secondary/exit)
-"bcA" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/exit)
-"bcB" = (
-/obj/structure/sign/warning/vacuum/external{
- pixel_x = 32
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/exit)
-"bcC" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/exit)
-"bcD" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/hallway/secondary/entry)
-"bcE" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/warehouse)
-"bcF" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/warehouse)
-"bcG" = (
-/obj/structure/table/wood,
-/obj/machinery/computer/security/wooden_tv,
-/turf/open/floor/carpet,
-/area/security/detectives_office)
-"bcH" = (
-/obj/structure/table/wood,
-/obj/item/storage/fancy/cigarettes,
-/obj/item/clothing/glasses/sunglasses,
-/turf/open/floor/carpet,
-/area/security/detectives_office)
-"bcI" = (
-/obj/structure/closet/emcloset,
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bcJ" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 8
- },
-/obj/structure/closet/crate/freezer,
-/obj/machinery/light/small{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/warehouse)
-"bcK" = (
-/obj/structure/rack,
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bcL" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/junction/flip{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bcM" = (
-/obj/structure/disposalpipe/segment{
- dir = 6
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bcN" = (
-/obj/item/folder/blue,
-/obj/structure/table/wood,
-/turf/open/floor/carpet,
-/area/bridge/meeting_room)
-"bcP" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 8
- },
-/turf/open/floor/carpet,
-/area/crew_quarters/heads/captain)
-"bcQ" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 5
- },
-/turf/open/floor/carpet,
-/area/crew_quarters/heads/captain)
-"bcR" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/warehouse)
-"bcS" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/warehouse)
-"bcU" = (
-/obj/structure/table/wood,
-/turf/open/floor/wood,
-/area/maintenance/bar)
-"bcV" = (
-/obj/machinery/airalarm{
- dir = 8;
- pixel_x = 24
- },
-/obj/structure/filingcabinet,
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plasteel/grimy,
-/area/security/detectives_office)
-"bcX" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/preopen{
- id = "heads_meeting";
- name = "privacy shutters"
- },
-/turf/open/floor/plating,
-/area/bridge/meeting_room)
-"bcY" = (
-/obj/item/hand_labeler,
-/obj/item/assembly/timer,
-/obj/structure/table,
-/turf/open/floor/wood,
-/area/bridge/meeting_room)
-"bcZ" = (
-/obj/structure/table/wood,
-/obj/item/radio/intercom{
- dir = 8;
- freerange = 1;
- name = "Station Intercom (Command)"
- },
-/turf/open/floor/carpet,
-/area/bridge/meeting_room)
-"bda" = (
-/obj/structure/chair/comfy/black{
- dir = 4
- },
-/turf/open/floor/carpet,
-/area/bridge/meeting_room)
-"bdb" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/white/side,
-/area/hallway/primary/starboard)
-"bdc" = (
-/obj/structure/extinguisher_cabinet{
- pixel_y = -30
- },
-/obj/machinery/light,
-/turf/open/floor/plasteel/white/corner,
-/area/hallway/primary/starboard)
-"bdd" = (
-/obj/machinery/vending/cola/random,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/wood,
-/area/bridge/meeting_room)
-"bde" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 4
- },
-/turf/open/floor/wood,
-/area/bridge/meeting_room)
-"bdf" = (
-/obj/machinery/airalarm{
- dir = 4;
- pixel_x = -23
- },
-/obj/machinery/porta_turret/ai{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/ai_upload)
-"bdg" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/circuit,
-/area/ai_monitored/turret_protected/ai_upload)
-"bdh" = (
-/obj/effect/turf_decal/bot_white,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/ai_upload)
-"bdi" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/vending/wardrobe/cap_wardrobe,
-/turf/open/floor/wood,
-/area/crew_quarters/heads/captain)
-"bdj" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 8
- },
-/turf/open/floor/wood,
-/area/crew_quarters/heads/captain)
-"bdk" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/wood,
-/area/crew_quarters/heads/captain)
-"bdl" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"bdm" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"bdn" = (
-/obj/machinery/camera{
- c_tag = "Central Hallway East";
- dir = 4
- },
-/obj/structure/disposalpipe/segment,
-/obj/machinery/status_display/evac{
- pixel_x = -32
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bdo" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"bdp" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"bdq" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"bdr" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"bds" = (
-/obj/machinery/camera{
- c_tag = "Starboard Primary Hallway 4";
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"bdt" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bdu" = (
-/obj/structure/disposalpipe/segment{
- dir = 5
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 5
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bdv" = (
-/obj/machinery/navbeacon{
- codes_txt = "patrol;next_patrol=HOP2";
- location = "Stbd"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"bdw" = (
-/obj/machinery/door/firedoor,
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/exit)
-"bdx" = (
-/obj/machinery/door/firedoor,
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"bdy" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/exit)
-"bdz" = (
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/hallway/secondary/exit)
-"bdA" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/obj/machinery/door/airlock/external{
- name = "Cargo Escape Airlock"
- },
-/turf/open/floor/plating,
-/area/hallway/secondary/exit)
-"bdB" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bdC" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/sorting/mail/flip{
- dir = 1;
- sortType = 1
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bdD" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bdE" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
- },
-/obj/structure/sign/poster/contraband/have_a_puff{
- pixel_y = -32
- },
-/turf/open/floor/plasteel/grimy,
-/area/security/detectives_office)
-"bdF" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
- },
-/turf/open/floor/carpet,
-/area/bridge/meeting_room)
-"bdG" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bdH" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bdI" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/carpet,
-/area/bridge/meeting_room)
-"bdJ" = (
-/obj/machinery/door/airlock{
- id_tag = "LockerShitter3";
- name = "Unit 3"
- },
-/turf/open/floor/mineral/titanium/blue,
-/area/crew_quarters/toilet/locker)
-"bdK" = (
-/obj/machinery/holopad,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/carpet,
-/area/bridge/meeting_room)
-"bdL" = (
-/obj/machinery/light,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/structure/bedsheetbin/color,
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/locker)
-"bdN" = (
-/obj/machinery/door/airlock/medical{
- name = "Morgue";
- req_access_txt = "6"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/dark,
-/area/medical/morgue)
-"bdO" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bdP" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall,
-/area/science/robotics/mechbay)
-"bdQ" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 5
- },
-/turf/closed/wall,
-/area/maintenance/disposal)
-"bdR" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bdS" = (
-/obj/structure/closet/crate/internals,
-/turf/open/floor/plasteel,
-/area/quartermaster/warehouse)
-"bdT" = (
-/obj/machinery/power/apc{
- areastring = "/area/maintenance/disposal";
- dir = 8;
- name = "Disposal APC";
- pixel_x = -24
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bdU" = (
-/obj/structure/closet/crate/medical,
-/turf/open/floor/plasteel,
-/area/quartermaster/warehouse)
-"bdX" = (
-/obj/item/storage/fancy/donut_box,
-/obj/structure/table,
-/turf/open/floor/wood,
-/area/bridge/meeting_room)
-"bdY" = (
-/obj/item/paper_bin{
- pixel_x = -3;
- pixel_y = 7
- },
-/obj/item/pen,
-/obj/structure/table/wood,
-/turf/open/floor/carpet,
-/area/bridge/meeting_room)
-"bdZ" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bea" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"beb" = (
-/obj/structure/table,
-/obj/item/aiModule/core/full/asimov,
-/obj/item/aiModule/core/freeformcore,
-/obj/machinery/door/window{
- base_state = "right";
- dir = 4;
- icon_state = "right";
- name = "Core Modules";
- req_access_txt = "20"
- },
-/obj/structure/window/reinforced,
-/obj/effect/spawner/lootdrop/aimodule_harmless,
-/obj/effect/spawner/lootdrop/aimodule_neutral,
-/obj/structure/window/reinforced{
- dir = 1
- },
-/obj/structure/window/reinforced{
- dir = 8
- },
-/obj/item/aiModule/core/full/custom,
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/ai_upload)
-"bec" = (
-/obj/machinery/light,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/ai_upload)
-"bed" = (
-/obj/machinery/power/apc/highcap/five_k{
- areastring = "/area/ai_monitored/turret_protected/ai_upload";
- name = "Upload APC";
- pixel_y = -24
- },
-/obj/structure/cable,
-/turf/open/floor/circuit,
-/area/ai_monitored/turret_protected/ai_upload)
-"bee" = (
-/obj/machinery/computer/upload/ai{
- dir = 1
- },
-/obj/machinery/flasher{
- id = "AI";
- pixel_y = -21
- },
-/turf/open/floor/circuit,
-/area/ai_monitored/turret_protected/ai_upload)
-"bef" = (
-/obj/machinery/computer/upload/borg{
- dir = 1
- },
-/obj/item/radio/intercom{
- broadcasting = 1;
- frequency = 1447;
- listening = 0;
- name = "Station Intercom (AI Private)";
- pixel_y = -29
- },
-/turf/open/floor/circuit,
-/area/ai_monitored/turret_protected/ai_upload)
-"beg" = (
-/obj/structure/table,
-/obj/item/aiModule/supplied/oxygen,
-/obj/item/aiModule/zeroth/oneHuman,
-/obj/machinery/door/window{
- dir = 8;
- name = "High-Risk Modules";
- req_access_txt = "20"
- },
-/obj/item/aiModule/reset/purge,
-/obj/structure/window/reinforced,
-/obj/effect/spawner/lootdrop/aimodule_harmful,
-/obj/structure/window/reinforced{
- dir = 1
- },
-/obj/structure/window/reinforced{
- dir = 4
- },
-/obj/item/aiModule/supplied/protectStation,
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/ai_upload)
-"beh" = (
-/obj/machinery/light,
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/ai_upload)
-"bej" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/wood,
-/area/crew_quarters/heads/captain)
-"bek" = (
-/obj/structure/chair,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/wood,
-/area/crew_quarters/heads/captain)
-"bel" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bem" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/carpet,
-/area/crew_quarters/heads/captain)
-"ben" = (
-/obj/structure/table/wood,
-/obj/machinery/camera{
- c_tag = "Captain's Office";
- dir = 8
- },
-/obj/item/storage/lockbox/medal,
-/turf/open/floor/wood,
-/area/crew_quarters/heads/captain)
-"beo" = (
-/obj/machinery/navbeacon{
- codes_txt = "patrol;next_patrol=Stbd";
- location = "HOP"
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bep" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/light{
- dir = 8
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"beq" = (
-/obj/structure/sign/directions/medical{
- dir = 4;
- pixel_x = 32;
- pixel_y = -24
- },
-/obj/structure/sign/directions/science{
- dir = 4;
- pixel_x = 32;
- pixel_y = -32
- },
-/obj/structure/sign/directions/engineering{
- pixel_x = 32;
- pixel_y = -40
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"ber" = (
-/obj/structure/extinguisher_cabinet{
- pixel_y = -30
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"bes" = (
-/obj/machinery/light,
-/obj/effect/turf_decal/tile/blue,
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"bet" = (
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"beu" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"bev" = (
-/obj/machinery/light,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/structure/sign/directions/evac{
- dir = 4;
- pixel_y = -25
- },
-/obj/structure/sign/directions/science{
- dir = 4;
- pixel_y = -32
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"bew" = (
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/structure/disposalpipe/segment{
- dir = 6
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bex" = (
-/obj/machinery/button/door{
- id = "qm_warehouse";
- name = "Warehouse Door Control";
- pixel_x = -1;
- pixel_y = -24;
- req_access_txt = "31"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6
- },
-/obj/structure/closet/crate,
-/turf/open/floor/plasteel,
-/area/quartermaster/warehouse)
-"bey" = (
-/turf/open/floor/plasteel/white/corner{
- dir = 8
- },
-/area/hallway/primary/starboard)
-"bez" = (
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"beA" = (
-/obj/machinery/conveyor{
- dir = 4;
- id = "packageSort2"
- },
-/obj/structure/plasticflaps,
-/turf/open/floor/plating,
-/area/quartermaster/sorting)
-"beB" = (
-/obj/machinery/camera{
- c_tag = "Starboard Primary Hallway 3";
- dir = 1
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"beC" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"beD" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
- },
-/obj/structure/closet/crate,
-/turf/open/floor/plasteel,
-/area/quartermaster/warehouse)
-"beE" = (
-/obj/machinery/light,
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"beF" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/sorting)
-"beG" = (
-/obj/machinery/door/firedoor,
-/obj/effect/turf_decal/tile/red,
-/turf/open/floor/plasteel,
-/area/hallway/secondary/exit)
-"beH" = (
-/obj/machinery/newscaster{
- pixel_y = -32
- },
-/obj/machinery/light,
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel/white/corner,
-/area/hallway/secondary/exit)
-"beI" = (
-/obj/structure/extinguisher_cabinet{
- pixel_x = 5;
- pixel_y = -32
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel/white/corner,
-/area/hallway/secondary/exit)
-"beJ" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/white/corner{
- dir = 8
- },
-/area/hallway/secondary/exit)
-"beK" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/obj/machinery/door/airlock/external{
- name = "Port Docking Bay 4"
- },
-/turf/open/floor/plating,
-/area/hallway/secondary/entry)
-"beL" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/obj/machinery/door/airlock/external{
- name = "Port Docking Bay 3"
- },
-/turf/open/floor/plating,
-/area/hallway/secondary/entry)
-"beM" = (
-/obj/structure/chair{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plasteel,
-/area/hallway/secondary/entry)
-"beN" = (
-/obj/item/radio/intercom{
- name = "Station Intercom (General)";
- pixel_y = -29
- },
-/obj/structure/chair{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plasteel,
-/area/hallway/secondary/entry)
-"beO" = (
-/turf/closed/wall,
-/area/maintenance/disposal)
-"beP" = (
-/obj/machinery/conveyor{
- dir = 4;
- id = "garbage"
- },
-/turf/open/floor/plating,
-/area/maintenance/disposal)
-"beQ" = (
-/obj/structure/disposaloutlet{
- dir = 4
- },
-/obj/structure/disposalpipe/trunk{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/disposal)
-"beR" = (
-/obj/machinery/conveyor{
- dir = 4;
- id = "garbage"
- },
-/obj/machinery/recycler,
-/obj/structure/sign/warning/securearea{
- name = "\improper STAY CLEAR HEAVY MACHINERY";
- pixel_y = 32
- },
-/turf/open/floor/plating,
-/area/maintenance/disposal)
-"beS" = (
-/obj/machinery/conveyor{
- dir = 4;
- id = "garbage"
- },
-/obj/machinery/light/small{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/maintenance/disposal)
-"beT" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/closed/wall,
-/area/maintenance/disposal)
-"beU" = (
-/obj/machinery/conveyor{
- dir = 6;
- id = "garbage"
- },
-/turf/open/floor/plating,
-/area/maintenance/disposal)
-"beV" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/closed/wall,
-/area/quartermaster/sorting)
-"beW" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/window/reinforced{
- dir = 1;
- layer = 2.9
- },
-/obj/machinery/firealarm{
- dir = 8;
- pixel_x = 24
- },
-/obj/structure/table/reinforced,
-/obj/item/stack/wrapping_paper{
- pixel_x = 3;
- pixel_y = 4
- },
-/obj/item/stack/packageWrap{
- pixel_x = -1;
- pixel_y = -1
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/sorting)
-"beX" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"beY" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/medical/morgue)
-"beZ" = (
-/obj/machinery/mineral/stacking_unit_console{
- machinedir = 8
- },
-/turf/closed/wall,
-/area/maintenance/disposal)
-"bfa" = (
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/toilet/locker)
-"bfb" = (
-/obj/structure/sign/warning/vacuum/external{
- pixel_y = 32
- },
-/obj/effect/landmark/event_spawn,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/chapel/main)
-"bfc" = (
-/obj/machinery/power/apc{
- areastring = "/area/crew_quarters/locker";
- dir = 1;
- name = "Locker Room APC";
- pixel_y = 24
- },
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bfd" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bfe" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bff" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bfg" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/item/stack/sheet/cardboard,
-/turf/open/floor/plasteel,
-/area/quartermaster/warehouse)
-"bfh" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/light/small,
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bfi" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/quartermaster/warehouse)
-"bfj" = (
-/obj/structure/disposalpipe/trunk,
-/obj/structure/disposaloutlet{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/quartermaster/sorting)
-"bfl" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/quartermaster/sorting)
-"bfm" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/quartermaster/office)
-"bfn" = (
-/obj/machinery/disposal/deliveryChute{
- dir = 8
- },
-/obj/structure/disposalpipe/trunk{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/quartermaster/sorting)
-"bfo" = (
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bfp" = (
-/obj/machinery/requests_console{
- announcementConsole = 1;
- department = "Bridge";
- departmentType = 5;
- name = "Bridge RC";
- pixel_y = -30
- },
-/obj/machinery/light,
-/turf/open/floor/wood,
-/area/bridge/meeting_room)
-"bfq" = (
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bfr" = (
-/obj/structure/noticeboard{
- dir = 8;
- pixel_x = 27
- },
-/obj/machinery/light{
- dir = 4
- },
-/turf/open/floor/wood,
-/area/bridge/meeting_room)
-"bfs" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 5
- },
-/turf/closed/wall/r_wall,
-/area/ai_monitored/turret_protected/ai_upload)
-"bft" = (
-/obj/machinery/status_display/ai,
-/turf/closed/wall/r_wall,
-/area/ai_monitored/turret_protected/ai_upload)
-"bfu" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 4
- },
-/turf/closed/wall/r_wall,
-/area/ai_monitored/turret_protected/ai_upload)
-"bfv" = (
-/turf/closed/wall/r_wall,
-/area/ai_monitored/turret_protected/ai_upload)
-"bfw" = (
-/obj/machinery/status_display/evac,
-/turf/closed/wall/r_wall,
-/area/ai_monitored/turret_protected/ai_upload)
-"bfx" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 8
- },
-/turf/closed/wall/r_wall,
-/area/ai_monitored/turret_protected/ai_upload)
-"bfy" = (
-/obj/structure/table/wood,
-/obj/item/paper_bin{
- pixel_x = -3;
- pixel_y = 7
- },
-/obj/item/pen,
-/obj/machinery/requests_console{
- announcementConsole = 1;
- department = "Captain's Desk";
- departmentType = 5;
- name = "Captain RC";
- pixel_x = -30
- },
-/turf/open/floor/wood,
-/area/crew_quarters/heads/captain)
-"bfz" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
-/turf/closed/wall/r_wall,
-/area/ai_monitored/turret_protected/ai_upload)
-"bfA" = (
-/obj/structure/table/wood,
-/obj/item/hand_tele,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/wood,
-/area/crew_quarters/heads/captain)
-"bfB" = (
-/obj/structure/table/wood,
-/obj/item/folder/blue,
-/obj/item/stamp/captain,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/wood,
-/area/crew_quarters/heads/captain)
-"bfC" = (
-/obj/structure/table/wood,
-/obj/item/flashlight/lamp/green,
-/turf/open/floor/wood,
-/area/crew_quarters/heads/captain)
-"bfD" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/wood,
-/area/crew_quarters/heads/captain)
-"bfE" = (
-/obj/structure/table/wood,
-/obj/item/pinpointer/nuke,
-/obj/item/disk/nuclear,
-/obj/item/storage/secure/safe{
- pixel_x = 35;
- pixel_y = 5
- },
-/obj/machinery/light{
- dir = 4
- },
-/turf/open/floor/wood,
-/area/crew_quarters/heads/captain)
-"bfF" = (
-/turf/closed/wall,
-/area/medical/chemistry)
-"bfG" = (
-/obj/effect/spawner/structure/window,
-/turf/open/floor/plating,
-/area/medical/medbay/central)
-"bfH" = (
-/obj/structure/sign/departments/medbay/alt,
-/turf/closed/wall,
-/area/medical/medbay/central)
-"bfI" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bfJ" = (
-/obj/machinery/door/firedoor,
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bfK" = (
-/turf/closed/wall,
-/area/security/checkpoint/medical)
-"bfL" = (
-/turf/closed/wall,
-/area/medical/morgue)
-"bfM" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bfN" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/turf/open/floor/plasteel,
-/area/quartermaster/sorting)
-"bfO" = (
-/obj/structure/closet/emcloset,
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"bfP" = (
-/obj/machinery/power/apc{
- areastring = "/area/hallway/primary/starboard";
- name = "Starboard Primary Hallway APC";
- pixel_y = -24
- },
-/obj/structure/cable,
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"bfQ" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/quartermaster/sorting)
-"bfR" = (
-/obj/structure/table/reinforced,
-/obj/item/hand_labeler{
- pixel_y = 8
- },
-/obj/item/hand_labeler{
- pixel_y = 8
- },
-/obj/item/storage/box,
-/obj/item/storage/box,
-/obj/item/storage/box,
-/turf/open/floor/plasteel,
-/area/quartermaster/sorting)
-"bfS" = (
-/turf/closed/wall,
-/area/storage/emergency/starboard)
-"bfT" = (
-/turf/closed/wall,
-/area/science/robotics/mechbay)
-"bfU" = (
-/obj/effect/turf_decal/loading_area{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"bfV" = (
-/turf/closed/wall/r_wall,
-/area/science/robotics/lab)
-"bfW" = (
-/obj/effect/turf_decal/tile/purple{
- dir = 1
- },
-/obj/effect/turf_decal/tile/purple,
-/obj/effect/turf_decal/tile/purple{
- dir = 8
- },
-/obj/item/twohanded/required/kirbyplants{
- icon_state = "plant-13"
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"bfX" = (
-/obj/effect/turf_decal/tile/purple,
-/obj/effect/turf_decal/tile/purple{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"bfY" = (
-/obj/item/radio/intercom{
- name = "Station Intercom (General)";
- pixel_y = -29
- },
-/obj/effect/turf_decal/tile/purple,
-/obj/effect/turf_decal/tile/purple{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"bfZ" = (
-/obj/structure/sign/warning/securearea{
- pixel_y = -32
- },
-/obj/effect/turf_decal/tile/purple,
-/obj/effect/turf_decal/tile/purple{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"bga" = (
-/obj/machinery/light,
-/obj/effect/turf_decal/tile/purple,
-/obj/effect/turf_decal/tile/purple{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"bgb" = (
-/obj/effect/turf_decal/tile/purple,
-/obj/effect/turf_decal/tile/purple{
- dir = 4
- },
-/obj/effect/turf_decal/tile/purple{
- dir = 8
- },
-/obj/item/twohanded/required/kirbyplants{
- icon_state = "plant-10"
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"bgc" = (
-/turf/closed/wall/r_wall,
-/area/science/lab)
-"bgd" = (
-/obj/machinery/airalarm{
- dir = 1;
- pixel_y = -22
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel/white/corner,
-/area/hallway/secondary/exit)
-"bge" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/hallway/secondary/exit)
-"bgf" = (
-/obj/structure/closet/emcloset,
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/exit)
-"bgg" = (
-/obj/structure/closet/emcloset,
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plasteel,
-/area/hallway/secondary/exit)
-"bgh" = (
-/obj/machinery/vending/cigarette,
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/entry)
-"bgi" = (
-/obj/machinery/camera{
- c_tag = "Arrivals Bay 3 & 4";
- dir = 1
- },
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/space_heater,
-/turf/open/floor/plasteel,
-/area/hallway/secondary/entry)
-"bgj" = (
-/obj/machinery/conveyor{
- dir = 8;
- id = "garbage"
- },
-/turf/open/floor/plating,
-/area/maintenance/disposal)
-"bgk" = (
-/obj/machinery/conveyor{
- dir = 10;
- id = "garbage"
- },
-/turf/open/floor/plating,
-/area/maintenance/disposal)
-"bgm" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bgn" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bgo" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/power/apc{
- areastring = "/area/science/robotics/mechbay";
- dir = 4;
- name = "Mech Bay APC";
- pixel_x = 26
- },
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/department/medical/morgue)
-"bgp" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"bgq" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bgr" = (
-/obj/machinery/door/airlock{
- id_tag = "LockerShitter4";
- name = "Unit 4"
- },
-/turf/open/floor/mineral/titanium/blue,
-/area/crew_quarters/toilet/locker)
-"bgt" = (
-/obj/effect/spawner/lootdrop/maintenance,
-/obj/structure/reagent_dispensers/watertank,
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bgu" = (
-/obj/machinery/button/door{
- id = "qm_warehouse";
- name = "Warehouse Door Control";
- pixel_x = -1;
- pixel_y = 24;
- req_access_txt = "31"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/quartermaster/storage)
-"bgv" = (
-/obj/structure/disposalpipe/segment,
-/turf/closed/wall,
-/area/quartermaster/office)
-"bgw" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bgy" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
- },
-/turf/closed/wall,
-/area/quartermaster/warehouse)
-"bgz" = (
-/obj/machinery/disposal/bin,
-/obj/structure/disposalpipe/trunk,
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"bgA" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/quartermaster/warehouse)
-"bgB" = (
-/obj/structure/disposalpipe/segment{
- dir = 6
- },
-/turf/closed/wall,
-/area/quartermaster/sorting)
-"bgC" = (
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/turf/closed/wall,
-/area/quartermaster/sorting)
-"bgD" = (
-/obj/machinery/conveyor_switch/oneway{
- id = "packageSort2"
- },
-/obj/machinery/camera{
- c_tag = "Cargo Delivery Office";
- dir = 4
- },
-/obj/machinery/requests_console{
- department = "Cargo Bay";
- departmentType = 2;
- pixel_x = -30
- },
-/obj/machinery/light{
- dir = 8
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/sorting)
-"bgE" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 8
- },
-/obj/machinery/airalarm{
- dir = 4;
- pixel_x = -23
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/sorting)
-"bgF" = (
-/obj/structure/table/glass,
-/obj/machinery/reagentgrinder,
-/obj/structure/extinguisher_cabinet{
- pixel_x = -27
- },
-/turf/open/floor/plasteel/white,
-/area/medical/chemistry)
-"bgG" = (
-/obj/machinery/camera{
- c_tag = "Central Hallway West";
- dir = 8
- },
-/obj/effect/turf_decal/tile/blue,
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bgH" = (
-/obj/machinery/door/window/eastright{
- dir = 1;
- name = "Bridge Delivery";
- req_access_txt = "19"
- },
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
-/area/bridge/meeting_room)
-"bgI" = (
-/obj/machinery/computer/slot_machine,
-/turf/open/floor/wood,
-/area/bridge/meeting_room)
-"bgJ" = (
-/obj/structure/reagent_dispensers/water_cooler,
-/turf/open/floor/wood,
-/area/bridge/meeting_room)
-"bgK" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/wood,
-/area/bridge/meeting_room)
-"bgL" = (
-/obj/machinery/computer/security/telescreen/entertainment{
- pixel_y = -32
- },
-/obj/machinery/space_heater,
-/turf/open/floor/wood,
-/area/bridge/meeting_room)
-"bgM" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/wood,
-/area/bridge/meeting_room)
-"bgN" = (
-/turf/open/floor/plasteel/dark,
-/area/engine/gravity_generator)
-"bgO" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall/r_wall,
-/area/engine/gravity_generator)
-"bgP" = (
-/obj/structure/disposalpipe/segment{
- dir = 6
- },
-/turf/open/floor/plasteel/white,
-/area/medical/chemistry)
-"bgQ" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 8
- },
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bgS" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/wood,
-/area/crew_quarters/heads/captain)
-"bgT" = (
-/obj/machinery/computer/communications{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/wood,
-/area/crew_quarters/heads/captain)
-"bgU" = (
-/obj/structure/chair/comfy/brown{
- dir = 4
- },
-/obj/effect/landmark/start/captain,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/wood,
-/area/crew_quarters/heads/captain)
-"bgV" = (
-/obj/structure/table/wood,
-/obj/item/book/manual/wiki/security_space_law,
-/obj/item/coin/plasma,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/wood,
-/area/crew_quarters/heads/captain)
-"bgW" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/holopad,
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/turf/open/floor/wood,
-/area/crew_quarters/heads/captain)
-"bgX" = (
-/obj/structure/table/wood,
-/obj/machinery/airalarm{
- dir = 8;
- pixel_x = 24
- },
-/obj/item/camera,
-/obj/item/storage/photo_album{
- pixel_y = -10
- },
-/turf/open/floor/wood,
-/area/crew_quarters/heads/captain)
-"bgY" = (
-/obj/machinery/firealarm{
- dir = 8;
- pixel_x = 24
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bgZ" = (
-/obj/machinery/power/apc{
- areastring = "/area/medical/chemistry";
- dir = 1;
- name = "Chemistry APC";
- pixel_y = 24
- },
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/turf/open/floor/plasteel/white,
-/area/medical/chemistry)
-"bha" = (
-/obj/machinery/vending/wardrobe/chem_wardrobe,
-/turf/open/floor/plasteel/white,
-/area/medical/chemistry)
-"bhb" = (
-/obj/machinery/chem_dispenser,
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/chemistry)
-"bhc" = (
-/obj/machinery/camera{
- c_tag = "Chemistry"
- },
-/obj/machinery/chem_heater,
-/turf/open/floor/plasteel/white,
-/area/medical/chemistry)
-"bhd" = (
-/obj/machinery/chem_master,
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/chemistry)
-"bhe" = (
-/obj/structure/chair,
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bhg" = (
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bhh" = (
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bhi" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/security/checkpoint/medical)
-"bhj" = (
-/obj/machinery/camera{
- c_tag = "Security Post - Medbay"
- },
-/obj/machinery/requests_console{
- department = "Security";
- departmentType = 5;
- pixel_y = 30
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/medical)
-"bhk" = (
-/obj/structure/table,
-/obj/item/paper_bin{
- pixel_x = 1;
- pixel_y = 9
- },
-/obj/item/pen,
-/obj/machinery/button/door{
- desc = "A remote control switch for the medbay foyer.";
- id = "MedbayFoyer";
- name = "Medbay Doors Control";
- normaldoorcontrol = 1;
- pixel_y = 26;
- req_access_txt = "5"
- },
-/obj/item/book/manual/wiki/security_space_law,
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/medical)
-"bhl" = (
-/obj/structure/filingcabinet,
-/obj/machinery/newscaster{
- pixel_x = 32
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/medical)
-"bhm" = (
-/turf/open/floor/plasteel/dark,
-/area/medical/morgue)
-"bhn" = (
-/obj/structure/table,
-/obj/item/storage/box/bodybags,
-/obj/item/pen,
-/obj/machinery/light/small{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/medical/morgue)
-"bho" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/bodycontainer/morgue{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/medical/morgue)
-"bhp" = (
-/obj/machinery/power/apc{
- areastring = "/area/medical/morgue";
- dir = 1;
- name = "Morgue APC";
- pixel_y = 24
- },
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/turf/open/floor/plasteel/dark,
-/area/medical/morgue)
-"bhq" = (
-/obj/machinery/light/small{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/medical/morgue)
-"bhr" = (
-/obj/machinery/door/airlock{
- name = "Starboard Emergency Storage"
- },
-/turf/open/floor/plating,
-/area/storage/emergency/starboard)
-"bhs" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/turf/open/floor/plasteel,
-/area/security/checkpoint/medical)
-"bht" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/research{
- name = "Mech Bay";
- req_access_txt = "29"
- },
-/turf/open/floor/plasteel,
-/area/science/robotics/mechbay)
-"bhu" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/poddoor/shutters{
- id = "Skynet_launch";
- name = "mech bay"
- },
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
-/area/science/robotics/mechbay)
-"bhv" = (
-/obj/machinery/airalarm{
- pixel_y = 25
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/science/robotics/lab)
-"bhw" = (
-/obj/machinery/computer/rdconsole/robotics,
-/turf/open/floor/plasteel/white,
-/area/science/robotics/lab)
-"bhx" = (
-/obj/machinery/requests_console{
- department = "Robotics";
- departmentType = 2;
- name = "Robotics RC";
- pixel_y = 30;
- receive_ore_updates = 1
- },
-/obj/machinery/light{
- dir = 1
- },
-/obj/machinery/rnd/production/circuit_imprinter,
-/turf/open/floor/plasteel/white,
-/area/science/robotics/lab)
-"bhy" = (
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "robotics";
- name = "robotics lab shutters"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/science/robotics/lab)
-"bhz" = (
-/obj/structure/table/reinforced,
-/obj/machinery/door/window/eastright{
- base_state = "left";
- dir = 2;
- icon_state = "left";
- name = "Robotics Desk";
- req_access_txt = "29"
- },
-/obj/item/paper_bin{
- pixel_x = -3;
- pixel_y = 7
- },
-/obj/item/pen,
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "robotics";
- name = "robotics lab shutters"
- },
-/turf/open/floor/plating,
-/area/science/robotics/lab)
-"bhA" = (
-/turf/closed/wall,
-/area/science/research)
-"bhB" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/obj/machinery/door/airlock/research{
- name = "Research Division Access";
- req_access_txt = "47"
- },
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"bhC" = (
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "rnd";
- name = "research lab shutters"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/science/lab)
-"bhD" = (
-/obj/structure/table/reinforced,
-/obj/machinery/door/window/southright{
- name = "Research and Development Desk";
- req_one_access_txt = "7;29"
- },
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "rnd";
- name = "research lab shutters"
- },
-/turf/open/floor/plating,
-/area/science/lab)
-"bhE" = (
-/obj/structure/table,
-/obj/item/stack/sheet/glass/fifty{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/item/stack/sheet/metal/fifty,
-/obj/item/clothing/glasses/welding,
-/turf/open/floor/plasteel/white,
-/area/science/lab)
-"bhF" = (
-/obj/structure/table,
-/obj/item/storage/toolbox/mechanical{
- pixel_x = 2;
- pixel_y = 3
- },
-/obj/item/storage/toolbox/mechanical{
- pixel_x = -2;
- pixel_y = -1
- },
-/obj/machinery/light{
- dir = 1
- },
-/turf/open/floor/plasteel/white,
-/area/science/lab)
-"bhG" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall,
-/area/maintenance/starboard)
-"bhH" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/starboard)
-"bhI" = (
-/obj/machinery/conveyor{
- id = "garbage"
- },
-/turf/open/floor/plating,
-/area/maintenance/disposal)
-"bhJ" = (
-/obj/structure/disposalpipe/trunk{
- dir = 2
- },
-/obj/machinery/disposal/deliveryChute{
- dir = 4
- },
-/obj/structure/window/reinforced,
-/obj/structure/window/reinforced{
- dir = 8
- },
-/obj/structure/window/reinforced{
- dir = 1
- },
-/obj/machinery/door/window{
- base_state = "right";
- dir = 4;
- icon_state = "right";
- layer = 3
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/disposal)
-"bhL" = (
-/obj/machinery/mineral/stacking_machine{
- input_dir = 1;
- stack_amt = 10
- },
-/turf/open/floor/plating,
-/area/maintenance/disposal)
-"bhM" = (
-/turf/open/floor/circuit,
-/area/science/robotics/mechbay)
-"bhN" = (
-/obj/structure/disposalpipe/segment{
- dir = 6
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bhO" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 5
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bhQ" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/closed/wall,
-/area/crew_quarters/toilet/locker)
-"bhR" = (
-/obj/structure/grille,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/structure/window{
- dir = 1
- },
-/obj/structure/window,
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bhS" = (
-/obj/structure/grille,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/structure/window{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bhT" = (
-/obj/structure/grille,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/structure/window,
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bhU" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"bhV" = (
-/obj/structure/disposalpipe/segment{
- dir = 6
- },
-/turf/open/floor/plasteel/white,
-/area/science/lab)
-"bhW" = (
-/obj/machinery/door/poddoor/shutters{
- id = "qm_warehouse";
- name = "warehouse shutters"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
-/area/quartermaster/warehouse)
-"bhX" = (
-/obj/structure/disposalpipe/sorting/wrap{
- dir = 1
- },
-/turf/closed/wall,
-/area/quartermaster/sorting)
-"bhY" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall,
-/area/quartermaster/storage)
-"bhZ" = (
-/obj/machinery/door/window/eastleft{
- icon_state = "right";
- name = "Incoming Mail";
- req_access_txt = "50"
- },
-/turf/open/floor/plating,
-/area/quartermaster/sorting)
-"bia" = (
-/obj/structure/disposalpipe/trunk{
- dir = 8
- },
-/obj/structure/disposaloutlet{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/quartermaster/sorting)
-"bib" = (
-/obj/machinery/disposal/bin,
-/obj/structure/disposalpipe/trunk{
- dir = 8
- },
-/obj/item/radio/intercom{
- name = "Station Intercom (General)";
- pixel_x = 29
- },
-/turf/open/floor/plasteel/white,
-/area/science/lab)
-"bic" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/quartermaster/storage)
-"bid" = (
-/obj/structure/extinguisher_cabinet{
- pixel_x = 27
- },
-/obj/effect/turf_decal/tile/blue,
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bie" = (
-/obj/machinery/navbeacon{
- codes_txt = "delivery;dir=1";
- dir = 1;
- freq = 1400;
- location = "Bridge"
- },
-/obj/structure/plasticflaps/opaque,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plasteel,
-/area/bridge/meeting_room)
-"bif" = (
-/obj/machinery/vending/cigarette,
-/turf/open/floor/wood,
-/area/bridge/meeting_room)
-"big" = (
-/obj/effect/turf_decal/bot_white,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/gravity_generator)
-"bih" = (
-/obj/effect/turf_decal/bot_white/right,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/gravity_generator)
-"bii" = (
-/obj/effect/turf_decal/bot_white/left,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/gravity_generator)
-"bij" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/closed/wall/r_wall,
-/area/engine/gravity_generator)
-"bik" = (
-/obj/item/radio/intercom{
- dir = 8;
- freerange = 1;
- name = "Station Intercom (Command)";
- pixel_x = -28
- },
-/obj/machinery/suit_storage_unit/captain,
-/obj/machinery/light{
- light_color = "#c9d3e8"
- },
-/turf/open/floor/wood,
-/area/crew_quarters/heads/captain)
-"bil" = (
-/obj/machinery/computer/card{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/wood,
-/area/crew_quarters/heads/captain)
-"bim" = (
-/obj/structure/table/wood,
-/obj/machinery/recharger,
-/obj/item/melee/chainofcommand,
-/turf/open/floor/wood,
-/area/crew_quarters/heads/captain)
-"bin" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel/white,
-/area/medical/chemistry)
-"bio" = (
-/obj/machinery/requests_console{
- department = "Chemistry";
- departmentType = 2;
- pixel_x = -30;
- receive_ore_updates = 1
- },
-/obj/machinery/light{
- dir = 8
- },
-/obj/structure/closet/secure_closet/chemical,
-/turf/open/floor/plasteel/white,
-/area/medical/chemistry)
-"bip" = (
-/turf/open/floor/plasteel/white,
-/area/medical/chemistry)
-"biq" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 5
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/storage)
-"bir" = (
-/obj/structure/table/reinforced,
-/obj/machinery/door/window/eastright{
- dir = 8;
- name = "Chemistry Desk";
- req_access_txt = "33"
- },
-/obj/machinery/door/firedoor,
-/turf/open/floor/plating,
-/area/medical/chemistry)
-"bis" = (
-/obj/structure/chair/office/light{
- dir = 4
- },
-/obj/effect/landmark/start/chemist,
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/chemistry)
-"bit" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/effect/turf_decal/tile/blue{
- alpha = 255;
- dir = 1
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"biu" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"biv" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"biw" = (
-/turf/open/floor/plasteel,
-/area/security/checkpoint/medical)
-"bix" = (
-/obj/structure/chair/office/dark{
- dir = 8
- },
-/obj/effect/landmark/start/depsec/medical,
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/medical)
-"biy" = (
-/obj/machinery/computer/secure_data{
- dir = 8
- },
-/obj/item/radio/intercom{
- pixel_x = 25
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/medical)
-"biz" = (
-/obj/structure/bodycontainer/morgue,
-/turf/open/floor/plasteel/dark,
-/area/medical/morgue)
-"biA" = (
-/obj/effect/spawner/structure/window,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/quartermaster/storage)
-"biB" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel/dark,
-/area/medical/morgue)
-"biC" = (
-/turf/open/floor/plating,
-/area/storage/emergency/starboard)
-"biD" = (
-/obj/item/storage/box/lights/mixed,
-/turf/open/floor/plating,
-/area/storage/emergency/starboard)
-"biE" = (
-/obj/machinery/light/small{
- dir = 1
- },
-/obj/item/extinguisher,
-/turf/open/floor/plating,
-/area/storage/emergency/starboard)
-"biF" = (
-/obj/structure/disposalpipe/sorting/mail/flip{
- dir = 1;
- sortType = 2
- },
-/obj/structure/noticeboard{
- pixel_y = 32
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"biG" = (
-/obj/machinery/mech_bay_recharge_port{
- dir = 2
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/turf/open/floor/plating,
-/area/science/robotics/mechbay)
-"biH" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/turf/open/floor/plasteel,
-/area/science/robotics/mechbay)
-"biI" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/circuit,
-/area/science/robotics/mechbay)
-"biJ" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/circuit,
-/area/science/robotics/mechbay)
-"biK" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment,
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/turf/open/floor/plasteel/white,
-/area/science/robotics/lab)
-"biL" = (
-/turf/open/floor/plasteel/white,
-/area/science/robotics/lab)
-"biN" = (
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/robotics/lab)
-"biO" = (
-/obj/machinery/camera{
- c_tag = "Robotics Lab";
- network = list("ss13","rd")
- },
-/obj/machinery/button/door{
- id = "robotics";
- name = "Shutters Control Button";
- pixel_x = 6;
- pixel_y = 24;
- req_access_txt = "29"
- },
-/obj/structure/table,
-/obj/item/book/manual/wiki/robotics_cyborgs{
- pixel_x = 2;
- pixel_y = 5
- },
-/obj/item/reagent_containers/glass/beaker/large,
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/robotics/lab)
-"biP" = (
-/obj/structure/filingcabinet/chestdrawer,
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/robotics/lab)
-"biQ" = (
-/obj/structure/chair/stool,
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/robotics/lab)
-"biR" = (
-/obj/structure/closet/emcloset,
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"biS" = (
-/obj/machinery/camera{
- c_tag = "Research Division Access"
- },
-/obj/structure/sink{
- dir = 4;
- pixel_x = 11
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"biT" = (
-/obj/structure/disposalpipe/segment{
- dir = 5
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"biU" = (
-/obj/effect/turf_decal/tile/purple{
- dir = 1
- },
-/obj/effect/turf_decal/tile/purple{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/lab)
-"biV" = (
-/obj/structure/chair/stool,
-/obj/effect/landmark/start/scientist,
-/obj/effect/turf_decal/tile/purple{
- dir = 1
- },
-/obj/effect/turf_decal/tile/purple{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/lab)
-"biW" = (
-/turf/open/floor/plasteel/white,
-/area/science/lab)
-"biX" = (
-/obj/machinery/camera{
- c_tag = "Research and Development";
- network = list("ss13","rd");
- pixel_x = 22
- },
-/obj/machinery/button/door{
- id = "rnd";
- name = "Shutters Control Button";
- pixel_x = -6;
- pixel_y = 24;
- req_access_txt = "47"
- },
-/obj/effect/turf_decal/tile/purple{
- dir = 1
- },
-/turf/open/floor/plasteel/white,
-/area/science/lab)
-"biY" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/starboard)
-"bja" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/maintenance/disposal)
-"bjb" = (
-/obj/machinery/conveyor{
- id = "garbage"
- },
-/obj/structure/sign/warning/vacuum{
- pixel_x = -32
- },
-/turf/open/floor/plating,
-/area/maintenance/disposal)
-"bjc" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/maintenance/disposal)
-"bjd" = (
-/obj/structure/disposalpipe/segment{
- dir = 5
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/maintenance/disposal)
-"bje" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/disposal)
-"bjf" = (
-/obj/machinery/door/airlock/maintenance{
- name = "Disposal Access";
- req_access_txt = "12"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/disposal)
-"bjg" = (
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bjh" = (
-/obj/structure/disposalpipe/segment{
- dir = 5
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bji" = (
-/obj/structure/closet/crate,
-/obj/effect/spawner/lootdrop/maintenance,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 5
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bjj" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bjk" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bjl" = (
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bjm" = (
-/obj/structure/table,
-/obj/item/hand_labeler,
-/obj/item/hand_labeler,
-/obj/machinery/requests_console{
- department = "Cargo Bay";
- departmentType = 2;
- pixel_y = 30
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/storage)
-"bjn" = (
-/obj/structure/table,
-/obj/item/clothing/head/soft,
-/obj/item/clothing/head/soft,
-/turf/open/floor/plasteel,
-/area/quartermaster/storage)
-"bjo" = (
-/obj/machinery/camera{
- c_tag = "Cargo Bay North"
- },
-/obj/machinery/vending/wardrobe/cargo_wardrobe,
-/turf/open/floor/plasteel,
-/area/quartermaster/storage)
-"bjp" = (
-/obj/structure/table,
-/obj/machinery/cell_charger,
-/obj/item/radio/intercom{
- pixel_y = 20
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/storage)
-"bjq" = (
-/obj/structure/extinguisher_cabinet{
- pixel_x = 5;
- pixel_y = 30
- },
-/obj/machinery/light{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/storage)
-"bjr" = (
-/turf/open/floor/plasteel,
-/area/quartermaster/storage)
-"bjs" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/mining/glass{
- name = "Cargo Office";
- req_access_txt = "50"
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/sorting)
-"bjt" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/quartermaster/storage)
-"bju" = (
-/obj/machinery/photocopier,
-/obj/item/radio/intercom{
- pixel_y = 20
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"bjv" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"bjw" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/sorting)
-"bjx" = (
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bjy" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
- },
-/obj/effect/turf_decal/bot_white/left,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/machinery/airalarm{
- dir = 8;
- pixel_x = 24
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/nuke_storage)
-"bjz" = (
-/turf/closed/wall/r_wall,
-/area/maintenance/central)
-"bjA" = (
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/plating,
-/area/maintenance/central)
-"bjB" = (
-/turf/open/floor/plating,
-/area/maintenance/central)
-"bjC" = (
-/obj/structure/closet/wardrobe/black,
-/turf/open/floor/plating,
-/area/maintenance/central)
-"bjE" = (
-/obj/machinery/airalarm{
- dir = 4;
- pixel_x = -22
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/wood,
-/area/bridge/meeting_room)
-"bjF" = (
-/obj/machinery/newscaster/security_unit{
- pixel_x = -32
- },
-/obj/machinery/keycard_auth{
- pixel_y = -24
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/wood,
-/area/crew_quarters/heads/captain)
-"bjG" = (
-/obj/machinery/door/window{
- base_state = "right";
- dir = 4;
- icon_state = "right";
- name = "Captain's Desk Door";
- req_access_txt = "20"
- },
-/turf/open/floor/wood,
-/area/crew_quarters/heads/captain)
-"bjH" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/firealarm{
- dir = 1;
- pixel_y = -24
- },
-/turf/open/floor/wood,
-/area/crew_quarters/heads/captain)
-"bjI" = (
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/turf/open/floor/wood,
-/area/crew_quarters/heads/captain)
-"bjJ" = (
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/turf/open/floor/wood,
-/area/crew_quarters/heads/captain)
-"bjK" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/turf/open/floor/plasteel/white,
-/area/medical/chemistry)
-"bjL" = (
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plasteel/white,
-/area/medical/chemistry)
-"bjM" = (
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/security/checkpoint/medical)
-"bjN" = (
-/obj/structure/reagent_dispensers/peppertank{
- pixel_x = 30
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/medical)
-"bjO" = (
-/obj/machinery/disposal/bin,
-/obj/structure/disposalpipe/trunk{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/medical/chemistry)
-"bjP" = (
-/obj/machinery/computer/mech_bay_power_console{
- dir = 8
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/turf/open/floor/plasteel,
-/area/science/robotics/mechbay)
-"bjQ" = (
-/obj/machinery/smartfridge/chemistry/preloaded,
-/turf/closed/wall,
-/area/medical/chemistry)
-"bjR" = (
-/obj/structure/table/glass,
-/obj/item/storage/box/beakers{
- pixel_x = 2;
- pixel_y = 2
- },
-/obj/item/storage/box/beakers{
- pixel_x = 2;
- pixel_y = 2
- },
-/obj/item/reagent_containers/glass/beaker/large,
-/obj/item/reagent_containers/glass/beaker/large,
-/obj/item/reagent_containers/dropper,
-/obj/item/reagent_containers/dropper,
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/chemistry)
-"bjS" = (
-/obj/machinery/holopad,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bjT" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bjU" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6
- },
-/obj/effect/turf_decal/tile/blue,
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bjV" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bjX" = (
-/obj/structure/table,
-/obj/machinery/recharger{
- pixel_y = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/medical)
-"bjY" = (
-/obj/machinery/airalarm{
- dir = 8;
- pixel_x = 24
- },
-/obj/machinery/light{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/medical)
-"bjZ" = (
-/obj/structure/closet/firecloset,
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"bka" = (
-/obj/structure/disposalpipe/segment,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/science/lab)
-"bkb" = (
-/obj/machinery/camera{
- c_tag = "Medbay Morgue";
- dir = 8;
- network = list("ss13","medbay")
- },
-/obj/machinery/airalarm{
- dir = 8;
- pixel_x = 24
- },
-/turf/open/floor/plasteel/dark,
-/area/medical/morgue)
-"bkc" = (
-/obj/machinery/space_heater,
-/turf/open/floor/plating,
-/area/storage/emergency/starboard)
-"bkd" = (
-/obj/machinery/portable_atmospherics/canister/air,
-/turf/open/floor/plating,
-/area/storage/emergency/starboard)
-"bkf" = (
-/obj/structure/reagent_dispensers/watertank,
-/turf/open/floor/plating,
-/area/storage/emergency/starboard)
-"bkh" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/circuit,
-/area/science/robotics/mechbay)
-"bki" = (
-/obj/structure/table/glass,
-/obj/item/reagent_containers/glass/beaker/large{
- pixel_x = -3;
- pixel_y = 3
- },
-/obj/item/reagent_containers/glass/beaker{
- pixel_x = 8;
- pixel_y = 2
- },
-/obj/item/reagent_containers/dropper,
-/obj/machinery/airalarm{
- dir = 8;
- pixel_x = 24
- },
-/turf/open/floor/plasteel/white,
-/area/science/lab)
-"bkj" = (
-/obj/structure/closet/emcloset,
-/obj/machinery/airalarm{
- pixel_y = 24
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/quartermaster/storage)
-"bkk" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 5
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plasteel/white,
-/area/science/robotics/lab)
-"bkm" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10
- },
-/turf/open/floor/plasteel/white,
-/area/science/robotics/lab)
-"bkn" = (
-/obj/machinery/light{
- dir = 1
- },
-/obj/machinery/firealarm{
- pixel_y = 27
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/storage)
-"bko" = (
-/obj/machinery/light{
- dir = 4
- },
-/obj/machinery/status_display/evac{
- pixel_x = 32
- },
-/obj/machinery/aug_manipulator,
-/turf/open/floor/plasteel/white,
-/area/science/robotics/lab)
-"bkp" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/storage)
-"bkq" = (
-/obj/structure/closet/firecloset,
-/obj/machinery/light{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"bkr" = (
-/obj/machinery/shower{
- dir = 8
- },
-/obj/structure/sign/warning/securearea{
- pixel_x = 32
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"bks" = (
-/obj/machinery/requests_console{
- department = "Science";
- departmentType = 2;
- name = "Science Requests Console";
- pixel_x = -30;
- receive_ore_updates = 1
- },
-/turf/open/floor/plasteel/white,
-/area/science/lab)
-"bkt" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/storage)
-"bku" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 5
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/storage)
-"bkv" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/lab)
-"bkw" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/light{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 1
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"bkx" = (
-/obj/machinery/status_display/supply,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/closed/wall,
-/area/quartermaster/sorting)
-"bky" = (
-/turf/closed/wall,
-/area/maintenance/starboard)
-"bkz" = (
-/obj/machinery/conveyor{
- id = "garbage"
- },
-/obj/machinery/door/poddoor/preopen{
- id = "Disposal Exit";
- name = "disposal exit vent"
- },
-/turf/open/floor/plating,
-/area/maintenance/disposal)
-"bkB" = (
-/obj/machinery/button/door{
- id = "Disposal Exit";
- name = "Disposal Vent Control";
- pixel_x = -25;
- pixel_y = 4;
- req_access_txt = "12"
- },
-/obj/machinery/button/massdriver{
- id = "trash";
- pixel_x = -26;
- pixel_y = -6
- },
-/obj/structure/chair/stool,
-/turf/open/floor/plating,
-/area/maintenance/disposal)
-"bkC" = (
-/obj/effect/decal/cleanable/oil,
-/obj/machinery/light_switch{
- pixel_x = 25
- },
-/turf/open/floor/plating,
-/area/maintenance/disposal)
-"bkD" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bkE" = (
-/obj/structure/sign/warning/docking,
-/turf/closed/wall/r_wall,
-/area/maintenance/port)
-"bkF" = (
-/turf/closed/wall/r_wall,
-/area/maintenance/port)
-"bkG" = (
-/obj/machinery/door/airlock/maintenance{
- name = "Cargo Bay Maintenance";
- req_access_txt = "31"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bkH" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
- },
-/turf/open/floor/plating,
-/area/quartermaster/sorting)
-"bkJ" = (
-/obj/effect/spawner/structure/window,
-/turf/open/floor/plating,
-/area/quartermaster/storage)
-"bkK" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/white,
-/area/medical/chemistry)
-"bkL" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/chem_heater,
-/turf/open/floor/plasteel/white,
-/area/medical/chemistry)
-"bkM" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"bkN" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/quartermaster/office)
-"bkO" = (
-/obj/machinery/light_switch{
- pixel_x = 28
- },
-/obj/item/screwdriver{
- pixel_y = 10
- },
-/obj/item/radio/off,
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/medical)
-"bkP" = (
-/obj/structure/disposalpipe/segment{
- dir = 6
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
- },
-/turf/open/floor/plasteel/dark,
-/area/medical/morgue)
-"bkQ" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/light/small,
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/turf/open/floor/plasteel/dark,
-/area/medical/morgue)
-"bkR" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/light_switch{
- pixel_y = -25
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/medical/morgue)
-"bkS" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bkT" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plating,
-/area/maintenance/central)
-"bkU" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/turf/open/floor/plasteel/dark,
-/area/medical/morgue)
-"bkV" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 5
- },
-/turf/open/floor/plating,
-/area/maintenance/fore/secondary)
-"bkW" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plating,
-/area/maintenance/central)
-"bkX" = (
-/obj/machinery/power/apc{
- areastring = "/area/bridge/meeting_room";
- dir = 4;
- name = "Conference Room APC";
- pixel_x = 24
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/turf/open/floor/plating,
-/area/maintenance/central)
-"bkY" = (
-/obj/effect/landmark/blobstart,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/turf/open/floor/plating,
-/area/maintenance/central)
-"bkZ" = (
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
-"bla" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/medical/morgue)
-"blb" = (
-/obj/machinery/door/airlock/command{
- name = "Captain's Quarters";
- req_access_txt = "20"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/carpet,
-/area/crew_quarters/heads/captain)
-"blc" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/closed/wall/r_wall,
-/area/crew_quarters/heads/captain)
-"bld" = (
-/obj/machinery/door/airlock/maintenance{
- name = "Captain's Office Maintenance";
- req_access_txt = "20"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/turf/open/floor/plating,
-/area/maintenance/central/secondary)
-"ble" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/extinguisher_cabinet{
- pixel_x = -27;
- pixel_y = 1
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"blf" = (
-/obj/structure/table/glass,
-/obj/item/storage/box/syringes,
-/obj/item/clothing/glasses/science{
- pixel_x = 2;
- pixel_y = 4
- },
-/obj/item/clothing/glasses/science,
-/obj/item/radio/intercom{
- dir = 8;
- name = "Station Intercom (General)";
- pixel_x = -28
- },
-/turf/open/floor/plasteel/white,
-/area/medical/chemistry)
-"blg" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/door/airlock/maintenance{
- name = "Morgue Maintenance";
- req_access_txt = "6"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/department/medical/morgue)
-"blh" = (
-/obj/structure/table/reinforced,
-/obj/machinery/door/window/eastright{
- base_state = "left";
- dir = 8;
- icon_state = "left";
- name = "Chemistry Desk";
- req_access_txt = "33"
- },
-/obj/machinery/door/firedoor,
-/turf/open/floor/plating,
-/area/medical/chemistry)
-"bli" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"blj" = (
-/obj/structure/table/reinforced,
-/obj/item/paper_bin{
- pixel_x = 1;
- pixel_y = 9
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"blk" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bll" = (
-/obj/structure/table/reinforced,
-/obj/item/folder/white,
-/obj/item/pen,
-/obj/item/reagent_containers/glass/bottle/epinephrine,
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"blm" = (
-/obj/structure/table/reinforced,
-/obj/item/reagent_containers/food/drinks/britcup{
- desc = "Kingston's personal cup."
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bln" = (
-/obj/structure/table/reinforced,
-/obj/machinery/camera{
- c_tag = "Medbay Foyer";
- dir = 8;
- network = list("ss13","medbay")
- },
-/obj/machinery/cell_charger,
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"blo" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/power/apc{
- areastring = "/area/storage/emergency/starboard";
- dir = 1;
- name = "Starboard Emergency Storage APC";
- pixel_y = 24
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/department/medical/morgue)
-"blp" = (
-/obj/machinery/power/apc{
- areastring = "/area/security/checkpoint/medical";
- dir = 8;
- name = "Medbay Security APC";
- pixel_x = -25
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/medical)
-"blq" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/structure/disposalpipe/sorting/mail{
- sortType = 9
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/department/medical/morgue)
-"blr" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/medical/morgue)
-"bls" = (
-/obj/structure/table,
-/obj/item/storage/toolbox/mechanical,
-/obj/item/crowbar/large,
-/obj/machinery/camera{
- c_tag = "Mech Bay";
- dir = 1
- },
-/obj/machinery/light,
-/turf/open/floor/plasteel,
-/area/science/robotics/mechbay)
-"blt" = (
-/obj/machinery/recharge_station,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/sign/poster/official/state_laws{
- pixel_y = -32
- },
-/obj/effect/landmark/start/cyborg,
-/turf/open/floor/plasteel,
-/area/science/robotics/mechbay)
-"blu" = (
-/obj/machinery/computer/mech_bay_power_console{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/turf/open/floor/plasteel,
-/area/science/robotics/mechbay)
-"blv" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/machinery/holopad,
-/turf/open/floor/plasteel,
-/area/science/robotics/mechbay)
-"blw" = (
-/turf/open/floor/mech_bay_recharge_floor,
-/area/science/robotics/mechbay)
-"blx" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/obj/machinery/airalarm{
- dir = 1;
- pixel_y = -22
- },
-/turf/open/floor/plasteel,
-/area/science/robotics/mechbay)
-"bly" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
- },
-/obj/machinery/light_switch{
- pixel_x = -23
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plasteel/white,
-/area/science/robotics/lab)
-"blz" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plasteel/white,
-/area/science/robotics/lab)
-"blA" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/science/robotics/lab)
-"blB" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/obj/machinery/mecha_part_fabricator,
-/turf/open/floor/plasteel,
-/area/science/robotics/lab)
-"blC" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/science/robotics/lab)
-"blD" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/closed/wall,
-/area/science/robotics/lab)
-"blE" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/structure/table,
-/obj/item/storage/firstaid/regular{
- empty = 1;
- name = "First-Aid (empty)"
- },
-/obj/item/storage/firstaid/regular{
- empty = 1;
- name = "First-Aid (empty)"
- },
-/obj/item/storage/firstaid/regular{
- empty = 1;
- name = "First-Aid (empty)"
- },
-/obj/item/healthanalyzer,
-/obj/item/healthanalyzer,
-/obj/item/healthanalyzer,
-/obj/item/radio/intercom{
- name = "Station Intercom (General)";
- pixel_x = 29
- },
-/turf/open/floor/plasteel,
-/area/science/robotics/lab)
-"blF" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/machinery/conveyor{
- dir = 4;
- id = "robo1"
- },
-/turf/open/floor/plasteel,
-/area/science/robotics/lab)
-"blG" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
- },
-/turf/open/floor/plasteel/white,
-/area/science/robotics/lab)
-"blH" = (
-/obj/structure/sink{
- dir = 4;
- pixel_x = 11
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"blI" = (
-/obj/machinery/rnd/destructive_analyzer,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/science/lab)
-"blJ" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/rnd/production/protolathe/department/science,
-/turf/open/floor/plasteel,
-/area/science/lab)
-"blK" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/science/lab)
-"blL" = (
-/obj/machinery/holopad,
-/turf/open/floor/plasteel/white,
-/area/science/lab)
-"blM" = (
-/obj/effect/turf_decal/bot,
-/obj/effect/landmark/start/cyborg,
-/turf/open/floor/plasteel,
-/area/science/robotics/lab)
-"blO" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/starboard)
-"blP" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/obj/machinery/door/airlock/external{
- req_access_txt = "13"
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard)
-"blQ" = (
-/obj/machinery/light/small{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"blR" = (
-/obj/structure/sign/warning/vacuum/external{
- pixel_y = 32
- },
-/obj/item/cigbutt,
-/turf/open/floor/plating,
-/area/maintenance/starboard)
-"blS" = (
-/obj/machinery/light/small{
- dir = 8
- },
-/obj/machinery/mass_driver{
- id = "trash"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/maintenance/disposal)
-"blU" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
- },
-/turf/open/floor/wood,
-/area/crew_quarters/dorms)
-"blV" = (
-/obj/machinery/light/small,
-/obj/machinery/space_heater,
-/turf/open/floor/plating,
-/area/maintenance/disposal)
-"blW" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/quartermaster/storage)
-"blX" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
- },
-/obj/machinery/door/airlock/research{
- name = "Research Division Access";
- req_access_txt = "47"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"blY" = (
-/obj/structure/closet/emcloset,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/storage)
-"blZ" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/science/lab)
-"bma" = (
-/obj/structure/table/glass,
-/obj/item/stock_parts/manipulator,
-/obj/item/stock_parts/capacitor,
-/obj/item/stock_parts/capacitor,
-/obj/item/stock_parts/manipulator,
-/obj/item/stock_parts/micro_laser,
-/obj/item/stock_parts/micro_laser,
-/obj/item/stack/cable_coil{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/item/stack/cable_coil,
-/obj/machinery/firealarm{
- dir = 8;
- pixel_x = 24
- },
-/turf/open/floor/plasteel/white,
-/area/science/lab)
-"bmb" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/storage)
-"bmc" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 5
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard)
-"bmd" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/disposalpipe/segment{
- dir = 5
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard)
-"bme" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard)
-"bmf" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"bmg" = (
-/obj/machinery/door/airlock/mining/glass{
- name = "Cargo Bay";
- req_access_txt = "31"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/storage)
-"bmh" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/storage)
-"bmi" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/sorting)
-"bmj" = (
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/quartermaster/storage)
-"bmk" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/mining/glass{
- name = "Delivery Office";
- req_access_txt = "50"
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/sorting)
-"bmm" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/door/firedoor,
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bmn" = (
-/obj/machinery/light{
- dir = 8
- },
-/obj/machinery/door/firedoor,
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/obj/machinery/status_display/supply{
- pixel_x = -28;
- pixel_y = 2
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bmo" = (
-/turf/closed/wall,
-/area/crew_quarters/heads/hop)
-"bmp" = (
-/obj/structure/rack,
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/plating,
-/area/maintenance/central)
-"bmq" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall,
-/area/crew_quarters/heads/hop)
-"bmr" = (
-/turf/closed/wall/r_wall,
-/area/crew_quarters/heads/hop)
-"bms" = (
-/obj/machinery/door/airlock/command{
- name = "Head of Personnel";
- req_access_txt = "57"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/wood,
-/area/crew_quarters/heads/hop)
-"bmt" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"bmx" = (
-/turf/closed/wall,
-/area/crew_quarters/heads/captain)
-"bmy" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/carpet,
-/area/crew_quarters/heads/captain)
-"bmz" = (
-/obj/machinery/light/small{
- dir = 1
- },
-/obj/structure/dresser,
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 8
- },
-/obj/item/card/id/captains_spare,
-/turf/open/floor/carpet,
-/area/crew_quarters/heads/captain)
-"bmA" = (
-/obj/machinery/door/airlock{
- name = "Private Restroom"
- },
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/heads/captain)
-"bmB" = (
-/obj/machinery/light_switch{
- pixel_y = 28
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
- },
-/turf/open/floor/carpet,
-/area/crew_quarters/heads/captain)
-"bmC" = (
-/obj/structure/sink{
- dir = 4;
- pixel_x = 11
- },
-/obj/structure/mirror{
- pixel_x = 28
- },
-/obj/machinery/light/small{
- dir = 1
- },
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/heads/captain)
-"bmD" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/maintenance/central/secondary)
-"bmE" = (
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bmF" = (
-/obj/structure/table/glass,
-/obj/machinery/airalarm{
- dir = 4;
- pixel_x = -22
- },
-/obj/item/stack/cable_coil/random,
-/obj/item/stack/cable_coil/random,
-/obj/item/stack/sheet/mineral/plasma,
-/obj/item/stack/sheet/mineral/plasma,
-/obj/item/reagent_containers/glass/bottle/epinephrine,
-/turf/open/floor/plasteel/white,
-/area/medical/chemistry)
-"bmG" = (
-/obj/machinery/chem_dispenser,
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/medical/chemistry)
-"bmH" = (
-/obj/machinery/door/airlock/mining/glass{
- name = "Cargo Bay";
- req_access_txt = "31"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/storage)
-"bmI" = (
-/obj/machinery/chem_master,
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/medical/chemistry)
-"bmJ" = (
-/obj/item/radio/intercom{
- broadcasting = 1;
- frequency = 1485;
- listening = 0;
- name = "Station Intercom (Medbay)";
- pixel_y = -30
- },
-/obj/machinery/light,
-/obj/machinery/firealarm{
- dir = 4;
- pixel_x = -24
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bmK" = (
-/obj/structure/table/reinforced,
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bmL" = (
-/obj/structure/chair/office/light{
- dir = 8
- },
-/obj/machinery/button/door{
- desc = "A remote control switch for the medbay foyer.";
- id = "MedbayFoyer";
- name = "Medbay Doors Control";
- normaldoorcontrol = 1;
- pixel_x = -26;
- req_access_txt = "5"
- },
-/obj/effect/landmark/start/medical_doctor,
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bmM" = (
-/obj/structure/chair/office/light{
- dir = 1
- },
-/obj/structure/sign/warning/nosmoking{
- pixel_x = 28
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bmN" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/medical)
-"bmO" = (
-/obj/structure/closet/secure_closet/security/med,
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/medical)
-"bmP" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"bmQ" = (
-/obj/item/stamp{
- pixel_x = -3;
- pixel_y = 3
- },
-/obj/item/stamp/denied{
- pixel_x = 4;
- pixel_y = -2
- },
-/obj/structure/table,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"bmR" = (
-/obj/structure/table,
-/obj/item/paper/guides/jobs/medical/morgue{
- pixel_x = 5;
- pixel_y = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/medical/morgue)
-"bmS" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bmT" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/turf/open/floor/plasteel/white,
-/area/medical/chemistry)
-"bmU" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/security/checkpoint/medical)
-"bmV" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/door/airlock/medical{
- name = "Morgue";
- req_access_txt = "6;5"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/dark,
-/area/medical/morgue)
-"bmW" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6
- },
-/turf/closed/wall,
-/area/medical/morgue)
-"bmX" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
-/turf/closed/wall/r_wall,
-/area/medical/genetics)
-"bmY" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/closed/wall,
-/area/medical/morgue)
-"bmZ" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/closed/wall/r_wall,
-/area/medical/genetics)
-"bna" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bnb" = (
-/obj/machinery/recharge_station,
-/obj/effect/landmark/start/cyborg,
-/turf/open/floor/plasteel,
-/area/science/robotics/mechbay)
-"bnc" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 4
- },
-/turf/closed/wall/r_wall,
-/area/science/robotics/mechbay)
-"bnf" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel/white,
-/area/science/lab)
-"bng" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel/white,
-/area/science/lab)
-"bnh" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel/white,
-/area/science/lab)
-"bni" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/structure/table,
-/obj/item/storage/toolbox/electrical{
- pixel_x = 1;
- pixel_y = 6
- },
-/obj/item/clothing/head/welding{
- pixel_x = -3;
- pixel_y = 5
- },
-/obj/item/clothing/glasses/welding,
-/obj/item/multitool{
- pixel_x = 3
- },
-/turf/open/floor/plasteel,
-/area/science/robotics/lab)
-"bnj" = (
-/obj/structure/table,
-/obj/item/stack/sheet/plasteel{
- amount = 10
- },
-/obj/item/stack/cable_coil,
-/obj/item/assembly/flash/handheld,
-/obj/item/assembly/flash/handheld,
-/obj/item/assembly/flash/handheld,
-/obj/item/assembly/flash/handheld,
-/obj/item/assembly/flash/handheld,
-/obj/item/assembly/flash/handheld,
-/obj/machinery/firealarm{
- dir = 8;
- pixel_x = 24
- },
-/turf/open/floor/plasteel,
-/area/science/robotics/lab)
-"bnk" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/effect/turf_decal/stripes/corner{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/lab)
-"bnl" = (
-/obj/item/stack/sheet/glass,
-/obj/structure/table/glass,
-/obj/item/stack/sheet/glass,
-/obj/item/stack/sheet/glass,
-/obj/item/stock_parts/matter_bin,
-/obj/item/stock_parts/matter_bin,
-/obj/machinery/light{
- dir = 4
- },
-/obj/item/stock_parts/scanning_module{
- pixel_x = 2;
- pixel_y = 3
- },
-/obj/item/stock_parts/scanning_module,
-/obj/machinery/power/apc{
- areastring = "/area/science/lab";
- dir = 4;
- name = "Research Lab APC";
- pixel_x = 26
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/turf/open/floor/plasteel/white,
-/area/science/lab)
-"bnm" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall/r_wall,
-/area/science/research)
-"bnn" = (
-/obj/machinery/computer/rdconsole/core{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/science/lab)
-"bno" = (
-/obj/item/reagent_containers/glass/beaker/sulphuric,
-/obj/machinery/rnd/production/circuit_imprinter/department/science,
-/turf/open/floor/plasteel,
-/area/science/lab)
-"bnp" = (
-/turf/open/floor/plasteel,
-/area/science/lab)
-"bnq" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/closed/wall,
-/area/science/lab)
-"bnr" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 5
- },
-/obj/structure/plasticflaps/opaque,
-/turf/open/floor/plating,
-/area/science/lab)
-"bns" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/closed/wall,
-/area/maintenance/starboard)
-"bnt" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"bnu" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10
- },
-/turf/closed/wall,
-/area/maintenance/starboard)
-"bnv" = (
-/obj/machinery/door/poddoor{
- id = "trash";
- name = "disposal bay door"
- },
-/obj/structure/fans/tiny,
-/turf/open/floor/plating,
-/area/maintenance/disposal)
-"bnw" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/storage)
-"bnx" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/disposalpipe/segment{
- dir = 5
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard)
-"bny" = (
-/obj/structure/disposalpipe/segment{
- dir = 5
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"bnz" = (
-/obj/effect/landmark/start/cargo_technician,
-/obj/structure/chair/office/dark{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"bnA" = (
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"bnB" = (
-/obj/structure/closet/wardrobe/chemistry_white,
-/obj/machinery/light_switch{
- pixel_x = -23
- },
-/turf/open/floor/plasteel/white,
-/area/medical/chemistry)
-"bnC" = (
-/obj/structure/chair,
-/turf/open/floor/plasteel/white,
-/area/medical/chemistry)
-"bnD" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/table,
-/obj/item/book/manual/wiki/chemistry,
-/obj/item/book/manual/wiki/chemistry{
- pixel_x = 3;
- pixel_y = 3
- },
-/turf/open/floor/plasteel/white,
-/area/medical/chemistry)
-"bnE" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"bnF" = (
-/obj/structure/sign/warning/nosmoking{
- pixel_y = 30
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bnG" = (
-/obj/item/paper_bin{
- pixel_x = -3;
- pixel_y = 7
- },
-/obj/item/clipboard,
-/obj/item/pen/red,
-/obj/structure/table,
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"bnH" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 5
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bnI" = (
-/obj/machinery/computer/cargo/request,
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"bnJ" = (
-/obj/machinery/firealarm{
- pixel_y = 27
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"bnK" = (
-/obj/effect/spawner/structure/window,
-/turf/open/floor/plating,
-/area/quartermaster/office)
-"bnL" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/sorting)
-"bnM" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bnN" = (
-/obj/effect/turf_decal/tile/red,
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bnO" = (
-/obj/machinery/newscaster/security_unit{
- pixel_y = 32
- },
-/obj/structure/filingcabinet/chestdrawer,
-/turf/open/floor/plasteel,
-/area/crew_quarters/heads/hop)
-"bnP" = (
-/obj/machinery/button/flasher{
- id = "hopflash";
- pixel_x = 6;
- pixel_y = 36
- },
-/obj/machinery/button/door{
- id = "hop";
- name = "Privacy Shutters Control";
- pixel_x = 6;
- pixel_y = 25;
- req_access_txt = "57"
- },
-/obj/machinery/button/door{
- id = "hopqueue";
- name = "Queue Shutters Control";
- pixel_x = -4;
- pixel_y = 25;
- req_access_txt = "57"
- },
-/obj/machinery/light_switch{
- pixel_x = -4;
- pixel_y = 36
- },
-/obj/machinery/pdapainter,
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/heads/hop)
-"bnQ" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/bed/dogbed/ian,
-/mob/living/simple_animal/pet/dog/corgi/Ian{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/heads/hop)
-"bnR" = (
-/obj/machinery/computer/security/telescreen/vault{
- pixel_y = 30
- },
-/obj/machinery/disposal/bin,
-/obj/structure/disposalpipe/trunk,
-/turf/open/floor/plasteel,
-/area/crew_quarters/heads/hop)
-"bnS" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/crew_quarters/heads/hop)
-"bnT" = (
-/obj/structure/sign/warning/electricshock{
- pixel_x = -32
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/engine/gravity_generator)
-"bnV" = (
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/engine/gravity_generator)
-"bnW" = (
-/obj/structure/sign/warning/radiation/rad_area{
- pixel_x = 32
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/engine/gravity_generator)
-"bnX" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/carpet,
-/area/crew_quarters/heads/captain)
-"bnY" = (
-/obj/structure/bed,
-/obj/item/bedsheet/captain,
-/obj/machinery/airalarm{
- dir = 4;
- pixel_x = -22
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/carpet,
-/area/crew_quarters/heads/captain)
-"bnZ" = (
-/obj/structure/table/wood,
-/obj/item/flashlight/lamp/green,
-/obj/item/pen/fountain/captain,
-/turf/open/floor/carpet,
-/area/crew_quarters/heads/captain)
-"boa" = (
-/obj/structure/toilet{
- contents = newlist(/obj/item/toy/snappop/phoenix);
- dir = 4
- },
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/heads/captain)
-"bob" = (
-/obj/structure/table/glass,
-/obj/item/grenade/chem_grenade,
-/obj/item/grenade/chem_grenade,
-/obj/item/grenade/chem_grenade,
-/obj/item/grenade/chem_grenade,
-/obj/item/screwdriver{
- pixel_x = -2;
- pixel_y = 6
- },
-/obj/machinery/light{
- dir = 8
- },
-/obj/machinery/firealarm{
- dir = 4;
- pixel_x = -24
- },
-/turf/open/floor/plasteel/white,
-/area/medical/chemistry)
-"boc" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bod" = (
-/obj/structure/table,
-/obj/item/folder/white,
-/obj/item/radio/headset/headset_med,
-/turf/open/floor/plasteel/white,
-/area/medical/chemistry)
-"boe" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/medical/glass{
- id_tag = "MedbayFoyer";
- name = "Medbay";
- req_access_txt = "5"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/mapping_helpers/airlock/unres,
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bof" = (
-/turf/closed/wall,
-/area/medical/medbay/central)
-"bog" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/medical/medbay/central)
-"boh" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/medical/glass{
- id_tag = "MedbayFoyer";
- name = "Medbay";
- req_access_txt = "5"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/mapping_helpers/airlock/unres,
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"boi" = (
-/obj/machinery/computer/med_data{
- dir = 1
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"boj" = (
-/obj/machinery/airalarm{
- dir = 1;
- pixel_y = -22
- },
-/obj/machinery/requests_console{
- department = "Medbay";
- departmentType = 1;
- name = "Medbay RC";
- pixel_x = 30
- },
-/obj/machinery/light,
-/obj/machinery/computer/crew{
- dir = 1
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bok" = (
-/obj/machinery/door/airlock/security/glass{
- name = "Security Office";
- req_access_txt = "63"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/white,
-/area/security/checkpoint/medical)
-"bol" = (
-/obj/machinery/airalarm{
- pixel_y = 23
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bom" = (
-/obj/machinery/light{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bon" = (
-/turf/closed/wall/r_wall,
-/area/medical/genetics)
-"boo" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"boq" = (
-/obj/structure/bed/roller,
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bor" = (
-/obj/structure/table,
-/obj/item/clothing/gloves/color/latex,
-/obj/item/surgical_drapes,
-/obj/item/razor,
-/turf/open/floor/plasteel/dark,
-/area/science/robotics/lab)
-"bos" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/power/apc{
- areastring = "/area/science/robotics/lab";
- dir = 8;
- name = "Robotics Lab APC";
- pixel_x = -25
- },
-/obj/structure/cable,
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plasteel/white,
-/area/science/robotics/lab)
-"bou" = (
-/turf/open/floor/plasteel,
-/area/science/robotics/lab)
-"bov" = (
-/obj/structure/table,
-/obj/item/assembly/prox_sensor{
- pixel_x = -8;
- pixel_y = 4
- },
-/obj/item/assembly/prox_sensor{
- pixel_x = -8;
- pixel_y = 4
- },
-/obj/item/assembly/prox_sensor{
- pixel_x = -8;
- pixel_y = 4
- },
-/obj/item/assembly/prox_sensor{
- pixel_x = -8;
- pixel_y = 4
- },
-/obj/item/stock_parts/cell/high/plus,
-/obj/item/stock_parts/cell/high/plus,
-/obj/item/crowbar,
-/obj/structure/extinguisher_cabinet{
- pixel_x = 27
- },
-/obj/item/radio/headset/headset_sci{
- pixel_x = -3
- },
-/turf/open/floor/plasteel,
-/area/science/robotics/lab)
-"bow" = (
-/obj/machinery/door/firedoor/heavy,
-/obj/machinery/door/poddoor/preopen{
- id = "Biohazard";
- name = "biohazard containment door"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plasteel,
-/area/science/research)
-"box" = (
-/turf/closed/wall,
-/area/science/robotics/lab)
-"boy" = (
-/obj/machinery/door/firedoor/heavy,
-/obj/machinery/door/poddoor/preopen{
- id = "Biohazard";
- name = "biohazard containment door"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plasteel,
-/area/science/research)
-"boz" = (
-/obj/machinery/door/firedoor/heavy,
-/obj/machinery/door/poddoor/preopen{
- id = "Biohazard";
- name = "biohazard containment door"
- },
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plasteel,
-/area/science/research)
-"boA" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel/white,
-/area/science/lab)
-"boB" = (
-/turf/closed/wall,
-/area/science/lab)
-"boC" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall/r_wall,
-/area/science/robotics/lab)
-"boD" = (
-/obj/structure/table,
-/obj/item/circular_saw,
-/obj/item/scalpel{
- pixel_y = 12
- },
-/obj/machinery/light{
- dir = 1
- },
-/turf/open/floor/plasteel/dark,
-/area/science/robotics/lab)
-"boE" = (
-/obj/structure/table,
-/obj/item/hemostat,
-/obj/item/cautery{
- pixel_x = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/science/robotics/lab)
-"boF" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard)
-"boG" = (
-/obj/structure/table,
-/obj/structure/window/reinforced{
- dir = 4
- },
-/obj/item/mmi,
-/obj/item/mmi,
-/obj/item/mmi,
-/turf/open/floor/plasteel/dark,
-/area/science/robotics/lab)
-"boH" = (
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard)
-"boI" = (
-/obj/structure/sign/warning/vacuum/external,
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/quartermaster/storage)
-"boJ" = (
-/obj/machinery/conveyor_switch/oneway{
- id = "QMLoad2"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/storage)
-"boK" = (
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plasteel,
-/area/quartermaster/storage)
-"boL" = (
-/obj/structure/table,
-/obj/item/retractor,
-/turf/open/floor/plasteel/dark,
-/area/science/robotics/lab)
-"boM" = (
-/turf/open/floor/plasteel/white/corner,
-/area/science/research)
-"boN" = (
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"boO" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/white/side,
-/area/science/research)
-"boP" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/white,
-/area/science/lab)
-"boQ" = (
-/obj/structure/table,
-/obj/machinery/cell_charger,
-/obj/item/stock_parts/cell/high/plus,
-/obj/item/stock_parts/cell/high/plus,
-/turf/open/floor/plasteel/white,
-/area/science/lab)
-"boR" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"boS" = (
-/obj/structure/table/reinforced,
-/obj/machinery/door/firedoor,
-/obj/machinery/door/window/westleft{
- name = "Cargo Desk";
- req_access_txt = "50"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"boT" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"boU" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"boV" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"boW" = (
-/obj/structure/disposalpipe/segment{
- dir = 6
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"boY" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/structure/sign/poster/official/ian{
- pixel_x = 32;
- pixel_y = 32
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"boZ" = (
-/obj/structure/table/reinforced,
-/obj/machinery/door/window/northleft{
- dir = 8;
- name = "Reception Window"
- },
-/obj/machinery/door/window/brigdoor{
- base_state = "rightsecure";
- dir = 4;
- icon_state = "rightsecure";
- name = "Head of Personnel's Desk";
- req_access_txt = "57"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/flasher{
- id = "hopflash";
- pixel_y = 28
- },
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "hop";
- name = "Privacy Shutters"
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/heads/hop)
-"bpb" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/carpet,
-/area/crew_quarters/heads/hop)
-"bpc" = (
-/obj/structure/chair/office/dark{
- dir = 8
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/heads/hop)
-"bpd" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/carpet,
-/area/crew_quarters/heads/hop)
-"bpe" = (
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/turf/open/floor/carpet,
-/area/crew_quarters/heads/hop)
-"bph" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/engine/gravity_generator)
-"bpj" = (
-/obj/structure/chair/comfy/brown{
- dir = 4
- },
-/obj/machinery/camera{
- c_tag = "Captain's Quarters";
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/carpet,
-/area/crew_quarters/heads/captain)
-"bpk" = (
-/obj/structure/closet/secure_closet/captains,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
- },
-/obj/item/clothing/under/rank/captain/parade,
-/turf/open/floor/carpet,
-/area/crew_quarters/heads/captain)
-"bpl" = (
-/obj/structure/table/wood,
-/obj/item/storage/box/matches,
-/obj/item/razor{
- pixel_x = -4;
- pixel_y = 2
- },
-/obj/item/clothing/mask/cigarette/cigar,
-/obj/item/reagent_containers/food/drinks/flask/gold,
-/turf/open/floor/carpet,
-/area/crew_quarters/heads/captain)
-"bpm" = (
-/obj/machinery/shower{
- dir = 1
- },
-/obj/item/soap/deluxe,
-/obj/item/bikehorn/rubberducky,
-/obj/structure/curtain,
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/heads/captain)
-"bpn" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/light{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bpo" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel/white,
-/area/science/lab)
-"bpp" = (
-/obj/machinery/door/window/eastright{
- base_state = "left";
- dir = 8;
- icon_state = "left";
- name = "Research Division Delivery";
- req_access_txt = "47"
- },
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
-/area/science/lab)
-"bpq" = (
-/obj/machinery/light_switch{
- pixel_y = -23
- },
-/obj/effect/turf_decal/loading_area{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/science/lab)
-"bpr" = (
-/obj/machinery/navbeacon{
- codes_txt = "delivery;dir=8";
- dir = 8;
- freq = 1400;
- location = "Research Division"
- },
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plasteel,
-/area/science/lab)
-"bps" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 5
- },
-/obj/effect/turf_decal/loading_area{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/storage)
-"bpt" = (
-/obj/structure/table,
-/obj/item/hand_labeler,
-/obj/item/stack/packageWrap,
-/turf/open/floor/plasteel/white,
-/area/medical/chemistry)
-"bpu" = (
-/obj/structure/bed/roller,
-/obj/machinery/button/door{
- desc = "A remote control switch for the medbay foyer.";
- id = "MedbayFoyer";
- name = "Medbay Exit Button";
- normaldoorcontrol = 1;
- pixel_y = 26
- },
-/obj/structure/extinguisher_cabinet{
- pixel_x = -27
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bpv" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/medical{
- name = "Medbay Reception";
- req_access_txt = "5"
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bpw" = (
-/obj/machinery/status_display/evac,
-/turf/closed/wall,
-/area/medical/medbay/central)
-"bpx" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bpy" = (
-/obj/structure/disposalpipe/segment{
- dir = 6
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bpz" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/storage)
-"bpA" = (
-/obj/machinery/computer/cargo{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"bpB" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"bpC" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bpD" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/medical/glass{
- name = "Chemistry Lab";
- req_access_txt = "5; 33"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/white,
-/area/medical/chemistry)
-"bpE" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/medical/genetics)
-"bpF" = (
-/obj/structure/table/reinforced,
-/obj/machinery/door/window/southleft{
- dir = 1;
- name = "Chemistry Desk";
- req_access_txt = "33"
- },
-/obj/machinery/door/firedoor,
-/turf/open/floor/plating,
-/area/medical/chemistry)
-"bpG" = (
-/obj/machinery/power/apc{
- areastring = "/area/medical/genetics";
- dir = 1;
- name = "Genetics APC";
- pixel_y = 24
- },
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/turf/open/floor/plasteel/white,
-/area/medical/genetics)
-"bpH" = (
-/obj/structure/table/glass,
-/obj/item/folder/white,
-/obj/item/radio/headset/headset_medsci,
-/obj/machinery/requests_console{
- department = "Genetics";
- name = "Genetics Requests Console";
- pixel_y = 30
- },
-/obj/item/storage/pill_bottle/mutadone,
-/obj/item/storage/pill_bottle/mannitol,
-/turf/open/floor/plasteel/white,
-/area/medical/genetics)
-"bpI" = (
-/obj/machinery/dna_scannernew,
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/genetics)
-"bpJ" = (
-/obj/machinery/light{
- dir = 1
- },
-/obj/machinery/airalarm{
- pixel_y = 23
- },
-/turf/open/floor/plasteel/white,
-/area/medical/genetics)
-"bpK" = (
-/mob/living/carbon/monkey,
-/turf/open/floor/plasteel,
-/area/medical/genetics)
-"bpL" = (
-/obj/structure/window/reinforced{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/medical/genetics)
-"bpM" = (
-/obj/structure/disposalpipe/segment,
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/medical/chemistry)
-"bpN" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bpO" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bpP" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 5
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bpQ" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 8
- },
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plating,
-/area/maintenance/department/medical/morgue)
-"bpR" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/turf/open/floor/plasteel/white,
-/area/science/robotics/lab)
-"bpS" = (
-/obj/structure/table,
-/obj/item/storage/box/bodybags,
-/obj/item/pen,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/science/robotics/lab)
-"bpT" = (
-/obj/structure/table,
-/obj/item/storage/belt/utility,
-/obj/item/stack/sheet/metal/fifty,
-/obj/item/stack/sheet/metal/fifty,
-/obj/item/stack/sheet/metal/fifty,
-/obj/item/stack/sheet/glass{
- amount = 20;
- pixel_x = -3;
- pixel_y = 6
- },
-/turf/open/floor/plasteel,
-/area/science/robotics/lab)
-"bpU" = (
-/obj/structure/table,
-/obj/machinery/cell_charger,
-/obj/item/stock_parts/cell/high/plus,
-/turf/open/floor/plasteel,
-/area/science/robotics/lab)
-"bpV" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/closed/wall/r_wall,
-/area/science/robotics/lab)
-"bpW" = (
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "robotics2";
- name = "robotics lab shutters"
- },
-/obj/effect/spawner/structure/window,
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "robotics2";
- name = "robotics lab shutters"
- },
-/turf/open/floor/plating,
-/area/science/robotics/lab)
-"bpX" = (
-/obj/machinery/firealarm{
- dir = 8;
- pixel_x = 24
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/white/corner{
- dir = 8
- },
-/area/science/research)
-"bpY" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/science/robotics/lab)
-"bpZ" = (
-/obj/item/folder/white,
-/obj/structure/table,
-/obj/item/disk/tech_disk,
-/obj/item/disk/tech_disk,
-/obj/item/disk/design_disk,
-/obj/item/disk/design_disk,
-/turf/open/floor/plasteel/white,
-/area/science/lab)
-"bqa" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/door/window/eastright{
- name = "Robotics Surgery";
- req_access_txt = "29"
- },
-/turf/open/floor/plasteel/dark,
-/area/science/robotics/lab)
-"bqc" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/turf/open/floor/plasteel/white,
-/area/science/robotics/lab)
-"bqd" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/conveyor{
- dir = 4;
- id = "robo2"
- },
-/turf/open/floor/plasteel,
-/area/science/robotics/lab)
-"bqe" = (
-/turf/closed/wall/r_wall,
-/area/science/explab)
-"bqf" = (
-/obj/machinery/door/firedoor/heavy,
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "rnd2";
- name = "research lab shutters"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/white,
-/area/science/lab)
-"bqg" = (
-/obj/structure/rack,
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/plating,
-/area/maintenance/starboard)
-"bqh" = (
-/obj/machinery/light/small{
- dir = 1
- },
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/plating,
-/area/maintenance/starboard)
-"bqi" = (
-/obj/machinery/conveyor{
- dir = 4;
- id = "QMLoad2"
- },
-/obj/machinery/door/poddoor{
- id = "QMLoaddoor2";
- name = "supply dock loading door"
- },
-/turf/open/floor/plating,
-/area/quartermaster/storage)
-"bqj" = (
-/obj/structure/plasticflaps,
-/obj/machinery/conveyor{
- dir = 4;
- id = "QMLoad2"
- },
-/turf/open/floor/plating,
-/area/quartermaster/storage)
-"bqk" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/door/firedoor/heavy,
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "rnd2";
- name = "research lab shutters"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/white,
-/area/science/lab)
-"bql" = (
-/obj/machinery/conveyor{
- dir = 4;
- id = "QMLoad2"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/quartermaster/storage)
-"bqm" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/quartermaster/storage)
-"bqn" = (
-/obj/machinery/light_switch{
- pixel_x = 27
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/storage)
-"bqo" = (
-/obj/machinery/autolathe,
-/obj/machinery/light_switch{
- pixel_x = -27
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"bqp" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/window/reinforced{
- dir = 1;
- layer = 2.9
- },
-/obj/structure/table/reinforced,
-/obj/item/destTagger,
-/obj/item/destTagger,
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/sorting)
-"bqq" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/carpet,
-/area/crew_quarters/heads/hop)
-"bqr" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/carpet,
-/area/crew_quarters/heads/hop)
-"bqs" = (
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"bqt" = (
-/obj/machinery/holopad,
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"bqu" = (
-/obj/machinery/door/firedoor,
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"bqv" = (
-/obj/effect/spawner/structure/window,
-/turf/open/floor/plating,
-/area/hallway/primary/central)
-"bqw" = (
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bqx" = (
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "hop";
- name = "Privacy Shutters"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/crew_quarters/heads/hop)
-"bqy" = (
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bqz" = (
-/turf/open/floor/carpet,
-/area/crew_quarters/heads/hop)
-"bqA" = (
-/obj/machinery/computer/card{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/heads/hop)
-"bqB" = (
-/obj/machinery/holopad,
-/turf/open/floor/carpet,
-/area/crew_quarters/heads/hop)
-"bqC" = (
-/obj/machinery/airalarm{
- dir = 8;
- pixel_x = 24
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/crew_quarters/heads/hop)
-"bqD" = (
-/obj/machinery/vending/coffee,
-/obj/machinery/light{
- dir = 8;
- light_color = "#e8eaff"
- },
-/turf/open/floor/plasteel/dark,
-/area/hallway/primary/central)
-"bqE" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel/dark,
-/area/hallway/primary/central)
-"bqF" = (
-/obj/machinery/vending/cigarette/beach,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/dark,
-/area/hallway/primary/central)
-"bqG" = (
-/obj/structure/reagent_dispensers/water_cooler,
-/obj/machinery/light{
- dir = 4;
- light_color = "#e8eaff"
- },
-/turf/open/floor/plasteel/dark,
-/area/hallway/primary/central)
-"bqH" = (
-/turf/closed/wall/r_wall,
-/area/teleporter)
-"bqI" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall/r_wall,
-/area/teleporter)
-"bqJ" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/closed/wall/r_wall,
-/area/teleporter)
-"bqK" = (
-/obj/machinery/door/airlock/maintenance{
- name = "Teleporter Maintenance";
- req_access_txt = "17"
- },
-/obj/structure/sign/warning/securearea{
- pixel_x = -32
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/maintenance/central/secondary)
-"bqL" = (
-/obj/machinery/door/firedoor,
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bqM" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/medical/medbay/central)
-"bqN" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 5
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bqO" = (
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bqP" = (
-/obj/structure/bed/roller,
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bqQ" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bqR" = (
-/obj/structure/table,
-/obj/item/crowbar,
-/obj/item/clothing/neck/stethoscope,
-/obj/item/reagent_containers/spray/cleaner,
-/obj/structure/sign/warning/nosmoking{
- pixel_y = 30
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bqS" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bqT" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden,
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bqU" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/noticeboard{
- pixel_y = 32
- },
-/obj/machinery/camera{
- c_tag = "Medbay West";
- network = list("ss13","medbay")
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bqV" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bqW" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bqX" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bqY" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bqZ" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel/white,
-/area/medical/genetics)
-"bra" = (
-/obj/structure/table/glass,
-/obj/item/storage/box/rxglasses,
-/turf/open/floor/plasteel/white,
-/area/medical/genetics)
-"brb" = (
-/obj/machinery/computer/scan_consolenew{
- dir = 8
- },
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/medical/genetics)
-"brc" = (
-/obj/structure/chair/office/light{
- dir = 4
- },
-/obj/effect/landmark/start/geneticist,
-/turf/open/floor/plasteel/white,
-/area/medical/genetics)
-"brd" = (
-/turf/open/floor/plasteel,
-/area/medical/genetics)
-"bre" = (
-/obj/structure/window/reinforced{
- dir = 8
- },
-/mob/living/carbon/monkey,
-/turf/open/floor/plasteel,
-/area/medical/genetics)
-"brf" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"brg" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"brh" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/effect/turf_decal/tile/blue,
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bri" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"brj" = (
-/obj/structure/bed/roller,
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"brk" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/turf/open/floor/plasteel/white,
-/area/medical/genetics)
-"brm" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white/side{
- dir = 9
- },
-/area/science/research)
-"brn" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"bro" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white/side{
- dir = 10
- },
-/area/science/research)
-"brp" = (
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"brq" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/button/door{
- id = "robotics2";
- name = "Shutters Control Button";
- pixel_x = 24;
- pixel_y = -24;
- req_access_txt = "29"
- },
-/turf/open/floor/plasteel,
-/area/science/robotics/lab)
-"brr" = (
-/obj/effect/spawner/structure/window,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/science/explab)
-"brs" = (
-/obj/structure/table/reinforced,
-/obj/machinery/door/window/eastright{
- base_state = "left";
- dir = 8;
- icon_state = "left";
- name = "Robotics Desk";
- req_access_txt = "29"
- },
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "robotics2";
- name = "robotics lab shutters"
- },
-/obj/item/folder/white,
-/obj/item/pen,
-/turf/open/floor/plating,
-/area/science/robotics/lab)
-"brt" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/white/side{
- dir = 9
- },
-/area/science/research)
-"bru" = (
-/obj/machinery/firealarm{
- pixel_y = 24
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/light{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
-/turf/open/floor/plasteel/white,
-/area/science/explab)
-"brv" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/explab)
-"brw" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/explab)
-"brx" = (
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "rnd2";
- name = "research lab shutters"
- },
-/obj/effect/spawner/structure/window,
-/turf/open/floor/plating,
-/area/science/lab)
-"bry" = (
-/obj/machinery/door/airlock/maintenance{
- name = "Experimentation Lab Maintenance";
- req_access_txt = "47"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard)
-"brz" = (
-/obj/machinery/rnd/bepis,
-/turf/open/floor/plasteel/white/side,
-/area/science/explab)
-"brA" = (
-/obj/structure/table,
-/obj/item/paper_bin{
- pixel_y = 6
- },
-/turf/open/floor/plasteel/white/corner,
-/area/science/explab)
-"brB" = (
-/obj/structure/closet/l3closet/scientist,
-/turf/open/floor/plasteel/white/side,
-/area/science/explab)
-"brC" = (
-/obj/structure/table,
-/obj/item/folder/white,
-/obj/item/folder/white,
-/obj/machinery/airalarm{
- pixel_y = 23
- },
-/obj/item/radio/off,
-/obj/machinery/camera{
- c_tag = "Experimentor Lab";
- network = list("ss13","rd")
- },
-/turf/open/floor/plasteel/white/side,
-/area/science/explab)
-"brD" = (
-/obj/structure/closet/emcloset,
-/turf/open/floor/plasteel/white/corner{
- dir = 8
- },
-/area/science/explab)
-"brE" = (
-/obj/machinery/door/airlock/maintenance/abandoned{
- req_one_access_txt = "8;12"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/starboard)
-"brF" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/sign/warning/securearea{
- pixel_x = -32
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/starboard)
-"brG" = (
-/obj/machinery/atmospherics/components/binary/valve{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard)
-"brH" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 6
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard)
-"brI" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 8
- },
-/obj/machinery/light/small{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard)
-"brJ" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/obj/machinery/door/airlock/external{
- name = "Supply Dock Airlock";
- req_access_txt = "31"
- },
-/turf/open/floor/plating,
-/area/quartermaster/storage)
-"brK" = (
-/turf/open/floor/plating,
-/area/quartermaster/storage)
-"brL" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/storage)
-"brM" = (
-/obj/machinery/navbeacon{
- codes_txt = "delivery;dir=8";
- dir = 8;
- freq = 1400;
- location = "QM #1"
- },
-/obj/effect/turf_decal/bot,
-/mob/living/simple_animal/bot/mulebot{
- beacon_freq = 1400;
- home_destination = "QM #1";
- suffix = "#1"
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/storage)
-"brN" = (
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
-/area/quartermaster/storage)
-"brO" = (
-/obj/structure/table,
-/obj/machinery/requests_console{
- department = "Cargo Bay";
- departmentType = 2;
- pixel_x = -30
- },
-/obj/item/multitool,
-/obj/machinery/camera{
- c_tag = "Cargo Office";
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"brP" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/explab)
-"brQ" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/structure/disposalpipe/junction/flip{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard)
-"brR" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden,
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"brS" = (
-/turf/open/floor/plasteel,
-/area/crew_quarters/heads/hop)
-"brU" = (
-/obj/structure/sign/warning/electricshock{
- pixel_y = -32
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/structure/cable,
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "hop";
- name = "Privacy Shutters"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/crew_quarters/heads/hop)
-"brV" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/medical/medbay/central)
-"brW" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/vending/cart,
-/turf/open/floor/plasteel,
-/area/crew_quarters/heads/hop)
-"brX" = (
-/obj/structure/table,
-/obj/item/storage/box/masks,
-/obj/item/storage/box/gloves{
- pixel_x = 3;
- pixel_y = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"brY" = (
-/obj/structure/disposalpipe/segment{
- dir = 6
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"brZ" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/crew_quarters/heads/hop)
-"bsa" = (
-/turf/open/floor/plasteel/dark,
-/area/hallway/primary/central)
-"bsb" = (
-/obj/structure/table,
-/obj/item/hand_labeler,
-/turf/open/floor/plasteel/dark,
-/area/hallway/primary/central)
-"bsc" = (
-/turf/open/floor/plasteel,
-/area/engine/gravity_generator)
-"bsg" = (
-/obj/structure/table,
-/obj/item/hand_labeler,
-/obj/machinery/camera{
- c_tag = "Medbay Morgue";
- dir = 8;
- network = list("ss13","medbay")
- },
-/turf/open/floor/plasteel/dark,
-/area/hallway/primary/central)
-"bsh" = (
-/turf/closed/wall,
-/area/teleporter)
-"bsi" = (
-/obj/structure/table,
-/obj/item/hand_tele,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/teleporter)
-"bsj" = (
-/obj/structure/extinguisher_cabinet{
- pixel_x = -27;
- pixel_y = 1
- },
-/obj/structure/table,
-/obj/item/beacon,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 5
- },
-/turf/open/floor/plasteel,
-/area/teleporter)
-"bsk" = (
-/obj/machinery/firealarm{
- pixel_y = 24
- },
-/obj/machinery/light{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/teleporter)
-"bsl" = (
-/obj/item/radio/intercom{
- name = "Station Intercom (General)";
- pixel_y = 20
- },
-/obj/structure/closet/crate,
-/obj/item/crowbar,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/teleporter)
-"bsm" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/teleporter)
-"bsn" = (
-/obj/machinery/camera{
- c_tag = "Teleporter"
- },
-/obj/machinery/airalarm{
- pixel_y = 23
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/teleporter)
-"bso" = (
-/obj/machinery/light_switch{
- pixel_x = 27
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/teleporter)
-"bsp" = (
-/obj/structure/disposalpipe/segment,
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bsq" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/item/radio/intercom{
- frequency = 1485;
- name = "Station Intercom (Medbay)";
- pixel_y = -30
- },
-/obj/machinery/light,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bsr" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bss" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bst" = (
-/obj/item/radio/intercom{
- frequency = 1485;
- name = "Station Intercom (Medbay)";
- pixel_x = 30
- },
-/obj/machinery/camera{
- c_tag = "Medbay East";
- dir = 8;
- network = list("ss13","medbay");
- pixel_y = -22
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bsu" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/medical/glass{
- id_tag = "GeneticsDoor";
- name = "Genetics";
- req_access_txt = "5; 68"
- },
-/obj/effect/mapping_helpers/airlock/unres,
-/turf/open/floor/plasteel/white,
-/area/medical/genetics)
-"bsv" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/white,
-/area/medical/genetics)
-"bsw" = (
-/obj/machinery/door/airlock/research{
- name = "Robotics Lab";
- req_access_txt = "29"
- },
-/turf/open/floor/plasteel/white,
-/area/science/robotics/lab)
-"bsx" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bsy" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bsz" = (
-/obj/machinery/status_display/evac{
- pixel_x = -32
- },
-/turf/open/floor/plasteel/white/side{
- dir = 5
- },
-/area/science/research)
-"bsA" = (
-/obj/machinery/atmospherics/pipe/manifold4w/scrubbers,
-/turf/open/floor/plasteel/white/side{
- dir = 9
- },
-/area/science/research)
-"bsC" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"bsD" = (
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"bsE" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/door/firedoor/heavy,
-/obj/machinery/door/airlock/research{
- name = "Experimentation Lab";
- req_access_txt = "47"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/explab)
-"bsF" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/explab)
-"bsG" = (
-/obj/machinery/holopad,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 1
- },
-/turf/open/floor/plasteel/white,
-/area/science/explab)
-"bsH" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/closed/wall/r_wall,
-/area/science/explab)
-"bsI" = (
-/obj/machinery/power/apc{
- areastring = "/area/science/explab";
- dir = 4;
- name = "Experimentation Lab APC";
- pixel_x = 26
- },
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/explab)
-"bsJ" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 4
- },
-/turf/closed/wall,
-/area/maintenance/starboard)
-"bsK" = (
-/obj/structure/table/glass,
-/obj/item/storage/box/disks{
- pixel_x = 2;
- pixel_y = 2
- },
-/turf/open/floor/plasteel/white,
-/area/medical/genetics)
-"bsL" = (
-/turf/open/floor/plasteel/white,
-/area/medical/genetics)
-"bsM" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard)
-"bsN" = (
-/obj/machinery/door/window/westleft{
- name = "Monkey Pen";
- req_access_txt = "9"
- },
-/turf/open/floor/plasteel,
-/area/medical/genetics)
-"bsO" = (
-/obj/structure/bodycontainer/morgue,
-/turf/open/floor/plasteel/dark,
-/area/science/robotics/lab)
-"bsP" = (
-/obj/structure/table/optable{
- name = "Robotics Operating Table"
- },
-/obj/effect/landmark/event_spawn,
-/obj/item/tank/internals/anesthetic,
-/obj/item/clothing/mask/breath,
-/turf/open/floor/plasteel/dark,
-/area/science/robotics/lab)
-"bsQ" = (
-/turf/open/floor/plasteel/dark,
-/area/science/robotics/lab)
-"bsR" = (
-/obj/machinery/computer/operating{
- dir = 1;
- name = "Robotics Operating Computer"
- },
-/turf/open/floor/plasteel/dark,
-/area/science/robotics/lab)
-"bsS" = (
-/obj/machinery/camera{
- c_tag = "Robotics Lab - South";
- dir = 1;
- network = list("ss13","rd")
- },
-/turf/open/floor/plasteel/white,
-/area/science/robotics/lab)
-"bsT" = (
-/obj/machinery/light,
-/turf/open/floor/plasteel/white,
-/area/science/robotics/lab)
-"bsU" = (
-/obj/structure/table/optable{
- name = "Robotics Operating Table"
- },
-/obj/item/surgical_drapes,
-/turf/open/floor/plating,
-/area/maintenance/port/fore)
-"bsV" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"bsW" = (
-/obj/machinery/vending/wardrobe/robo_wardrobe,
-/turf/open/floor/plasteel/white,
-/area/science/robotics/lab)
-"bsX" = (
-/obj/machinery/light{
- dir = 8
- },
-/turf/open/floor/plasteel/white/side{
- dir = 5
- },
-/area/science/research)
-"bsY" = (
-/obj/structure/chair/office/dark{
- dir = 4
- },
-/obj/effect/landmark/start/head_of_personnel,
-/turf/open/floor/plasteel,
-/area/crew_quarters/heads/hop)
-"bsZ" = (
-/obj/structure/disposalpipe/segment{
- dir = 6
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"bta" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/camera{
- c_tag = "Research Division North"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"btb" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/noticeboard{
- pixel_y = 32
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"btc" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plasteel,
-/area/teleporter)
-"btd" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/turf/open/floor/plasteel,
-/area/teleporter)
-"bte" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white/side{
- dir = 6
- },
-/area/science/research)
-"btf" = (
-/obj/machinery/requests_console{
- department = "Medbay";
- departmentType = 1;
- name = "Medbay RC";
- pixel_x = -30
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"btg" = (
-/obj/machinery/door/firedoor,
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bth" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/item/twohanded/required/kirbyplants{
- icon_state = "plant-16"
- },
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"bti" = (
-/obj/structure/closet/wardrobe/grey,
-/obj/item/clothing/head/beret/black,
-/obj/item/clothing/head/beret/black,
-/obj/item/clothing/head/beret,
-/obj/item/clothing/head/beret,
-/obj/item/clothing/under/misc/assistantformal,
-/obj/item/clothing/under/dress/skirt,
-/turf/open/floor/plasteel/white,
-/area/medical/genetics)
-"btj" = (
-/obj/structure/disposalpipe/segment{
- dir = 6
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/explab)
-"btk" = (
-/obj/structure/closet/wardrobe/white,
-/obj/item/clothing/under/costume/kilt,
-/obj/item/clothing/under/rank/civilian/janitor/maid,
-/turf/open/floor/plasteel/white,
-/area/medical/genetics)
-"btl" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/turf/open/floor/plasteel/white,
-/area/medical/genetics)
-"btm" = (
-/obj/structure/disposalpipe/sorting/mail/flip{
- dir = 2;
- sortType = 12
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/white,
-/area/medical/genetics)
-"btn" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/closed/wall/r_wall,
-/area/science/research)
-"bto" = (
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
-/obj/structure/sign/warning/securearea{
- pixel_x = 32
- },
-/obj/machinery/light/small{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/medical/genetics)
-"btp" = (
-/turf/open/floor/plating,
-/area/maintenance/starboard)
-"btq" = (
-/obj/structure/closet,
-/obj/effect/spawner/lootdrop/maintenance{
- lootcount = 2;
- name = "2maintenance loot spawner"
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard)
-"btr" = (
-/obj/machinery/camera{
- c_tag = "Cargo Receiving Dock";
- dir = 4
- },
-/obj/machinery/button/door{
- id = "QMLoaddoor";
- layer = 4;
- name = "Loading Doors";
- pixel_x = -24;
- pixel_y = -8
- },
-/obj/machinery/button/door{
- id = "QMLoaddoor2";
- layer = 4;
- name = "Loading Doors";
- pixel_x = -24;
- pixel_y = 8
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/storage)
-"bts" = (
-/obj/machinery/navbeacon{
- codes_txt = "delivery;dir=8";
- dir = 8;
- freq = 1400;
- location = "QM #2"
- },
-/obj/effect/turf_decal/bot,
-/mob/living/simple_animal/bot/mulebot{
- home_destination = "QM #2";
- suffix = "#2"
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/storage)
-"btt" = (
-/obj/structure/table,
-/obj/machinery/firealarm{
- dir = 4;
- pixel_x = -24
- },
-/obj/item/folder/yellow,
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"btu" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"btv" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"btw" = (
-/obj/machinery/light{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"btx" = (
-/obj/machinery/door/firedoor/heavy,
-/obj/machinery/door/poddoor/preopen{
- id = "Biohazard";
- name = "biohazard containment door"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plasteel,
-/area/science/research)
-"bty" = (
-/obj/structure/chair{
- dir = 8
- },
-/obj/effect/landmark/start/assistant,
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"btz" = (
-/obj/structure/disposalpipe/segment,
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"btA" = (
-/obj/machinery/camera{
- c_tag = "Research Division West"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"btB" = (
-/obj/machinery/computer/bounty{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/heads/hop)
-"btC" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/heads/hop)
-"btD" = (
-/obj/item/paper_bin/bundlenatural{
- pixel_x = 6;
- pixel_y = 4
- },
-/obj/item/paper_bin{
- pixel_x = -6;
- pixel_y = 4
- },
-/obj/item/pen/fountain,
-/obj/structure/table,
-/obj/item/pen/fourcolor,
-/obj/item/stamp/hop,
-/turf/open/floor/plasteel,
-/area/crew_quarters/heads/hop)
-"btE" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment,
-/obj/machinery/light{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/crew_quarters/heads/hop)
-"btG" = (
-/turf/closed/wall/r_wall,
-/area/engine/gravity_generator)
-"btH" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/chair/stool,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/teleporter)
-"btI" = (
-/obj/machinery/power/apc{
- areastring = "/area/teleporter";
- dir = 8;
- name = "Teleporter APC";
- pixel_x = -24
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/turf/open/floor/plasteel,
-/area/teleporter)
-"btJ" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/bluespace_beacon,
-/turf/open/floor/plasteel,
-/area/teleporter)
-"btK" = (
-/obj/machinery/holopad,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/teleporter)
-"btL" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/teleporter)
-"btM" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/command{
- name = "Teleport Access";
- req_access_txt = "17"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/teleporter)
-"btN" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/turf/open/floor/plasteel,
-/area/teleporter)
-"btO" = (
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/structure/disposalpipe/segment,
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"btP" = (
-/obj/structure/extinguisher_cabinet{
- pixel_x = -5;
- pixel_y = 30
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"btQ" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white/side{
- dir = 10
- },
-/area/science/research)
-"btR" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"btS" = (
-/obj/machinery/firealarm{
- pixel_y = 24
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"btT" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"btU" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 1
- },
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"btV" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"btW" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white/side{
- dir = 5
- },
-/area/science/research)
-"btX" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/firealarm{
- dir = 1;
- pixel_y = -24
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"btY" = (
-/obj/machinery/requests_console{
- department = "Science";
- departmentType = 2;
- name = "Science Requests Console";
- pixel_y = -30;
- receive_ore_updates = 1
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
- },
-/turf/open/floor/plasteel/white,
-/area/science/explab)
-"btZ" = (
-/obj/machinery/light,
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bua" = (
-/turf/closed/wall,
-/area/medical/genetics)
-"bub" = (
-/obj/machinery/light,
-/obj/item/radio/intercom{
- name = "Station Intercom (General)";
- pixel_y = -35
- },
-/obj/effect/turf_decal/loading_area{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/storage)
-"buc" = (
-/obj/machinery/light,
-/obj/machinery/power/apc{
- areastring = "/area/quartermaster/office";
- name = "Cargo Office APC";
- pixel_x = 1;
- pixel_y = -24
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/tile/brown,
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"bud" = (
-/obj/effect/turf_decal/loading_area{
- dir = 1
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"bue" = (
-/obj/machinery/requests_console{
- announcementConsole = 1;
- department = "Head of Personnel's Desk";
- departmentType = 5;
- name = "Head of Personnel RC";
- pixel_y = -30
- },
-/obj/machinery/camera{
- c_tag = "Head of Personnel's Office";
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/heads/hop)
-"buf" = (
-/obj/machinery/computer/scan_consolenew{
- dir = 8
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/genetics)
-"bug" = (
-/obj/structure/chair/office/light{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/genetics)
-"bui" = (
-/obj/machinery/airalarm{
- dir = 1;
- pixel_y = -22
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/loading_area{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"buj" = (
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "robotics2";
- name = "robotics lab shutters"
- },
-/obj/effect/spawner/structure/window,
-/turf/open/floor/plating,
-/area/science/robotics/lab)
-"buk" = (
-/turf/open/floor/plasteel/white/side{
- dir = 8
- },
-/area/medical/sleeper)
-"bul" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/genetics)
-"bum" = (
-/obj/machinery/holopad,
-/turf/open/floor/plasteel/white,
-/area/medical/genetics)
-"bun" = (
-/obj/structure/disposalpipe/segment{
- dir = 6
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/turf/open/floor/plasteel/white,
-/area/medical/genetics)
-"buo" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"bup" = (
-/obj/machinery/light,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"buq" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/medical/genetics)
-"bur" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/genetics)
-"bus" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"but" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/white,
-/area/medical/genetics)
-"buu" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/explab)
-"buv" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/explab)
-"buw" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/explab)
-"bux" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/purple,
-/obj/effect/turf_decal/tile/purple{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/genetics)
-"buy" = (
-/obj/structure/disposalpipe/sorting/mail{
- sortType = 23
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden,
-/turf/open/floor/plasteel/white,
-/area/medical/genetics)
-"buz" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plating,
-/area/maintenance/starboard)
-"buB" = (
-/obj/machinery/conveyor_switch/oneway{
- dir = 8;
- id = "QMLoad"
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/storage)
-"buC" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/storage)
-"buD" = (
-/obj/machinery/navbeacon{
- codes_txt = "delivery;dir=8";
- dir = 8;
- freq = 1400;
- location = "QM #3"
- },
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plasteel,
-/area/quartermaster/storage)
-"buE" = (
-/obj/structure/table,
-/obj/machinery/airalarm{
- dir = 4;
- pixel_x = -22
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"buF" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"buG" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/door/airlock/research{
- name = "Genetics Research Access";
- req_access_txt = "9"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/genetics)
-"buH" = (
-/obj/machinery/door/airlock/research{
- name = "Genetics Research Access";
- req_access_txt = "47"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"buI" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"buJ" = (
-/obj/structure/chair{
- dir = 8
- },
-/obj/machinery/light,
-/obj/effect/landmark/start/assistant,
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"buK" = (
-/obj/machinery/light{
- dir = 4
- },
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"buL" = (
-/obj/structure/disposalpipe/segment{
- dir = 5
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/genetics)
-"buM" = (
-/obj/machinery/keycard_auth{
- pixel_x = -24
- },
-/obj/machinery/computer/cargo{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/heads/hop)
-"buN" = (
-/obj/structure/chair{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/heads/hop)
-"buO" = (
-/obj/structure/table,
-/obj/item/folder/blue,
-/obj/item/stack/packageWrap{
- pixel_x = -1;
- pixel_y = -1
- },
-/obj/item/hand_labeler,
-/turf/open/floor/plasteel,
-/area/crew_quarters/heads/hop)
-"buQ" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/dark,
-/area/hallway/primary/central)
-"buT" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"buU" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/door/firedoor/heavy,
-/obj/machinery/door/poddoor/preopen{
- id = "Biohazard";
- name = "biohazard containment door"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plasteel,
-/area/science/research)
-"buV" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/turf/open/floor/plasteel,
-/area/teleporter)
-"buW" = (
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plasteel,
-/area/teleporter)
-"buX" = (
-/obj/machinery/shieldwallgen,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plasteel,
-/area/teleporter)
-"buY" = (
-/obj/machinery/shieldwallgen,
-/obj/structure/window/reinforced{
- dir = 8
- },
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plasteel,
-/area/teleporter)
-"buZ" = (
-/obj/structure/closet/crate,
-/turf/open/floor/plasteel,
-/area/teleporter)
-"bva" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/sign/warning/securearea{
- pixel_x = -32
- },
-/obj/structure/disposalpipe/segment,
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bvb" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"bvc" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/light,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"bvd" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/closed/wall,
-/area/medical/sleeper)
-"bve" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"bvf" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
- },
-/turf/open/floor/plasteel/white/side{
- dir = 9
- },
-/area/science/research)
-"bvg" = (
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden,
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"bvh" = (
-/obj/effect/spawner/structure/window,
-/turf/open/floor/plating,
-/area/medical/sleeper)
-"bvi" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall,
-/area/medical/sleeper)
-"bvj" = (
-/turf/closed/wall,
-/area/medical/sleeper)
-"bvk" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bvl" = (
-/obj/machinery/door/airlock/medical/glass{
- name = "Surgery Observation"
- },
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/dark,
-/area/medical/sleeper)
-"bvm" = (
-/obj/machinery/holopad,
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bvn" = (
-/obj/machinery/button/door{
- desc = "A remote control switch for the genetics doors.";
- id = "GeneticsDoor";
- name = "Genetics Exit Button";
- normaldoorcontrol = 1;
- pixel_x = 8;
- pixel_y = 24
- },
-/obj/structure/table,
-/obj/item/book/manual/wiki/medical_cloning{
- pixel_y = 6
- },
-/obj/item/storage/box/rxglasses{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/item/storage/box/bodybags,
-/obj/item/pen,
-/turf/open/floor/plasteel/white,
-/area/medical/genetics)
-"bvo" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/genetics)
-"bvp" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/genetics)
-"bvq" = (
-/obj/structure/chair,
-/obj/effect/landmark/start/geneticist,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/genetics)
-"bvr" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/genetics)
-"bvs" = (
-/obj/machinery/dna_scannernew,
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/medical/genetics)
-"bvt" = (
-/obj/machinery/door/airlock/research/glass{
- name = "Genetics Research";
- req_access_txt = "5; 9; 68"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/genetics)
-"bvu" = (
-/obj/structure/window/reinforced,
-/mob/living/carbon/monkey,
-/turf/open/floor/plasteel,
-/area/medical/genetics)
-"bvv" = (
-/obj/structure/window/reinforced{
- dir = 8
- },
-/obj/structure/window/reinforced,
-/turf/open/floor/plasteel,
-/area/medical/genetics)
-"bvw" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
-/turf/open/floor/plasteel/white,
-/area/medical/genetics)
-"bvx" = (
-/turf/closed/wall/r_wall,
-/area/science/research)
-"bvy" = (
-/obj/machinery/camera{
- c_tag = "Genetics Research";
- dir = 1;
- network = list("ss13","medbay")
- },
-/obj/machinery/firealarm{
- dir = 1;
- pixel_y = -24
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/purple,
-/obj/effect/turf_decal/tile/purple{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/genetics)
-"bvz" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/genetics)
-"bvA" = (
-/obj/structure/sign/warning/securearea,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/closed/wall/r_wall,
-/area/medical/genetics)
-"bvB" = (
-/obj/machinery/camera{
- c_tag = "Genetics Access";
- dir = 8;
- network = list("ss13","medbay");
- pixel_y = -22
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/genetics)
-"bvC" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/security/checkpoint/science)
-"bvD" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"bvE" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white/side{
- dir = 6
- },
-/area/science/research)
-"bvF" = (
-/obj/machinery/requests_console{
- department = "Cargo Bay";
- departmentType = 2;
- pixel_x = -30
- },
-/obj/machinery/computer/bounty{
- dir = 4
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 4
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/obj/machinery/keycard_auth{
- pixel_y = 25
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/qm)
-"bvH" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white/side{
- dir = 9
- },
-/area/science/research)
-"bvI" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"bvJ" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/crew_quarters/heads/hor)
-"bvK" = (
-/turf/closed/wall,
-/area/crew_quarters/heads/hor)
-"bvL" = (
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/supply)
-"bvM" = (
-/obj/machinery/light_switch{
- pixel_x = -20
- },
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plasteel/white,
-/area/science/explab)
-"bvN" = (
-/obj/structure/chair/office/light,
-/obj/effect/landmark/start/scientist,
-/turf/open/floor/plasteel/white,
-/area/science/explab)
-"bvO" = (
-/turf/open/floor/plasteel/white,
-/area/science/explab)
-"bvP" = (
-/obj/structure/extinguisher_cabinet{
- pixel_x = 5;
- pixel_y = -32
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
- },
-/turf/open/floor/plasteel/white,
-/area/science/explab)
-"bvQ" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard)
-"bvR" = (
-/obj/machinery/atmospherics/components/unary/thermomachine/freezer{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard)
-"bvS" = (
-/obj/machinery/conveyor{
- dir = 8;
- id = "QMLoad"
- },
-/obj/machinery/door/poddoor{
- id = "QMLoaddoor";
- name = "supply dock loading door"
- },
-/turf/open/floor/plating,
-/area/quartermaster/storage)
-"bvT" = (
-/obj/structure/plasticflaps,
-/obj/machinery/conveyor{
- dir = 8;
- id = "QMLoad"
- },
-/turf/open/floor/plating,
-/area/quartermaster/storage)
-"bvU" = (
-/obj/machinery/conveyor{
- dir = 8;
- id = "QMLoad"
- },
-/obj/machinery/light,
-/obj/machinery/status_display/supply{
- pixel_y = -32
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/quartermaster/storage)
-"bvV" = (
-/obj/machinery/conveyor{
- dir = 8;
- id = "QMLoad"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/quartermaster/storage)
-"bvW" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bvX" = (
-/obj/machinery/camera{
- c_tag = "Cargo Bay South";
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/storage)
-"bvY" = (
-/obj/machinery/navbeacon{
- codes_txt = "delivery;dir=8";
- dir = 8;
- freq = 1400;
- location = "QM #4"
- },
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plasteel,
-/area/quartermaster/storage)
-"bvZ" = (
-/obj/structure/table,
-/obj/item/storage/firstaid/regular{
- pixel_x = 6;
- pixel_y = -5
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"bwa" = (
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bwb" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/corner{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bwc" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/tile/brown,
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"bwd" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/security/checkpoint/supply)
-"bwe" = (
-/turf/closed/wall,
-/area/security/checkpoint/supply)
-"bwf" = (
-/obj/machinery/camera{
- c_tag = "Cargo Bay Entrance";
- dir = 4
- },
-/obj/structure/disposalpipe/segment,
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bwg" = (
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "hopqueue";
- name = "HoP Queue Shutters"
- },
-/obj/effect/turf_decal/loading_area{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bwh" = (
-/obj/structure/sign/warning/securearea{
- pixel_y = 32
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bwi" = (
-/obj/item/radio/intercom{
- dir = 8;
- name = "Station Intercom (General)";
- pixel_x = -28
- },
-/obj/structure/closet/secure_closet/hop,
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/item/clothing/suit/ianshirt,
-/turf/open/floor/plasteel,
-/area/crew_quarters/heads/hop)
-"bwj" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/heads/hop)
-"bwk" = (
-/obj/structure/table,
-/obj/machinery/recharger,
-/turf/open/floor/plasteel,
-/area/crew_quarters/heads/hop)
-"bwl" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/heads/hop)
-"bwq" = (
-/obj/machinery/teleport/station,
-/turf/open/floor/plating,
-/area/teleporter)
-"bwr" = (
-/obj/machinery/computer/teleporter{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/teleporter)
-"bws" = (
-/obj/structure/rack,
-/obj/item/tank/internals/oxygen,
-/obj/item/clothing/mask/gas,
-/turf/open/floor/plating,
-/area/teleporter)
-"bwt" = (
-/obj/machinery/teleport/hub,
-/turf/open/floor/plating,
-/area/teleporter)
-"bwu" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bwv" = (
-/obj/machinery/navbeacon{
- codes_txt = "delivery;dir=4";
- dir = 4;
- freq = 1400;
- location = "Medbay"
- },
-/obj/structure/plasticflaps/opaque,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plasteel,
-/area/medical/medbay/central)
-"bww" = (
-/obj/structure/chair,
-/obj/machinery/camera{
- c_tag = "Surgery Observation";
- network = list("ss13","medbay")
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/medical/sleeper)
-"bwx" = (
-/obj/machinery/door/window/eastleft{
- name = "Medical Delivery";
- req_access_txt = "5"
- },
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
-/area/medical/medbay/central)
-"bwy" = (
-/obj/structure/disposalpipe/segment{
- dir = 5
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bwz" = (
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bwA" = (
-/obj/machinery/disposal/bin,
-/obj/structure/disposalpipe/trunk{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bwB" = (
-/obj/structure/chair,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/medical/sleeper)
-"bwD" = (
-/obj/machinery/sleeper{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/medical/sleeper)
-"bwE" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/dark,
-/area/medical/sleeper)
-"bwF" = (
-/obj/structure/table/glass,
-/obj/item/reagent_containers/glass/beaker/cryoxadone{
- pixel_x = 7;
- pixel_y = 1
- },
-/obj/item/reagent_containers/glass/beaker/cryoxadone{
- pixel_x = 7;
- pixel_y = 1
- },
-/turf/open/floor/plasteel,
-/area/medical/sleeper)
-"bwG" = (
-/obj/structure/sign/warning/nosmoking,
-/turf/closed/wall,
-/area/medical/sleeper)
-"bwH" = (
-/obj/structure/table,
-/obj/machinery/cell_charger,
-/turf/open/floor/plasteel,
-/area/medical/sleeper)
-"bwI" = (
-/obj/machinery/atmospherics/components/unary/cryo_cell,
-/turf/open/floor/plasteel,
-/area/medical/sleeper)
-"bwJ" = (
-/obj/structure/table/glass,
-/obj/machinery/camera{
- c_tag = "Medbay Cryogenics";
- network = list("ss13","medbay")
- },
-/obj/item/reagent_containers/glass/beaker/cryoxadone,
-/obj/item/reagent_containers/glass/beaker/cryoxadone,
-/turf/open/floor/plasteel,
-/area/medical/sleeper)
-"bwK" = (
-/obj/structure/extinguisher_cabinet{
- pixel_x = 27
- },
-/obj/machinery/light{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bwL" = (
-/obj/machinery/camera{
- c_tag = "Genetics Cloning";
- dir = 4;
- network = list("ss13","medbay")
- },
-/obj/machinery/firealarm{
- dir = 4;
- pixel_x = -24
- },
-/obj/structure/closet/secure_closet/personal/patient,
-/turf/open/floor/plasteel/white,
-/area/medical/genetics)
-"bwM" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/science)
-"bwN" = (
-/obj/machinery/light_switch{
- pixel_x = 8;
- pixel_y = 28
- },
-/obj/machinery/button/door{
- id = "Biohazard";
- name = "Biohazard Shutter Control";
- pixel_x = -5;
- pixel_y = 28;
- req_access_txt = "47"
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/science)
-"bwO" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 5
- },
-/turf/open/floor/plasteel/white/side{
- dir = 9
- },
-/area/science/research)
-"bwQ" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/crew_quarters/heads/hor)
-"bwR" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 8
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/heads/hor)
-"bwS" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/disposalpipe/segment{
- dir = 5
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/qm)
-"bwT" = (
-/obj/machinery/door/airlock/mining/glass{
- name = "Quartermaster";
- req_access_txt = "41"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/qm)
-"bwU" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/brown,
-/obj/effect/turf_decal/tile/brown{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/qm)
-"bwV" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/effect/landmark/start/shaft_miner,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"bwW" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"bwX" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/structure/disposalpipe/sorting/mail/flip{
- dir = 1;
- sortType = 3
- },
-/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden,
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"bwY" = (
-/obj/machinery/door/airlock/security/glass{
- name = "Security Office";
- req_access_txt = "63"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/supply)
-"bwZ" = (
-/obj/structure/chair,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/dark,
-/area/medical/sleeper)
-"bxa" = (
-/obj/structure/chair,
-/obj/structure/sign/warning/nosmoking{
- pixel_x = -28
- },
-/turf/open/floor/plasteel/dark,
-/area/medical/sleeper)
-"bxb" = (
-/obj/structure/chair,
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/medical/sleeper)
-"bxc" = (
-/obj/machinery/holopad,
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/medical/sleeper)
-"bxd" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"bxe" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"bxf" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white/side{
- dir = 5
- },
-/area/science/research)
-"bxg" = (
-/obj/structure/reagent_dispensers/watertank,
-/obj/effect/decal/cleanable/cobweb/cobweb2,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bxi" = (
-/obj/machinery/computer/aifixer{
- dir = 8
- },
-/obj/machinery/requests_console{
- announcementConsole = 1;
- department = "Research Director's Desk";
- departmentType = 5;
- name = "Research Director RC";
- pixel_x = -2;
- pixel_y = 30;
- receive_ore_updates = 1
- },
-/obj/structure/window/reinforced{
- dir = 4
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/heads/hor)
-"bxj" = (
-/obj/structure/table,
-/obj/machinery/computer/security/telescreen/rd,
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/heads/hor)
-"bxk" = (
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/plasteel,
-/area/storage/primary)
-"bxl" = (
-/obj/structure/rack,
-/obj/item/circuitboard/aicore{
- pixel_x = -2;
- pixel_y = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/turf/open/floor/plasteel/white,
-/area/crew_quarters/heads/hor)
-"bxm" = (
-/obj/effect/landmark/xmastree/rdrod,
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/turf/open/floor/plasteel/white,
-/area/crew_quarters/heads/hor)
-"bxn" = (
-/turf/closed/wall,
-/area/science/explab)
-"bxo" = (
-/obj/machinery/disposal/bin,
-/obj/structure/disposalpipe/trunk{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/science/explab)
-"bxp" = (
-/obj/machinery/computer/rdconsole/experiment{
- dir = 1
- },
-/turf/open/floor/plasteel/white/side{
- dir = 1
- },
-/area/science/explab)
-"bxq" = (
-/obj/structure/table,
-/obj/item/clipboard,
-/obj/item/book/manual/wiki/experimentor,
-/turf/open/floor/plasteel/white/corner{
- dir = 4
- },
-/area/science/explab)
-"bxr" = (
-/obj/structure/closet/radiation,
-/turf/open/floor/plasteel/white/corner{
- dir = 1
- },
-/area/science/explab)
-"bxs" = (
-/obj/machinery/button/door{
- id = "telelab";
- name = "Test Chamber Blast Doors";
- pixel_x = 25;
- req_access_txt = "47"
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plasteel/white,
-/area/science/explab)
-"bxt" = (
-/obj/machinery/meter,
-/obj/machinery/atmospherics/pipe/simple/general/visible,
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard)
-"bxu" = (
-/turf/closed/wall,
-/area/quartermaster/qm)
-"bxv" = (
-/obj/structure/chair/office/dark{
- dir = 4
- },
-/obj/effect/landmark/start/depsec/science,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/science)
-"bxw" = (
-/obj/machinery/door/airlock/mining/glass{
- name = "Quartermaster";
- req_access_txt = "41"
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/qm)
-"bxx" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/quartermaster/qm)
-"bxy" = (
-/turf/closed/wall,
-/area/quartermaster/miningdock)
-"bxz" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall,
-/area/quartermaster/miningdock)
-"bxA" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment,
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/mining{
- req_access_txt = "48"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"bxB" = (
-/obj/item/paper_bin{
- pixel_x = 1;
- pixel_y = 9
- },
-/obj/item/pen,
-/obj/structure/table,
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/supply)
-"bxC" = (
-/obj/machinery/recharger{
- pixel_y = 4
- },
-/obj/structure/table,
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/supply)
-"bxD" = (
-/obj/item/book/manual/wiki/security_space_law,
-/obj/structure/table,
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/supply)
-"bxE" = (
-/obj/machinery/computer/secure_data{
- dir = 8
- },
-/obj/machinery/airalarm{
- dir = 8;
- pixel_x = 24
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/supply)
-"bxF" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white/side{
- dir = 9
- },
-/area/science/research)
-"bxG" = (
-/obj/machinery/door/airlock/command{
- name = "Head of Personnel";
- req_access_txt = "57"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plasteel,
-/area/crew_quarters/heads/hop)
-"bxI" = (
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/preopen{
- id = "bridge blast";
- name = "bridge blast door"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/hallway/primary/central)
-"bxK" = (
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/preopen{
- id = "bridge blast";
- name = "bridge blast door"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/hallway/primary/central)
-"bxL" = (
-/obj/machinery/camera{
- c_tag = "Central Hallway South-East";
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bxM" = (
-/obj/structure/chair/office/dark,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/landmark/event_spawn,
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/auxiliary)
-"bxN" = (
-/obj/structure/sink{
- dir = 8;
- pixel_x = -12;
- pixel_y = 2
- },
-/obj/structure/mirror{
- pixel_x = -28
- },
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bxO" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bxP" = (
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/heads/hor)
-"bxQ" = (
-/turf/open/floor/plasteel,
-/area/medical/sleeper)
-"bxR" = (
-/obj/machinery/door/firedoor,
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
-/area/medical/sleeper)
-"bxS" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/medical/sleeper)
-"bxT" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 5
- },
-/turf/open/floor/plasteel,
-/area/medical/sleeper)
-"bxU" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 10
- },
-/turf/open/floor/plasteel,
-/area/medical/sleeper)
-"bxV" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible,
-/turf/open/floor/plasteel,
-/area/medical/sleeper)
-"bxW" = (
-/obj/machinery/door/airlock/command/glass{
- name = "Research Director";
- req_access_txt = "30"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/heads/hor)
-"bxX" = (
-/obj/machinery/light{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/medical/genetics)
-"bxY" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/heads/hor)
-"bxZ" = (
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/heads/hor)
-"bya" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/heads/hor)
-"byb" = (
-/obj/machinery/airalarm{
- dir = 8;
- pixel_x = 24
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/heads/hor)
-"byc" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/brown,
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/obj/machinery/computer/card/minor/qm{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/qm)
-"byd" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
- },
-/obj/effect/turf_decal/tile/brown,
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/qm)
-"bye" = (
-/obj/structure/sign/warning/securearea,
-/turf/closed/wall/r_wall,
-/area/medical/genetics)
-"byf" = (
-/turf/closed/wall/r_wall,
-/area/science/server)
-"byg" = (
-/obj/structure/table,
-/obj/item/clipboard,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/item/cartridge/quartermaster{
- pixel_x = 6;
- pixel_y = 5
- },
-/obj/item/cartridge/quartermaster{
- pixel_x = -4;
- pixel_y = 7
- },
-/obj/item/cartridge/quartermaster,
-/obj/item/coin/silver,
-/obj/effect/turf_decal/tile/brown,
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/obj/item/stamp/qm,
-/obj/item/paper_bin{
- pixel_x = -3;
- pixel_y = 7
- },
-/obj/item/pen/fountain,
-/turf/open/floor/plasteel,
-/area/quartermaster/qm)
-"byh" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/command{
- name = "Server Room";
- req_access_txt = "30"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel/dark,
-/area/science/server)
-"byi" = (
-/turf/closed/wall,
-/area/security/checkpoint/science)
-"byj" = (
-/obj/machinery/door/airlock/security/glass{
- name = "Security Office";
- req_access_txt = "63"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/white,
-/area/security/checkpoint/science)
-"byk" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/security/checkpoint/science)
-"byl" = (
-/obj/structure/table,
-/obj/item/folder/yellow,
-/obj/item/pen{
- pixel_x = 4;
- pixel_y = 4
- },
-/obj/item/pen/red,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/brown,
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/qm)
-"bym" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/quartermaster/qm)
-"byn" = (
-/obj/structure/filingcabinet,
-/obj/machinery/light_switch{
- pixel_y = -25
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/brown,
-/obj/effect/turf_decal/tile/brown{
- dir = 4
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/qm)
-"byo" = (
-/obj/structure/table,
-/obj/machinery/button/door{
- id = "Biohazard";
- name = "Biohazard Shutter Control";
- pixel_x = -5;
- pixel_y = 5;
- req_access_txt = "47"
- },
-/obj/machinery/button/door{
- id = "rnd2";
- name = "Research Lab Shutter Control";
- pixel_x = 5;
- pixel_y = 5;
- req_access_txt = "47"
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/heads/hor)
-"byp" = (
-/obj/machinery/computer/robotics{
- dir = 8
- },
-/obj/structure/window/reinforced{
- dir = 4
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/heads/hor)
-"byq" = (
-/obj/structure/chair/office/light{
- dir = 8
- },
-/obj/effect/landmark/start/research_director,
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/heads/hor)
-"byr" = (
-/obj/machinery/holopad,
-/turf/open/floor/plasteel/white,
-/area/crew_quarters/heads/hor)
-"bys" = (
-/obj/structure/rack,
-/obj/item/aicard,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/crew_quarters/heads/hor)
-"byt" = (
-/turf/closed/wall/r_wall,
-/area/crew_quarters/heads/hor)
-"byu" = (
-/obj/structure/displaycase/labcage,
-/obj/machinery/light{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/crew_quarters/heads/hor)
-"byv" = (
-/obj/machinery/door/poddoor/preopen{
- id = "telelab";
- name = "test chamber blast door"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/firedoor/heavy,
-/turf/open/floor/engine,
-/area/science/explab)
-"byw" = (
-/obj/machinery/door/poddoor/preopen{
- id = "telelab";
- name = "test chamber blast door"
- },
-/obj/machinery/door/firedoor/heavy,
-/turf/open/floor/engine,
-/area/science/explab)
-"byx" = (
-/obj/machinery/atmospherics/components/unary/thermomachine/heater{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard)
-"byy" = (
-/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"byz" = (
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/qm)
-"byA" = (
-/obj/machinery/power/apc{
- areastring = "/area/quartermaster/qm";
- dir = 1;
- name = "Quartermaster APC";
- pixel_y = 24
- },
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/qm)
-"byB" = (
-/obj/machinery/disposal/bin,
-/obj/structure/disposalpipe/trunk,
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/qm)
-"byC" = (
-/obj/machinery/holopad,
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/qm)
-"byD" = (
-/obj/structure/closet/secure_closet/quartermaster,
-/obj/machinery/airalarm{
- pixel_y = 23
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/obj/effect/turf_decal/tile/brown,
-/obj/effect/turf_decal/tile/brown{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/qm)
-"byE" = (
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"byF" = (
-/obj/machinery/power/apc{
- areastring = "/area/quartermaster/miningdock";
- dir = 1;
- name = "Mining Dock APC";
- pixel_y = 24
- },
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"byG" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"byH" = (
-/obj/machinery/light_switch{
- pixel_y = -25
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/structure/closet/secure_closet/security/cargo,
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/supply)
-"byI" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/supply)
-"byJ" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/security/checkpoint/supply)
-"byK" = (
-/turf/open/floor/plasteel,
-/area/security/checkpoint/supply)
-"byL" = (
-/obj/structure/chair/office/dark{
- dir = 1
- },
-/obj/effect/landmark/start/depsec/supply,
-/turf/open/floor/plasteel,
-/area/security/checkpoint/supply)
-"byM" = (
-/obj/item/radio/intercom{
- dir = 4;
- name = "Station Intercom (General)";
- pixel_x = 27
- },
-/obj/machinery/computer/security/mining{
- dir = 8
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/supply)
-"byN" = (
-/obj/machinery/newscaster{
- pixel_y = 32
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"byO" = (
-/obj/machinery/requests_console{
- department = "Security";
- departmentType = 5;
- pixel_y = -30
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 8
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/supply)
-"byP" = (
-/obj/structure/sign/warning/securearea{
- pixel_y = 32
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"byQ" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"byR" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment{
- dir = 5
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"byS" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/corner{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"byT" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/machinery/vending/wardrobe/sec_wardrobe,
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/supply)
-"byU" = (
-/obj/machinery/light,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"byW" = (
-/obj/structure/extinguisher_cabinet{
- pixel_x = 5;
- pixel_y = -32
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"byX" = (
-/obj/machinery/airalarm{
- dir = 8;
- pixel_x = 24
- },
-/obj/machinery/light{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"byY" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/effect/spawner/structure/window,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/medical/sleeper)
-"byZ" = (
-/obj/structure/disposalpipe/segment{
- dir = 6
- },
-/obj/effect/spawner/structure/window,
-/turf/open/floor/plating,
-/area/medical/sleeper)
-"bza" = (
-/obj/structure/chair,
-/obj/machinery/airalarm{
- pixel_y = 23
- },
-/turf/open/floor/plasteel/dark,
-/area/medical/sleeper)
-"bzb" = (
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/obj/effect/spawner/structure/window,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/medical/sleeper)
-"bzc" = (
-/obj/machinery/door/airlock/medical/glass{
- name = "Recovery Room"
- },
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bzd" = (
-/obj/structure/table,
-/obj/item/stack/packageWrap,
-/obj/item/stack/packageWrap,
-/obj/item/pen,
-/obj/machinery/requests_console{
- department = "Medbay";
- departmentType = 1;
- name = "Medbay RC";
- pixel_y = 30
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bze" = (
-/obj/machinery/airalarm{
- dir = 4;
- pixel_x = -22
- },
-/obj/machinery/shower{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bzf" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
- },
-/obj/effect/landmark/start/paramedic,
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bzg" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bzh" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 6
- },
-/turf/open/floor/plasteel,
-/area/medical/sleeper)
-"bzi" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/medical/sleeper)
-"bzj" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/medical/sleeper)
-"bzk" = (
-/obj/structure/reagent_dispensers/fueltank,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bzl" = (
-/obj/machinery/dna_scannernew,
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/medical/genetics)
-"bzm" = (
-/obj/machinery/clonepod,
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/medical/genetics)
-"bzn" = (
-/obj/machinery/computer/cloning{
- dir = 1
- },
-/obj/machinery/airalarm{
- dir = 1;
- pixel_y = -22
- },
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/medical/genetics)
-"bzo" = (
-/obj/machinery/disposal/bin,
-/obj/structure/disposalpipe/trunk{
- dir = 1
- },
-/obj/machinery/light_switch{
- pixel_y = -28
- },
-/turf/open/floor/plasteel/white,
-/area/medical/genetics)
-"bzp" = (
-/obj/structure/closet/secure_closet/personal/patient,
-/obj/machinery/light,
-/turf/open/floor/plasteel/white,
-/area/medical/genetics)
-"bzq" = (
-/obj/structure/closet/secure_closet/medical1,
-/turf/open/floor/plasteel/white,
-/area/medical/genetics)
-"bzr" = (
-/obj/item/radio/intercom{
- name = "Station Intercom (General)";
- pixel_y = -29
- },
-/obj/machinery/vending/wardrobe/gene_wardrobe,
-/turf/open/floor/plasteel/white,
-/area/medical/genetics)
-"bzs" = (
-/turf/closed/wall,
-/area/maintenance/aft)
-"bzt" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4;
- external_pressure_bound = 140;
- name = "server vent";
- pressure_checks = 0
- },
-/turf/open/floor/circuit/telecomms/server,
-/area/science/server)
-"bzu" = (
-/obj/machinery/rnd/server,
-/turf/open/floor/circuit/telecomms/server,
-/area/science/server)
-"bzv" = (
-/obj/machinery/atmospherics/pipe/simple{
- dir = 10
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/turf/open/floor/plasteel/dark,
-/area/science/server)
-"bzw" = (
-/obj/machinery/atmospherics/pipe/simple{
- dir = 4
- },
-/obj/structure/sign/warning/securearea{
- desc = "A warning sign which reads 'SERVER ROOM'.";
- name = "SERVER ROOM";
- pixel_y = 32
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/science/server)
-"bzx" = (
-/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on,
-/obj/effect/decal/cleanable/cobweb/cobweb2,
-/turf/open/floor/plasteel/dark,
-/area/science/server)
-"bzy" = (
-/obj/machinery/camera{
- c_tag = "Server Room";
- network = list("ss13","rd");
- pixel_x = 22
- },
-/obj/machinery/power/apc{
- areastring = "/area/science/server";
- dir = 1;
- name = "Server Room APC";
- pixel_y = 25
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/machinery/space_heater,
-/turf/open/floor/plasteel/dark,
-/area/science/server)
-"bzz" = (
-/obj/structure/reagent_dispensers/peppertank{
- pixel_x = -30
- },
-/obj/machinery/airalarm{
- pixel_y = 25
- },
-/obj/structure/closet/secure_closet/security/science,
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/science)
-"bzA" = (
-/obj/machinery/light{
- dir = 4
- },
-/turf/open/floor/plasteel/white/side{
- dir = 9
- },
-/area/science/research)
-"bzB" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"bzC" = (
-/obj/structure/table,
-/obj/machinery/recharger{
- pixel_y = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/science)
-"bzD" = (
-/obj/structure/table,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/computer/security/telescreen/circuitry,
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/science)
-"bzE" = (
-/turf/open/floor/plasteel/white/side{
- dir = 5
- },
-/area/science/research)
-"bzF" = (
-/obj/machinery/firealarm{
- dir = 8;
- pixel_x = 24
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"bzG" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/public/glass{
- name = "Central Access"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/tile/yellow,
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bzH" = (
-/obj/structure/table,
-/obj/item/hemostat,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/white/side,
-/area/medical/sleeper)
-"bzI" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/table,
-/obj/item/surgicaldrill,
-/turf/open/floor/plasteel,
-/area/medical/sleeper)
-"bzJ" = (
-/obj/machinery/computer/mecha{
- dir = 8
- },
-/obj/structure/window/reinforced{
- dir = 4
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/heads/hor)
-"bzK" = (
-/obj/structure/table,
-/obj/item/scalpel{
- pixel_y = 12
- },
-/obj/item/circular_saw,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bzL" = (
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plasteel/white,
-/area/crew_quarters/heads/hor)
-"bzM" = (
-/obj/structure/rack,
-/obj/item/taperecorder{
- pixel_x = -3
- },
-/obj/item/paicard{
- pixel_x = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/turf/open/floor/plasteel/white,
-/area/crew_quarters/heads/hor)
-"bzN" = (
-/obj/machinery/modular_computer/console/preset/research{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/turf/open/floor/plasteel/white,
-/area/crew_quarters/heads/hor)
-"bzO" = (
-/turf/open/floor/engine,
-/area/science/explab)
-"bzP" = (
-/obj/machinery/computer/cargo{
- dir = 4
- },
-/obj/machinery/light{
- dir = 8
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/qm)
-"bzQ" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/qm)
-"bzR" = (
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/qm)
-"bzS" = (
-/obj/structure/table,
-/obj/item/cautery{
- pixel_x = 4
- },
-/turf/open/floor/plasteel,
-/area/medical/sleeper)
-"bzT" = (
-/obj/structure/chair/office/dark,
-/obj/effect/landmark/start/quartermaster,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/qm)
-"bzU" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/obj/effect/turf_decal/tile/blue,
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bzV" = (
-/obj/machinery/vending/wardrobe/medi_wardrobe,
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bzW" = (
-/obj/structure/closet/l3closet,
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bzX" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bzY" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"bzZ" = (
-/obj/machinery/door/firedoor/heavy,
-/turf/open/floor/plasteel/white/side{
- dir = 9
- },
-/area/science/research)
-"bAa" = (
-/obj/machinery/door/firedoor/heavy,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"bAb" = (
-/obj/structure/chair/office/dark{
- dir = 8
- },
-/obj/effect/landmark/start/shaft_miner,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"bAc" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"bAd" = (
-/obj/item/screwdriver{
- pixel_y = 10
- },
-/obj/machinery/light{
- dir = 4
- },
-/obj/item/radio/off,
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/supply)
-"bAe" = (
-/obj/machinery/navbeacon{
- codes_txt = "patrol;next_patrol=AIW";
- location = "QM"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bAf" = (
-/obj/machinery/holopad,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bAg" = (
-/obj/machinery/navbeacon{
- codes_txt = "patrol;next_patrol=AftH";
- location = "AIW"
- },
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bAh" = (
-/obj/machinery/navbeacon{
- codes_txt = "patrol;next_patrol=CHE";
- location = "AIE"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bAi" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bAj" = (
-/obj/machinery/navbeacon{
- codes_txt = "patrol;next_patrol=HOP";
- location = "CHE"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bAk" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bAl" = (
-/obj/structure/chair,
-/turf/open/floor/plasteel/dark,
-/area/medical/sleeper)
-"bAm" = (
-/obj/structure/disposalpipe/segment{
- dir = 5
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 8
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"bAn" = (
-/obj/machinery/door/airlock/maintenance{
- name = "Mining Maintenance";
- req_access_txt = "48"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bAo" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/power/apc{
- areastring = "/area/security/checkpoint/supply";
- dir = 1;
- name = "Cargo Security APC";
- pixel_x = 1;
- pixel_y = 24
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bAp" = (
-/obj/structure/closet/secure_closet/medical1,
-/obj/machinery/light{
- dir = 8
- },
-/obj/machinery/firealarm{
- dir = 4;
- pixel_x = -24
- },
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bAq" = (
-/obj/machinery/sleeper{
- dir = 8
- },
-/obj/machinery/camera{
- c_tag = "Medbay Treatment Center";
- dir = 8;
- network = list("ss13","medbay")
- },
-/turf/open/floor/plasteel,
-/area/medical/sleeper)
-"bAr" = (
-/obj/machinery/portable_atmospherics/canister/oxygen,
-/turf/open/floor/plasteel,
-/area/medical/sleeper)
-"bAs" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 1;
- name = "Connector Port (Air Supply)"
- },
-/obj/machinery/portable_atmospherics/canister/oxygen,
-/obj/machinery/firealarm{
- dir = 1;
- pixel_y = -24
- },
-/obj/machinery/light,
-/turf/open/floor/plasteel,
-/area/medical/sleeper)
-"bAt" = (
-/obj/structure/table/reinforced,
-/obj/item/wrench/medical,
-/turf/open/floor/plasteel,
-/area/medical/sleeper)
-"bAu" = (
-/obj/machinery/atmospherics/components/unary/thermomachine/freezer{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/medical/sleeper)
-"bAv" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 1;
- name = "Connector Port (Air Supply)"
- },
-/obj/machinery/portable_atmospherics/canister/oxygen,
-/turf/open/floor/plasteel,
-/area/medical/sleeper)
-"bAw" = (
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bAx" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bAy" = (
-/obj/effect/landmark/blobstart,
-/turf/open/floor/plasteel/dark/telecomms,
-/area/science/server)
-"bAz" = (
-/obj/machinery/airalarm/server{
- dir = 4;
- pixel_x = -22
- },
-/obj/machinery/light/small{
- dir = 8
- },
-/turf/open/floor/plasteel/dark/telecomms,
-/area/science/server)
-"bAA" = (
-/obj/machinery/atmospherics/pipe/manifold{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/science/server)
-"bAB" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/command/glass{
- name = "Server Room";
- req_access_txt = "30"
- },
-/turf/open/floor/plasteel/dark,
-/area/science/server)
-"bAC" = (
-/obj/machinery/atmospherics/pipe/simple{
- dir = 9
- },
-/obj/machinery/light/small{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/science/server)
-"bAD" = (
-/obj/structure/chair/office/light,
-/obj/machinery/atmospherics/pipe/simple{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/science/server)
-"bAE" = (
-/obj/machinery/camera{
- c_tag = "Security Post - Science";
- dir = 4;
- network = list("ss13","rd")
- },
-/obj/machinery/newscaster{
- pixel_x = -30
- },
-/obj/machinery/light{
- dir = 8
- },
-/obj/machinery/vending/wardrobe/sec_wardrobe,
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/science)
-"bAF" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/science)
-"bAG" = (
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/science)
-"bAH" = (
-/obj/structure/table,
-/obj/item/book/manual/wiki/security_space_law,
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/science)
-"bAI" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/disposalpipe/segment{
- dir = 6
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bAJ" = (
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bAK" = (
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bAL" = (
-/obj/structure/table,
-/obj/item/plant_analyzer,
-/obj/item/stock_parts/cell/high/plus,
-/turf/open/floor/plating,
-/area/storage/tech)
-"bAM" = (
-/obj/structure/table,
-/obj/item/analyzer,
-/obj/item/healthanalyzer,
-/obj/machinery/light/small{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/storage/tech)
-"bAN" = (
-/obj/machinery/door/firedoor,
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bAO" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/door/firedoor,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bAP" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/tile/yellow,
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bAQ" = (
-/obj/effect/landmark/blobstart,
-/obj/effect/landmark/xeno_spawn,
-/turf/open/floor/engine,
-/area/science/explab)
-"bAR" = (
-/obj/machinery/rnd/experimentor,
-/turf/open/floor/engine,
-/area/science/explab)
-"bAS" = (
-/obj/machinery/camera{
- c_tag = "Quartermaster's Office";
- dir = 4
- },
-/obj/item/radio/intercom{
- name = "Station Intercom (General)";
- pixel_y = -35
- },
-/obj/machinery/status_display/supply{
- pixel_x = -32
- },
-/obj/machinery/computer/security/qm{
- dir = 4
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/obj/effect/turf_decal/tile/brown,
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/qm)
-"bAT" = (
-/obj/machinery/vending/wardrobe/jani_wardrobe,
-/turf/open/floor/plasteel,
-/area/janitor)
-"bAU" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/turf/open/floor/plasteel,
-/area/janitor)
-"bAV" = (
-/obj/machinery/door/window/westleft{
- name = "Janitorial Delivery";
- req_access_txt = "26"
- },
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
-/area/janitor)
-"bAW" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bAX" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/table,
-/obj/item/clothing/gloves/color/latex,
-/obj/item/clothing/mask/surgical,
-/obj/item/clothing/suit/apron/surgical,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6
- },
-/turf/open/floor/plasteel/white/side{
- dir = 4
- },
-/area/medical/sleeper)
-"bAY" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 1
- },
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bAZ" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"bBa" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"bBb" = (
-/obj/effect/landmark/start/medical_doctor,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bBc" = (
-/obj/structure/table,
-/obj/item/surgical_drapes,
-/obj/item/razor,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white/side{
- dir = 8
- },
-/area/medical/sleeper)
-"bBd" = (
-/obj/structure/table,
-/obj/structure/bedsheetbin{
- pixel_x = 2
- },
-/obj/item/clothing/suit/straight_jacket,
-/obj/item/clothing/mask/muzzle,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bBe" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bBf" = (
-/obj/structure/filingcabinet,
-/obj/structure/reagent_dispensers/peppertank{
- pixel_x = 30
- },
-/obj/machinery/newscaster{
- pixel_y = -32
- },
-/obj/machinery/camera{
- c_tag = "Security Post - Cargo";
- dir = 1
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/supply)
-"bBg" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/item/radio/intercom{
- name = "Station Intercom (General)";
- pixel_y = -29
- },
-/obj/machinery/light{
- light_color = "#cee5d2"
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bBh" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bBi" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bBj" = (
-/obj/machinery/airalarm{
- dir = 1;
- pixel_y = -22
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bBk" = (
-/obj/machinery/door/firedoor,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/camera{
- c_tag = "Central Primary Hallway South-West";
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bBl" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bBm" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bBn" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bBo" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bBp" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bBq" = (
-/obj/structure/disposalpipe/junction/flip{
- dir = 2
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/sign/directions/engineering{
- pixel_x = -32;
- pixel_y = -40
- },
-/obj/structure/sign/directions/medical{
- dir = 4;
- pixel_x = -32;
- pixel_y = -24
- },
-/obj/structure/sign/directions/evac{
- dir = 4;
- pixel_x = -32;
- pixel_y = -32
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bBr" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/status_display/evac{
- pixel_y = -32
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bBs" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bBt" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/camera{
- c_tag = "Central Primary Hallway South";
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bBu" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/light,
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bBv" = (
-/obj/structure/disposalpipe/sorting/mail/flip{
- dir = 8;
- sortType = 22
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bBw" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bBx" = (
-/obj/machinery/door/firedoor,
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bBy" = (
-/obj/machinery/light,
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bBz" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/sign/poster/contraband/space_up{
- pixel_y = -32
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bBA" = (
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/structure/disposalpipe/junction/flip{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bBB" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/obj/effect/landmark/start/assistant,
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bBC" = (
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bBD" = (
-/turf/open/floor/plasteel/white/side{
- dir = 9
- },
-/area/science/research)
-"bBE" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"bBF" = (
-/obj/machinery/portable_atmospherics/scrubber,
-/obj/item/storage/firstaid/toxin,
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/airalarm/unlocked{
- pixel_y = 24
- },
-/turf/open/floor/plasteel/white,
-/area/science/mixing)
-"bBG" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"bBH" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/closed/wall,
-/area/quartermaster/miningdock)
-"bBI" = (
-/obj/machinery/airalarm{
- dir = 8;
- pixel_x = 24
- },
-/obj/structure/closet/wardrobe/miner,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/item/radio/headset/headset_cargo/mining,
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"bBJ" = (
-/obj/machinery/firealarm{
- pixel_y = 24
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bBK" = (
-/obj/machinery/disposal/bin,
-/obj/structure/disposalpipe/trunk,
-/obj/machinery/light{
- dir = 1
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bBL" = (
-/obj/machinery/vending/medical{
- pixel_x = -2
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bBN" = (
-/turf/closed/wall,
-/area/crew_quarters/heads/cmo)
-"bBO" = (
-/obj/machinery/computer/med_data,
-/obj/machinery/airalarm{
- pixel_y = 23
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/heads/cmo)
-"bBP" = (
-/obj/machinery/computer/crew,
-/obj/machinery/requests_console{
- announcementConsole = 1;
- department = "Chief Medical Officer's Desk";
- departmentType = 5;
- name = "Chief Medical Officer RC";
- pixel_y = 32
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/heads/cmo)
-"bBQ" = (
-/obj/machinery/disposal/bin,
-/obj/structure/disposalpipe/trunk,
-/obj/machinery/light{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/heads/cmo)
-"bBR" = (
-/turf/closed/mineral/random/snow/no_caves,
-/area/security/main)
-"bBS" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{
- dir = 4;
- external_pressure_bound = 120;
- name = "server vent"
- },
-/turf/open/floor/circuit/telecomms/server,
-/area/science/server)
-"bBU" = (
-/obj/machinery/atmospherics/pipe/simple{
- dir = 9
- },
-/obj/machinery/firealarm{
- dir = 1;
- pixel_y = -24
- },
-/turf/open/floor/plasteel/dark,
-/area/science/server)
-"bBV" = (
-/obj/structure/sign/warning/securearea{
- desc = "A warning sign which reads 'SERVER ROOM'.";
- name = "SERVER ROOM";
- pixel_y = -32
- },
-/obj/machinery/atmospherics/pipe/simple{
- dir = 4
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/science/server)
-"bBW" = (
-/obj/structure/table,
-/obj/item/folder/white,
-/obj/item/pen,
-/turf/open/floor/plasteel/dark,
-/area/science/server)
-"bBX" = (
-/obj/machinery/computer/rdservercontrol{
- dir = 1
- },
-/turf/open/floor/plasteel/dark,
-/area/science/server)
-"bBY" = (
-/obj/item/radio/intercom{
- pixel_x = -25
- },
-/obj/structure/filingcabinet,
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/science)
-"bBZ" = (
-/obj/item/screwdriver{
- pixel_y = 10
- },
-/obj/item/radio/off,
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/science)
-"bCa" = (
-/obj/machinery/power/apc{
- areastring = "/area/security/checkpoint/science";
- name = "Science Security APC";
- pixel_y = -24
- },
-/obj/structure/cable,
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/science)
-"bCb" = (
-/obj/structure/table,
-/obj/item/paper_bin{
- pixel_x = 1;
- pixel_y = 9
- },
-/obj/item/pen,
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/science)
-"bCc" = (
-/obj/machinery/computer/secure_data{
- dir = 1
- },
-/obj/machinery/requests_console{
- department = "Security";
- departmentType = 5;
- pixel_y = -30
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/science)
-"bCd" = (
-/obj/structure/disposalpipe/sorting/mail{
- dir = 8;
- sortType = 15
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/machinery/light{
- light_color = "#cee5d2"
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bCe" = (
-/obj/structure/disposalpipe/segment{
- dir = 5
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bCf" = (
-/obj/machinery/power/apc{
- areastring = "/area/crew_quarters/heads/hor";
- dir = 8;
- name = "RD Office APC";
- pixel_x = -25
- },
-/obj/structure/cable,
-/obj/machinery/light_switch{
- pixel_y = -23
- },
-/obj/item/twohanded/required/kirbyplants/dead,
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/heads/hor)
-"bCg" = (
-/obj/structure/table,
-/obj/item/cartridge/signal/toxins,
-/obj/item/cartridge/signal/toxins{
- pixel_x = -4;
- pixel_y = 2
- },
-/obj/item/cartridge/signal/toxins{
- pixel_x = 4;
- pixel_y = 6
- },
-/obj/machinery/camera{
- c_tag = "Research Director's Office";
- dir = 1;
- network = list("ss13","rd")
- },
-/obj/item/radio/intercom{
- name = "Station Intercom (General)";
- pixel_y = -29
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/heads/hor)
-"bCh" = (
-/obj/machinery/keycard_auth{
- pixel_y = -24
- },
-/obj/machinery/light,
-/obj/machinery/computer/card/minor/rd{
- dir = 1
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/heads/hor)
-"bCi" = (
-/obj/machinery/disposal/bin,
-/obj/structure/disposalpipe/trunk{
- dir = 1
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/heads/hor)
-"bCj" = (
-/obj/structure/closet/secure_closet/RD,
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/heads/hor)
-"bCk" = (
-/obj/structure/filingcabinet/chestdrawer,
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/heads/hor)
-"bCl" = (
-/obj/machinery/camera{
- c_tag = "Experimentor Lab Chamber";
- dir = 1;
- network = list("ss13","rd")
- },
-/obj/machinery/light,
-/obj/structure/sign/warning/nosmoking{
- pixel_y = -32
- },
-/turf/open/floor/engine,
-/area/science/explab)
-"bCm" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 5
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard)
-"bCn" = (
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bCo" = (
-/obj/structure/table,
-/obj/item/paper_bin{
- pixel_x = 1;
- pixel_y = 9
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"bCp" = (
-/obj/machinery/light{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/tile/yellow,
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bCq" = (
-/turf/closed/wall,
-/area/maintenance/port/aft)
-"bCr" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bCs" = (
-/turf/closed/wall,
-/area/storage/tech)
-"bCt" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/mob/living/simple_animal/hostile/lizard{
- name = "Wags-His-Tail";
- real_name = "Wags-His-Tail"
- },
-/turf/open/floor/plasteel,
-/area/janitor)
-"bCu" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/public/glass{
- name = "Central Access"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bCv" = (
-/turf/closed/wall,
-/area/janitor)
-"bCw" = (
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
- },
-/turf/open/floor/plasteel,
-/area/janitor)
-"bCx" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 8
- },
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/plasteel,
-/area/gateway)
-"bCy" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/closed/wall,
-/area/janitor)
-"bCz" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bCA" = (
-/obj/structure/disposalpipe/trunk{
- dir = 1
- },
-/obj/machinery/disposal/bin,
-/turf/open/floor/plasteel/dark,
-/area/hallway/primary/central)
-"bCB" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/door/airlock/maintenance{
- name = "Surgery Maintenance";
- req_access_txt = "45"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bCC" = (
-/obj/structure/disposalpipe/segment{
- dir = 6
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bCD" = (
-/obj/structure/table,
-/obj/item/retractor,
-/turf/open/floor/plasteel/white/side,
-/area/medical/sleeper)
-"bCE" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
- },
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bCF" = (
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
- },
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bCG" = (
-/obj/structure/table,
-/obj/item/folder/white,
-/obj/item/reagent_containers/dropper,
-/obj/item/soap/nanotrasen,
-/obj/item/gun/syringe/dart,
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bCH" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
- },
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bCJ" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bCK" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bCL" = (
-/obj/structure/closet/secure_closet/medical3,
-/obj/machinery/camera{
- c_tag = "Medbay Storage";
- network = list("ss13","medbay")
- },
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bCM" = (
-/obj/structure/closet/secure_closet/medical3,
-/obj/machinery/airalarm{
- pixel_y = 24
- },
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bCN" = (
-/obj/structure/disposalpipe/trunk,
-/obj/machinery/disposal/bin,
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bCO" = (
-/obj/structure/table,
-/obj/item/storage/box/bodybags{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/item/storage/box/rxglasses,
-/obj/item/hand_labeler,
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bCP" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/closed/wall,
-/area/medical/sleeper)
-"bCQ" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/medical/sleeper)
-"bCR" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bCS" = (
-/obj/machinery/airalarm{
- dir = 8;
- pixel_x = 24
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/iv_drip,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bCT" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/bloodbankgen,
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bCU" = (
-/obj/item/radio/intercom{
- frequency = 1485;
- name = "Station Intercom (Medbay)";
- pixel_x = -30
- },
-/obj/machinery/camera{
- c_tag = "Medbay South";
- dir = 4;
- network = list("ss13","medbay")
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bCV" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bCW" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/heads/cmo)
-"bCX" = (
-/obj/effect/decal/cleanable/oil,
-/obj/item/cigbutt,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/science/storage)
-"bCY" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/heads/cmo)
-"bCZ" = (
-/obj/structure/chair/office/light,
-/obj/effect/landmark/start/chief_medical_officer,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/heads/cmo)
-"bDa" = (
-/obj/machinery/keycard_auth{
- pixel_x = 24
- },
-/obj/structure/disposalpipe/segment,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/heads/cmo)
-"bDb" = (
-/turf/closed/wall/r_wall,
-/area/science/xenobiology)
-"bDc" = (
-/turf/closed/wall,
-/area/science/storage)
-"bDd" = (
-/obj/machinery/door/firedoor/heavy,
-/obj/machinery/airalarm{
- dir = 4;
- pixel_x = -22
- },
-/turf/open/floor/plasteel/white/side{
- dir = 5
- },
-/area/science/research)
-"bDe" = (
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/plasteel,
-/area/hallway/primary/port)
-"bDf" = (
-/obj/machinery/light_switch{
- pixel_x = 27
- },
-/obj/machinery/light/small{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/science/storage)
-"bDg" = (
-/obj/structure/rack,
-/obj/effect/spawner/lootdrop/maintenance{
- lootcount = 3;
- name = "3maintenance loot spawner"
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard)
-"bDh" = (
-/obj/structure/closet,
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/plating,
-/area/maintenance/starboard)
-"bDj" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/science/storage)
-"bDk" = (
-/obj/structure/table,
-/obj/item/folder/yellow,
-/obj/item/pen,
-/obj/machinery/requests_console{
- department = "Mining";
- pixel_x = -30
- },
-/obj/machinery/light{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"bDl" = (
-/obj/machinery/firealarm{
- dir = 4;
- pixel_x = -24
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white/side{
- dir = 5
- },
-/area/science/research)
-"bDm" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10
- },
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"bDn" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"bDo" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"bDp" = (
-/obj/machinery/firealarm{
- dir = 8;
- pixel_x = 24
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/tile/yellow,
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bDq" = (
-/obj/structure/table,
-/obj/item/paper_bin{
- pixel_x = -3;
- pixel_y = 7
- },
-/obj/item/pen,
-/obj/item/key/janitor,
-/turf/open/floor/plasteel,
-/area/janitor)
-"bDr" = (
-/obj/item/restraints/legcuffs/beartrap,
-/obj/item/restraints/legcuffs/beartrap,
-/obj/item/storage/box/mousetraps,
-/obj/item/storage/box/mousetraps,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/table,
-/turf/open/floor/plasteel,
-/area/janitor)
-"bDs" = (
-/obj/structure/sign/poster/contraband/lusty_xenomorph{
- pixel_x = 32
- },
-/obj/structure/reagent_dispensers/watertank/high,
-/turf/open/floor/plasteel,
-/area/janitor)
-"bDt" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10
- },
-/turf/closed/wall,
-/area/maintenance/port/aft)
-"bDu" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bDv" = (
-/obj/structure/table,
-/obj/item/flashlight{
- pixel_x = 1;
- pixel_y = 5
- },
-/obj/item/flashlight{
- pixel_x = 1;
- pixel_y = 5
- },
-/obj/item/assembly/flash/handheld,
-/obj/item/assembly/flash/handheld,
-/obj/machinery/status_display/ai{
- pixel_x = -32
- },
-/obj/machinery/power/apc{
- areastring = "/area/storage/tech";
- dir = 1;
- name = "Tech Storage APC";
- pixel_y = 24
- },
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/turf/open/floor/plating,
-/area/storage/tech)
-"bDw" = (
-/obj/structure/table,
-/obj/item/screwdriver{
- pixel_y = 16
- },
-/obj/item/wirecutters,
-/turf/open/floor/plating,
-/area/storage/tech)
-"bDx" = (
-/obj/structure/table,
-/obj/item/electronics/apc,
-/obj/item/electronics/airlock,
-/obj/machinery/light/small{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/storage/tech)
-"bDA" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/power/apc{
- areastring = "/area/medical/sleeper";
- dir = 4;
- name = "Treatment Center APC";
- pixel_x = 26
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bDB" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white/side{
- dir = 4
- },
-/area/medical/sleeper)
-"bDC" = (
-/obj/machinery/computer/operating{
- dir = 1
- },
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bDD" = (
-/obj/structure/bed,
-/obj/item/bedsheet/medical,
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bDE" = (
-/obj/machinery/vending/wallmed{
- pixel_x = 28
- },
-/obj/machinery/camera{
- c_tag = "Medbay Recovery Room";
- dir = 8;
- network = list("ss13","medbay")
- },
-/obj/machinery/iv_drip,
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bDF" = (
-/obj/machinery/door/poddoor/preopen{
- id = "medpriv4";
- name = "privacy door"
- },
-/obj/effect/spawner/structure/window,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/medical/medbay/central)
-"bDG" = (
-/obj/machinery/door/firedoor,
-/obj/effect/turf_decal/tile/yellow,
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bDH" = (
-/obj/structure/closet/l3closet/janitor,
-/obj/machinery/airalarm{
- pixel_y = 23
- },
-/turf/open/floor/plasteel,
-/area/janitor)
-"bDI" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden,
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bDJ" = (
-/obj/structure/closet/jcloset,
-/obj/item/storage/bag/trash,
-/obj/item/clothing/under/rank/civilian/janitor/maid,
-/obj/item/clothing/under/rank/civilian/janitor/maid,
-/obj/item/clothing/under/rank/civilian/janitor/maid,
-/obj/item/clothing/under/costume/maid,
-/obj/item/clothing/under/costume/maid,
-/obj/item/clothing/under/costume/maid,
-/turf/open/floor/plasteel,
-/area/janitor)
-"bDK" = (
-/obj/machinery/light_switch{
- pixel_y = 28
- },
-/obj/machinery/camera{
- c_tag = "Custodial Closet"
- },
-/obj/vehicle/ridden/janicart,
-/turf/open/floor/plasteel,
-/area/janitor)
-"bDL" = (
-/obj/structure/sign/poster/contraband/lizard{
- pixel_x = -32
- },
-/turf/open/floor/plasteel,
-/area/janitor)
-"bDM" = (
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plasteel,
-/area/janitor)
-"bDN" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bDO" = (
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/structure/sign/poster/contraband/hacking_guide{
- pixel_y = 32
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bDP" = (
-/obj/machinery/navbeacon{
- codes_txt = "delivery;dir=8";
- dir = 1;
- freq = 1400;
- location = "Janitor"
- },
-/obj/structure/plasticflaps/opaque,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plasteel,
-/area/janitor)
-"bDQ" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bDR" = (
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bDS" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/heads/cmo)
-"bDT" = (
-/obj/effect/landmark/start/medical_doctor,
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bDU" = (
-/obj/machinery/door/airlock/command/glass{
- name = "Chief Medical Officer";
- req_access_txt = "40"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/heads/cmo)
-"bDV" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/sorting/mail{
- sortType = 10
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bDW" = (
-/obj/machinery/door/airlock/medical/glass{
- name = "Medbay Storage";
- req_access_txt = "5"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bDY" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/landmark/xeno_spawn,
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/engine,
-/area/science/storage)
-"bDZ" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bEa" = (
-/obj/structure/disposalpipe/segment{
- dir = 5
- },
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bEb" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/engine,
-/area/science/storage)
-"bEc" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/engine,
-/area/science/storage)
-"bEd" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/door/airlock/medical/glass{
- name = "Medbay Storage";
- req_access_txt = "5"
- },
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bEe" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bEf" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
- },
-/turf/open/floor/plasteel/white/side{
- dir = 5
- },
-/area/science/research)
-"bEg" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/door/airlock/research{
- name = "Toxins Storage";
- req_access_txt = "8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/science/storage)
-"bEh" = (
-/obj/structure/table/glass,
-/obj/item/paper_bin{
- pixel_x = -2;
- pixel_y = 5
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/heads/cmo)
-"bEi" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/crew_quarters/heads/cmo)
-"bEj" = (
-/obj/structure/table/glass,
-/obj/item/pen,
-/obj/item/clothing/neck/stethoscope,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/mob/living/simple_animal/pet/cat/Runtime,
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/heads/cmo)
-"bEk" = (
-/obj/structure/table/glass,
-/obj/item/folder/white,
-/obj/item/stamp/cmo,
-/obj/item/clothing/glasses/hud/health,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/heads/cmo)
-"bEl" = (
-/obj/structure/disposalpipe/segment,
-/obj/item/radio/intercom{
- pixel_x = 25
- },
-/obj/machinery/camera{
- c_tag = "Chief Medical Office";
- dir = 8;
- network = list("ss13","medbay");
- pixel_y = -22
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/heads/cmo)
-"bEm" = (
-/turf/open/floor/engine,
-/area/science/xenobiology)
-"bEn" = (
-/obj/machinery/camera{
- c_tag = "Xenobiology Test Chamber";
- network = list("xeno","rd")
- },
-/obj/machinery/light{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/science/xenobiology)
-"bEo" = (
-/obj/machinery/portable_atmospherics/canister/toxins,
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/engine,
-/area/science/storage)
-"bEp" = (
-/obj/machinery/portable_atmospherics/canister/toxins,
-/obj/structure/sign/warning/nosmoking{
- pixel_y = 32
- },
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/engine,
-/area/science/storage)
-"bEq" = (
-/obj/machinery/power/apc{
- areastring = "/area/science/research";
- dir = 8;
- name = "Misc Research APC";
- pixel_x = -25
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/turf/open/floor/plasteel/white/side{
- dir = 5
- },
-/area/science/research)
-"bEr" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"bEs" = (
-/turf/closed/wall,
-/area/science/mixing)
-"bEt" = (
-/obj/machinery/vending/coffee,
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"bEu" = (
-/obj/structure/closet/bombcloset,
-/obj/machinery/light{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plasteel/white,
-/area/science/mixing)
-"bEv" = (
-/obj/structure/closet/bombcloset,
-/obj/machinery/light_switch{
- pixel_y = 28
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plasteel/white,
-/area/science/mixing)
-"bEw" = (
-/obj/machinery/portable_atmospherics/canister,
-/obj/item/radio/intercom{
- pixel_y = 25
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plasteel/white,
-/area/science/mixing)
-"bEx" = (
-/obj/machinery/portable_atmospherics/canister,
-/obj/structure/window/reinforced{
- dir = 8
- },
-/obj/machinery/firealarm{
- pixel_y = 24
- },
-/obj/machinery/camera{
- c_tag = "Toxins Lab West";
- network = list("ss13","rd")
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plasteel/white,
-/area/science/mixing)
-"bEy" = (
-/obj/machinery/portable_atmospherics/pump,
-/obj/structure/window/reinforced{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plasteel/white,
-/area/science/mixing)
-"bEz" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"bEA" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible,
-/obj/machinery/light{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel/white,
-/area/science/mixing)
-"bEB" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible,
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/turf/open/floor/plasteel/white,
-/area/science/mixing)
-"bEC" = (
-/turf/closed/wall/r_wall,
-/area/science/mixing)
-"bED" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible,
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/turf/open/floor/plasteel/white,
-/area/science/mixing)
-"bEE" = (
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
- },
-/obj/structure/disposalpipe/segment{
- dir = 6
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard)
-"bEF" = (
-/obj/structure/closet/crate,
-/obj/effect/spawner/lootdrop/maintenance{
- lootcount = 4;
- name = "4maintenance loot spawner"
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard)
-"bEG" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard)
-"bEH" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall,
-/area/science/mixing)
-"bEI" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard)
-"bEJ" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/port/fore)
-"bEK" = (
-/obj/machinery/camera{
- c_tag = "Mining Dock";
- dir = 4
- },
-/obj/machinery/computer/security/mining,
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"bEL" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/mixing)
-"bEM" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/closed/wall/r_wall,
-/area/science/mixing)
-"bEN" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden,
-/turf/open/floor/plasteel,
-/area/science/mixing)
-"bEO" = (
-/obj/structure/sign/warning/securearea{
- pixel_x = -32
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/corner{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/science/mixing)
-"bEP" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bEQ" = (
-/obj/effect/landmark/start/shaft_miner,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"bER" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/storage/tech)
-"bES" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall,
-/area/maintenance/port/aft)
-"bET" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/storage/tech)
-"bEU" = (
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/storage/tech)
-"bEV" = (
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/storage/tech)
-"bEW" = (
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/storage/tech)
-"bEX" = (
-/obj/structure/table,
-/obj/item/aicard,
-/obj/item/aiModule/reset,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/storage/tech)
-"bEY" = (
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/storage/tech)
-"bEZ" = (
-/obj/structure/table,
-/obj/item/stack/cable_coil{
- pixel_x = -3;
- pixel_y = 3
- },
-/obj/item/stack/cable_coil,
-/obj/item/stock_parts/cell/high/plus,
-/turf/open/floor/plating,
-/area/storage/tech)
-"bFa" = (
-/turf/open/floor/plating,
-/area/storage/tech)
-"bFb" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/storage/tech)
-"bFc" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/landmark/blobstart,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/storage/tech)
-"bFd" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bFe" = (
-/obj/machinery/door/airlock/engineering{
- name = "Tech Storage";
- req_access_txt = "23"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/storage/tech)
-"bFf" = (
-/obj/structure/chair/stool,
-/obj/effect/landmark/start/janitor,
-/turf/open/floor/plasteel,
-/area/janitor)
-"bFg" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/janitor)
-"bFh" = (
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bFi" = (
-/obj/structure/disposalpipe/segment{
- dir = 6
- },
-/turf/open/floor/plasteel,
-/area/janitor)
-"bFj" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/manifold4w/scrubbers,
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bFk" = (
-/obj/item/mop,
-/obj/item/reagent_containers/glass/bucket,
-/obj/structure/sign/poster/contraband/busty_backdoor_xeno_babes_6{
- pixel_x = 32
- },
-/obj/structure/closet,
-/turf/open/floor/plasteel,
-/area/janitor)
-"bFl" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/power/apc{
- areastring = "/area/janitor";
- dir = 8;
- name = "Custodial Closet APC";
- pixel_x = -24
- },
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bFm" = (
-/obj/structure/disposalpipe/sorting/mail/flip{
- dir = 8;
- sortType = 6
- },
-/obj/effect/spawner/structure/window,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bFn" = (
-/obj/structure/disposalpipe/segment{
- dir = 5
- },
-/obj/structure/grille/broken,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bFo" = (
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bFp" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/effect/spawner/structure/window,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bFq" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/tile/yellow,
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bFr" = (
-/obj/structure/disposalpipe/segment{
- dir = 6
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bFs" = (
-/obj/machinery/door/airlock/maintenance{
- name = "Custodial Maintenance";
- req_access_txt = "26"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bFt" = (
-/obj/structure/disposalpipe/segment,
-/obj/effect/spawner/structure/window,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bFu" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/medical{
- name = "Operating Theatre";
- req_access_txt = "45"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/medical/sleeper)
-"bFv" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bFw" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bFx" = (
-/obj/structure/disposalpipe/segment,
-/obj/effect/spawner/structure/window,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bFy" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
- },
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bFz" = (
-/obj/machinery/airalarm{
- dir = 1;
- pixel_y = -22
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
- },
-/turf/open/floor/plasteel/white/side{
- dir = 1
- },
-/area/medical/sleeper)
-"bFA" = (
-/obj/structure/sink{
- dir = 4;
- pixel_x = 11
- },
-/obj/machinery/requests_console{
- department = "Medbay";
- departmentType = 1;
- name = "Medbay RC";
- pixel_x = 30
- },
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bFB" = (
-/obj/structure/closet/secure_closet/medical2,
-/turf/open/floor/plasteel,
-/area/medical/sleeper)
-"bFC" = (
-/obj/structure/table/wood/poker,
-/obj/item/clothing/mask/cigarette/cigar{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
- },
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"bFD" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bFE" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 8
- },
-/obj/machinery/computer/security/telescreen/cmo{
- dir = 1;
- pixel_y = -24
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/heads/cmo)
-"bFF" = (
-/obj/machinery/light,
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bFG" = (
-/obj/structure/chair{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/heads/cmo)
-"bFH" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/light_switch{
- pixel_x = 28
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/heads/cmo)
-"bFI" = (
-/obj/machinery/airalarm{
- dir = 4;
- pixel_x = -22
- },
-/obj/machinery/light/small{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/science/storage)
-"bFJ" = (
-/obj/structure/bed,
-/obj/item/bedsheet/medical,
-/obj/structure/sign/warning/nosmoking{
- pixel_x = -28
- },
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bFK" = (
-/obj/structure/closet/wardrobe/pjs,
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bFL" = (
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bFM" = (
-/obj/structure/disposalpipe/junction/flip{
- dir = 2
- },
-/obj/machinery/atmospherics/pipe/manifold4w/scrubbers,
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bFN" = (
-/obj/structure/table,
-/obj/item/cartridge/medical{
- pixel_x = -2;
- pixel_y = 6
- },
-/obj/item/cartridge/medical{
- pixel_x = 6;
- pixel_y = 3
- },
-/obj/item/cartridge/medical,
-/obj/item/cartridge/chemistry{
- pixel_y = 2
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/heads/cmo)
-"bFO" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/crew_quarters/heads/cmo)
-"bFP" = (
-/obj/machinery/computer/card/minor/cmo{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/heads/cmo)
-"bFQ" = (
-/obj/structure/sign/warning/nosmoking{
- pixel_x = -32
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/white/side{
- dir = 5
- },
-/area/science/research)
-"bFR" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"bFS" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"bFT" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/mixing)
-"bFU" = (
-/turf/open/floor/plasteel/white,
-/area/science/mixing)
-"bFV" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible,
-/obj/machinery/meter,
-/turf/open/floor/plasteel/white,
-/area/science/mixing)
-"bFW" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 5
- },
-/turf/open/floor/plasteel/white,
-/area/science/mixing)
-"bFX" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 9
- },
-/turf/open/floor/plasteel/white,
-/area/science/mixing)
-"bFY" = (
-/obj/machinery/door/airlock/maintenance{
- req_one_access_txt = "8;12"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/disposalpipe/segment,
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/turf/open/floor/plating,
-/area/maintenance/starboard)
-"bFZ" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/closed/wall,
-/area/science/mixing)
-"bGa" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6
- },
-/turf/closed/wall,
-/area/maintenance/starboard)
-"bGb" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
- },
-/turf/closed/wall,
-/area/science/mixing)
-"bGc" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/science/mixing)
-"bGd" = (
-/obj/machinery/doppler_array/research/science{
- dir = 4
- },
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plasteel,
-/area/science/mixing)
-"bGe" = (
-/turf/closed/wall,
-/area/science/test_area)
-"bGf" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating/airless,
-/area/science/test_area)
-"bGi" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/quartermaster/miningdock)
-"bGj" = (
-/obj/machinery/computer/shuttle/mining{
- dir = 4
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 4
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"bGk" = (
-/obj/structure/chair/stool,
-/obj/effect/landmark/start/scientist,
-/turf/open/floor/plasteel/white,
-/area/science/mixing)
-"bGl" = (
-/obj/item/assembly/prox_sensor{
- pixel_x = -4;
- pixel_y = 1
- },
-/obj/item/assembly/prox_sensor{
- pixel_x = 8;
- pixel_y = 9
- },
-/obj/item/assembly/prox_sensor{
- pixel_x = 9;
- pixel_y = -2
- },
-/obj/item/assembly/prox_sensor{
- pixel_y = 2
- },
-/obj/structure/table/reinforced,
-/turf/open/floor/plasteel/white,
-/area/science/mixing)
-"bGm" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"bGn" = (
-/obj/structure/closet/secure_closet/miner,
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"bGo" = (
-/obj/machinery/door/airlock/maintenance/abandoned{
- name = "Firefighting equipment";
- req_access_txt = "12"
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bGp" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bGq" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bGr" = (
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/structure/cable,
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/storage/tech)
-"bGs" = (
-/obj/machinery/camera{
- c_tag = "Secure Tech Storage"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/storage/tech)
-"bGt" = (
-/obj/structure/rack,
-/obj/effect/spawner/lootdrop/techstorage/AI,
-/turf/open/floor/plasteel,
-/area/storage/tech)
-"bGu" = (
-/obj/structure/sign/warning/electricshock,
-/turf/closed/wall/r_wall,
-/area/storage/tech)
-"bGv" = (
-/obj/structure/table,
-/obj/machinery/cell_charger{
- pixel_y = 5
- },
-/obj/item/multitool,
-/turf/open/floor/plating,
-/area/storage/tech)
-"bGw" = (
-/obj/structure/rack,
-/obj/effect/spawner/lootdrop/techstorage/rnd,
-/turf/open/floor/plating,
-/area/storage/tech)
-"bGx" = (
-/obj/structure/rack,
-/obj/effect/spawner/lootdrop/techstorage/tcomms,
-/turf/open/floor/plating,
-/area/storage/tech)
-"bGy" = (
-/obj/structure/rack,
-/obj/effect/spawner/lootdrop/techstorage/service,
-/turf/open/floor/plating,
-/area/storage/tech)
-"bGz" = (
-/obj/structure/table/reinforced,
-/obj/item/wrench,
-/obj/item/screwdriver{
- pixel_y = 10
- },
-/obj/item/analyzer,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/white,
-/area/science/mixing)
-"bGA" = (
-/obj/machinery/holopad,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/mixing)
-"bGB" = (
-/obj/structure/table,
-/obj/item/grenade/chem_grenade/cleaner,
-/obj/item/grenade/chem_grenade/cleaner,
-/obj/item/grenade/chem_grenade/cleaner,
-/obj/machinery/requests_console{
- department = "Janitorial";
- departmentType = 1;
- pixel_y = -29
- },
-/obj/item/reagent_containers/spray/cleaner,
-/obj/item/storage/box/lights/mixed,
-/obj/item/storage/box/lights/mixed,
-/turf/open/floor/plasteel,
-/area/janitor)
-"bGC" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/door/firedoor/heavy,
-/obj/machinery/door/airlock/research{
- name = "Toxins Launch Room Access";
- req_access_txt = "7"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/mixing)
-"bGD" = (
-/obj/structure/janitorialcart,
-/turf/open/floor/plasteel,
-/area/janitor)
-"bGE" = (
-/obj/machinery/disposal/bin,
-/obj/structure/disposalpipe/trunk{
- dir = 1
- },
-/obj/machinery/light,
-/turf/open/floor/plasteel,
-/area/janitor)
-"bGF" = (
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/mixing)
-"bGG" = (
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/science/mixing)
-"bGH" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bGI" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bGJ" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bGK" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/science/mixing)
-"bGL" = (
-/obj/machinery/atmospherics/pipe/manifold4w/scrubbers,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/science/mixing)
-"bGM" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"bGN" = (
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bGO" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/disposalpipe/segment{
- dir = 6
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/tile/yellow,
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bGP" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bGQ" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bGR" = (
-/obj/structure/table,
-/obj/item/storage/belt/medical{
- pixel_y = 2
- },
-/obj/item/storage/belt/medical{
- pixel_y = 2
- },
-/obj/item/storage/belt/medical{
- pixel_y = 2
- },
-/obj/item/clothing/neck/stethoscope,
-/obj/item/gun/syringe/dart,
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bGT" = (
-/obj/structure/table,
-/obj/item/folder/white,
-/obj/item/clothing/neck/stethoscope,
-/obj/machinery/vending/wallmed{
- pixel_y = 28
- },
-/obj/machinery/light/small{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bGU" = (
-/obj/structure/closet/secure_closet/personal/patient,
-/obj/machinery/button/door{
- id = "medpriv4";
- name = "Privacy Shutters";
- pixel_y = 25
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bGV" = (
-/obj/structure/chair/office/light{
- dir = 8
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bGW" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/manifold4w/scrubbers,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bGX" = (
-/obj/machinery/light{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bGY" = (
-/obj/machinery/portable_atmospherics/scrubber/huge,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/engine,
-/area/science/storage)
-"bGZ" = (
-/obj/machinery/holopad,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/heads/cmo)
-"bHa" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/closed/wall,
-/area/crew_quarters/heads/cmo)
-"bHb" = (
-/obj/structure/disposalpipe/segment{
- dir = 5
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/heads/cmo)
-"bHc" = (
-/obj/structure/extinguisher_cabinet{
- pixel_x = -27
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
- },
-/turf/open/floor/plasteel/white/side{
- dir = 5
- },
-/area/science/research)
-"bHd" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bHe" = (
-/obj/machinery/power/apc{
- areastring = "/area/science/storage";
- dir = 8;
- name = "Toxins Storage APC";
- pixel_x = -25
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/machinery/camera{
- c_tag = "Toxins Storage";
- dir = 4;
- network = list("ss13","rd")
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/engine,
-/area/science/storage)
-"bHf" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"bHg" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"bHh" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/storage/tech)
-"bHi" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/storage/tech)
-"bHj" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bHk" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bHl" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden,
-/obj/effect/turf_decal/tile/yellow,
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bHm" = (
-/obj/machinery/door/firedoor/heavy,
-/obj/machinery/door/airlock/research{
- name = "Toxins Lab";
- req_access_txt = "7"
- },
-/turf/open/floor/plasteel/white,
-/area/science/mixing)
-"bHn" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/turf/closed/wall/r_wall,
-/area/maintenance/aft)
-"bHo" = (
-/obj/structure/closet,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bHp" = (
-/obj/structure/disposalpipe/segment{
- dir = 5
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bHq" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bHr" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/closed/wall,
-/area/science/mixing)
-"bHs" = (
-/obj/machinery/light/small{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/stripes/corner,
-/turf/open/floor/plasteel,
-/area/science/mixing)
-"bHt" = (
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bHu" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
- },
-/obj/item/radio/intercom{
- pixel_y = 25
- },
-/obj/machinery/light/small{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/science/mixing)
-"bHv" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/science/mixing)
-"bHw" = (
-/obj/item/target,
-/obj/structure/window/reinforced,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/science/test_area)
-"bHy" = (
-/obj/structure/closet/crate,
-/obj/machinery/light/small{
- dir = 4
- },
-/obj/item/radio/intercom{
- dir = 4;
- name = "Station Intercom (General)";
- pixel_x = 27
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"bHz" = (
-/obj/item/stack/ore/iron,
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"bHA" = (
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"bHC" = (
-/obj/effect/landmark/blobstart,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bHD" = (
-/obj/machinery/light/small{
- dir = 1
- },
-/obj/structure/chair/stool,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bHE" = (
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bHG" = (
-/obj/structure/rack,
-/obj/machinery/light/small{
- dir = 8
- },
-/obj/effect/spawner/lootdrop/techstorage/command,
-/turf/open/floor/plasteel,
-/area/storage/tech)
-"bHH" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plating,
-/area/storage/tech)
-"bHI" = (
-/obj/machinery/door/airlock/highsecurity{
- name = "Secure Tech Storage";
- req_access_txt = "19;23"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plating,
-/area/storage/tech)
-"bHJ" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/landmark/xeno_spawn,
-/turf/open/floor/plating,
-/area/storage/tech)
-"bHK" = (
-/obj/machinery/light{
- dir = 8
- },
-/obj/machinery/door/firedoor/heavy,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/white/side{
- dir = 5
- },
-/area/science/research)
-"bHL" = (
-/obj/machinery/camera{
- c_tag = "Research Division South";
- dir = 8
- },
-/obj/machinery/door/firedoor/heavy,
-/turf/open/floor/plasteel/white/side{
- dir = 9
- },
-/area/science/research)
-"bHM" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/door/firedoor/heavy,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"bHN" = (
-/obj/machinery/requests_console{
- department = "Tech storage";
- pixel_y = -32
- },
-/obj/machinery/space_heater,
-/turf/open/floor/plating,
-/area/storage/tech)
-"bHO" = (
-/obj/structure/rack,
-/obj/item/storage/toolbox/electrical{
- pixel_x = 1;
- pixel_y = -1
- },
-/obj/item/multitool,
-/obj/item/clothing/glasses/meson,
-/obj/machinery/light/small,
-/turf/open/floor/plating,
-/area/storage/tech)
-"bHP" = (
-/obj/effect/turf_decal/tile/yellow,
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bHQ" = (
-/obj/machinery/vending/assist,
-/turf/open/floor/plating,
-/area/storage/tech)
-"bHR" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/camera{
- c_tag = "Aft Primary Hallway 2";
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bHS" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bHT" = (
-/obj/effect/spawner/structure/window,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/machinery/door/firedoor,
-/turf/open/floor/plating,
-/area/medical/medbay/central)
-"bHU" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/grille/broken,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bHV" = (
-/obj/machinery/power/apc{
- areastring = "/area/maintenance/aft";
- dir = 8;
- name = "Aft Maintenance APC";
- pixel_x = -24
- },
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bHW" = (
-/obj/structure/disposalpipe/segment,
-/obj/effect/spawner/structure/window,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bHX" = (
-/obj/effect/spawner/structure/window,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bHY" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bIa" = (
-/obj/structure/disposalpipe/segment{
- dir = 5
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/machinery/atmospherics/pipe/manifold4w/scrubbers,
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bIb" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/white/side{
- dir = 5
- },
-/area/science/research)
-"bIc" = (
-/obj/machinery/firealarm{
- dir = 1;
- pixel_y = -24
- },
-/turf/open/floor/plasteel/white/side{
- dir = 1
- },
-/area/medical/sleeper)
-"bId" = (
-/obj/machinery/vending/wallmed{
- pixel_y = -28
- },
-/obj/machinery/camera{
- c_tag = "Surgery Operating";
- dir = 1;
- network = list("ss13","medbay");
- pixel_x = 22
- },
-/obj/machinery/light,
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bIe" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/status_display/evac{
- pixel_x = -32
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bIf" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/doorButtons/access_button{
- idDoor = "virology_airlock_exterior";
- idSelf = "virology_airlock_control";
- name = "Virology Access Button";
- pixel_x = -24;
- req_access_txt = "39"
- },
-/obj/machinery/door/firedoor,
-/obj/effect/mapping_helpers/airlock/locked,
-/obj/machinery/door/airlock/virology{
- autoclose = 0;
- frequency = 1449;
- id_tag = "virology_airlock_exterior";
- name = "Virology Exterior Airlock";
- req_access_txt = "39"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bIg" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/structure/disposalpipe/sorting/mail/flip{
- dir = 2;
- sortType = 13
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bIh" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
-"bIi" = (
-/obj/structure/table,
-/obj/item/storage/firstaid/o2{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/item/storage/firstaid/o2,
-/obj/item/storage/firstaid/regular{
- pixel_x = -3;
- pixel_y = -3
- },
-/obj/structure/window/reinforced{
- dir = 8
- },
-/obj/structure/window/reinforced{
- dir = 1
- },
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bIj" = (
-/obj/structure/table,
-/obj/machinery/light,
-/obj/item/reagent_containers/spray/cleaner,
-/obj/item/clothing/glasses/hud/health,
-/obj/item/clothing/glasses/hud/health,
-/obj/item/clothing/glasses/hud/health,
-/obj/item/hand_labeler,
-/obj/item/stack/packageWrap,
-/obj/item/stack/packageWrap,
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bIk" = (
-/obj/structure/table,
-/obj/item/storage/firstaid/fire{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/item/storage/firstaid/fire,
-/obj/item/storage/firstaid/regular{
- pixel_x = -3;
- pixel_y = -3
- },
-/obj/machinery/door/window/northright{
- name = "First-Aid Supplies";
- red_alert_access = 1;
- req_access_txt = "5"
- },
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bIl" = (
-/obj/structure/table,
-/obj/item/storage/firstaid/toxin{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/item/storage/firstaid/toxin,
-/obj/item/storage/firstaid/regular{
- pixel_x = -3;
- pixel_y = -3
- },
-/obj/machinery/door/window/northleft{
- name = "First-Aid Supplies";
- red_alert_access = 1;
- req_access_txt = "5"
- },
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bIm" = (
-/obj/machinery/light,
-/obj/machinery/rnd/production/techfab/department/medical,
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bIn" = (
-/obj/structure/table,
-/obj/item/storage/firstaid/brute{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/item/storage/firstaid/brute,
-/obj/item/storage/firstaid/regular{
- pixel_x = -3;
- pixel_y = -3
- },
-/obj/structure/window/reinforced{
- dir = 4
- },
-/obj/structure/window/reinforced{
- dir = 1
- },
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"bIo" = (
-/obj/structure/bed,
-/obj/item/bedsheet/medical,
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bIp" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bIq" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bIr" = (
-/obj/machinery/door/airlock/medical{
- name = "Patient Room";
- req_access_txt = "5"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bIs" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/door/airlock/maintenance{
- name = "Xenobiology Maintenance";
- req_access_txt = "55"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bIt" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
-"bIu" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
-"bIv" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
-/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
-"bIw" = (
-/obj/structure/closet/secure_closet/CMO,
-/obj/machinery/light{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/heads/cmo)
-"bIx" = (
-/obj/structure/sign/warning/electricshock,
-/turf/closed/wall/r_wall,
-/area/science/xenobiology)
-"bIy" = (
-/obj/structure/disposaloutlet{
- dir = 1
- },
-/obj/structure/disposalpipe/trunk,
-/turf/open/floor/engine,
-/area/science/xenobiology)
-"bIz" = (
-/obj/machinery/portable_atmospherics/canister/carbon_dioxide,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/engine,
-/area/science/storage)
-"bIA" = (
-/obj/machinery/portable_atmospherics/canister/oxygen,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/engine,
-/area/science/storage)
-"bIB" = (
-/obj/machinery/portable_atmospherics/canister/nitrous_oxide,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/engine,
-/area/science/storage)
-"bIC" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/science/storage)
-"bID" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/turf/open/floor/plasteel/white/side{
- dir = 5
- },
-/area/science/research)
-"bIE" = (
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"bIF" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bIG" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bIH" = (
-/obj/machinery/pipedispenser/disposal,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bII" = (
-/obj/item/storage/secure/safe{
- pixel_x = 5;
- pixel_y = 29
- },
-/obj/machinery/camera{
- c_tag = "Virology Break Room";
- network = list("ss13","medbay")
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bIJ" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bIK" = (
-/obj/structure/sink{
- dir = 8;
- pixel_x = -12;
- pixel_y = 2
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bIL" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
- },
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bIM" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/sign/warning/securearea{
- pixel_x = 32
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bIN" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/closed/wall/r_wall,
-/area/science/xenobiology)
-"bIO" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
-/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
-"bIP" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/structure/chair/comfy/black,
-/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
-"bIQ" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/holopad,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
-"bIR" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
- },
-/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
-"bIS" = (
-/obj/machinery/door/airlock/research{
- name = "Toxins Launch Room";
- req_access_txt = "7"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/science/mixing)
-"bIT" = (
-/obj/effect/spawner/structure/window,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/structure/sign/departments/xenobio{
- pixel_y = -32
- },
-/turf/open/floor/plating,
-/area/science/xenobiology)
-"bIU" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/corner,
-/turf/open/floor/plasteel,
-/area/science/mixing)
-"bIV" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/science/mixing)
-"bIW" = (
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plasteel,
-/area/science/mixing)
-"bIX" = (
-/obj/structure/sign/warning/securearea{
- desc = "A warning sign which reads 'BOMB RANGE";
- name = "BOMB RANGE"
- },
-/turf/closed/wall,
-/area/science/test_area)
-"bIY" = (
-/obj/structure/chair,
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/science/test_area)
-"bIZ" = (
-/obj/structure/chair,
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/science/test_area)
-"bJa" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/science/test_area)
-"bJb" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/obj/machinery/door/airlock/mining/glass{
- name = "Mining Dock";
- req_access_txt = "48"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plating,
-/area/quartermaster/miningdock)
-"bJd" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/obj/machinery/door/airlock/mining/glass{
- name = "Mining Dock";
- req_access_txt = "48"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"bJe" = (
-/obj/structure/table,
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bJf" = (
-/obj/structure/closet/firecloset,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bJg" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/storage/tech)
-"bJh" = (
-/obj/structure/rack,
-/obj/effect/spawner/lootdrop/techstorage/RnD_secure,
-/turf/open/floor/plasteel,
-/area/storage/tech)
-"bJi" = (
-/obj/structure/sign/warning/securearea,
-/turf/closed/wall/r_wall,
-/area/storage/tech)
-"bJj" = (
-/obj/structure/table,
-/obj/item/stock_parts/subspace/analyzer,
-/obj/item/stock_parts/subspace/analyzer,
-/obj/item/stock_parts/subspace/analyzer,
-/turf/open/floor/plating,
-/area/storage/tech)
-"bJk" = (
-/obj/structure/rack,
-/obj/effect/spawner/lootdrop/techstorage/medical,
-/turf/open/floor/plating,
-/area/storage/tech)
-"bJl" = (
-/obj/structure/rack,
-/obj/effect/spawner/lootdrop/techstorage/engineering,
-/turf/open/floor/plating,
-/area/storage/tech)
-"bJm" = (
-/obj/structure/rack,
-/obj/effect/spawner/lootdrop/techstorage/security,
-/turf/open/floor/plating,
-/area/storage/tech)
-"bJn" = (
-/obj/machinery/light_switch{
- pixel_x = 27
- },
-/turf/open/floor/plating,
-/area/storage/tech)
-"bJo" = (
-/turf/open/floor/plasteel/white/side{
- dir = 1
- },
-/area/science/research)
-"bJp" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 8
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bJq" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bJr" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
- },
-/turf/open/floor/plasteel/white/side{
- dir = 1
- },
-/area/science/research)
-"bJs" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bJt" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bJu" = (
-/obj/structure/light_construct{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/construction)
-"bJv" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bJw" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bJx" = (
-/obj/effect/landmark/event_spawn,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"bJy" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bJz" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/extinguisher_cabinet{
- pixel_x = -27;
- pixel_y = 1
- },
-/obj/machinery/light{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bJA" = (
-/obj/effect/landmark/blobstart,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bJB" = (
-/obj/machinery/atmospherics/pipe/manifold4w/scrubbers,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bJC" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/closed/wall/r_wall,
-/area/medical/sleeper)
-"bJD" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10
- },
-/turf/closed/wall/r_wall,
-/area/medical/sleeper)
-"bJE" = (
-/turf/closed/wall/r_wall,
-/area/medical/medbay/central)
-"bJF" = (
-/obj/machinery/pipedispenser/disposal/transit_tube,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bJG" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bJH" = (
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/machinery/shieldwallgen/xenobiologyaccess,
-/turf/open/floor/plating,
-/area/science/xenobiology)
-"bJI" = (
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/machinery/door/poddoor/preopen{
- id = "misclab";
- name = "test chamber blast door"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/engine,
-/area/science/xenobiology)
-"bJJ" = (
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/machinery/door/poddoor/preopen{
- id = "misclab";
- name = "test chamber blast door"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/engine,
-/area/science/xenobiology)
-"bJK" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/machinery/door/poddoor/preopen{
- id = "misclab";
- name = "test chamber blast door"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/engine,
-/area/science/xenobiology)
-"bJM" = (
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/machinery/door/poddoor/preopen{
- id = "misclab";
- name = "test chamber blast door"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/engine,
-/area/science/xenobiology)
-"bJN" = (
-/turf/closed/wall,
-/area/science/xenobiology)
-"bJO" = (
-/obj/machinery/door/airlock/research{
- name = "Testing Lab";
- req_access_txt = "47"
- },
-/turf/open/floor/plasteel,
-/area/science/misc_lab)
-"bJP" = (
-/obj/effect/spawner/lootdrop/keg,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bJQ" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bJR" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/closed/wall,
-/area/science/storage)
-"bJT" = (
-/obj/machinery/vending/cigarette,
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"bJU" = (
-/obj/machinery/vending/wardrobe/science_wardrobe,
-/turf/open/floor/plasteel/white,
-/area/science/mixing)
-"bJV" = (
-/obj/structure/closet/l3closet/scientist{
- pixel_x = -2
- },
-/turf/open/floor/plasteel/white,
-/area/science/mixing)
-"bJW" = (
-/obj/item/transfer_valve{
- pixel_x = -5
- },
-/obj/item/transfer_valve{
- pixel_x = -5
- },
-/obj/item/transfer_valve,
-/obj/item/transfer_valve,
-/obj/item/transfer_valve{
- pixel_x = 5
- },
-/obj/item/transfer_valve{
- pixel_x = 5
- },
-/obj/machinery/requests_console{
- department = "Science";
- departmentType = 2;
- name = "Science Requests Console";
- pixel_y = -30;
- receive_ore_updates = 1
- },
-/obj/structure/table/reinforced,
-/turf/open/floor/plasteel/white,
-/area/science/mixing)
-"bJX" = (
-/obj/item/assembly/signaler{
- pixel_y = 8
- },
-/obj/item/assembly/signaler{
- pixel_x = -8;
- pixel_y = 5
- },
-/obj/item/assembly/signaler{
- pixel_x = 6;
- pixel_y = 5
- },
-/obj/item/assembly/signaler{
- pixel_x = -2;
- pixel_y = -2
- },
-/obj/structure/table/reinforced,
-/turf/open/floor/plasteel/white,
-/area/science/mixing)
-"bJY" = (
-/obj/structure/tank_dispenser,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/engine,
-/area/science/storage)
-"bJZ" = (
-/obj/item/assembly/timer{
- pixel_x = 5;
- pixel_y = 4
- },
-/obj/item/assembly/timer{
- pixel_x = -4;
- pixel_y = 2
- },
-/obj/item/assembly/timer{
- pixel_x = 6;
- pixel_y = -4
- },
-/obj/item/assembly/timer,
-/obj/structure/table/reinforced,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/white,
-/area/science/mixing)
-"bKa" = (
-/obj/machinery/power/apc{
- areastring = "/area/science/mixing";
- dir = 4;
- name = "Toxins Lab APC";
- pixel_x = 26
- },
-/obj/structure/cable,
-/turf/open/floor/plasteel/white,
-/area/science/mixing)
-"bKb" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plasteel,
-/area/science/mixing)
-"bKc" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/science/mixing)
-"bKd" = (
-/obj/machinery/camera{
- c_tag = "Toxins Launch Room Access";
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/stripes/corner{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/science/mixing)
-"bKe" = (
-/obj/effect/spawner/structure/window,
-/turf/open/floor/plating,
-/area/science/mixing)
-"bKf" = (
-/obj/machinery/door/window/southleft{
- name = "Mass Driver Door";
- req_access_txt = "7"
- },
-/obj/effect/turf_decal/loading_area,
-/turf/open/floor/plasteel,
-/area/science/mixing)
-"bKg" = (
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/science/test_area)
-"bKh" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/science/test_area)
-"bKi" = (
-/obj/structure/chair{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/science/test_area)
-"bKj" = (
-/obj/machinery/camera{
- c_tag = "Mining Dock External";
- dir = 8
- },
-/obj/structure/reagent_dispensers/fueltank,
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"bKk" = (
-/obj/item/stack/ore/silver,
-/obj/item/stack/ore/silver,
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"bKl" = (
-/obj/structure/closet/emcloset,
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/obj/effect/turf_decal/tile/brown,
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"bKm" = (
-/obj/structure/sign/warning/vacuum/external,
-/turf/closed/wall,
-/area/quartermaster/miningdock)
-"bKn" = (
-/obj/structure/rack,
-/obj/item/storage/toolbox/mechanical{
- pixel_x = -2;
- pixel_y = -1
- },
-/obj/item/pickaxe{
- pixel_x = 5
- },
-/obj/item/shovel{
- pixel_x = -5
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"bKo" = (
-/obj/machinery/light,
-/obj/machinery/space_heater,
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"bKp" = (
-/obj/structure/closet/crate,
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"bKq" = (
-/obj/machinery/mineral/equipment_vendor,
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"bKr" = (
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/structure/cable,
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/storage/tech)
-"bKs" = (
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/structure/cable,
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/storage/tech)
-"bKt" = (
-/obj/structure/table,
-/obj/item/stock_parts/micro_laser,
-/obj/item/stock_parts/manipulator,
-/obj/item/stock_parts/manipulator,
-/obj/item/stock_parts/manipulator,
-/obj/item/stock_parts/manipulator,
-/obj/item/stock_parts/capacitor,
-/obj/item/stock_parts/micro_laser/high,
-/obj/item/stock_parts/micro_laser/high,
-/obj/item/stock_parts/micro_laser/high,
-/obj/item/stock_parts/micro_laser/high,
-/turf/open/floor/plating,
-/area/storage/tech)
-"bKu" = (
-/obj/structure/table,
-/obj/item/stock_parts/subspace/amplifier,
-/obj/item/stock_parts/subspace/amplifier,
-/obj/item/stock_parts/subspace/amplifier,
-/turf/open/floor/plating,
-/area/storage/tech)
-"bKv" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bKw" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/closed/wall,
-/area/maintenance/aft)
-"bKx" = (
-/obj/structure/closet/crate,
-/obj/effect/landmark/blobstart,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/construction)
-"bKy" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/closed/wall/r_wall,
-/area/maintenance/aft)
-"bKz" = (
-/obj/structure/reagent_dispensers/watertank,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bKA" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/construction)
-"bKB" = (
-/obj/machinery/meter,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bKC" = (
-/obj/structure/reagent_dispensers/fueltank,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bKD" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bKE" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bKF" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/structure/chair/office/dark{
- dir = 4
- },
-/obj/effect/landmark/start/cargo_technician,
-/turf/open/floor/plasteel,
-/area/quartermaster/sorting)
-"bKG" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/sign/warning/securearea{
- pixel_y = -32
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bKH" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bKI" = (
-/obj/structure/disposalpipe/sorting/mail{
- dir = 8;
- sortType = 11
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bKJ" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bKK" = (
-/obj/effect/decal/cleanable/cobweb/cobweb2,
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/machinery/power/apc{
- areastring = "/area/medical/medbay/central";
- dir = 4;
- name = "Medbay APC";
- pixel_x = 24
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bKL" = (
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bKM" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/obj/machinery/airalarm{
- pixel_y = 24
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bKN" = (
-/obj/machinery/door/airlock/medical{
- name = "Apothecary";
- req_access_txt = "5"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/door/firedoor,
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bKO" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bKP" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/window/westleft{
- name = "Delivery Desk";
- req_access_txt = "50"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/bot,
-/obj/structure/table/reinforced,
-/turf/open/floor/plasteel,
-/area/quartermaster/sorting)
-"bKQ" = (
-/obj/structure/rack,
-/obj/effect/spawner/lootdrop/maintenance{
- lootcount = 2;
- name = "2maintenance loot spawner"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bKR" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/closed/wall,
-/area/medical/medbay/central)
-"bKS" = (
-/obj/machinery/power/apc{
- areastring = "/area/crew_quarters/heads/cmo";
- dir = 1;
- name = "CM Office APC";
- pixel_y = 24
- },
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bKT" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bKU" = (
-/obj/machinery/door/airlock/engineering/abandoned{
- name = "Construction Area";
- req_access_txt = "32"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/construction)
-"bKV" = (
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bKW" = (
-/obj/item/wrench,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plasteel,
-/area/science/xenobiology)
-"bKX" = (
-/obj/machinery/button/door{
- id = "misclab";
- name = "Test Chamber Blast Doors";
- pixel_y = -2;
- req_access_txt = "55"
- },
-/obj/structure/table/reinforced,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/window/reinforced{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/turf/open/floor/plasteel,
-/area/science/xenobiology)
-"bKY" = (
-/obj/machinery/computer/security/telescreen{
- name = "Test Chamber Monitor";
- network = list("xeno");
- pixel_y = 2
- },
-/obj/structure/table/reinforced,
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plasteel,
-/area/science/xenobiology)
-"bKZ" = (
-/obj/machinery/disposal/bin,
-/obj/structure/disposalpipe/trunk{
- dir = 1
- },
-/obj/structure/window/reinforced{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/turf/open/floor/plasteel,
-/area/science/xenobiology)
-"bLb" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plasteel,
-/area/science/xenobiology)
-"bLc" = (
-/obj/item/clothing/mask/gas,
-/obj/item/clothing/mask/gas,
-/obj/item/clothing/mask/gas,
-/obj/item/clothing/glasses/science,
-/obj/item/clothing/glasses/science,
-/obj/structure/table,
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plasteel,
-/area/science/xenobiology)
-"bLd" = (
-/obj/structure/sink{
- dir = 8;
- pixel_x = -12;
- pixel_y = 2
- },
-/obj/machinery/doorButtons/access_button{
- idDoor = "virology_airlock_interior";
- idSelf = "virology_airlock_control";
- name = "Virology Access Button";
- pixel_x = 8;
- pixel_y = -28;
- req_access_txt = "39"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bLe" = (
-/obj/structure/sign/warning/biohazard,
-/turf/closed/wall,
-/area/science/xenobiology)
-"bLf" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bLg" = (
-/obj/structure/disposalpipe/segment{
- dir = 6
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bLh" = (
-/obj/structure/sign/warning/fire,
-/turf/closed/wall,
-/area/science/research)
-"bLi" = (
-/obj/structure/sign/warning/nosmoking{
- pixel_x = -32
- },
-/turf/open/floor/plasteel/white,
-/area/science/mixing)
-"bLj" = (
-/obj/structure/sign/warning/vacuum/external{
- pixel_y = -32
- },
-/turf/open/floor/plating,
-/area/science/mixing)
-"bLk" = (
-/obj/machinery/mass_driver{
- dir = 4;
- id = "toxinsdriver"
- },
-/turf/open/floor/plating,
-/area/science/mixing)
-"bLl" = (
-/obj/machinery/door/poddoor{
- id = "toxinsdriver";
- name = "toxins launcher bay door"
- },
-/obj/structure/fans/tiny,
-/turf/open/floor/plating,
-/area/science/mixing)
-"bLm" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/science/mixing)
-"bLn" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/science/test_area)
-"bLo" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/science/test_area)
-"bLp" = (
-/obj/item/beacon,
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/science/test_area)
-"bLq" = (
-/turf/closed/indestructible{
- desc = "A wall impregnated with Fixium, able to withstand massive explosions with ease";
- icon_state = "riveted";
- name = "hyper-reinforced wall"
- },
-/area/science/test_area)
-"bLr" = (
-/obj/item/target/alien/anchored,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/camera/preset/toxins{
- dir = 8
- },
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/science/test_area)
-"bLu" = (
-/obj/structure/rack,
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bLv" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bLw" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bLx" = (
-/obj/structure/table,
-/obj/item/stock_parts/subspace/transmitter,
-/obj/item/stock_parts/subspace/transmitter,
-/obj/item/stock_parts/subspace/treatment,
-/obj/item/stock_parts/subspace/treatment,
-/obj/item/stock_parts/subspace/treatment,
-/obj/machinery/airalarm{
- dir = 1;
- pixel_y = -22
- },
-/turf/open/floor/plating,
-/area/storage/tech)
-"bLy" = (
-/obj/structure/table,
-/obj/item/stock_parts/subspace/ansible,
-/obj/item/stock_parts/subspace/ansible,
-/obj/item/stock_parts/subspace/ansible,
-/obj/item/stock_parts/subspace/crystal,
-/obj/item/stock_parts/subspace/crystal,
-/obj/item/stock_parts/subspace/crystal,
-/turf/open/floor/plating,
-/area/storage/tech)
-"bLz" = (
-/obj/structure/table,
-/obj/item/stock_parts/subspace/filter,
-/obj/item/stock_parts/subspace/filter,
-/obj/item/stock_parts/subspace/filter,
-/obj/item/stock_parts/subspace/filter,
-/obj/item/stock_parts/subspace/filter,
-/obj/machinery/light/small,
-/turf/open/floor/plating,
-/area/storage/tech)
-"bLA" = (
-/obj/structure/rack,
-/obj/item/storage/toolbox/electrical{
- pixel_x = 1;
- pixel_y = -1
- },
-/obj/item/clothing/gloves/color/yellow,
-/obj/item/t_scanner,
-/obj/item/multitool,
-/obj/machinery/camera{
- c_tag = "Tech Storage";
- dir = 1
- },
-/turf/open/floor/plating,
-/area/storage/tech)
-"bLB" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bLC" = (
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plating,
-/area/construction)
-"bLD" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/closed/wall,
-/area/storage/tech)
-"bLE" = (
-/turf/open/floor/plasteel/grimy,
-/area/security/detectives_office)
-"bLF" = (
-/obj/structure/filingcabinet/filingcabinet,
-/obj/machinery/power/apc{
- areastring = "/area/quartermaster/sorting";
- name = "Delivery Office APC";
- pixel_x = 1;
- pixel_y = -24
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/sorting)
-"bLG" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/grimy,
-/area/security/detectives_office)
-"bLH" = (
-/obj/structure/closet/emcloset,
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bLI" = (
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bLJ" = (
-/obj/machinery/computer/atmos_control,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bLK" = (
-/turf/closed/wall/r_wall,
-/area/engine/atmos)
-"bLL" = (
-/obj/machinery/computer/station_alert,
-/obj/machinery/airalarm{
- pixel_y = 23
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bLM" = (
-/obj/machinery/computer/atmos_alert,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bLN" = (
-/obj/machinery/vending/wardrobe/atmos_wardrobe,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bLO" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/door/firedoor/heavy,
-/obj/machinery/door/airlock/maintenance{
- name = "Atmospherics Maintenance";
- req_access_txt = "24"
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bLP" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall/r_wall,
-/area/engine/atmos)
-"bLQ" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/turf/closed/wall/r_wall,
-/area/engine/atmos)
-"bLR" = (
-/obj/machinery/atmospherics/pipe/simple/supply/visible,
-/turf/closed/wall/r_wall,
-/area/engine/atmos)
-"bLS" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bLT" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bLU" = (
-/obj/machinery/light/small{
- dir = 8
- },
-/obj/machinery/chem_dispenser/apothecary,
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bLV" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/machinery/chem_heater,
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bLW" = (
-/obj/structure/chair/office/light{
- dir = 8
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bLX" = (
-/obj/machinery/atmospherics/pipe/manifold4w/scrubbers,
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"bLY" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bLZ" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bMa" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 5
- },
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bMb" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bMc" = (
-/obj/machinery/door/airlock/maintenance{
- name = "Medbay Maintenance";
- req_access_txt = "5"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bMd" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bMe" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/junction,
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bMf" = (
-/obj/structure/table,
-/obj/machinery/cell_charger{
- pixel_y = 5
- },
-/obj/item/stack/cable_coil,
-/obj/item/multitool,
-/obj/item/stock_parts/cell/high/plus,
-/obj/structure/window/reinforced{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/science/misc_lab)
-"bMg" = (
-/obj/machinery/power/apc{
- areastring = "/area/science/xenobiology";
- dir = 8;
- name = "Xenobiology APC";
- pixel_x = -25
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
-"bMh" = (
-/obj/structure/chair/stool,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
-"bMi" = (
-/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
-"bMj" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
- },
-/turf/closed/wall,
-/area/maintenance/port/aft)
-"bMk" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
-"bMl" = (
-/obj/machinery/processor/slime,
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plasteel,
-/area/science/xenobiology)
-"bMm" = (
-/obj/machinery/monkey_recycler,
-/obj/machinery/firealarm{
- pixel_y = 24
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/turf/open/floor/plasteel,
-/area/science/xenobiology)
-"bMn" = (
-/obj/machinery/airalarm{
- pixel_y = 23
- },
-/obj/structure/table/glass,
-/obj/machinery/reagentgrinder{
- desc = "Used to grind things up into raw materials and liquids.";
- pixel_y = 5
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plasteel,
-/area/science/xenobiology)
-"bMo" = (
-/obj/machinery/smartfridge/extract/preloaded,
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plasteel,
-/area/science/xenobiology)
-"bMp" = (
-/obj/structure/closet/l3closet/scientist,
-/obj/machinery/light_switch{
- pixel_y = 28
- },
-/obj/item/extinguisher,
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plasteel,
-/area/science/xenobiology)
-"bMq" = (
-/obj/structure/closet/l3closet/scientist,
-/obj/item/extinguisher,
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plasteel,
-/area/science/xenobiology)
-"bMr" = (
-/obj/effect/spawner/structure/window,
-/turf/open/floor/plating,
-/area/science/xenobiology)
-"bMs" = (
-/obj/effect/spawner/lootdrop/maintenance{
- lootcount = 2;
- name = "2maintenance loot spawner"
- },
-/obj/machinery/space_heater,
-/turf/open/floor/plating,
-/area/maintenance/fore/secondary)
-"bMt" = (
-/obj/structure/sign/warning/vacuum/external{
- pixel_y = 32
- },
-/turf/open/floor/engine/vacuum,
-/area/science/mixing)
-"bMu" = (
-/obj/machinery/door/poddoor/incinerator_toxmix,
-/turf/open/floor/engine/vacuum,
-/area/science/mixing)
-"bMv" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 4
- },
-/turf/closed/wall/r_wall,
-/area/science/mixing)
-"bMw" = (
-/obj/machinery/sparker/toxmix{
- pixel_x = 25
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/toxins_mixing_output{
- dir = 4
- },
-/turf/open/floor/engine/vacuum,
-/area/science/mixing)
-"bMx" = (
-/obj/machinery/airlock_sensor/incinerator_toxmix{
- pixel_y = 24
- },
-/obj/machinery/atmospherics/components/binary/pump/on{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/engine,
-/area/science/mixing)
-"bMy" = (
-/obj/machinery/atmospherics/components/binary/valve{
- dir = 4;
- name = "mix to port"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/mixing)
-"bMz" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 4
- },
-/obj/machinery/meter,
-/obj/machinery/embedded_controller/radio/airlock_controller/incinerator_toxmix{
- pixel_x = -24
- },
-/obj/effect/turf_decal/stripes/corner{
- dir = 1
- },
-/turf/open/floor/plasteel/white,
-/area/science/mixing)
-"bMA" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/turf/open/floor/plasteel,
-/area/science/mixing)
-"bMB" = (
-/obj/structure/reagent_dispensers/fueltank,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"bMC" = (
-/obj/effect/decal/cleanable/cobweb/cobweb2,
-/obj/effect/spawner/lootdrop/maintenance,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"bMD" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/science/test_area)
-"bME" = (
-/obj/structure/chair{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/science/test_area)
-"bMG" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bMH" = (
-/obj/machinery/holopad,
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bMI" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bMJ" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
- },
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bMK" = (
-/turf/closed/wall,
-/area/engine/atmos)
-"bML" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/plasticflaps/opaque,
-/obj/machinery/navbeacon{
- codes_txt = "delivery;dir=4";
- dir = 4;
- freq = 1400;
- location = "Atmospherics"
- },
-/obj/effect/turf_decal/delivery,
-/obj/machinery/door/window/northleft{
- dir = 4;
- name = "Atmospherics Desk";
- req_access_txt = "24"
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bMM" = (
-/obj/structure/rack,
-/obj/item/clothing/suit/hazardvest,
-/obj/item/clothing/suit/hazardvest,
-/obj/item/clothing/suit/hazardvest,
-/obj/item/clothing/suit/hazardvest,
-/obj/item/clothing/gloves/color/black,
-/obj/item/clothing/gloves/color/black,
-/obj/item/clothing/gloves/color/black,
-/obj/item/clothing/mask/gas,
-/obj/item/clothing/mask/gas,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bMN" = (
-/obj/machinery/atmospherics/components/unary/thermomachine/heater,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bMO" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bMP" = (
-/obj/machinery/firealarm{
- pixel_y = 24
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bMQ" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/engine/atmos)
-"bMR" = (
-/obj/machinery/pipedispenser,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bMS" = (
-/obj/machinery/camera{
- c_tag = "Atmospherics North East"
- },
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 8;
- name = "Distro to Waste"
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bMT" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{
- dir = 8
- },
-/obj/machinery/light{
- dir = 1
- },
-/obj/machinery/meter/atmos/atmos_waste_loop,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bMU" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/visible{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bMV" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/visible,
-/obj/machinery/meter/atmos/distro_loop,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bMW" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 10
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bMX" = (
-/obj/machinery/atmospherics/components/binary/pump/on{
- dir = 8;
- name = "Air to Distro"
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bMY" = (
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bMZ" = (
-/obj/machinery/atmospherics/components/unary/thermomachine/heater/on,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bNc" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall/r_wall,
-/area/medical/virology)
-"bNd" = (
-/turf/closed/wall/r_wall,
-/area/medical/virology)
-"bNe" = (
-/obj/structure/window/reinforced{
- dir = 4
- },
-/obj/structure/table,
-/obj/item/hand_labeler,
-/obj/item/clothing/glasses/science,
-/obj/item/clothing/glasses/science,
-/turf/open/floor/plasteel,
-/area/science/misc_lab)
-"bNf" = (
-/obj/structure/sign/warning/biohazard,
-/turf/closed/wall,
-/area/medical/virology)
-"bNg" = (
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bNh" = (
-/obj/machinery/computer/pandemic,
-/obj/effect/turf_decal/tile/green,
-/obj/effect/turf_decal/tile/green{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bNi" = (
-/obj/structure/chair/stool,
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
- },
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bNj" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/virology/glass{
- name = "Isolation A";
- req_access_txt = "39"
- },
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bNk" = (
-/obj/effect/spawner/structure/window,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/medical/virology)
-"bNl" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/virology/glass{
- name = "Isolation B";
- req_access_txt = "39"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bNm" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/science/misc_lab)
-"bNn" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
-"bNo" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
-"bNp" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
-"bNq" = (
-/obj/structure/table,
-/obj/item/stack/sheet/glass/fifty{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/item/stack/sheet/metal/fifty,
-/obj/item/stack/sheet/mineral/plasma,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/science/misc_lab)
-"bNr" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/research{
- name = "Xenobiology Lab";
- req_access_txt = "55"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
-"bNs" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bNt" = (
-/turf/open/floor/engine/vacuum,
-/area/science/mixing)
-"bNu" = (
-/obj/machinery/door/airlock/research/glass/incinerator/toxmix_exterior,
-/turf/open/floor/engine,
-/area/science/mixing)
-"bNv" = (
-/obj/machinery/door/airlock/research/glass/incinerator/toxmix_interior,
-/turf/open/floor/engine,
-/area/science/mixing)
-"bNw" = (
-/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_toxmix,
-/turf/open/floor/engine,
-/area/science/mixing)
-"bNx" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/mixing)
-"bNy" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/science/mixing)
-"bNz" = (
-/obj/structure/extinguisher_cabinet{
- pixel_x = 27
- },
-/obj/machinery/camera{
- c_tag = "Toxins Lab East";
- dir = 8;
- network = list("ss13","rd");
- pixel_y = -22
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/science/mixing)
-"bNA" = (
-/obj/structure/reagent_dispensers/watertank,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"bNB" = (
-/obj/structure/rack,
-/obj/effect/spawner/lootdrop/maintenance{
- lootcount = 2;
- name = "2maintenance loot spawner"
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"bNC" = (
-/obj/structure/closet/wardrobe/grey,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"bND" = (
-/obj/structure/chair{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/science/test_area)
-"bNE" = (
-/obj/structure/chair{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/science/test_area)
-"bNF" = (
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/science/test_area)
-"bNG" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/science/test_area)
-"bNH" = (
-/obj/structure/table/reinforced,
-/obj/item/radio/intercom{
- pixel_y = -26
- },
-/obj/item/paper_bin{
- pixel_x = -3
- },
-/obj/item/pen{
- pixel_x = -3
- },
-/obj/item/folder/yellow{
- pixel_x = 4
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/sorting)
-"bNI" = (
-/turf/closed/wall,
-/area/construction)
-"bNJ" = (
-/turf/open/floor/plating,
-/area/construction)
-"bNK" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/mining/glass{
- name = "Cargo Office";
- req_access_txt = "50"
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"bNN" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bNO" = (
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/effect/turf_decal/loading_area{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bNP" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/effect/turf_decal/loading_area{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bNQ" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bNR" = (
-/obj/machinery/disposal/bin,
-/obj/structure/disposalpipe/trunk{
- dir = 8
- },
-/obj/machinery/camera{
- c_tag = "Atmospherics Monitoring"
- },
-/obj/machinery/light{
- dir = 4
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/turf/open/floor/plasteel/checker,
-/area/engine/atmos)
-"bNS" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bNT" = (
-/obj/machinery/camera{
- c_tag = "Atmospherics North West";
- dir = 4
- },
-/obj/machinery/light{
- dir = 8
- },
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bNU" = (
-/obj/effect/spawner/structure/window,
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/medical/virology)
-"bNV" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bNW" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
- },
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bNX" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/turf/open/floor/plasteel,
-/area/science/misc_lab)
-"bNY" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/engine/atmos)
-"bNZ" = (
-/obj/structure/disposalpipe/segment{
- dir = 6
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/turf/open/floor/plasteel,
-/area/science/misc_lab)
-"bOb" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bOc" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 1;
- name = "Mix to Distro"
- },
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bOd" = (
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bOe" = (
-/obj/machinery/meter,
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bOf" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 10
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/engine/atmos)
-"bOg" = (
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bOh" = (
-/obj/structure/grille,
-/turf/closed/wall/r_wall,
-/area/engine/atmos)
-"bOj" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 8
- },
-/turf/closed/wall/r_wall,
-/area/medical/virology)
-"bOk" = (
-/obj/machinery/disposal/bin,
-/obj/structure/disposalpipe/trunk{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/science/misc_lab)
-"bOl" = (
-/obj/machinery/light{
- dir = 1
- },
-/obj/machinery/announcement_system,
-/turf/open/floor/plasteel,
-/area/tcommsat/computer)
-"bOm" = (
-/obj/structure/bed,
-/obj/item/bedsheet/medical,
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bOn" = (
-/obj/machinery/light{
- dir = 1
- },
-/obj/machinery/airalarm{
- pixel_y = 23
- },
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bOo" = (
-/obj/item/radio/intercom{
- dir = 8;
- freerange = 1;
- name = "Station Intercom (Telecomms)";
- pixel_y = 26
- },
-/turf/open/floor/plasteel,
-/area/tcommsat/computer)
-"bOp" = (
-/obj/structure/closet/emcloset,
-/obj/machinery/camera{
- c_tag = "Virology Airlock";
- network = list("ss13","medbay")
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bOq" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bOr" = (
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bOs" = (
-/obj/machinery/light/small{
- dir = 1
- },
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bOt" = (
-/mob/living/carbon/monkey,
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bOu" = (
-/obj/structure/rack,
-/obj/item/clothing/mask/gas{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/item/clothing/mask/gas,
-/obj/item/clothing/mask/gas{
- pixel_x = -3;
- pixel_y = -3
- },
-/obj/machinery/airalarm{
- dir = 4;
- pixel_x = -23
- },
-/turf/open/floor/plasteel,
-/area/science/misc_lab)
-"bOv" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/science/misc_lab)
-"bOw" = (
-/obj/machinery/firealarm{
- dir = 1;
- pixel_y = -24
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/science/misc_lab)
-"bOx" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
-"bOy" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/science/misc_lab)
-"bOz" = (
-/obj/structure/chair/stool,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
-"bOA" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/item/twohanded/required/kirbyplants,
-/turf/open/floor/plasteel/white/side{
- dir = 1
- },
-/area/science/research)
-"bOB" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/turf/open/floor/plasteel/white,
-/area/science/misc_lab)
-"bOC" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/tcommsat/computer)
-"bOD" = (
-/obj/structure/chair/office/dark{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/tcommsat/computer)
-"bOE" = (
-/obj/machinery/sparker/toxmix{
- pixel_x = 25
- },
-/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/toxins_mixing_input{
- dir = 4
- },
-/turf/open/floor/engine/vacuum,
-/area/science/mixing)
-"bOF" = (
-/obj/structure/sign/warning/fire{
- pixel_y = -32
- },
-/obj/machinery/atmospherics/components/binary/pump/on{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/engine,
-/area/science/mixing)
-"bOG" = (
-/obj/machinery/light,
-/obj/machinery/atmospherics/components/binary/valve{
- dir = 4;
- name = "port to mix"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/mixing)
-"bOH" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 4
- },
-/obj/machinery/meter,
-/obj/machinery/button/door/incinerator_vent_toxmix{
- pixel_x = -25;
- pixel_y = 5
- },
-/obj/machinery/button/ignition/incinerator/toxmix{
- pixel_x = -25;
- pixel_y = -5
- },
-/obj/effect/turf_decal/stripes/corner{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/mixing)
-"bOI" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/turf/open/floor/plasteel,
-/area/science/mixing)
-"bOJ" = (
-/obj/item/target,
-/obj/structure/window/reinforced{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/science/test_area)
-"bOK" = (
-/obj/structure/barricade/wooden,
-/obj/structure/girder,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bOL" = (
-/obj/structure/closet/crate,
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"bOM" = (
-/obj/structure/table,
-/obj/item/paper_bin,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
- },
-/obj/item/pen/fountain,
-/turf/open/floor/plasteel,
-/area/tcommsat/computer)
-"bON" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "kanyewest";
- name = "privacy shutters"
- },
-/turf/open/floor/plating,
-/area/security/detectives_office)
-"bOO" = (
-/obj/machinery/power/apc{
- areastring = "/area/security/checkpoint/engineering";
- dir = 8;
- name = "Engineering Security APC";
- pixel_x = -24
- },
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/machinery/newscaster{
- pixel_y = 32
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/engineering)
-"bOP" = (
-/obj/structure/table/glass,
-/obj/structure/reagent_dispensers/virusfood{
- pixel_x = -30
- },
-/obj/item/book/manual/wiki/infections{
- pixel_y = 7
- },
-/obj/item/reagent_containers/syringe/antiviral,
-/obj/item/reagent_containers/dropper,
-/obj/item/reagent_containers/spray/cleaner,
-/obj/effect/turf_decal/tile/green{
- dir = 1
- },
-/obj/effect/turf_decal/tile/green{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bOQ" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/item/beacon,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bOR" = (
-/obj/machinery/meter,
-/obj/machinery/atmospherics/pipe/manifold/purple/visible{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bOS" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bOT" = (
-/obj/machinery/door/poddoor/preopen{
- id = "atmos";
- name = "Atmospherics Blast Door"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/engine/atmos)
-"bOU" = (
-/obj/machinery/holopad,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bOV" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bOW" = (
-/obj/machinery/requests_console{
- department = "Atmospherics";
- departmentType = 4;
- name = "Atmos RC";
- pixel_x = 30
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/machinery/computer/atmos_control{
- dir = 8
- },
-/turf/open/floor/plasteel/dark/corner,
-/area/engine/atmos)
-"bOX" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bOY" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/closed/wall,
-/area/engine/atmos)
-"bOZ" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bPa" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/engine/atmos)
-"bPb" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/research/glass{
- name = "Circuitry Lab";
- req_access_txt = "47"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel/white,
-/area/science/circuit)
-"bPc" = (
-/obj/machinery/atmospherics/components/binary/pump/on{
- dir = 8;
- name = "Mix to Waste"
- },
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bPd" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bPe" = (
-/obj/machinery/atmospherics/pipe/manifold/purple/visible,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bPf" = (
-/obj/machinery/atmospherics/pipe/simple/purple/visible{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bPg" = (
-/obj/machinery/atmospherics/pipe/simple/purple/visible{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bPh" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/layer_manifold{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/engine/atmos)
-"bPi" = (
-/obj/machinery/light{
- dir = 4
- },
-/obj/effect/turf_decal/tile/green{
- dir = 1
- },
-/obj/effect/turf_decal/tile/green,
-/obj/effect/turf_decal/tile/green{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/purple/visible{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bPj" = (
-/obj/machinery/atmospherics/pipe/simple{
- dir = 4
- },
-/obj/structure/grille,
-/obj/machinery/meter,
-/turf/closed/wall/r_wall,
-/area/engine/atmos)
-"bPk" = (
-/obj/machinery/camera{
- c_tag = "Atmospherics Waste Tank"
- },
-/turf/open/floor/engine/vacuum,
-/area/engine/atmos)
-"bPl" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/mix_output{
- dir = 8
- },
-/turf/open/floor/engine/vacuum,
-/area/engine/atmos)
-"bPm" = (
-/turf/open/floor/engine/vacuum,
-/area/engine/atmos)
-"bPn" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bPo" = (
-/obj/structure/table,
-/obj/machinery/microwave{
- pixel_x = -3;
- pixel_y = 6
- },
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bPp" = (
-/obj/machinery/iv_drip,
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bPq" = (
-/obj/machinery/shower{
- dir = 4
- },
-/obj/structure/sign/warning/securearea{
- pixel_x = -32
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bPr" = (
-/obj/machinery/airalarm{
- dir = 8;
- pixel_x = 24
- },
-/obj/structure/closet/l3closet,
-/obj/machinery/light{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bPs" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/science/misc_lab)
-"bPt" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/mob/living/carbon/monkey,
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bPu" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bPw" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 4
- },
-/turf/closed/wall/r_wall,
-/area/medical/virology)
-"bPx" = (
-/obj/machinery/disposal/bin,
-/obj/structure/sign/warning/deathsposal{
- pixel_y = -32
- },
-/obj/structure/disposalpipe/trunk{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/science/xenobiology)
-"bPz" = (
-/obj/structure/table/glass,
-/obj/item/storage/box/beakers{
- pixel_x = 2;
- pixel_y = 7
- },
-/obj/item/storage/box/syringes{
- pixel_y = 5
- },
-/obj/item/storage/box/monkeycubes{
- pixel_x = 2;
- pixel_y = -2
- },
-/obj/item/storage/box/monkeycubes,
-/obj/machinery/light,
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/science/xenobiology)
-"bPA" = (
-/obj/machinery/computer/camera_advanced/xenobio{
- dir = 1
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/science/xenobiology)
-"bPE" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/obj/machinery/portable_atmospherics/canister/bz,
-/turf/open/floor/plasteel,
-/area/science/xenobiology)
-"bPF" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/science/circuit)
-"bPG" = (
-/obj/machinery/chem_master,
-/obj/item/radio/intercom{
- name = "Station Intercom (General)";
- pixel_y = -29
- },
-/obj/machinery/light,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/science/xenobiology)
-"bPH" = (
-/obj/machinery/requests_console{
- department = "Science";
- departmentType = 2;
- name = "Science Requests Console";
- pixel_y = -30;
- receive_ore_updates = 1
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/structure/table/reinforced,
-/obj/item/slime_scanner,
-/obj/item/clothing/gloves/color/latex,
-/obj/item/clothing/glasses/science,
-/turf/open/floor/plasteel,
-/area/science/xenobiology)
-"bPI" = (
-/obj/structure/reagent_dispensers/watertank,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/science/xenobiology)
-"bPJ" = (
-/obj/structure/table/glass,
-/obj/item/stack/sheet/mineral/plasma{
- pixel_y = 4
- },
-/obj/item/stack/sheet/mineral/plasma{
- pixel_y = 4
- },
-/obj/item/stack/sheet/mineral/plasma{
- pixel_y = 4
- },
-/obj/item/stack/sheet/mineral/plasma{
- pixel_y = 4
- },
-/obj/item/reagent_containers/glass/beaker{
- pixel_x = 8;
- pixel_y = 2
- },
-/obj/item/reagent_containers/glass/beaker/large{
- pixel_x = -3;
- pixel_y = 3
- },
-/obj/item/reagent_containers/dropper,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/science/xenobiology)
-"bPK" = (
-/obj/effect/spawner/structure/window,
-/turf/open/floor/plating,
-/area/science/misc_lab)
-"bPL" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/white,
-/area/science/circuit)
-"bPM" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
-/obj/effect/turf_decal/stripes/line,
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/science/circuit)
-"bPN" = (
-/turf/closed/wall,
-/area/science/misc_lab)
-"bPO" = (
-/obj/effect/spawner/lootdrop/maintenance,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"bPP" = (
-/obj/effect/decal/cleanable/oil,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"bPQ" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10
- },
-/turf/open/floor/plasteel,
-/area/tcommsat/computer)
-"bPU" = (
-/obj/item/shard,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bPV" = (
-/obj/machinery/door/airlock/maintenance{
- name = "Maint Bar Access";
- req_access_txt = "12"
- },
-/obj/structure/barricade/wooden{
- name = "wooden barricade (CLOSED)"
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bPW" = (
-/obj/effect/decal/cleanable/oil,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bPX" = (
-/obj/structure/closet/emcloset,
-/obj/effect/decal/cleanable/cobweb,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bPY" = (
-/obj/structure/girder,
-/obj/structure/grille/broken,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bPZ" = (
-/obj/structure/chair{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bQa" = (
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bQb" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/tcommsat/computer)
-"bQc" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/turf/open/floor/plating,
-/area/construction)
-"bQd" = (
-/obj/structure/table,
-/obj/item/folder/blue,
-/obj/item/pen/blue,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/tcommsat/computer)
-"bQe" = (
-/obj/item/screwdriver{
- pixel_y = 10
- },
-/obj/machinery/button/door{
- desc = "A remote control-switch for the engineering security doors.";
- id = "Engineering";
- name = "Engineering Lockdown";
- pixel_x = -24;
- pixel_y = -6;
- req_access_txt = "10"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/item/radio/off,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/light_switch{
- pixel_x = -27;
- pixel_y = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/engineering)
-"bQf" = (
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bQg" = (
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bQh" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/chair{
- dir = 8
- },
-/obj/effect/landmark/start/atmospheric_technician,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bQi" = (
-/obj/structure/table/reinforced,
-/obj/machinery/door/firedoor/heavy,
-/obj/machinery/door/window/northleft{
- dir = 4;
- name = "Atmospherics Desk";
- req_access_txt = "24"
- },
-/obj/machinery/door/poddoor/preopen{
- id = "atmos";
- name = "Atmospherics Blast Door"
- },
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bQj" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bQk" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bQl" = (
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/obj/machinery/computer/atmos_alert{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/dark/corner,
-/area/engine/atmos)
-"bQm" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bQn" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/preopen{
- id = "atmos";
- name = "Atmospherics Blast Door"
- },
-/turf/open/floor/plating,
-/area/engine/atmos)
-"bQo" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/window/reinforced{
- dir = 1
- },
-/obj/effect/turf_decal/bot,
-/obj/machinery/portable_atmospherics/canister/air,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bQp" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bQq" = (
-/obj/machinery/camera{
- c_tag = "Security Post - Engineering";
- dir = 8
- },
-/obj/item/radio/intercom{
- dir = 4;
- name = "Station Intercom (General)";
- pixel_x = 27
- },
-/obj/machinery/light{
- dir = 4
- },
-/obj/machinery/vending/wardrobe/sec_wardrobe,
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/engineering)
-"bQr" = (
-/obj/machinery/atmospherics/components/unary/thermomachine/freezer,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bQs" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 8;
- name = "Air to Waste"
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bQt" = (
-/obj/item/crowbar,
-/obj/item/wrench,
-/obj/structure/window/reinforced,
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel/dark/corner,
-/area/hallway/primary/aft)
-"bQu" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/structure/closet/crate,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bQv" = (
-/obj/machinery/atmospherics/pipe/simple/purple/visible,
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bQw" = (
-/obj/machinery/atmospherics/pipe/manifold/green/visible{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bQx" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 6
- },
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 9
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bQy" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/engine/atmos)
-"bQz" = (
-/obj/machinery/computer/atmos_control/tank/mix_tank{
- dir = 8
- },
-/obj/effect/turf_decal/tile/green,
-/obj/effect/turf_decal/tile/green{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 10
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bQA" = (
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/turf/open/floor/plating/airless,
-/area/engine/atmos)
-"bQB" = (
-/obj/machinery/air_sensor/atmos/mix_tank,
-/turf/open/floor/engine/vacuum,
-/area/engine/atmos)
-"bQC" = (
-/obj/machinery/light/small{
- dir = 4
- },
-/turf/open/floor/engine/vacuum,
-/area/engine/atmos)
-"bQD" = (
-/obj/structure/chair/stool,
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bQE" = (
-/obj/structure/table,
-/obj/item/storage/box/donkpockets{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/machinery/newscaster{
- pixel_x = -30
- },
-/obj/item/stack/sheet/mineral/plasma,
-/obj/item/stack/sheet/mineral/plasma,
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bQF" = (
-/obj/machinery/vending/wardrobe/viro_wardrobe,
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bQG" = (
-/obj/effect/spawner/structure/window,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/science/circuit)
-"bQH" = (
-/obj/structure/closet/l3closet,
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bQI" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/circuit)
-"bQJ" = (
-/obj/effect/landmark/blobstart,
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bQK" = (
-/obj/machinery/door/airlock/command/glass{
- name = "Control Room";
- req_access_txt = "19; 61"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/tcommsat/computer)
-"bQM" = (
-/obj/machinery/door/firedoor,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
-"bQN" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/light{
- dir = 4
- },
-/obj/machinery/camera{
- c_tag = "Xenobiology North";
- dir = 8;
- network = list("ss13","rd")
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
-"bQO" = (
-/obj/structure/closet/bombcloset,
-/obj/machinery/light_switch{
- pixel_x = -20
- },
-/turf/open/floor/plasteel,
-/area/science/misc_lab)
-"bQP" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/tcommsat/computer)
-"bQQ" = (
-/obj/machinery/door/firedoor,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bQR" = (
-/obj/structure/table,
-/obj/structure/window/reinforced{
- dir = 4
- },
-/obj/item/storage/toolbox/mechanical,
-/obj/item/clothing/ears/earmuffs,
-/obj/machinery/camera{
- c_tag = "Testing Lab North";
- network = list("ss13","rd")
- },
-/turf/open/floor/plasteel,
-/area/science/misc_lab)
-"bQS" = (
-/obj/machinery/requests_console{
- department = "Science";
- departmentType = 2;
- name = "Science Requests Console";
- pixel_y = 30;
- receive_ore_updates = 1
- },
-/turf/open/floor/plasteel,
-/area/science/misc_lab)
-"bQT" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/science/misc_lab)
-"bQU" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/science/misc_lab)
-"bQV" = (
-/obj/machinery/atmospherics/components/trinary/filter{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/science/misc_lab)
-"bQW" = (
-/obj/machinery/atmospherics/components/unary/thermomachine/heater{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/science/misc_lab)
-"bQY" = (
-/obj/structure/table/reinforced,
-/obj/item/integrated_circuit_printer,
-/obj/machinery/computer/security/telescreen/circuitry{
- pixel_y = 30
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/white,
-/area/science/circuit)
-"bQZ" = (
-/turf/closed/wall/r_wall,
-/area/science/misc_lab)
-"bRa" = (
-/obj/structure/table/reinforced,
-/obj/machinery/light{
- dir = 1
- },
-/obj/item/stack/sheet/metal/ten,
-/turf/open/floor/plasteel/white,
-/area/science/circuit)
-"bRg" = (
-/obj/structure/rack,
-/obj/effect/spawner/lootdrop/maintenance{
- lootcount = 2;
- name = "2maintenance loot spawner"
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bRh" = (
-/obj/effect/spawner/lootdrop/maintenance{
- lootcount = 3;
- name = "3maintenance loot spawner"
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bRi" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/break_room)
-"bRj" = (
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/break_room)
-"bRk" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/engineering)
-"bRl" = (
-/obj/structure/light_construct{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/construction)
-"bRm" = (
-/obj/machinery/door/airlock/security/glass{
- name = "Security Office";
- req_access_txt = "63"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/engineering)
-"bRn" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/closed/wall,
-/area/construction)
-"bRo" = (
-/obj/machinery/computer/secure_data{
- dir = 8
- },
-/obj/machinery/computer/security/telescreen/engine{
- dir = 8;
- pixel_x = 24
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/engineering)
-"bRp" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bRr" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/firealarm{
- dir = 1;
- pixel_y = -24
- },
-/obj/structure/tank_dispenser,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bRs" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/preopen{
- id = "atmos";
- name = "Atmospherics Blast Door"
- },
-/turf/open/floor/plating,
-/area/engine/atmos)
-"bRt" = (
-/obj/structure/reagent_dispensers/fueltank,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bRu" = (
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/obj/machinery/computer/atmos_alert{
- dir = 8
- },
-/turf/open/floor/plasteel/dark/corner,
-/area/engine/atmos)
-"bRv" = (
-/obj/structure/chair/office/dark{
- dir = 4
- },
-/obj/effect/landmark/start/atmospheric_technician,
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bRw" = (
-/obj/effect/turf_decal/bot,
-/obj/machinery/portable_atmospherics/canister/oxygen,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bRx" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bRy" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 6
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bRA" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bRB" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/components/binary/pump/on{
- dir = 8;
- name = "Waste to Filter"
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bRC" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 4
- },
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/atmos/glass{
- name = "Distribution Loop";
- req_access_txt = "24"
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bRD" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 9
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bRE" = (
-/obj/machinery/atmospherics/components/binary/pump{
- name = "Air to Ports"
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bRF" = (
-/obj/machinery/atmospherics/components/binary/pump{
- name = "Mix to Ports"
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bRG" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 5
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bRI" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 4
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/engine/atmos)
-"bRJ" = (
-/obj/machinery/atmospherics/components/binary/pump/on{
- dir = 4;
- name = "Unfiltered & Air to Mix"
- },
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/obj/effect/turf_decal/tile/green{
- dir = 8
- },
-/obj/effect/turf_decal/tile/green,
-/obj/effect/turf_decal/tile/green{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bRL" = (
-/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/mix_input{
- dir = 8
- },
-/turf/open/floor/engine/vacuum,
-/area/engine/atmos)
-"bRM" = (
-/obj/structure/table,
-/obj/machinery/light_switch{
- pixel_x = -23
- },
-/obj/machinery/reagentgrinder,
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bRN" = (
-/turf/closed/wall,
-/area/medical/virology)
-"bRO" = (
-/obj/machinery/firealarm{
- dir = 8;
- pixel_x = 24
- },
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bRP" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/door/firedoor,
-/obj/effect/mapping_helpers/airlock/locked,
-/obj/machinery/door/airlock/virology{
- autoclose = 0;
- frequency = 1449;
- id_tag = "virology_airlock_interior";
- name = "Virology Interior Airlock";
- req_access_txt = "39"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
- },
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bRQ" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/medical/virology)
-"bRR" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/virology/glass{
- name = "Monkey Pen";
- req_access_txt = "39"
- },
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bRS" = (
-/obj/structure/chair/office/dark,
-/obj/effect/landmark/start/depsec/engineering,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/turf/open/floor/plasteel,
-/area/security/checkpoint/engineering)
-"bRT" = (
-/obj/structure/disposalpipe/trunk{
- dir = 4
- },
-/obj/structure/disposaloutlet,
-/turf/open/floor/engine,
-/area/science/xenobiology)
-"bRU" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/science/xenobiology)
-"bRV" = (
-/obj/machinery/disposal/bin,
-/obj/structure/disposalpipe/trunk{
- dir = 8
- },
-/obj/structure/window/reinforced,
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/turf/open/floor/plasteel,
-/area/science/xenobiology)
-"bRW" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio3";
- name = "containment blast door"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/engine,
-/area/science/xenobiology)
-"bRY" = (
-/obj/structure/window/reinforced,
-/obj/structure/table/reinforced,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/button/door{
- id = "xenobio8";
- name = "Containment Blast Doors";
- pixel_y = 4;
- req_access_txt = "55"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/turf/open/floor/plasteel,
-/area/science/xenobiology)
-"bRZ" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
-"bSa" = (
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio8";
- name = "containment blast door"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/engine,
-/area/science/xenobiology)
-"bSb" = (
-/obj/structure/closet/l3closet/scientist{
- pixel_x = -2
- },
-/turf/open/floor/plasteel,
-/area/science/misc_lab)
-"bSc" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/science/misc_lab)
-"bSd" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/tcommsat/computer)
-"bSe" = (
-/obj/structure/table,
-/obj/structure/window/reinforced{
- dir = 4
- },
-/obj/item/electropack,
-/obj/item/healthanalyzer,
-/obj/item/assembly/signaler,
-/turf/open/floor/plasteel,
-/area/science/misc_lab)
-"bSf" = (
-/obj/structure/chair/stool,
-/turf/open/floor/plasteel,
-/area/science/misc_lab)
-"bSg" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/science/misc_lab)
-"bSh" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible,
-/turf/open/floor/engine,
-/area/science/misc_lab)
-"bSi" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/science/misc_lab)
-"bSj" = (
-/obj/machinery/atmospherics/components/unary/thermomachine/freezer{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/science/misc_lab)
-"bSk" = (
-/obj/effect/landmark/start/scientist,
-/obj/structure/chair/office/light{
- dir = 1
- },
-/turf/open/floor/plasteel/white,
-/area/science/circuit)
-"bSl" = (
-/turf/closed/wall/r_wall,
-/area/science/circuit)
-"bSm" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plating{
- icon_state = "platingdmg3"
- },
-/area/maintenance/starboard/aft)
-"bSn" = (
-/obj/effect/spawner/lootdrop/crate_spawner,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bSo" = (
-/obj/effect/spawner/lootdrop/grille_or_trash,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bSp" = (
-/obj/structure/grille/broken,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bSq" = (
-/obj/structure/rack,
-/obj/item/tank/internals/emergency_oxygen,
-/obj/item/tank/internals/emergency_oxygen,
-/obj/item/clothing/mask/breath,
-/obj/item/clothing/mask/breath,
-/obj/effect/decal/cleanable/cobweb,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bSs" = (
-/obj/structure/reagent_dispensers/watertank,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bSt" = (
-/obj/structure/closet/emcloset,
-/obj/machinery/camera{
- c_tag = "Telecomms Monitoring";
- dir = 8;
- network = list("tcomms")
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/tcommsat/computer)
-"bSv" = (
-/obj/machinery/camera{
- c_tag = "Construction Area";
- dir = 1
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/construction)
-"bSw" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bSx" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/construction)
-"bSy" = (
-/obj/machinery/light/small,
-/turf/open/floor/plasteel/grimy,
-/area/security/detectives_office)
-"bSz" = (
-/obj/structure/table,
-/turf/open/floor/plating,
-/area/construction)
-"bSA" = (
-/obj/structure/disposalpipe/segment,
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bSB" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall,
-/area/engine/atmos)
-"bSC" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 10
- },
-/turf/closed/wall/r_wall,
-/area/engine/atmos)
-"bSD" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/door/airlock/atmos/glass{
- name = "Atmospherics Monitoring";
- req_access_txt = "24"
- },
-/obj/machinery/door/firedoor/heavy,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bSE" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 1;
- name = "Pure to Mix"
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bSF" = (
-/obj/effect/turf_decal/bot,
-/obj/machinery/portable_atmospherics/canister/nitrogen,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bSI" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 6
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bSJ" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 9
- },
-/turf/open/floor/plating,
-/area/engine/atmos)
-"bSK" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/engine/atmos)
-"bSM" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 5
- },
-/turf/open/floor/plating,
-/area/engine/atmos)
-"bSN" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
- dir = 10
- },
-/turf/open/floor/plating,
-/area/engine/atmos)
-"bSQ" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bSR" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bSS" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/virology{
- name = "Break Room";
- req_access_txt = "39"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bST" = (
-/obj/machinery/doorButtons/airlock_controller{
- idExterior = "virology_airlock_exterior";
- idInterior = "virology_airlock_interior";
- idSelf = "virology_airlock_control";
- name = "Virology Access Console";
- pixel_x = 8;
- pixel_y = 22;
- req_access_txt = "39"
- },
-/obj/machinery/light_switch{
- pixel_x = -4;
- pixel_y = 24
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bSU" = (
-/obj/structure/extinguisher_cabinet{
- pixel_x = -5;
- pixel_y = 30
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bSV" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/firealarm{
- pixel_y = 25
- },
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bSW" = (
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bSX" = (
-/obj/machinery/power/apc/highcap/five_k{
- areastring = "/area/medical/virology";
- dir = 1;
- name = "Virology APC";
- pixel_y = 24
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/machinery/camera{
- c_tag = "Virology Module";
- network = list("ss13","medbay")
- },
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bSY" = (
-/obj/machinery/vending/medical,
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bTf" = (
-/obj/structure/rack,
-/obj/item/wrench,
-/obj/item/crowbar,
-/obj/machinery/computer/security/telescreen{
- name = "Test Chamber Monitor";
- network = list("test");
- pixel_y = -30
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/science/misc_lab)
-"bTg" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6
- },
-/turf/open/floor/plasteel,
-/area/engine/break_room)
-"bTh" = (
-/obj/machinery/holopad,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/engine/break_room)
-"bTi" = (
-/obj/structure/table,
-/obj/machinery/recharger{
- pixel_y = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/engineering)
-"bTj" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/security/checkpoint/engineering)
-"bTk" = (
-/obj/machinery/atmospherics/components/binary/valve,
-/turf/open/floor/engine,
-/area/science/misc_lab)
-"bTl" = (
-/turf/open/floor/engine,
-/area/science/misc_lab)
-"bTm" = (
-/obj/machinery/atmospherics/components/trinary/mixer/flipped{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/science/misc_lab)
-"bTn" = (
-/obj/structure/table,
-/obj/item/assembly/igniter{
- pixel_x = -5;
- pixel_y = 3
- },
-/obj/item/assembly/igniter{
- pixel_x = 5;
- pixel_y = -4
- },
-/obj/item/assembly/igniter{
- pixel_x = 2;
- pixel_y = 6
- },
-/obj/item/assembly/igniter{
- pixel_x = 2;
- pixel_y = -1
- },
-/obj/machinery/light{
- dir = 4
- },
-/obj/item/assembly/timer{
- pixel_x = -3;
- pixel_y = 3
- },
-/obj/item/assembly/timer{
- pixel_x = -3;
- pixel_y = 3
- },
-/obj/item/assembly/timer{
- pixel_x = -3;
- pixel_y = 3
- },
-/obj/item/assembly/timer{
- pixel_x = -3;
- pixel_y = 3
- },
-/turf/open/floor/engine,
-/area/science/misc_lab)
-"bTo" = (
-/obj/structure/table/reinforced,
-/obj/machinery/light{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/science/circuit)
-"bTp" = (
-/obj/structure/table/reinforced,
-/obj/item/stack/sheet/glass/fifty,
-/obj/item/paper_bin,
-/obj/item/pen,
-/turf/open/floor/plasteel/white,
-/area/science/circuit)
-"bTr" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"bTz" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bTA" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/closed/wall,
-/area/maintenance/port/aft)
-"bTB" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6
- },
-/turf/closed/wall,
-/area/maintenance/port/aft)
-"bTC" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
-/turf/closed/wall,
-/area/maintenance/port/aft)
-"bTD" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bTE" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bTF" = (
-/obj/structure/closet/emcloset,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bTG" = (
-/obj/structure/table,
-/obj/item/paper_bin{
- pixel_x = 1;
- pixel_y = 9
- },
-/obj/item/pen,
-/obj/structure/reagent_dispensers/peppertank{
- pixel_x = 30
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/engineering)
-"bTH" = (
-/obj/structure/table,
-/obj/item/book/manual/wiki/security_space_law,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/engineering)
-"bTI" = (
-/obj/machinery/holopad,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/tcommsat/computer)
-"bTJ" = (
-/obj/machinery/power/apc{
- areastring = "/area/hallway/primary/aft";
- dir = 8;
- name = "Aft Hall APC";
- pixel_x = -25;
- pixel_y = 1
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/structure/disposalpipe/segment,
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bTK" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 4
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel/dark/corner{
- dir = 1
- },
-/area/engine/atmos)
-"bTL" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel/dark/corner{
- dir = 1
- },
-/area/engine/atmos)
-"bTM" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bTN" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bTO" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
- },
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 1;
- name = "External to Waste"
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bTP" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bTQ" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
- dir = 5
- },
-/turf/open/floor/plating,
-/area/engine/atmos)
-"bTR" = (
-/obj/machinery/atmospherics/pipe/manifold/orange/visible,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bTS" = (
-/obj/machinery/atmospherics/pipe/simple/yellow/visible,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bTU" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 8;
- name = "Pure to Ports"
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bTV" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 8;
- name = "N2O to Pure"
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/turf/open/floor/plasteel/cafeteria,
-/area/engine/atmos)
-"bTW" = (
-/turf/open/floor/engine/n2o,
-/area/engine/atmos)
-"bTX" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/nitrous_output{
- dir = 8
- },
-/turf/open/floor/engine/n2o,
-/area/engine/atmos)
-"bTY" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 5
- },
-/turf/closed/wall/r_wall,
-/area/medical/virology)
-"bTZ" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/closed/wall/r_wall,
-/area/medical/virology)
-"bUa" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10
- },
-/turf/closed/wall,
-/area/medical/virology)
-"bUb" = (
-/obj/machinery/airalarm{
- dir = 4;
- pixel_x = -22
- },
-/obj/structure/sink{
- dir = 8;
- pixel_x = -12;
- pixel_y = 2
- },
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bUc" = (
-/obj/machinery/requests_console{
- announcementConsole = 1;
- department = "Telecomms Admin";
- departmentType = 5;
- name = "Telecomms RC";
- pixel_x = 30
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/tcommsat/computer)
-"bUd" = (
-/obj/structure/table/reinforced,
-/obj/machinery/button/door{
- id = "xenobio3";
- name = "Containment Blast Doors";
- pixel_y = 4;
- req_access_txt = "55"
- },
-/obj/structure/window/reinforced{
- dir = 1
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/turf/open/floor/plasteel,
-/area/science/xenobiology)
-"bUe" = (
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio3";
- name = "containment blast door"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/engine,
-/area/science/xenobiology)
-"bUg" = (
-/obj/structure/window/reinforced{
- dir = 1
- },
-/obj/machinery/disposal/bin,
-/obj/structure/disposalpipe/trunk{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/turf/open/floor/plasteel,
-/area/science/xenobiology)
-"bUh" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio8";
- name = "containment blast door"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/engine,
-/area/science/xenobiology)
-"bUi" = (
-/obj/structure/disposalpipe/trunk{
- dir = 8
- },
-/obj/structure/disposaloutlet{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/science/xenobiology)
-"bUj" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 4
- },
-/obj/machinery/light{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/science/misc_lab)
-"bUk" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 10
- },
-/turf/open/floor/plasteel,
-/area/science/misc_lab)
-"bUl" = (
-/obj/structure/disposalpipe/sorting/mail/flip{
- dir = 2;
- sortType = 5
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bUm" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/engine/break_room)
-"bUn" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 9
- },
-/turf/open/floor/engine,
-/area/science/misc_lab)
-"bUo" = (
-/obj/structure/table,
-/obj/item/storage/box/beakers{
- pixel_x = 2;
- pixel_y = 2
- },
-/obj/item/grenade/chem_grenade,
-/obj/item/grenade/chem_grenade,
-/turf/open/floor/engine,
-/area/science/misc_lab)
-"bUp" = (
-/obj/structure/extinguisher_cabinet{
- pixel_x = -27
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/white,
-/area/science/circuit)
-"bUq" = (
-/obj/machinery/vending/assist,
-/turf/open/floor/plasteel/white,
-/area/science/circuit)
-"bUs" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bUt" = (
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/machinery/light{
- dir = 1;
- light_color = "#cee5d2"
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bUu" = (
-/obj/structure/disposalpipe/segment{
- dir = 6
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bUv" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bUx" = (
-/obj/structure/disposalpipe/junction/yjunction{
- dir = 1
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bUy" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/tcommsat/computer)
-"bUz" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bUB" = (
-/obj/machinery/power/apc{
- areastring = "/area/tcommsat/computer";
- name = "Telecomms Monitoring APC";
- pixel_y = -24
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bUC" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/closed/wall/r_wall,
-/area/tcommsat/computer)
-"bUD" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bUE" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 4
- },
-/obj/machinery/portable_atmospherics/pump,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/white/corner{
- dir = 1
- },
-/area/engine/atmos)
-"bUF" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel/dark/corner{
- dir = 1
- },
-/area/engine/atmos)
-"bUG" = (
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
- dir = 1
- },
-/obj/machinery/meter,
-/turf/closed/wall/r_wall,
-/area/engine/atmos)
-"bUH" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bUI" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/obj/effect/decal/cleanable/oil{
- icon_state = "floor5"
- },
-/turf/open/floor/plasteel/dark/corner,
-/area/engine/atmos)
-"bUJ" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
- },
-/obj/machinery/door/firedoor/heavy,
-/obj/machinery/door/airlock/atmos{
- name = "Atmospherics";
- req_access_txt = "24"
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bUK" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bUL" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/engine/atmos)
-"bUM" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 9
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bUN" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/turf/open/floor/plating,
-/area/engine/atmos)
-"bUO" = (
-/obj/machinery/atmospherics/pipe/manifold/orange/visible,
-/obj/machinery/meter,
-/turf/closed/wall/r_wall,
-/area/engine/atmos)
-"bUP" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/turf/closed/wall,
-/area/engine/atmos)
-"bUQ" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bUS" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 8;
- name = "Mix to External"
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bUT" = (
-/obj/machinery/computer/atmos_control/tank/nitrous_tank{
- dir = 8
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
- dir = 4
- },
-/turf/open/floor/plasteel/white/corner,
-/area/engine/atmos)
-"bUU" = (
-/obj/machinery/portable_atmospherics/canister/nitrous_oxide,
-/obj/machinery/atmospherics/miner/n2o,
-/turf/open/floor/engine/n2o,
-/area/engine/atmos)
-"bUV" = (
-/obj/machinery/air_sensor/atmos/nitrous_tank,
-/turf/open/floor/engine/n2o,
-/area/engine/atmos)
-"bUW" = (
-/obj/machinery/light/small{
- dir = 4
- },
-/turf/open/floor/engine/n2o,
-/area/engine/atmos)
-"bUY" = (
-/obj/structure/disposalpipe/segment{
- dir = 5
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 5
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bUZ" = (
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bVa" = (
-/obj/machinery/smartfridge/chemistry/virology/preloaded,
-/obj/effect/turf_decal/tile/green{
- dir = 1
- },
-/obj/effect/turf_decal/tile/green{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bVb" = (
-/obj/machinery/light_switch{
- pixel_x = 27
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/turf/open/floor/plasteel,
-/area/tcommsat/computer)
-"bVc" = (
-/obj/structure/disposalpipe/segment{
- dir = 6
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bVd" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bVe" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bVf" = (
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bVg" = (
-/obj/item/radio/intercom{
- name = "Station Intercom (General)";
- pixel_y = 20
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bVh" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bVi" = (
-/obj/structure/sign/warning/electricshock,
-/turf/closed/wall,
-/area/science/xenobiology)
-"bVj" = (
-/obj/machinery/light{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
-"bVk" = (
-/obj/structure/sink{
- dir = 4;
- pixel_x = 11
- },
-/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
-"bVl" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/science/misc_lab)
-"bVm" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/break_room)
-"bVn" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 4
- },
-/obj/machinery/meter,
-/turf/open/floor/plasteel,
-/area/science/misc_lab)
-"bVo" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/engine/break_room)
-"bVp" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/engine/break_room)
-"bVq" = (
-/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden,
-/turf/open/floor/plasteel,
-/area/engine/break_room)
-"bVr" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/turf/open/floor/plasteel,
-/area/engine/break_room)
-"bVs" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/science/circuit)
-"bVt" = (
-/obj/machinery/airalarm{
- dir = 8;
- pixel_x = 24
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/obj/structure/target_stake,
-/turf/open/floor/plasteel,
-/area/science/circuit)
-"bVx" = (
-/obj/machinery/atmospherics/components/unary/outlet_injector/on,
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/maintenance/port/aft)
-"bVy" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 4
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bVA" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/reagent_dispensers/fueltank,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 10
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bVB" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/closet/emcloset,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bVC" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible,
-/obj/machinery/light/small{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bVD" = (
-/obj/machinery/disposal/bin,
-/obj/structure/disposalpipe/trunk{
- dir = 8
- },
-/obj/structure/sign/warning/deathsposal{
- pixel_y = 32
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bVE" = (
-/obj/effect/decal/cleanable/cobweb/cobweb2,
-/obj/machinery/atmospherics/components/unary/portables_connector/visible,
-/obj/machinery/portable_atmospherics/canister/oxygen,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bVF" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bVG" = (
-/obj/structure/sign/warning/nosmoking{
- pixel_x = -28
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bVI" = (
-/turf/closed/wall/r_wall,
-/area/tcommsat/server)
-"bVJ" = (
-/turf/closed/wall/r_wall,
-/area/tcommsat/computer)
-"bVK" = (
-/obj/machinery/vending/snack/random,
-/turf/open/floor/plasteel,
-/area/engine/break_room)
-"bVM" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bVN" = (
-/obj/machinery/camera{
- c_tag = "Atmospherics Access";
- dir = 4
- },
-/obj/machinery/light{
- dir = 8
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel/dark/corner{
- dir = 1
- },
-/area/engine/atmos)
-"bVO" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 9
- },
-/turf/closed/wall/r_wall,
-/area/engine/atmos)
-"bVP" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 8;
- name = "External to Pumps"
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bVQ" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bVR" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 4
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/obj/machinery/suit_storage_unit/atmos,
-/turf/open/floor/plasteel/dark/corner,
-/area/engine/atmos)
-"bVS" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 4
- },
-/obj/structure/sign/warning/securearea,
-/turf/closed/wall,
-/area/engine/atmos)
-"bVT" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bVU" = (
-/obj/machinery/portable_atmospherics/pump,
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/white/corner{
- dir = 1
- },
-/area/engine/atmos)
-"bVV" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bVW" = (
-/obj/machinery/atmospherics/components/binary/pump/on{
- dir = 8;
- name = "Air to External"
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bVX" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 4
- },
-/obj/machinery/suit_storage_unit/atmos,
-/obj/machinery/airalarm{
- dir = 1;
- pixel_y = -22
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bVY" = (
-/obj/machinery/atmospherics/components/binary/pump/on{
- dir = 4;
- name = "External to Filter"
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bVZ" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bWa" = (
-/obj/machinery/atmospherics/pipe/manifold/yellow/visible{
- dir = 8
- },
-/obj/machinery/meter,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bWc" = (
-/obj/machinery/atmospherics/components/trinary/filter/atmos/n2o{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel/white/corner,
-/area/engine/atmos)
-"bWd" = (
-/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/nitrous_input{
- dir = 8
- },
-/turf/open/floor/engine/n2o,
-/area/engine/atmos)
-"bWe" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bWf" = (
-/obj/structure/table/glass,
-/obj/item/clothing/gloves/color/latex,
-/obj/machinery/requests_console{
- department = "Virology";
- name = "Virology Requests Console";
- pixel_x = -32
- },
-/obj/item/healthanalyzer,
-/obj/item/clothing/glasses/hud/health,
-/obj/effect/turf_decal/tile/green{
- dir = 1
- },
-/obj/effect/turf_decal/tile/green{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bWg" = (
-/obj/structure/table,
-/obj/item/hand_labeler,
-/obj/item/radio/headset/headset_med,
-/obj/effect/turf_decal/tile/green,
-/obj/effect/turf_decal/tile/green{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bWh" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
- },
-/turf/open/floor/plasteel,
-/area/engine/break_room)
-"bWi" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/spawner/structure/window,
-/turf/open/floor/plating,
-/area/medical/virology)
-"bWj" = (
-/obj/effect/spawner/structure/window,
-/turf/open/floor/plating,
-/area/medical/virology)
-"bWl" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio2";
- name = "containment blast door"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/engine,
-/area/science/xenobiology)
-"bWm" = (
-/obj/structure/window/reinforced,
-/obj/structure/table/reinforced,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/button/door{
- id = "xenobio7";
- name = "Containment Blast Doors";
- pixel_y = 4;
- req_access_txt = "55"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/turf/open/floor/plasteel,
-/area/science/xenobiology)
-"bWn" = (
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio7";
- name = "containment blast door"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/engine,
-/area/science/xenobiology)
-"bWo" = (
-/obj/item/radio/intercom{
- pixel_x = -25
- },
-/turf/open/floor/plasteel,
-/area/science/misc_lab)
-"bWp" = (
-/obj/structure/chair/office/light,
-/obj/effect/landmark/start/scientist,
-/turf/open/floor/plasteel,
-/area/science/misc_lab)
-"bWq" = (
-/obj/machinery/atmospherics/components/binary/pump,
-/turf/open/floor/plasteel,
-/area/science/misc_lab)
-"bWr" = (
-/turf/open/floor/plasteel,
-/area/science/misc_lab)
-"bWs" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/tcommsat/computer)
-"bWt" = (
-/obj/structure/chair/office/dark{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6
- },
-/turf/open/floor/plasteel,
-/area/tcommsat/computer)
-"bWu" = (
-/obj/machinery/door/airlock/engineering{
- name = "Telecommunications";
- req_access_txt = "61"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/tcommsat/computer)
-"bWv" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/tcommsat/computer)
-"bWw" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bWx" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 5
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bWy" = (
-/turf/open/floor/plasteel,
-/area/maintenance/port/aft)
-"bWz" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 9
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bWA" = (
-/obj/machinery/atmospherics/pipe/manifold4w/general,
-/obj/machinery/meter,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bWB" = (
-/turf/open/floor/circuit/telecomms/mainframe,
-/area/tcommsat/server)
-"bWC" = (
-/obj/machinery/telecomms/bus/preset_four,
-/turf/open/floor/plasteel/dark/telecomms,
-/area/tcommsat/server)
-"bWD" = (
-/obj/machinery/telecomms/server/presets/engineering,
-/turf/open/floor/plasteel/dark/telecomms,
-/area/tcommsat/server)
-"bWE" = (
-/obj/machinery/telecomms/processor/preset_three,
-/turf/open/floor/plasteel/dark/telecomms,
-/area/tcommsat/server)
-"bWF" = (
-/obj/machinery/light{
- dir = 1
- },
-/obj/machinery/power/apc/highcap/five_k{
- areastring = "/area/tcommsat/server";
- dir = 1;
- name = "Telecomms Server APC";
- pixel_y = 25
- },
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/turf/open/floor/circuit/telecomms/mainframe,
-/area/tcommsat/server)
-"bWG" = (
-/obj/machinery/telecomms/server/presets/security,
-/turf/open/floor/plasteel/dark/telecomms,
-/area/tcommsat/server)
-"bWH" = (
-/obj/structure/table,
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/tcommsat/computer)
-"bWI" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/turf/open/floor/plating,
-/area/tcommsat/computer)
-"bWJ" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bWK" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bWL" = (
-/obj/machinery/airalarm{
- dir = 4;
- pixel_x = -22
- },
-/obj/structure/disposalpipe/segment,
-/obj/machinery/light{
- dir = 8
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bWM" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 4
- },
-/obj/machinery/portable_atmospherics/scrubber,
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel/white/corner{
- dir = 1
- },
-/area/engine/atmos)
-"bWN" = (
-/obj/machinery/airalarm{
- dir = 4;
- pixel_x = -22
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel/dark/corner{
- dir = 1
- },
-/area/engine/atmos)
-"bWO" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 10
- },
-/turf/closed/wall/r_wall,
-/area/engine/atmos)
-"bWP" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bWQ" = (
-/turf/closed/wall/r_wall,
-/area/security/checkpoint/engineering)
-"bWR" = (
-/obj/item/radio/intercom{
- name = "Station Intercom (General)";
- pixel_x = -30
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/obj/machinery/camera{
- c_tag = "Atmospherics Central";
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bWT" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bWU" = (
-/obj/machinery/light{
- dir = 4
- },
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 4;
- name = "Mix to Engine"
- },
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bWV" = (
-/obj/machinery/door/airlock/external{
- name = "Atmospherics External Airlock";
- req_access_txt = "24"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bWW" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 1
- },
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bWX" = (
-/obj/structure/table/glass,
-/obj/item/radio/intercom{
- pixel_x = -25
- },
-/obj/machinery/light{
- dir = 8
- },
-/obj/item/storage/box/beakers{
- pixel_x = 2;
- pixel_y = 2
- },
-/obj/item/storage/box/syringes,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/green{
- dir = 1
- },
-/obj/effect/turf_decal/tile/green{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bWY" = (
-/obj/structure/table,
-/obj/item/paper_bin{
- pixel_x = -2;
- pixel_y = 5
- },
-/obj/item/pen/red,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/green,
-/obj/effect/turf_decal/tile/green{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bWZ" = (
-/obj/structure/chair/office/light{
- dir = 4
- },
-/obj/effect/landmark/start/virologist,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bXa" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10
- },
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bXb" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/spawner/structure/window,
-/turf/open/floor/plating,
-/area/medical/virology)
-"bXc" = (
-/obj/structure/table,
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bXd" = (
-/obj/machinery/light{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bXh" = (
-/obj/structure/filingcabinet/chestdrawer,
-/turf/open/floor/plasteel,
-/area/science/misc_lab)
-"bXi" = (
-/obj/structure/table,
-/obj/item/folder/white,
-/obj/item/folder/white,
-/obj/item/pen,
-/obj/item/taperecorder,
-/turf/open/floor/plasteel,
-/area/science/misc_lab)
-"bXj" = (
-/obj/structure/table,
-/obj/machinery/atmospherics/pipe/simple/general/visible,
-/obj/machinery/button/ignition{
- id = "testigniter";
- pixel_x = -6;
- pixel_y = 2
- },
-/obj/machinery/button/door{
- id = "testlab";
- name = "Test Chamber Blast Doors";
- pixel_x = 4;
- pixel_y = 2;
- req_access_txt = "55"
- },
-/turf/open/floor/plasteel,
-/area/science/misc_lab)
-"bXk" = (
-/obj/machinery/navbeacon{
- codes_txt = "patrol;next_patrol=AIE";
- location = "AftH"
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bXl" = (
-/obj/structure/table,
-/obj/item/paper_bin{
- pixel_y = 6
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6
- },
-/turf/open/floor/plasteel,
-/area/science/misc_lab)
-"bXm" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bXn" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bXo" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bXp" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/break_room)
-"bXq" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/engineering/glass{
- name = "Engineering";
- req_access_txt = "32"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/break_room)
-"bXr" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/science/misc_lab)
-"bXs" = (
-/turf/open/floor/plasteel/white,
-/area/science/circuit)
-"bXt" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/science/circuit)
-"bXv" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/obj/machinery/door/airlock/external{
- name = "External Access";
- req_access_txt = "13"
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bXw" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/turf/open/floor/plasteel,
-/area/maintenance/port/aft)
-"bXx" = (
-/obj/effect/landmark/blobstart,
-/turf/open/floor/plasteel,
-/area/maintenance/port/aft)
-"bXy" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible,
-/turf/open/floor/plasteel,
-/area/maintenance/port/aft)
-"bXz" = (
-/obj/machinery/telecomms/processor/preset_four,
-/turf/open/floor/plasteel/dark/telecomms,
-/area/tcommsat/server)
-"bXA" = (
-/obj/machinery/telecomms/server/presets/common,
-/turf/open/floor/plasteel/dark/telecomms,
-/area/tcommsat/server)
-"bXB" = (
-/obj/machinery/telecomms/bus/preset_three,
-/turf/open/floor/plasteel/dark/telecomms,
-/area/tcommsat/server)
-"bXC" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/circuit/telecomms/mainframe,
-/area/tcommsat/server)
-"bXD" = (
-/obj/machinery/telecomms/server/presets/command,
-/turf/open/floor/plasteel/dark/telecomms,
-/area/tcommsat/server)
-"bXE" = (
-/obj/machinery/computer/message_monitor{
- dir = 4
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/tcommsat/computer)
-"bXF" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/structure/cable,
-/turf/open/floor/plating,
-/area/tcommsat/computer)
-"bXG" = (
-/turf/open/floor/plasteel,
-/area/tcommsat/computer)
-"bXH" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/machinery/atmospherics/pipe/manifold4w/scrubbers,
-/turf/open/floor/plasteel,
-/area/engine/break_room)
-"bXI" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/break_room)
-"bXJ" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 4
- },
-/obj/machinery/portable_atmospherics/scrubber,
-/obj/machinery/light/small,
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel/white/corner{
- dir = 1
- },
-/area/engine/atmos)
-"bXK" = (
-/obj/machinery/meter,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible,
-/turf/closed/wall/r_wall,
-/area/engine/atmos)
-"bXL" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 9
- },
-/obj/machinery/door/poddoor/preopen{
- id = "atmos";
- name = "Atmospherics Blast Door"
- },
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bXM" = (
-/obj/machinery/door/poddoor/preopen{
- id = "atmos";
- name = "Atmospherics Blast Door"
- },
-/obj/effect/turf_decal/delivery,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bXN" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/break_room)
-"bXO" = (
-/obj/structure/filingcabinet,
-/obj/machinery/airalarm{
- pixel_y = 23
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/engineering)
-"bXP" = (
-/obj/machinery/requests_console{
- department = "Security";
- departmentType = 5;
- pixel_y = 30
- },
-/obj/structure/closet/secure_closet/security/engine,
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/engineering)
-"bXQ" = (
-/obj/structure/fireaxecabinet{
- pixel_x = -32
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bXR" = (
-/obj/machinery/power/floodlight,
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/turf/open/floor/plating,
-/area/engine/atmos)
-"bXS" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plating,
-/area/engine/atmos)
-"bXT" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/obj/machinery/light{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bXU" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 8;
- name = "Ports to External"
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bXV" = (
-/obj/machinery/camera{
- c_tag = "Atmospherics East";
- dir = 8
- },
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 8;
- name = "Plasma to Pure"
- },
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/obj/effect/turf_decal/tile/purple{
- dir = 1
- },
-/obj/effect/turf_decal/tile/purple,
-/obj/effect/turf_decal/tile/purple{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bXW" = (
-/turf/open/floor/engine/plasma,
-/area/engine/atmos)
-"bXX" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/toxin_output{
- dir = 8
- },
-/turf/open/floor/engine/plasma,
-/area/engine/atmos)
-"bXY" = (
-/obj/effect/landmark/xeno_spawn,
-/turf/open/floor/engine/plasma,
-/area/engine/atmos)
-"bXZ" = (
-/obj/structure/closet/crate,
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bYa" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
- },
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bYb" = (
-/obj/machinery/vending/cigarette,
-/turf/open/floor/plasteel,
-/area/engine/break_room)
-"bYc" = (
-/obj/machinery/disposal/bin,
-/obj/structure/sign/warning/deathsposal{
- pixel_y = -32
- },
-/obj/structure/disposalpipe/trunk{
- dir = 8
- },
-/obj/effect/turf_decal/tile/green,
-/obj/effect/turf_decal/tile/green{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bYd" = (
-/obj/structure/disposalpipe/segment{
- dir = 6
- },
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bYe" = (
-/obj/structure/closet/secure_closet/personal/patient,
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bYf" = (
-/obj/structure/table/reinforced,
-/obj/machinery/button/door{
- id = "xenobio2";
- name = "Containment Blast Doors";
- pixel_y = 4;
- req_access_txt = "55"
- },
-/obj/structure/window/reinforced{
- dir = 1
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/turf/open/floor/plasteel,
-/area/science/xenobiology)
-"bYg" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable,
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio2";
- name = "containment blast door"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/engine,
-/area/science/xenobiology)
-"bYh" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio7";
- name = "containment blast door"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/engine,
-/area/science/xenobiology)
-"bYi" = (
-/obj/machinery/door/poddoor/preopen{
- id = "testlab";
- name = "test chamber blast door"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/engine,
-/area/science/misc_lab)
-"bYj" = (
-/obj/machinery/door/poddoor/preopen{
- id = "testlab";
- name = "test chamber blast door"
- },
-/obj/machinery/atmospherics/pipe/simple/general/visible,
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/engine,
-/area/science/misc_lab)
-"bYk" = (
-/obj/structure/reagent_dispensers/fueltank,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plasteel,
-/area/science/misc_lab)
-"bYl" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/science/misc_lab)
-"bYm" = (
-/obj/structure/reagent_dispensers/watertank,
-/obj/structure/window/reinforced{
- dir = 4
- },
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plasteel,
-/area/science/misc_lab)
-"bYn" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bYo" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/turf/open/floor/plasteel/white,
-/area/science/misc_lab)
-"bYp" = (
-/obj/structure/sign/warning/securearea{
- pixel_x = -32
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bYq" = (
-/obj/machinery/light,
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bYr" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"bYs" = (
-/obj/structure/closet/crate,
-/obj/item/clothing/under/color/lightpurple,
-/obj/item/stack/spacecash/c200,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"bYt" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 5
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bYu" = (
-/obj/structure/sign/warning/vacuum/external{
- pixel_x = -32
- },
-/obj/machinery/space_heater,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bYv" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 8;
- name = "Mix to Space"
- },
-/turf/open/floor/plasteel,
-/area/maintenance/port/aft)
-"bYw" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/maintenance/port/aft)
-"bYx" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/maintenance/port/aft)
-"bYy" = (
-/obj/machinery/door/airlock/maintenance/abandoned{
- name = "Incinerator Access";
- req_access_txt = "12"
- },
-/obj/structure/barricade/wooden{
- name = "wooden barricade (CLOSED)"
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bYz" = (
-/turf/open/floor/plasteel/dark/telecomms,
-/area/tcommsat/server)
-"bYA" = (
-/obj/machinery/telecomms/broadcaster/preset_right,
-/turf/open/floor/plasteel/dark/telecomms,
-/area/tcommsat/server)
-"bYB" = (
-/obj/machinery/blackbox_recorder,
-/turf/open/floor/plasteel/dark/telecomms,
-/area/tcommsat/server)
-"bYC" = (
-/obj/machinery/telecomms/receiver/preset_right,
-/turf/open/floor/plasteel/dark/telecomms,
-/area/tcommsat/server)
-"bYD" = (
-/obj/machinery/computer/telecomms/server{
- dir = 4;
- network = "tcommsat"
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/tcommsat/computer)
-"bYE" = (
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bYF" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/tcommsat/computer)
-"bYG" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/obj/structure/sign/departments/engineering{
- pixel_y = -32
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bYH" = (
-/turf/closed/wall,
-/area/engine/break_room)
-"bYI" = (
-/obj/machinery/firealarm{
- dir = 8;
- pixel_x = 24
- },
-/obj/effect/turf_decal/tile/yellow,
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bYJ" = (
-/obj/machinery/atmospherics/pipe/manifold4w/general/visible,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bYK" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/obj/structure/extinguisher_cabinet{
- pixel_x = -27
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bYL" = (
-/obj/machinery/atmospherics/pipe/manifold/yellow/visible{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bYM" = (
-/obj/machinery/airalarm{
- dir = 1;
- pixel_y = -22
- },
-/obj/structure/disposalpipe/segment{
- dir = 5
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bYN" = (
-/obj/machinery/atmospherics/pipe/manifold4w/yellow/visible,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bYO" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/break_room)
-"bYP" = (
-/obj/effect/landmark/event_spawn,
-/turf/closed/wall,
-/area/crew_quarters/bar)
-"bYT" = (
-/obj/machinery/computer/atmos_control/tank/toxin_tank{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/obj/effect/turf_decal/tile/purple{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/effect/turf_decal/tile/purple,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bYU" = (
-/obj/machinery/portable_atmospherics/canister/toxins,
-/obj/machinery/atmospherics/miner/toxins,
-/turf/open/floor/engine/plasma,
-/area/engine/atmos)
-"bYV" = (
-/obj/machinery/air_sensor/atmos/toxin_tank,
-/turf/open/floor/engine/plasma,
-/area/engine/atmos)
-"bYW" = (
-/obj/machinery/light/small{
- dir = 4
- },
-/turf/open/floor/engine/plasma,
-/area/engine/atmos)
-"bYX" = (
-/obj/structure/closet/l3closet/virology,
-/obj/effect/turf_decal/tile/green,
-/obj/effect/turf_decal/tile/green{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bYY" = (
-/obj/structure/closet/secure_closet/medical1,
-/obj/structure/disposalpipe/segment,
-/obj/effect/turf_decal/tile/green,
-/obj/effect/turf_decal/tile/green{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
-"bYZ" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/closed/wall/r_wall,
-/area/medical/virology)
-"bZa" = (
-/obj/structure/sink{
- dir = 8;
- pixel_x = -12;
- pixel_y = 2
- },
-/obj/machinery/camera{
- c_tag = "Xenobiology South";
- dir = 4;
- network = list("ss13","rd")
- },
-/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
-"bZb" = (
-/obj/machinery/light{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
-"bZc" = (
-/obj/machinery/atmospherics/components/unary/outlet_injector/on{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/science/misc_lab)
-"bZd" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 8
- },
-/obj/structure/disposalpipe/junction/flip,
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/turf/open/floor/plasteel,
-/area/science/misc_lab)
-"bZe" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/engine/break_room)
-"bZg" = (
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/engine/break_room)
-"bZh" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/science/circuit)
-"bZi" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/maintenance/starboard)
-"bZj" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bZk" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 4
- },
-/obj/machinery/portable_atmospherics/canister,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bZl" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 8;
- name = "Mix to Port"
- },
-/obj/machinery/light/small,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bZn" = (
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/turf/open/floor/circuit/telecomms/mainframe,
-/area/tcommsat/server)
-"bZo" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/circuit/telecomms/mainframe,
-/area/tcommsat/server)
-"bZp" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/turf/open/floor/circuit/telecomms/mainframe,
-/area/tcommsat/server)
-"bZq" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/turf/open/floor/plating,
-/area/tcommsat/computer)
-"bZr" = (
-/obj/machinery/status_display/evac,
-/turf/closed/wall,
-/area/tcommsat/computer)
-"bZs" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/structure/cable,
-/turf/open/floor/plating,
-/area/tcommsat/computer)
-"bZt" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/engine/break_room)
-"bZu" = (
-/obj/machinery/camera{
- c_tag = "Engineering Foyer";
- dir = 1
- },
-/obj/structure/noticeboard{
- dir = 1;
- pixel_y = -27
- },
-/turf/open/floor/plasteel,
-/area/engine/break_room)
-"bZv" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/tcommsat/computer)
-"bZw" = (
-/obj/structure/extinguisher_cabinet{
- pixel_x = 27
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/closet/firecloset,
-/turf/open/floor/plasteel,
-/area/engine/break_room)
-"bZx" = (
-/obj/machinery/door/firedoor,
-/obj/structure/disposalpipe/segment,
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"bZy" = (
-/turf/open/floor/plasteel,
-/area/engine/break_room)
-"bZz" = (
-/obj/structure/table,
-/obj/machinery/light_switch{
- pixel_x = -23
- },
-/obj/machinery/light{
- dir = 8
- },
-/obj/item/book/manual/wiki/engineering_hacking{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/item/book/manual/wiki/engineering_construction,
-/turf/open/floor/plasteel,
-/area/engine/break_room)
-"bZA" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/engine/break_room)
-"bZB" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"bZC" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/preopen{
- id = "ceprivacy";
- name = "privacy shutter"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/structure/cable,
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/turf/open/floor/plating,
-/area/crew_quarters/heads/chief)
-"bZD" = (
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/preopen{
- id = "ceprivacy";
- name = "privacy shutter"
- },
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/turf/open/floor/plating,
-/area/crew_quarters/heads/chief)
-"bZE" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/engine/break_room)
-"bZF" = (
-/obj/machinery/power/apc{
- areastring = "/area/engine/atmos";
- dir = 8;
- name = "Atmospherics APC";
- pixel_x = -24
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bZG" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bZH" = (
-/obj/machinery/portable_atmospherics/canister,
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bZI" = (
-/obj/machinery/space_heater,
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bZK" = (
-/obj/machinery/atmospherics/components/trinary/filter/atmos/plasma{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/obj/effect/turf_decal/tile/purple{
- dir = 8
- },
-/obj/effect/turf_decal/tile/purple,
-/obj/effect/turf_decal/tile/purple{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bZL" = (
-/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/toxin_input{
- dir = 8
- },
-/turf/open/floor/engine/plasma,
-/area/engine/atmos)
-"bZM" = (
-/turf/open/floor/plating{
- icon_state = "platingdmg3"
- },
-/area/maintenance/aft)
-"bZN" = (
-/obj/structure/reagent_dispensers/watertank,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bZO" = (
-/obj/effect/decal/cleanable/cobweb/cobweb2,
-/obj/effect/spawner/lootdrop/maintenance,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bZP" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10
- },
-/turf/closed/wall/r_wall,
-/area/medical/virology)
-"bZQ" = (
-/obj/machinery/atmospherics/components/binary/valve/on{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bZR" = (
-/obj/machinery/airalarm{
- pixel_y = 23
- },
-/obj/item/wrench,
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/obj/machinery/space_heater,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bZS" = (
-/obj/machinery/atmospherics/components/unary/tank/air{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bZT" = (
-/obj/structure/rack,
-/obj/machinery/light/small{
- dir = 1
- },
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bZU" = (
-/obj/structure/closet/emcloset,
-/obj/effect/decal/cleanable/cobweb,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"bZV" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio1";
- name = "containment blast door"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/engine,
-/area/science/xenobiology)
-"bZW" = (
-/obj/structure/window/reinforced,
-/obj/structure/table/reinforced,
-/obj/machinery/button/door{
- id = "xenobio6";
- name = "Containment Blast Doors";
- pixel_y = 4;
- req_access_txt = "55"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/turf/open/floor/plasteel,
-/area/science/xenobiology)
-"bZX" = (
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio6";
- name = "containment blast door"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/engine,
-/area/science/xenobiology)
-"bZY" = (
-/obj/item/radio/intercom{
- pixel_x = -25
- },
-/turf/open/floor/engine,
-/area/science/misc_lab)
-"bZZ" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/science/misc_lab)
-"caa" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/stripes/corner{
- dir = 1
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/science/misc_lab)
-"cac" = (
-/obj/structure/chair/stool,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cad" = (
-/obj/structure/table,
-/obj/item/flashlight/lamp,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cae" = (
-/turf/open/floor/plating{
- icon_state = "platingdmg3"
- },
-/area/maintenance/starboard/aft)
-"caf" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 5
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/maintenance/port/aft)
-"cag" = (
-/obj/machinery/ntnet_relay,
-/turf/open/floor/circuit/telecomms/mainframe,
-/area/tcommsat/server)
-"cah" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/turf/open/floor/circuit/telecomms/mainframe,
-/area/tcommsat/server)
-"cai" = (
-/obj/machinery/power/smes{
- charge = 5e+006
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/turf/open/floor/circuit/telecomms/mainframe,
-/area/tcommsat/server)
-"cak" = (
-/obj/machinery/telecomms/hub/preset,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark/telecomms,
-/area/tcommsat/server)
-"cal" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/obj/machinery/door/airlock/engineering/glass{
- name = "Server Room";
- req_access_txt = "61"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/tcommsat/computer)
-"can" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/obj/machinery/door/airlock/engineering/glass{
- name = "Server Room";
- req_access_txt = "61"
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/tcommsat/computer)
-"cao" = (
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/tcommsat/computer)
-"cap" = (
-/obj/machinery/light,
-/obj/structure/closet/firecloset,
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/engine/break_room)
-"caq" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"car" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 5
- },
-/turf/closed/wall,
-/area/maintenance/port/aft)
-"cas" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"cat" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 5
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"cau" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"cav" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"caw" = (
-/obj/structure/table,
-/obj/machinery/airalarm{
- dir = 4;
- pixel_x = -22
- },
-/obj/item/stack/packageWrap,
-/obj/item/stack/packageWrap,
-/obj/item/hand_labeler,
-/turf/open/floor/plasteel,
-/area/engine/break_room)
-"cax" = (
-/obj/structure/closet/wardrobe/black,
-/obj/effect/decal/cleanable/cobweb,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"cay" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"caz" = (
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/structure/disposalpipe/segment{
- dir = 6
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"caA" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/security/checkpoint/engineering)
-"caC" = (
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"caD" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/closed/wall/r_wall,
-/area/security/checkpoint/engineering)
-"caE" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"caF" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 6
- },
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
- dir = 9
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"caG" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/obj/machinery/requests_console{
- department = "Atmospherics";
- departmentType = 4;
- name = "Atmos RC";
- pixel_x = -30
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"caH" = (
-/obj/effect/decal/cleanable/oil{
- icon_state = "floor6"
- },
-/obj/machinery/atmospherics/pipe/manifold/yellow/visible,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"caI" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"caK" = (
-/obj/structure/rack,
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"caL" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"caM" = (
-/obj/structure/disposalpipe/segment{
- dir = 5
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"caN" = (
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"caO" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"caP" = (
-/obj/machinery/atmospherics/components/binary/valve{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"caQ" = (
-/obj/structure/chair/stool{
- pixel_y = 8
- },
-/obj/machinery/light/small{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 5
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"caR" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 8
- },
-/obj/machinery/portable_atmospherics/canister/air,
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"caS" = (
-/obj/structure/disposalpipe/segment{
- dir = 6
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"caT" = (
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"caU" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"caX" = (
-/obj/machinery/sparker{
- id = "testigniter";
- pixel_x = -25
- },
-/turf/open/floor/engine,
-/area/science/misc_lab)
-"caY" = (
-/obj/item/beacon,
-/turf/open/floor/engine,
-/area/science/misc_lab)
-"caZ" = (
-/obj/machinery/door/poddoor/preopen{
- id = "testlab";
- name = "test chamber blast door"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/engine,
-/area/science/misc_lab)
-"cba" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/science/misc_lab)
-"cbb" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/science/misc_lab)
-"cbc" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/science/misc_lab)
-"cbd" = (
-/obj/machinery/power/apc{
- areastring = "/area/science/misc_lab";
- dir = 4;
- name = "Testing Lab APC";
- pixel_x = 26
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/science/misc_lab)
-"cbe" = (
-/obj/structure/table/reinforced,
-/obj/item/integrated_electronics/analyzer,
-/obj/item/integrated_electronics/debugger,
-/obj/item/integrated_electronics/wirer,
-/turf/open/floor/plasteel/white,
-/area/science/circuit)
-"cbf" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cbg" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plating{
- icon_state = "platingdmg3"
- },
-/area/maintenance/starboard/aft)
-"cbh" = (
-/obj/structure/table,
-/obj/item/folder/white,
-/obj/item/folder/white,
-/obj/item/pen,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cbi" = (
-/obj/structure/table,
-/obj/item/paper_bin{
- pixel_x = -2;
- pixel_y = 5
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cbj" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 4
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/maintenance/port/aft)
-"cbk" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/components/binary/pump/on{
- dir = 8;
- name = "Mix to Space"
- },
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/maintenance/port/aft)
-"cbl" = (
-/obj/machinery/camera{
- c_tag = "Telecomms Server Room";
- dir = 4;
- network = list("tcomms")
- },
-/turf/open/floor/plasteel/dark/telecomms,
-/area/tcommsat/server)
-"cbm" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/structure/cable,
-/turf/open/floor/plating,
-/area/tcommsat/computer)
-"cbn" = (
-/obj/structure/sign/warning/securearea{
- desc = "A warning sign which reads 'SERVER ROOM'.";
- name = "SERVER ROOM"
- },
-/turf/closed/wall,
-/area/tcommsat/computer)
-"cbo" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/turf/open/floor/plating,
-/area/tcommsat/computer)
-"cbp" = (
-/obj/structure/closet/secure_closet/engineering_chief,
-/obj/machinery/power/apc/highcap/five_k{
- areastring = "/area/crew_quarters/heads/chief";
- dir = 4;
- name = "CE Office APC";
- pixel_x = 24
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
- },
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/crew_quarters/heads/chief)
-"cbq" = (
-/obj/structure/filingcabinet/chestdrawer,
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/mob/living/simple_animal/parrot/Poly,
-/turf/open/floor/plasteel/dark,
-/area/crew_quarters/heads/chief)
-"cbr" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"cbs" = (
-/obj/structure/sign/warning/securearea,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall,
-/area/engine/engineering)
-"cbt" = (
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
-/obj/machinery/camera{
- c_tag = "Aft Primary Hallway 1";
- dir = 8;
- pixel_y = -22
- },
-/obj/effect/turf_decal/tile/yellow,
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"cbu" = (
-/obj/machinery/power/apc{
- areastring = "/area/engine/break_room";
- dir = 8;
- name = "Engineering Foyer APC";
- pixel_x = -24
- },
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/turf/open/floor/plasteel,
-/area/engine/break_room)
-"cbv" = (
-/obj/machinery/door/airlock/maintenance/abandoned{
- name = "Research Delivery access";
- req_access_txt = "12"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cbw" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 5
- },
-/obj/structure/disposalpipe/segment{
- dir = 5
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"cbx" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/disposalpipe/sorting/mail/flip{
- dir = 8;
- sortType = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"cby" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
- },
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"cbA" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 4;
- name = "Ports to Incinerator"
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"cbB" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 8;
- name = "Air to Pure"
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"cbC" = (
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
- dir = 1
- },
-/obj/machinery/meter,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"cbD" = (
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
- dir = 8
- },
-/obj/machinery/meter,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"cbE" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 10
- },
-/obj/machinery/meter,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"cbF" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"cbG" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 8;
- name = "CO2 to Pure"
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"cbH" = (
-/turf/open/floor/engine/co2,
-/area/engine/atmos)
-"cbI" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/carbon_output{
- dir = 8
- },
-/turf/open/floor/engine/co2,
-/area/engine/atmos)
-"cbJ" = (
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
- dir = 10
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cbK" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall,
-/area/maintenance/aft)
-"cbL" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cbM" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cbN" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cbO" = (
-/obj/machinery/door/airlock/atmos/abandoned{
- name = "Atmospherics Maintenance";
- req_access_txt = "12;24"
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cbP" = (
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cbQ" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cbR" = (
-/obj/structure/table/reinforced,
-/obj/machinery/button/door{
- id = "xenobio1";
- name = "Containment Blast Doors";
- pixel_y = 4;
- req_access_txt = "55"
- },
-/obj/structure/window/reinforced{
- dir = 1
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/light,
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/turf/open/floor/plasteel,
-/area/science/xenobiology)
-"cbS" = (
-/obj/structure/cable,
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio1";
- name = "containment blast door"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/engine,
-/area/science/xenobiology)
-"cbU" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio6";
- name = "containment blast door"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/engine,
-/area/science/xenobiology)
-"cbV" = (
-/obj/machinery/camera{
- c_tag = "Testing Chamber";
- dir = 1;
- network = list("test","rd")
- },
-/obj/machinery/light,
-/turf/open/floor/engine,
-/area/science/misc_lab)
-"cbW" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/stripes/corner{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/turf/open/floor/plasteel,
-/area/science/misc_lab)
-"cbY" = (
-/obj/structure/table/reinforced,
-/obj/item/multitool,
-/obj/item/screwdriver,
-/obj/machinery/requests_console{
- department = "Science";
- departmentType = 2;
- name = "Science Requests Console";
- pixel_y = -30;
- receive_ore_updates = 1
- },
-/turf/open/floor/plasteel/white,
-/area/science/circuit)
-"cbZ" = (
-/obj/structure/table/reinforced,
-/obj/item/integrated_circuit_printer,
-/obj/machinery/computer/security/telescreen/circuitry{
- dir = 1;
- pixel_y = -30
- },
-/turf/open/floor/plasteel/white,
-/area/science/circuit)
-"cca" = (
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/machinery/power/solar{
- id = "portsolar";
- name = "Port Solar Array"
- },
-/turf/open/floor/plating/asteroid/snow/ice/icemoon/solarpanel,
-/area/icemoon/surface/outdoors)
-"ccb" = (
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/machinery/power/solar{
- id = "portsolar";
- name = "Port Solar Array"
- },
-/turf/open/floor/plating/asteroid/snow/ice/icemoon/solarpanel,
-/area/icemoon/surface/outdoors)
-"ccc" = (
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors)
-"ccd" = (
-/obj/structure/closet,
-/obj/effect/spawner/lootdrop/maintenance{
- lootcount = 8;
- name = "8maintenance loot spawner"
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"cce" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/door/airlock/maintenance/abandoned{
- name = "Construction Area Maintenance";
- req_access_txt = "32"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"ccf" = (
-/obj/machinery/telecomms/broadcaster/preset_left,
-/turf/open/floor/plasteel/dark/telecomms,
-/area/tcommsat/server)
-"ccg" = (
-/obj/machinery/telecomms/message_server,
-/turf/open/floor/plasteel/dark/telecomms,
-/area/tcommsat/server)
-"cch" = (
-/obj/machinery/telecomms/receiver/preset_left,
-/turf/open/floor/plasteel/dark/telecomms,
-/area/tcommsat/server)
-"cci" = (
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/obj/machinery/space_heater,
-/turf/open/floor/plasteel,
-/area/tcommsat/computer)
-"ccj" = (
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/crew_quarters/heads/chief)
-"cck" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/crew_quarters/heads/chief)
-"ccl" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/crew_quarters/heads/chief)
-"ccm" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"ccn" = (
-/obj/machinery/camera{
- c_tag = "Engineering Access"
- },
-/obj/structure/closet/radiation,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cco" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"ccp" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"ccq" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"ccr" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"ccs" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/break_room)
-"cct" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"ccv" = (
-/obj/machinery/firealarm{
- dir = 4;
- pixel_x = -24
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"ccw" = (
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
-"ccy" = (
-/obj/machinery/atmospherics/pipe/simple/yellow/visible,
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"ccz" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"ccA" = (
-/obj/machinery/computer/atmos_control/tank/carbon_tank{
- dir = 8
- },
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"ccB" = (
-/obj/machinery/portable_atmospherics/canister/carbon_dioxide,
-/obj/machinery/atmospherics/miner/carbon_dioxide,
-/turf/open/floor/engine/co2,
-/area/engine/atmos)
-"ccC" = (
-/obj/machinery/air_sensor/atmos/carbon_tank,
-/turf/open/floor/engine/co2,
-/area/engine/atmos)
-"ccD" = (
-/obj/machinery/light/small{
- dir = 4
- },
-/turf/open/floor/engine/co2,
-/area/engine/atmos)
-"ccE" = (
-/obj/structure/sign/warning/nosmoking{
- pixel_y = 28
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"ccF" = (
-/obj/machinery/light/small{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"ccG" = (
-/obj/structure/chair/stool,
-/obj/effect/decal/cleanable/cobweb{
- icon_state = "cobweb2"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"ccI" = (
-/obj/structure/disposalpipe/segment{
- dir = 5
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 5
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"ccJ" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"ccK" = (
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"ccL" = (
-/obj/structure/disposalpipe/segment{
- dir = 6
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"ccM" = (
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"ccN" = (
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"ccO" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"ccQ" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/science/xenobiology)
-"ccR" = (
-/obj/machinery/portable_atmospherics/pump,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plasteel,
-/area/science/misc_lab)
-"ccT" = (
-/obj/machinery/light{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/science/misc_lab)
-"ccU" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/closed/wall,
-/area/maintenance/starboard/aft)
-"ccV" = (
-/obj/structure/table,
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"ccW" = (
-/obj/structure/table,
-/obj/effect/decal/cleanable/cobweb,
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"ccX" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors)
-"ccZ" = (
-/obj/structure/chair/stool,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"cda" = (
-/obj/machinery/light/small{
- dir = 1
- },
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"cdb" = (
-/obj/machinery/portable_atmospherics/canister/air,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"cdc" = (
-/obj/machinery/telecomms/bus/preset_two,
-/turf/open/floor/plasteel/dark/telecomms,
-/area/tcommsat/server)
-"cdd" = (
-/obj/machinery/telecomms/server/presets/supply,
-/turf/open/floor/plasteel/dark/telecomms,
-/area/tcommsat/server)
-"cde" = (
-/obj/machinery/telecomms/processor/preset_one,
-/turf/open/floor/plasteel/dark/telecomms,
-/area/tcommsat/server)
-"cdf" = (
-/obj/machinery/telecomms/server/presets/medical,
-/turf/open/floor/plasteel/dark/telecomms,
-/area/tcommsat/server)
-"cdg" = (
-/obj/machinery/computer/telecomms/monitor{
- dir = 4;
- network = "tcommsat"
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/tcommsat/computer)
-"cdh" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"cdj" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"cdk" = (
-/obj/machinery/computer/atmos_alert,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cdl" = (
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/carpet,
-/area/chapel/main)
-"cdm" = (
-/obj/structure/table/reinforced,
-/obj/item/clipboard,
-/obj/item/paper/monitorkey,
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/item/pen/fountain,
-/turf/open/floor/plasteel,
-/area/crew_quarters/heads/chief)
-"cdn" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 8
- },
-/obj/structure/closet/firecloset,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cdo" = (
-/obj/machinery/light{
- dir = 4
- },
-/obj/structure/closet/radiation,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cdp" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cdq" = (
-/obj/effect/spawner/structure/window/reinforced/tinted,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cdr" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cds" = (
-/obj/machinery/power/apc{
- areastring = "/area/maintenance/starboard/aft";
- dir = 8;
- name = "Starboard Quarter Maintenance APC";
- pixel_x = -25
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/machinery/camera{
- c_tag = "Aft Starboard Solar Access";
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cdt" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/engine/break_room)
-"cdu" = (
-/obj/structure/closet/emcloset,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cdv" = (
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"cdw" = (
-/obj/machinery/airalarm{
- dir = 4;
- pixel_x = -22
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"cdx" = (
-/obj/machinery/atmospherics/components/unary/relief_valve/atmos/atmos_waste{
- dir = 1
- },
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/engine/atmos)
-"cdB" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/engine/atmos)
-"cdC" = (
-/obj/machinery/atmospherics/components/trinary/filter/atmos/co2{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"cdD" = (
-/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/carbon_input{
- dir = 8
- },
-/turf/open/floor/engine/co2,
-/area/engine/atmos)
-"cdE" = (
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cdF" = (
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cdG" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cdH" = (
-/obj/structure/table,
-/obj/effect/spawner/lootdrop/maintenance,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cdI" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cdJ" = (
-/obj/structure/disposalpipe/segment{
- dir = 5
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 5
- },
-/obj/machinery/space_heater,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cdK" = (
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cdL" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cdN" = (
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cdO" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cdQ" = (
-/obj/structure/closet/emcloset,
-/obj/effect/decal/cleanable/cobweb,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cdR" = (
-/obj/machinery/atmospherics/components/unary/tank/air,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cdS" = (
-/obj/machinery/portable_atmospherics/scrubber,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plasteel,
-/area/science/misc_lab)
-"cdT" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cdU" = (
-/obj/structure/chair/office/light{
- dir = 4
- },
-/obj/effect/landmark/start/chief_engineer,
-/turf/open/floor/plasteel,
-/area/crew_quarters/heads/chief)
-"cdV" = (
-/obj/structure/table,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cdW" = (
-/obj/machinery/power/apc{
- areastring = "/area/maintenance/port/aft";
- dir = 8;
- name = "Port Quarter Maintenance APC";
- pixel_x = -25;
- pixel_y = 1
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"cdX" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"cdZ" = (
-/obj/machinery/telecomms/processor/preset_two,
-/turf/open/floor/plasteel/dark/telecomms,
-/area/tcommsat/server)
-"cea" = (
-/obj/machinery/telecomms/server/presets/service,
-/turf/open/floor/plasteel/dark/telecomms,
-/area/tcommsat/server)
-"ceb" = (
-/obj/machinery/telecomms/bus/preset_one,
-/turf/open/floor/plasteel/dark/telecomms,
-/area/tcommsat/server)
-"cec" = (
-/obj/structure/sign/warning/nosmoking{
- pixel_y = -32
- },
-/obj/machinery/light,
-/turf/open/floor/circuit/telecomms/mainframe,
-/area/tcommsat/server)
-"ced" = (
-/obj/machinery/telecomms/server/presets/science,
-/turf/open/floor/plasteel/dark/telecomms,
-/area/tcommsat/server)
-"cee" = (
-/obj/structure/table,
-/obj/item/radio/off,
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/obj/item/multitool,
-/turf/open/floor/plasteel,
-/area/tcommsat/computer)
-"cef" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable,
-/turf/open/floor/plating,
-/area/tcommsat/computer)
-"ceg" = (
-/obj/machinery/airalarm{
- dir = 1;
- pixel_y = -22
- },
-/obj/machinery/light,
-/obj/structure/filingcabinet/chestdrawer,
-/turf/open/floor/plasteel,
-/area/tcommsat/computer)
-"ceh" = (
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/plasteel,
-/area/bridge)
-"cei" = (
-/obj/structure/rack,
-/obj/item/storage/toolbox/mechanical{
- pixel_x = -2;
- pixel_y = -1
- },
-/turf/open/floor/plasteel,
-/area/tcommsat/computer)
-"cej" = (
-/obj/machinery/door/poddoor/preopen{
- id = "Engineering";
- name = "engineering security door"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/delivery,
-/obj/machinery/shower{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cek" = (
-/obj/machinery/door/poddoor/preopen{
- id = "Engineering";
- name = "engineering security door"
- },
-/obj/effect/turf_decal/delivery,
-/obj/machinery/shower{
- dir = 8
- },
-/obj/structure/sign/warning/enginesafety{
- pixel_x = 32
- },
-/obj/structure/sign/poster/official/safety_eye_protection{
- pixel_y = -32
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cel" = (
-/obj/machinery/door/poddoor/preopen{
- id = "Engineering";
- name = "engineering security door"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cem" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"cen" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"ceo" = (
-/obj/machinery/keycard_auth{
- pixel_y = -28
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/heads/chief)
-"cep" = (
-/obj/structure/sign/warning/securearea,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
-"ceq" = (
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/crew_quarters/heads/chief)
-"cer" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/break_room)
-"ces" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cet" = (
-/obj/machinery/door/firedoor,
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cev" = (
-/obj/effect/spawner/structure/window,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"cew" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/engine/break_room)
-"cex" = (
-/obj/machinery/camera{
- c_tag = "Atmospherics South West";
- dir = 4
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"cey" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
-"cez" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"ceA" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/turf/open/floor/plating,
-/area/engine/atmos)
-"ceB" = (
-/obj/machinery/light{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 9
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"ceC" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/yellow/visible,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"ceD" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"ceE" = (
-/obj/structure/sign/warning/fire{
- pixel_y = -32
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"ceF" = (
-/obj/structure/closet/emcloset,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"ceG" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"ceH" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/closed/wall,
-/area/maintenance/aft)
-"ceI" = (
-/obj/structure/sign/warning/biohazard,
-/turf/closed/wall,
-/area/maintenance/aft)
-"ceJ" = (
-/obj/structure/disposalpipe/segment,
-/turf/closed/wall,
-/area/maintenance/aft)
-"ceK" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/closet/l3closet,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"ceL" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/light/small,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"ceM" = (
-/obj/machinery/meter,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"ceN" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
- dir = 9
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"ceO" = (
-/obj/machinery/meter,
-/obj/machinery/atmospherics/pipe/manifold/cyan/hidden,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"ceP" = (
-/obj/machinery/portable_atmospherics/canister,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plasteel,
-/area/science/misc_lab)
-"ceQ" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/science/misc_lab)
-"ceR" = (
-/obj/effect/landmark/blobstart,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"ceS" = (
-/obj/item/stack/sheet/cardboard,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"ceT" = (
-/obj/machinery/light/small,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"ceU" = (
-/obj/structure/sign/warning/vacuum/external{
- pixel_y = -32
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"ceV" = (
-/obj/structure/closet,
-/obj/effect/spawner/lootdrop/maintenance{
- lootcount = 2;
- name = "2maintenance loot spawner"
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"ceW" = (
-/obj/machinery/space_heater,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"ceX" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/machinery/holopad,
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"ceY" = (
-/obj/structure/reagent_dispensers/fueltank,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"ceZ" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/engineering/glass{
- name = "Power Storage";
- req_access_txt = "11"
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cfa" = (
-/obj/structure/rack,
-/obj/item/storage/belt/utility,
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/obj/item/weldingtool/largetank,
-/obj/item/clothing/head/welding{
- pixel_x = -3;
- pixel_y = 5
- },
-/obj/item/clothing/glasses/welding,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cfb" = (
-/turf/closed/wall/r_wall,
-/area/crew_quarters/heads/chief)
-"cfc" = (
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/preopen{
- id = "ceprivacy";
- name = "privacy shutter"
- },
-/turf/open/floor/plating,
-/area/crew_quarters/heads/chief)
-"cfd" = (
-/obj/machinery/firealarm{
- dir = 8;
- pixel_x = 24
- },
-/obj/structure/closet/radiation,
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cfe" = (
-/obj/structure/sign/warning/radiation/rad_area{
- pixel_x = -32
- },
-/obj/structure/disposalpipe/segment,
-/obj/structure/sign/warning/securearea{
- pixel_x = 32
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"cfg" = (
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cfh" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/engine/break_room)
-"cfi" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/obj/structure/reagent_dispensers/watertank/high,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"cfj" = (
-/turf/closed/wall,
-/area/maintenance/disposal/incinerator)
-"cfk" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/door/airlock/atmos{
- name = "Turbine Access";
- req_access_txt = "32"
- },
-/turf/open/floor/plating,
-/area/maintenance/disposal/incinerator)
-"cfl" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/closed/wall,
-/area/maintenance/disposal/incinerator)
-"cfm" = (
-/obj/structure/rack,
-/obj/effect/spawner/lootdrop/maintenance{
- lootcount = 2;
- name = "2maintenance loot spawner"
- },
-/obj/item/toy/minimeteor,
-/obj/item/poster/random_contraband,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cfn" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/rack,
-/obj/effect/spawner/lootdrop/maintenance,
-/obj/item/reagent_containers/food/snacks/donkpocket,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cfo" = (
-/obj/structure/closet,
-/obj/effect/spawner/lootdrop/maintenance,
-/obj/item/roller,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cfp" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/item/c_tube,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cfq" = (
-/obj/structure/mopbucket,
-/obj/item/caution,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cfr" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- external_pressure_bound = 140;
- name = "killroom vent";
- pressure_checks = 0
- },
-/obj/machinery/camera{
- c_tag = "Xenobiology Kill Room";
- dir = 4;
- network = list("ss13","rd")
- },
-/turf/open/floor/circuit/telecomms,
-/area/science/xenobiology)
-"cfs" = (
-/obj/machinery/door/airlock/maintenance/abandoned{
- name = "Air Supply Maintenance";
- req_access_txt = "12"
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cft" = (
-/obj/machinery/door/airlock/maintenance{
- name = "Testing Lab Maintenance";
- req_access_txt = "47"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cfu" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall/r_wall,
-/area/science/misc_lab)
-"cfv" = (
-/obj/machinery/door/airlock/maintenance/abandoned{
- name = "Firefighting equipment";
- req_access_txt = "12"
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cfw" = (
-/turf/closed/wall/r_wall,
-/area/maintenance/solars/port/aft)
-"cfx" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating/airless,
-/area/maintenance/solars/port/aft)
-"cfy" = (
-/obj/structure/rack,
-/obj/item/clothing/shoes/winterboots,
-/obj/item/clothing/suit/hooded/wintercoat,
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/turf/open/floor/plasteel,
-/area/science/xenobiology)
-"cfz" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cfB" = (
-/obj/structure/closet/secure_closet/engineering_personal,
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/obj/item/clothing/under/misc/overalls,
-/obj/item/clothing/under/misc/overalls,
-/obj/item/radio/headset/headset_eng,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cfD" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/door/airlock/maintenance{
- name = "Engineering Maintenance";
- req_access_txt = "10"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"cfF" = (
-/obj/machinery/suit_storage_unit/ce,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/crew_quarters/heads/chief)
-"cfG" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cfH" = (
-/obj/machinery/button/door{
- id = "ceprivacy";
- name = "Privacy Shutters Control";
- pixel_y = 26
- },
-/obj/machinery/holopad,
-/obj/machinery/light{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/crew_quarters/heads/chief)
-"cfI" = (
-/obj/structure/closet/secure_closet/engineering_personal,
-/obj/machinery/airalarm{
- dir = 8;
- pixel_x = 24
- },
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/obj/item/clothing/under/misc/overalls,
-/obj/item/clothing/under/misc/overalls,
-/obj/item/radio/headset/headset_eng,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cfJ" = (
-/obj/machinery/light/small{
- dir = 1
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/manifold4w/scrubbers,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cfK" = (
-/obj/structure/sign/warning/securearea,
-/turf/closed/wall,
-/area/engine/engineering)
-"cfL" = (
-/obj/machinery/firealarm{
- pixel_y = 24
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cfM" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/obj/machinery/door/airlock/engineering{
- name = "Engine Room";
- req_access_txt = "10"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cfN" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"cfP" = (
-/obj/machinery/atmospherics/components/trinary/mixer/airmix/inverse{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"cfQ" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 6
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"cfT" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"cfU" = (
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
- dir = 4
- },
-/obj/machinery/door/airlock/atmos{
- name = "Atmospherics";
- req_access_txt = "24"
- },
-/turf/open/floor/plating,
-/area/maintenance/disposal/incinerator)
-"cfW" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/machinery/atmospherics/pipe/simple/yellow/visible,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cfX" = (
-/obj/machinery/power/apc{
- areastring = "/area/maintenance/disposal/incinerator";
- name = "Incinerator APC";
- pixel_y = -24
- },
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/simple/yellow/visible,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cfY" = (
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/disposal/incinerator)
-"cfZ" = (
-/obj/machinery/light_switch{
- pixel_y = 26
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/space_heater,
-/turf/open/floor/plasteel,
-/area/maintenance/disposal/incinerator)
-"cga" = (
-/obj/machinery/power/smes{
- capacity = 9e+006;
- charge = 10000
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/effect/decal/cleanable/cobweb{
- icon_state = "cobweb2"
- },
-/turf/open/floor/plating,
-/area/maintenance/disposal/incinerator)
-"cgb" = (
-/obj/machinery/disposal/bin,
-/obj/structure/sign/warning/deathsposal{
- pixel_y = 32
- },
-/obj/structure/disposalpipe/trunk,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plating,
-/area/maintenance/disposal/incinerator)
-"cgc" = (
-/obj/effect/landmark/xeno_spawn,
-/turf/open/floor/plating{
- icon_state = "platingdmg3"
- },
-/area/maintenance/aft)
-"cgd" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 5
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cge" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cgf" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/grille/broken,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cgg" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cgh" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/grille,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cgi" = (
-/turf/open/floor/circuit/telecomms,
-/area/science/xenobiology)
-"cgj" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/barricade/wooden,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cgk" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/sign/warning/biohazard,
-/turf/open/floor/plating,
-/area/science/xenobiology)
-"cgl" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{
- external_pressure_bound = 120;
- name = "killroom vent"
- },
-/turf/open/floor/circuit/telecomms,
-/area/science/xenobiology)
-"cgm" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cgn" = (
-/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on,
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/turf/open/floor/plasteel,
-/area/science/xenobiology)
-"cgo" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cgp" = (
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
-/obj/structure/closet/toolcloset,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cgq" = (
-/obj/machinery/space_heater,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cgr" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/closed/wall,
-/area/maintenance/starboard/aft)
-"cgs" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cgt" = (
-/obj/structure/sign/warning/securearea{
- pixel_y = 32
- },
-/obj/effect/spawner/lootdrop/maintenance,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cgu" = (
-/obj/structure/rack,
-/obj/effect/decal/cleanable/cobweb/cobweb2,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/spawner/lootdrop/maintenance{
- lootcount = 3;
- name = "3maintenance loot spawner"
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cgv" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cgw" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
-/obj/structure/closet/radiation,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cgy" = (
-/obj/machinery/light/small{
- dir = 1
- },
-/obj/structure/chair/stool,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cgA" = (
-/obj/structure/sign/warning/vacuum/external{
- pixel_x = -32
- },
-/obj/machinery/space_heater,
-/turf/open/floor/plating,
-/area/maintenance/solars/port/aft)
-"cgB" = (
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/machinery/power/smes,
-/turf/open/floor/plating,
-/area/maintenance/solars/port/aft)
-"cgC" = (
-/obj/machinery/power/terminal{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/machinery/light/small{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/maintenance/solars/port/aft)
-"cgD" = (
-/obj/machinery/camera{
- c_tag = "Aft Port Solar Access";
- dir = 4
- },
-/obj/machinery/light/small{
- dir = 8
- },
-/obj/structure/closet/emcloset,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"cgE" = (
-/obj/structure/sign/warning/electricshock,
-/turf/closed/wall/r_wall,
-/area/maintenance/solars/port/aft)
-"cgF" = (
-/obj/effect/spawner/lootdrop/maintenance,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"cgG" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"cgI" = (
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"cgO" = (
-/obj/structure/rack,
-/obj/item/lighter,
-/obj/item/clothing/glasses/meson{
- pixel_y = 4
- },
-/obj/item/stock_parts/cell/high/plus,
-/obj/item/reagent_containers/pill/patch/silver_sulf,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/crew_quarters/heads/chief)
-"cgQ" = (
-/obj/machinery/camera{
- c_tag = "Engineering East";
- dir = 8
- },
-/obj/machinery/vending/wardrobe/engi_wardrobe,
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cgR" = (
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cgS" = (
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/preopen{
- id = "ceprivacy";
- name = "privacy shutter"
- },
-/turf/open/floor/plating,
-/area/crew_quarters/heads/chief)
-"cgT" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/obj/machinery/door/airlock/engineering{
- name = "SMES Room";
- req_access_txt = "32"
- },
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
-/area/engine/engine_smes)
-"cgU" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cgV" = (
-/obj/machinery/computer/atmos_control/tank/nitrogen_tank{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"cgW" = (
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/machinery/atmospherics/components/trinary/filter/atmos/n2{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"cgX" = (
-/obj/machinery/light,
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"cgY" = (
-/obj/machinery/atmospherics/components/binary/pump/on{
- dir = 1;
- name = "N2 Outlet Pump"
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"cgZ" = (
-/obj/machinery/computer/atmos_control/tank/oxygen_tank{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"cha" = (
-/obj/machinery/atmospherics/components/trinary/filter/atmos/o2{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"chb" = (
-/obj/machinery/atmospherics/components/binary/pump/on{
- dir = 1;
- name = "O2 Outlet Pump"
- },
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"chc" = (
-/obj/machinery/computer/atmos_control/tank/air_tank{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 9
- },
-/turf/open/floor/plasteel/white/corner,
-/area/engine/atmos)
-"chd" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 4
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/engine/atmos)
-"che" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/obj/machinery/door/airlock/external{
- name = "Atmospherics External Airlock";
- req_access_txt = "24"
- },
-/turf/open/floor/plating,
-/area/engine/atmos)
-"chf" = (
-/obj/machinery/camera{
- c_tag = "Atmospherics South East";
- dir = 1
- },
-/obj/machinery/atmospherics/components/binary/pump/on{
- dir = 1;
- name = "Air Outlet Pump"
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/white/corner,
-/area/engine/atmos)
-"chg" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/turf/open/floor/plating,
-/area/engine/atmos)
-"chh" = (
-/obj/machinery/atmospherics/components/unary/tank/toxins{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/maintenance/disposal/incinerator)
-"chi" = (
-/obj/machinery/atmospherics/pipe/manifold4w/general{
- level = 2
- },
-/obj/machinery/meter,
-/turf/open/floor/plasteel,
-/area/maintenance/disposal/incinerator)
-"chj" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 4;
- name = "plasma tank pump"
- },
-/turf/open/floor/plasteel,
-/area/maintenance/disposal/incinerator)
-"chk" = (
-/obj/machinery/atmospherics/pipe/simple/yellow/visible,
-/turf/closed/wall,
-/area/maintenance/disposal/incinerator)
-"chl" = (
-/obj/machinery/light{
- dir = 1
- },
-/obj/machinery/atmospherics/components/binary/pump{
- name = "atmospherics mix pump"
- },
-/turf/open/floor/plasteel,
-/area/maintenance/disposal/incinerator)
-"chm" = (
-/obj/machinery/power/terminal{
- dir = 1
- },
-/obj/machinery/airalarm/all_access{
- dir = 8;
- pixel_x = 24
- },
-/obj/structure/cable/yellow{
- icon_state = "0-8"
- },
-/turf/open/floor/plasteel,
-/area/maintenance/disposal/incinerator)
-"chn" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable/yellow{
- icon_state = "2-4"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10
- },
-/turf/open/floor/plasteel,
-/area/maintenance/disposal/incinerator)
-"cho" = (
-/obj/machinery/light,
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 5
- },
-/turf/open/floor/circuit/telecomms,
-/area/science/xenobiology)
-"chp" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 5
- },
-/turf/closed/wall,
-/area/maintenance/starboard/aft)
-"chq" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 4
- },
-/turf/open/floor/circuit/telecomms,
-/area/science/xenobiology)
-"chr" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/research{
- name = "Kill Chamber";
- req_access_txt = "55"
- },
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/science/xenobiology)
-"chs" = (
-/obj/machinery/light,
-/obj/machinery/atmospherics/pipe/manifold/general/visible,
-/turf/open/floor/circuit/telecomms,
-/area/science/xenobiology)
-"chu" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
-"chv" = (
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"chw" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"chx" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"chy" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/structure/disposalpipe/segment{
- dir = 5
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"chz" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"chA" = (
-/obj/structure/reagent_dispensers/watertank,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"chB" = (
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"chC" = (
-/obj/structure/rack,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/spawner/lootdrop/maintenance,
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"chD" = (
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"chE" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"chH" = (
-/obj/structure/closet/firecloset,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"chJ" = (
-/obj/machinery/power/tracker,
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/turf/open/floor/plating/asteroid/snow/ice/icemoon/solarpanel,
-/area/icemoon/surface/outdoors)
-"chN" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plating,
-/area/maintenance/solars/port/aft)
-"chO" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/obj/machinery/door/airlock/external{
- name = "Solar Maintenance";
- req_access_txt = "10; 13"
- },
-/turf/open/floor/plating,
-/area/maintenance/solars/port/aft)
-"chP" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/turf/open/floor/plating,
-/area/maintenance/solars/port/aft)
-"chQ" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/turf/open/floor/plating,
-/area/maintenance/solars/port/aft)
-"chR" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/turf/open/floor/plating,
-/area/maintenance/solars/port/aft)
-"chS" = (
-/obj/machinery/door/airlock/engineering{
- name = "Port Quarter Solar Access";
- req_access_txt = "10"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plating,
-/area/maintenance/solars/port/aft)
-"chT" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"chY" = (
-/obj/machinery/shieldgen,
-/turf/open/floor/plating,
-/area/engine/engineering)
-"cia" = (
-/obj/effect/turf_decal/bot{
- dir = 1
- },
-/obj/structure/table,
-/obj/item/stack/sheet/metal/fifty,
-/obj/item/stack/sheet/glass/fifty,
-/obj/machinery/light{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cic" = (
-/obj/effect/turf_decal/bot{
- dir = 1
- },
-/obj/machinery/portable_atmospherics/canister/oxygen,
-/obj/machinery/airalarm{
- pixel_y = 23
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cid" = (
-/obj/effect/turf_decal/bot{
- dir = 1
- },
-/obj/structure/reagent_dispensers/watertank,
-/obj/machinery/power/apc/highcap/fifteen_k{
- areastring = "/area/engine/engineering";
- dir = 1;
- name = "Engineering APC";
- pixel_y = 25
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cie" = (
-/obj/effect/turf_decal/bot{
- dir = 1
- },
-/obj/structure/table,
-/obj/item/clothing/gloves/color/yellow,
-/obj/item/clothing/gloves/color/yellow,
-/obj/item/clothing/gloves/color/yellow,
-/obj/item/clothing/gloves/color/yellow,
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/machinery/light{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cif" = (
-/obj/effect/turf_decal/bot{
- dir = 1
- },
-/obj/structure/reagent_dispensers/fueltank,
-/obj/structure/extinguisher_cabinet{
- pixel_x = -5;
- pixel_y = 30
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cig" = (
-/turf/closed/wall,
-/area/engine/engineering)
-"cij" = (
-/obj/machinery/modular_computer/console/preset/engineering,
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cik" = (
-/obj/machinery/computer/apc_control{
- dir = 4
- },
-/obj/machinery/airalarm{
- dir = 4;
- pixel_x = -22
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/crew_quarters/heads/chief)
-"cim" = (
-/turf/open/floor/plasteel,
-/area/crew_quarters/heads/chief)
-"cin" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/crew_quarters/heads/chief)
-"cio" = (
-/obj/structure/table/reinforced,
-/obj/item/folder/yellow,
-/obj/item/stamp/ce,
-/obj/structure/disposalpipe/segment,
-/obj/effect/landmark/event_spawn,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/crew_quarters/heads/chief)
-"ciq" = (
-/obj/structure/cable,
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/preopen{
- id = "ceprivacy";
- name = "privacy shutter"
- },
-/turf/open/floor/plating,
-/area/crew_quarters/heads/chief)
-"cis" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cit" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/turf/closed/wall/r_wall,
-/area/engine/atmos)
-"ciu" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/layer_manifold,
-/turf/open/floor/plating,
-/area/engine/atmos)
-"civ" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/engine/atmos)
-"cix" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/turf/closed/wall/r_wall,
-/area/engine/atmos)
-"ciy" = (
-/obj/structure/sign/warning/nosmoking{
- pixel_x = -28
- },
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 4;
- name = "input gas connector port"
- },
-/obj/machinery/portable_atmospherics/canister/oxygen,
-/turf/open/floor/plasteel,
-/area/maintenance/disposal/incinerator)
-"ciz" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/maintenance/disposal/incinerator)
-"ciA" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 4;
- name = "input port pump"
- },
-/turf/open/floor/plasteel,
-/area/maintenance/disposal/incinerator)
-"ciB" = (
-/obj/effect/decal/cleanable/cobweb,
-/obj/structure/reagent_dispensers/watertank,
-/obj/item/extinguisher,
-/turf/open/floor/plasteel,
-/area/maintenance/disposal/incinerator)
-"ciD" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- name = "output gas connector port"
- },
-/obj/machinery/portable_atmospherics/canister,
-/obj/structure/sign/warning/nosmoking{
- pixel_x = 28
- },
-/turf/open/floor/plasteel,
-/area/maintenance/disposal/incinerator)
-"ciE" = (
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/maintenance/disposal/incinerator)
-"ciF" = (
-/obj/structure/table,
-/obj/item/cartridge/medical,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"ciG" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/closet/firecloset/full,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"ciH" = (
-/obj/structure/rack,
-/obj/effect/spawner/lootdrop/maintenance{
- lootcount = 2;
- name = "2maintenance loot spawner"
- },
-/obj/item/latexballon,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"ciI" = (
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"ciJ" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating{
- icon_state = "platingdmg3"
- },
-/area/maintenance/starboard/aft)
-"ciK" = (
-/obj/structure/rack,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/spawner/lootdrop/maintenance{
- lootcount = 4;
- name = "4maintenance loot spawner"
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"ciL" = (
-/obj/effect/spawner/structure/window/reinforced/tinted,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"ciM" = (
-/obj/machinery/power/compressor{
- comp_id = "incineratorturbine";
- dir = 1;
- luminosity = 2
- },
-/obj/structure/cable/yellow,
-/obj/structure/cable/yellow{
- icon_state = "0-2"
- },
-/obj/machinery/camera{
- c_tag = "Turbine Chamber";
- dir = 4;
- network = list("turbine")
- },
-/turf/open/floor/engine/vacuum,
-/area/maintenance/disposal/incinerator)
-"ciN" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"ciQ" = (
-/obj/machinery/power/solar_control{
- dir = 4;
- id = "portsolar";
- name = "Port Quarter Solar Control"
- },
-/obj/structure/cable,
-/turf/open/floor/plating,
-/area/maintenance/solars/port/aft)
-"ciR" = (
-/obj/machinery/power/apc{
- areastring = "/area/maintenance/solars/port/aft";
- dir = 4;
- name = "Port Quarter Solar APC";
- pixel_x = 23;
- pixel_y = 2
- },
-/obj/machinery/camera{
- c_tag = "Aft Port Solar Control";
- dir = 1
- },
-/obj/structure/cable,
-/turf/open/floor/plating,
-/area/maintenance/solars/port/aft)
-"ciS" = (
-/turf/open/floor/plating,
-/area/maintenance/solars/port/aft)
-"ciT" = (
-/obj/structure/closet/emcloset,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"ciU" = (
-/obj/structure/disposalpipe/segment{
- dir = 5
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"ciW" = (
-/obj/effect/landmark/blobstart,
-/turf/open/floor/plating,
-/area/engine/engineering)
-"ciX" = (
-/obj/structure/closet/crate,
-/obj/item/stack/sheet/metal/fifty,
-/obj/item/stack/rods/fifty,
-/obj/item/stack/sheet/glass/fifty,
-/obj/item/electronics/airlock,
-/obj/item/electronics/airlock,
-/obj/item/stock_parts/cell/high/plus,
-/obj/item/stack/sheet/mineral/plasma{
- amount = 30
- },
-/obj/item/lightreplacer,
-/obj/item/lightreplacer,
-/turf/open/floor/plating,
-/area/engine/engineering)
-"ciY" = (
-/obj/machinery/door/poddoor{
- id = "Secure Storage";
- name = "secure storage"
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"ciZ" = (
-/turf/open/floor/plating,
-/area/engine/engineering)
-"cja" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cjb" = (
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel{
- name = "floor"
- },
-/area/engine/engineering)
-"cjc" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cjd" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cje" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cjf" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/structure/chair/office/dark{
- dir = 1
- },
-/obj/effect/landmark/start/station_engineer,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cjg" = (
-/obj/machinery/computer/card/minor/ce{
- dir = 4
- },
-/obj/machinery/requests_console{
- announcementConsole = 1;
- department = "Chief Engineer's Desk";
- departmentType = 3;
- name = "Chief Engineer RC";
- pixel_x = -32
- },
-/obj/machinery/camera{
- c_tag = "Chief Engineer's Office";
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/crew_quarters/heads/chief)
-"cji" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment{
- dir = 5
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cjj" = (
-/obj/machinery/light{
- dir = 4
- },
-/obj/item/radio/intercom{
- dir = 4;
- name = "Station Intercom (General)";
- pixel_x = 27
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/crew_quarters/heads/chief)
-"cjk" = (
-/obj/structure/sign/warning/securearea,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
-"cjl" = (
-/obj/machinery/camera{
- c_tag = "Engineering MiniSat Access";
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cjm" = (
-/obj/machinery/door/airlock/command{
- name = "MiniSat Access";
- req_access_txt = "65"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cjn" = (
-/obj/structure/chair/wood/normal{
- dir = 4
- },
-/obj/effect/landmark/blobstart,
-/turf/open/floor/wood,
-/area/maintenance/bar)
-"cjo" = (
-/obj/structure/closet/toolcloset,
-/turf/open/floor/plasteel,
-/area/construction)
-"cjp" = (
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/maintenance/disposal/incinerator)
-"cjq" = (
-/obj/machinery/atmospherics/components/binary/valve{
- name = "Mix to Space"
- },
-/turf/open/floor/plasteel,
-/area/maintenance/disposal/incinerator)
-"cjr" = (
-/turf/open/floor/plasteel,
-/area/maintenance/disposal/incinerator)
-"cjs" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/maintenance/disposal/incinerator)
-"cjt" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/maintenance/disposal/incinerator)
-"cju" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 1;
- name = "Incinerator to Output"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/maintenance/disposal/incinerator)
-"cjv" = (
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment{
- dir = 5
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/maintenance/disposal/incinerator)
-"cjw" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/closed/wall,
-/area/maintenance/aft)
-"cjx" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
- },
-/turf/closed/wall,
-/area/maintenance/disposal/incinerator)
-"cjy" = (
-/obj/structure/disposalpipe/segment,
-/obj/item/shard,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cjz" = (
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
-/turf/closed/wall,
-/area/maintenance/aft)
-"cjA" = (
-/obj/structure/disposalpipe/segment,
-/obj/item/cigbutt/roach,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cjB" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 9
- },
-/obj/structure/table,
-/obj/item/folder/white,
-/obj/item/pen,
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/turf/open/floor/plasteel,
-/area/science/xenobiology)
-"cjC" = (
-/obj/structure/grille,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cjD" = (
-/turf/closed/wall/r_wall,
-/area/maintenance/solars/starboard/aft)
-"cjE" = (
-/obj/structure/rack,
-/obj/effect/decal/cleanable/cobweb/cobweb2,
-/obj/effect/spawner/lootdrop/maintenance,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cjF" = (
-/obj/machinery/door/airlock/engineering{
- name = "Starboard Quarter Solar Access";
- req_access_txt = "10"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/maintenance/solars/starboard/aft)
-"cjG" = (
-/obj/structure/sign/warning/electricshock,
-/turf/closed/wall/r_wall,
-/area/maintenance/solars/starboard/aft)
-"cjH" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors)
-"cjI" = (
-/obj/structure/closet/crate,
-/obj/effect/spawner/lootdrop/maintenance{
- lootcount = 2;
- name = "2maintenance loot spawner"
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"cjJ" = (
-/turf/closed/wall/r_wall,
-/area/engine/engine_smes)
-"cjK" = (
-/obj/effect/spawner/lootdrop/maintenance,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"cjL" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/construction)
-"cjM" = (
-/obj/machinery/portable_atmospherics/canister/toxins,
-/obj/machinery/light/small{
- dir = 8
- },
-/obj/machinery/camera{
- c_tag = "Engineering Secure Storage";
- dir = 4
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"cjN" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cjO" = (
-/obj/machinery/light,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cjP" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cjQ" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cjR" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/obj/machinery/door/airlock/external{
- name = "Engineering External Access";
- req_access_txt = "10;13"
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cjS" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/closet/wardrobe/engineering_yellow,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cjT" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cjU" = (
-/obj/machinery/computer/station_alert{
- dir = 4
- },
-/obj/machinery/computer/security/telescreen/ce{
- dir = 4;
- pixel_x = -24
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/crew_quarters/heads/chief)
-"cjV" = (
-/obj/structure/closet/emcloset,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cjW" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
-/area/science/misc_lab)
-"cjX" = (
-/obj/machinery/light_switch{
- pixel_x = 27
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/crew_quarters/heads/chief)
-"cjY" = (
-/obj/structure/table/reinforced,
-/obj/item/cartridge/engineering{
- pixel_x = 4;
- pixel_y = 5
- },
-/obj/item/cartridge/engineering{
- pixel_x = -3;
- pixel_y = 2
- },
-/obj/item/cartridge/engineering{
- pixel_x = 3
- },
-/obj/item/cartridge/atmos,
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/heads/chief)
-"cka" = (
-/obj/machinery/door/poddoor/preopen{
- id = "testlab";
- name = "test chamber blast door"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/obj/machinery/door/airlock/research/glass{
- name = "Test Chamber";
- req_access_txt = "47"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/science/misc_lab)
-"ckb" = (
-/obj/machinery/atmospherics/pipe/simple,
-/obj/structure/grille,
-/obj/machinery/meter,
-/turf/closed/wall/r_wall,
-/area/engine/atmos)
-"ckc" = (
-/obj/machinery/atmospherics/pipe/simple,
-/obj/structure/grille,
-/obj/machinery/meter{
- name = "Mixed Air Tank In"
- },
-/turf/closed/wall/r_wall,
-/area/engine/atmos)
-"ckd" = (
-/obj/machinery/atmospherics/pipe/simple,
-/obj/structure/grille,
-/obj/machinery/meter{
- name = "Mixed Air Tank Out"
- },
-/turf/closed/wall/r_wall,
-/area/engine/atmos)
-"cke" = (
-/obj/structure/chair/stool,
-/turf/open/floor/plasteel,
-/area/maintenance/disposal/incinerator)
-"ckf" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/maintenance/disposal/incinerator)
-"ckg" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 8
- },
-/obj/machinery/meter,
-/turf/open/floor/plasteel,
-/area/maintenance/disposal/incinerator)
-"ckh" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 8;
- name = "Mix to MiniSat"
- },
-/turf/open/floor/plasteel,
-/area/maintenance/disposal/incinerator)
-"cki" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/maintenance/disposal/incinerator)
-"ckj" = (
-/obj/item/cigbutt,
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 10
- },
-/turf/open/floor/plasteel,
-/area/maintenance/disposal/incinerator)
-"ckk" = (
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/components/binary/valve{
- dir = 4;
- name = "Incinerator to Space"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/maintenance/disposal/incinerator)
-"ckl" = (
-/obj/machinery/portable_atmospherics/canister,
-/obj/effect/decal/cleanable/cobweb,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"ckm" = (
-/obj/machinery/door/airlock/maintenance/abandoned{
- name = "Biohazard Disposals";
- req_access_txt = "12"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cko" = (
-/obj/structure/disposalpipe/segment,
-/turf/closed/wall,
-/area/maintenance/starboard/aft)
-"ckp" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/spawner/structure/window,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"ckr" = (
-/obj/structure/reagent_dispensers/fueltank,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cks" = (
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plating,
-/area/maintenance/solars/starboard/aft)
-"ckt" = (
-/obj/machinery/power/apc{
- areastring = "/area/maintenance/solars/starboard/aft";
- dir = 8;
- name = "Starboard Quarter Solar APC";
- pixel_x = -26;
- pixel_y = 3
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/turf/open/floor/plating,
-/area/maintenance/solars/starboard/aft)
-"cku" = (
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/machinery/power/smes,
-/turf/open/floor/plating,
-/area/maintenance/solars/starboard/aft)
-"ckv" = (
-/obj/machinery/light/small{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"ckw" = (
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engine_smes)
-"ckx" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/light{
- dir = 1
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engine_smes)
-"cky" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engine_smes)
-"ckz" = (
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engine_smes)
-"ckA" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"ckB" = (
-/obj/machinery/field/generator,
-/turf/open/floor/plating,
-/area/engine/engineering)
-"ckC" = (
-/obj/machinery/power/emitter,
-/turf/open/floor/plating,
-/area/engine/engineering)
-"ckD" = (
-/obj/effect/turf_decal/bot{
- dir = 1
- },
-/obj/structure/table,
-/obj/item/stack/cable_coil,
-/obj/item/stack/cable_coil,
-/obj/item/storage/box/lights/mixed,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"ckF" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"ckG" = (
-/obj/effect/turf_decal/bot{
- dir = 1
- },
-/obj/structure/closet/crate/solarpanel_small,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"ckH" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"ckI" = (
-/obj/machinery/suit_storage_unit/engine,
-/obj/effect/turf_decal/bot{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"ckK" = (
-/obj/structure/tank_dispenser,
-/obj/effect/turf_decal/bot{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"ckL" = (
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/crew_quarters/heads/chief)
-"ckM" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/science/misc_lab)
-"ckN" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/obj/machinery/door/airlock/research/glass{
- name = "Test Chamber";
- req_access_txt = "47"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
-/area/science/misc_lab)
-"ckO" = (
-/obj/machinery/door/airlock/command/glass{
- name = "Chief Engineer";
- req_access_txt = "56"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/heads/chief)
-"ckQ" = (
-/obj/structure/closet/cardboard,
-/turf/open/floor/plasteel,
-/area/quartermaster/warehouse)
-"ckS" = (
-/obj/structure/closet/cardboard,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"ckT" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"ckU" = (
-/obj/machinery/air_sensor/atmos/nitrogen_tank,
-/turf/open/floor/engine/n2,
-/area/engine/atmos)
-"ckV" = (
-/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/nitrogen_input{
- dir = 1
- },
-/turf/open/floor/engine/n2,
-/area/engine/atmos)
-"ckW" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/nitrogen_output{
- dir = 1
- },
-/turf/open/floor/engine/n2,
-/area/engine/atmos)
-"ckX" = (
-/obj/machinery/air_sensor/atmos/oxygen_tank,
-/turf/open/floor/engine/o2,
-/area/engine/atmos)
-"ckY" = (
-/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/oxygen_input{
- dir = 1
- },
-/turf/open/floor/engine/o2,
-/area/engine/atmos)
-"ckZ" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/oxygen_output{
- dir = 1
- },
-/turf/open/floor/engine/o2,
-/area/engine/atmos)
-"cla" = (
-/obj/machinery/air_sensor/atmos/air_tank,
-/turf/open/floor/engine/air,
-/area/engine/atmos)
-"clb" = (
-/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/air_input{
- dir = 1
- },
-/turf/open/floor/engine/air,
-/area/engine/atmos)
-"clc" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/high_volume/siphon/atmos/air_output{
- dir = 1
- },
-/turf/open/floor/engine/air,
-/area/engine/atmos)
-"cld" = (
-/obj/effect/landmark/blobstart,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 4;
- name = "Mix to Incinerator"
- },
-/turf/open/floor/plasteel,
-/area/maintenance/disposal/incinerator)
-"cle" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible,
-/turf/open/floor/plasteel,
-/area/maintenance/disposal/incinerator)
-"clf" = (
-/obj/machinery/light{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/general/visible,
-/turf/open/floor/plasteel,
-/area/maintenance/disposal/incinerator)
-"clg" = (
-/obj/item/radio/intercom{
- name = "Station Intercom (General)";
- pixel_y = -29
- },
-/obj/structure/table,
-/obj/item/paper_bin{
- pixel_x = -3;
- pixel_y = 7
- },
-/obj/item/pen,
-/turf/open/floor/plating,
-/area/maintenance/disposal/incinerator)
-"clh" = (
-/obj/machinery/light/small,
-/obj/structure/extinguisher_cabinet{
- pixel_y = -31
- },
-/obj/machinery/computer/turbine_computer{
- dir = 1;
- id = "incineratorturbine"
- },
-/turf/open/floor/plasteel,
-/area/maintenance/disposal/incinerator)
-"cli" = (
-/obj/machinery/button/door/incinerator_vent_atmos_aux{
- pixel_x = 6;
- pixel_y = -24
- },
-/obj/machinery/button/door/incinerator_vent_atmos_main{
- pixel_x = -6;
- pixel_y = -24
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/general/visible,
-/turf/open/floor/plasteel,
-/area/maintenance/disposal/incinerator)
-"clj" = (
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/maintenance/disposal/incinerator)
-"clk" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cll" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"clm" = (
-/obj/machinery/meter,
-/obj/machinery/atmospherics/pipe/manifold/general/hidden{
- dir = 1
- },
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cln" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"clo" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 1
- },
-/obj/machinery/meter,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"clp" = (
-/obj/machinery/door/airlock/external{
- name = "Solar Maintenance";
- req_access_txt = "10; 13"
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"clq" = (
-/obj/structure/rack,
-/obj/structure/disposalpipe/segment,
-/obj/effect/spawner/lootdrop/maintenance{
- lootcount = 2;
- name = "2maintenance loot spawner"
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"clr" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 5
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cls" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/rack,
-/obj/effect/spawner/lootdrop/maintenance{
- lootcount = 3;
- name = "3maintenance loot spawner"
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"clt" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"clu" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"clv" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating{
- icon_state = "platingdmg3"
- },
-/area/maintenance/starboard/aft)
-"clw" = (
-/obj/structure/table,
-/obj/machinery/cell_charger,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"clx" = (
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/turf/open/floor/plating,
-/area/maintenance/solars/starboard/aft)
-"cly" = (
-/obj/structure/chair/stool,
-/obj/machinery/camera{
- c_tag = "Aft Starboard Solar Control";
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/solars/starboard/aft)
-"clz" = (
-/obj/machinery/power/terminal{
- dir = 1
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/machinery/light/small{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/solars/starboard/aft)
-"clA" = (
-/obj/structure/sign/warning/vacuum/external{
- pixel_y = 32
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"clB" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/entry)
-"clC" = (
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engine_smes)
-"clD" = (
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engine_smes)
-"clE" = (
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/machinery/power/smes/engineering,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engine_smes)
-"clF" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engine_smes)
-"clG" = (
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/machinery/power/smes/engineering,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engine_smes)
-"clJ" = (
-/obj/effect/spawner/structure/window,
-/turf/open/floor/plating,
-/area/engine/engineering)
-"clM" = (
-/obj/structure/table,
-/obj/item/storage/box/lights/mixed,
-/obj/item/clothing/glasses/meson,
-/obj/item/clothing/glasses/meson,
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"clN" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"clO" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/closet/wardrobe/grey,
-/obj/machinery/camera{
- c_tag = "Dorms East - Holodeck";
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
-"clQ" = (
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"clR" = (
-/obj/machinery/light{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"clT" = (
-/obj/machinery/portable_atmospherics/canister/nitrogen,
-/obj/machinery/atmospherics/miner/nitrogen,
-/turf/open/floor/engine/n2,
-/area/engine/atmos)
-"clU" = (
-/turf/open/floor/engine/n2,
-/area/engine/atmos)
-"clV" = (
-/obj/machinery/portable_atmospherics/canister/oxygen,
-/obj/machinery/atmospherics/miner/oxygen,
-/turf/open/floor/engine/o2,
-/area/engine/atmos)
-"clW" = (
-/turf/open/floor/engine/o2,
-/area/engine/atmos)
-"clY" = (
-/obj/effect/landmark/xeno_spawn,
-/turf/open/floor/engine/air,
-/area/engine/atmos)
-"clZ" = (
-/turf/open/floor/engine/air,
-/area/engine/atmos)
-"cmb" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/maintenance/disposal/incinerator)
-"cmd" = (
-/turf/closed/wall/r_wall,
-/area/maintenance/disposal/incinerator)
-"cme" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible,
-/turf/closed/wall/r_wall,
-/area/maintenance/disposal/incinerator)
-"cmf" = (
-/obj/effect/mapping_helpers/airlock/locked,
-/obj/machinery/door/airlock/public/glass/incinerator/atmos_interior,
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
- },
-/obj/machinery/embedded_controller/radio/airlock_controller/incinerator_atmos{
- pixel_x = 38;
- pixel_y = 6
- },
-/turf/open/floor/engine,
-/area/maintenance/disposal/incinerator)
-"cmg" = (
-/obj/machinery/atmospherics/pipe/simple/general/hidden{
- dir = 9
- },
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cmh" = (
-/obj/structure/disposalpipe/junction/yjunction{
- dir = 2
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cmi" = (
-/obj/structure/disposalpipe/segment{
- dir = 5
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cmj" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cmk" = (
-/obj/structure/chair/stool{
- pixel_y = 8
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cmo" = (
-/obj/structure/rack,
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cmq" = (
-/obj/effect/landmark/xeno_spawn,
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plating{
- icon_state = "platingdmg3"
- },
-/area/maintenance/starboard/aft)
-"cmr" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 5
- },
-/turf/closed/wall,
-/area/maintenance/starboard/aft)
-"cmt" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cmu" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
- },
-/turf/closed/wall,
-/area/maintenance/starboard/aft)
-"cmv" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/turf/open/floor/plating,
-/area/maintenance/solars/starboard/aft)
-"cmw" = (
-/obj/machinery/power/solar_control{
- dir = 1;
- id = "starboardsolar";
- name = "Starboard Quarter Solar Control"
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/turf/open/floor/plating,
-/area/maintenance/solars/starboard/aft)
-"cmx" = (
-/obj/structure/sign/warning/vacuum/external{
- pixel_y = -32
- },
-/obj/machinery/space_heater,
-/turf/open/floor/plating,
-/area/maintenance/solars/starboard/aft)
-"cmy" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engine_smes)
-"cmz" = (
-/obj/structure/cable/yellow{
- icon_state = "2-4"
- },
-/obj/structure/cable/yellow{
- icon_state = "2-8"
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engine_smes)
-"cmA" = (
-/obj/machinery/power/terminal{
- dir = 1
- },
-/obj/structure/cable/yellow{
- icon_state = "0-4"
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engine_smes)
-"cmB" = (
-/obj/machinery/power/terminal{
- dir = 1
- },
-/obj/structure/cable/yellow{
- icon_state = "0-8"
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engine_smes)
-"cmC" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
-"cmD" = (
-/obj/machinery/navbeacon{
- codes_txt = "delivery;dir=2";
- freq = 1400;
- location = "Engineering"
- },
-/obj/structure/plasticflaps/opaque,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cmF" = (
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cmG" = (
-/obj/machinery/firealarm{
- dir = 4;
- pixel_x = -24
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cmL" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cmN" = (
-/obj/structure/sign/warning/nosmoking{
- pixel_y = 32
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cmU" = (
-/obj/machinery/light/small,
-/turf/open/floor/engine/n2,
-/area/engine/atmos)
-"cmV" = (
-/obj/machinery/light/small,
-/turf/open/floor/engine/o2,
-/area/engine/atmos)
-"cmW" = (
-/obj/machinery/light/small,
-/turf/open/floor/engine/air,
-/area/engine/atmos)
-"cmX" = (
-/obj/machinery/light_switch{
- pixel_x = 27
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/construction)
-"cmY" = (
-/obj/machinery/atmospherics/components/binary/pump/on,
-/obj/machinery/light/small{
- dir = 8
- },
-/obj/structure/sign/warning/fire{
- pixel_x = -32
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/machinery/airlock_sensor/incinerator_atmos{
- pixel_x = 8;
- pixel_y = 24
- },
-/turf/open/floor/engine,
-/area/maintenance/disposal/incinerator)
-"cmZ" = (
-/obj/machinery/atmospherics/components/binary/pump/on{
- dir = 1
- },
-/obj/structure/sign/warning/fire{
- pixel_x = 32
- },
-/obj/machinery/light/small{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/maintenance/disposal/incinerator)
-"cna" = (
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_atmos{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/maintenance/disposal/incinerator)
-"cnb" = (
-/obj/structure/disposalpipe/segment{
- dir = 5
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cnc" = (
-/obj/machinery/light/small,
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cnd" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cne" = (
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cnf" = (
-/obj/structure/table,
-/obj/effect/spawner/lootdrop/maintenance{
- lootcount = 2;
- name = "2maintenance loot spawner"
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cng" = (
-/obj/machinery/light/small,
-/obj/structure/table,
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/obj/effect/spawner/lootdrop/maintenance,
-/obj/item/clipboard,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cnj" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/maintenance/solars/starboard/aft)
-"cnk" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/obj/machinery/door/airlock/external{
- name = "Solar Maintenance";
- req_access_txt = "10; 13"
- },
-/turf/open/floor/plating,
-/area/maintenance/solars/starboard/aft)
-"cnl" = (
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors)
-"cnm" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engine_smes)
-"cnn" = (
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engine_smes)
-"cnp" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/camera{
- c_tag = "SMES Room";
- dir = 8
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/turf/open/floor/plasteel/dark,
-/area/engine/engine_smes)
-"cnr" = (
-/obj/machinery/door/window/southleft{
- name = "Engineering Delivery";
- req_access_txt = "10"
- },
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cnt" = (
-/obj/machinery/camera{
- c_tag = "Engineering West";
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/effect/landmark/start/station_engineer,
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cnv" = (
-/obj/machinery/holopad,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cny" = (
-/obj/effect/landmark/start/station_engineer,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cnA" = (
-/obj/effect/turf_decal/bot{
- dir = 1
- },
-/obj/structure/table,
-/obj/item/electronics/airlock,
-/obj/item/electronics/airlock,
-/obj/item/electronics/apc,
-/obj/item/electronics/apc,
-/obj/item/stock_parts/cell/high/plus,
-/obj/item/stock_parts/cell/high/plus,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/item/twohanded/rcl/pre_loaded,
-/obj/item/twohanded/rcl/pre_loaded,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cnB" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/closed/wall,
-/area/construction)
-"cnC" = (
-/obj/effect/mapping_helpers/airlock/locked,
-/obj/machinery/door/airlock/public/glass/incinerator/atmos_exterior,
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/maintenance/disposal/incinerator)
-"cnD" = (
-/obj/structure/disposalpipe/segment{
- dir = 5
- },
-/turf/closed/wall,
-/area/maintenance/aft)
-"cnE" = (
-/obj/structure/disposalpipe/junction/flip{
- dir = 4
- },
-/obj/machinery/space_heater,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cnF" = (
-/obj/machinery/atmospherics/components/binary/pump/on{
- name = "Waste Out"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cnG" = (
-/obj/structure/closet/emcloset,
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cnH" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cnJ" = (
-/obj/effect/spawner/lootdrop/maintenance,
-/obj/structure/disposalpipe/segment{
- dir = 5
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cnK" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/maintenance/solars/starboard/aft)
-"cnL" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/dark,
-/area/engine/engine_smes)
-"cnM" = (
-/obj/machinery/door/window{
- name = "SMES Chamber";
- req_access_txt = "32"
- },
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/structure/cable/yellow{
- icon_state = "1-4"
- },
-/obj/structure/cable/yellow{
- icon_state = "1-8"
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engine_smes)
-"cnN" = (
-/obj/structure/window/reinforced,
-/obj/structure/cable/yellow{
- icon_state = "0-4"
- },
-/obj/machinery/power/terminal{
- dir = 1
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engine_smes)
-"cnO" = (
-/obj/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 8
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engine_smes)
-"cnP" = (
-/obj/machinery/power/terminal{
- dir = 1
- },
-/obj/structure/window/reinforced,
-/obj/structure/cable/yellow{
- icon_state = "0-8"
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engine_smes)
-"cnQ" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/light{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/engine/engine_smes)
-"cnR" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/closed/wall/r_wall,
-/area/engine/engine_smes)
-"cnS" = (
-/obj/machinery/door/firedoor,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/camera{
- c_tag = "SMES Access";
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/engine_smes)
-"cnU" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/sign/warning/electricshock{
- pixel_x = -32
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/loading_area,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cnX" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/extinguisher_cabinet{
- pixel_x = -5;
- pixel_y = 30
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cnY" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/sign/warning/nosmoking{
- pixel_y = 32
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cnZ" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/airalarm{
- pixel_y = 23
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"coa" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/door/firedoor,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cob" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"coh" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 5
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
-"con" = (
-/turf/open/pool,
-/area/crew_quarters/fitness/pool)
-"cop" = (
-/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/incinerator_input{
- dir = 1
- },
-/turf/open/floor/engine/vacuum,
-/area/maintenance/disposal/incinerator)
-"coq" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/incinerator_output{
- dir = 1
- },
-/obj/structure/sign/warning/vacuum/external{
- pixel_y = -32
- },
-/turf/open/floor/engine/vacuum,
-/area/maintenance/disposal/incinerator)
-"cor" = (
-/obj/machinery/igniter{
- id = "Incinerator"
- },
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/machinery/air_sensor{
- pixel_x = -32;
- pixel_y = -32
- },
-/turf/open/floor/engine/vacuum,
-/area/maintenance/disposal/incinerator)
-"cos" = (
-/obj/machinery/door/poddoor/incinerator_atmos_aux,
-/turf/open/floor/engine/vacuum,
-/area/maintenance/disposal/incinerator)
-"cot" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cou" = (
-/obj/machinery/space_heater,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cov" = (
-/obj/machinery/power/port_gen/pacman,
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 8
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/turf/open/floor/plasteel,
-/area/engine/engine_smes)
-"cow" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/cable/yellow{
- icon_state = "1-4"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/engine/engine_smes)
-"cox" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/engine/engine_smes)
-"coy" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/engine/engine_smes)
-"coz" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/engine/engine_smes)
-"coA" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/engine/engine_smes)
-"coB" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/obj/machinery/door/airlock/engineering{
- name = "SMES Room";
- req_access_txt = "32"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
-/area/engine/engine_smes)
-"coC" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/engine_smes)
-"coH" = (
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"coI" = (
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plasteel,
-/area/hydroponics)
-"coJ" = (
-/obj/machinery/door/firedoor,
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"coL" = (
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"coT" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible,
-/obj/machinery/meter,
-/turf/open/floor/engine,
-/area/science/misc_lab)
-"coZ" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
- },
-/obj/structure/closet/secure_closet/engineering_electrical,
-/obj/item/storage/toolbox/artistic{
- icon_state = "yellow";
- item_state = "toolbox_yellow";
- name = "Cable Toolbox";
- pixel_y = 6
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cpa" = (
-/obj/machinery/light{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/obj/structure/closet/secure_closet/engineering_welding,
-/obj/item/clothing/glasses/welding,
-/obj/item/clothing/glasses/welding,
-/obj/item/clothing/glasses/welding,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cpb" = (
-/obj/structure/closet/emcloset,
-/obj/machinery/light/small{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"cpj" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/machinery/firealarm{
- dir = 4;
- pixel_x = -24
- },
-/obj/structure/chair/office/light,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
-/turf/open/floor/plasteel,
-/area/engine/engine_smes)
-"cpk" = (
-/obj/effect/turf_decal/stripes/corner,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/engine_smes)
-"cpl" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/engine/engine_smes)
-"cpm" = (
-/obj/machinery/airalarm{
- dir = 1;
- pixel_y = -22
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
- },
-/turf/open/floor/plasteel,
-/area/engine/engine_smes)
-"cpn" = (
-/obj/machinery/light,
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6
- },
-/turf/open/floor/plasteel,
-/area/engine/engine_smes)
-"cpo" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/engine/engine_smes)
-"cpp" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
- },
-/obj/machinery/airalarm{
- dir = 1;
- pixel_y = -22
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/engine_smes)
-"cpq" = (
-/obj/structure/sign/warning/electricshock{
- pixel_x = -32
- },
-/obj/machinery/computer/rdconsole/production{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cps" = (
-/obj/structure/table,
-/obj/machinery/cell_charger,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cpC" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/plasteel,
-/area/bridge)
-"cpE" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 5
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cpF" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/structure/sign/poster/official/space_cops{
- pixel_x = -32
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/fore)
-"cpG" = (
-/obj/structure/table/optable,
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"cpI" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/obj/machinery/door/airlock/external{
- name = "Escape Pod Four"
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"cpN" = (
-/obj/machinery/power/turbine{
- luminosity = 2
- },
-/obj/structure/cable/yellow,
-/turf/open/floor/engine/vacuum,
-/area/maintenance/disposal/incinerator)
-"cpO" = (
-/obj/machinery/atmospherics/components/binary/pump/on{
- name = "Incinerator Output Pump"
- },
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/maintenance/disposal/incinerator)
-"cpQ" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/maintenance/disposal/incinerator)
-"cpR" = (
-/obj/machinery/door/airlock/abandoned{
- name = "Observatory Access"
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"cpS" = (
-/obj/structure/cable,
-/obj/machinery/power/apc{
- areastring = "/area/engine/engine_smes";
- name = "SMES room APC";
- pixel_y = -24
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/obj/structure/table,
-/obj/item/stock_parts/cell/high/plus,
-/turf/open/floor/plasteel,
-/area/engine/engine_smes)
-"cpT" = (
-/obj/item/radio/intercom{
- name = "Station Intercom (General)";
- pixel_y = -35
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/obj/structure/closet/secure_closet/engineering_electrical,
-/turf/open/floor/plasteel,
-/area/engine/engine_smes)
-"cpU" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/engine/engine_smes)
-"cpV" = (
-/obj/machinery/camera{
- c_tag = "Engineering Storage";
- dir = 4
- },
-/obj/machinery/rnd/production/protolathe/department/engineering,
-/obj/structure/sign/poster/contraband/power{
- desc = "Lord Singuloth must feed. Annoyingly, it's really easy for people to sabotage containment and let Lord Singuloth eat the entire station.. For this reason, Nanotrasen prefers Supermatter reactors.";
- pixel_x = -32;
- poster_item_desc = "This poster depicts Lord Singuloth. Nanotrasen doesn't approve. Nanotrasen wants Supermatter over Singularities, as they are usually much safer."
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cpW" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cpX" = (
-/obj/structure/table,
-/obj/item/stack/sheet/glass/fifty,
-/obj/item/stack/sheet/glass/fifty,
-/obj/item/stack/sheet/glass/fifty,
-/obj/item/stack/rods/fifty,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cpY" = (
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"cqn" = (
-/obj/structure/grille,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"cqo" = (
-/obj/structure/sign/warning/pods{
- pixel_x = 32
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cqp" = (
-/obj/machinery/camera{
- c_tag = "Engineering Escape Pod";
- dir = 4
- },
-/obj/machinery/space_heater,
-/turf/open/floor/plating,
-/area/engine/engineering)
-"cqr" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/corner{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/entry)
-"cqs" = (
-/obj/structure/sign/warning/fire,
-/turf/closed/wall/r_wall,
-/area/maintenance/disposal/incinerator)
-"cqt" = (
-/obj/machinery/door/poddoor/incinerator_atmos_main,
-/turf/open/floor/engine/vacuum,
-/area/maintenance/disposal/incinerator)
-"cqv" = (
-/obj/effect/decal/cleanable/cobweb/cobweb2,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"cqw" = (
-/obj/machinery/light{
- dir = 8
- },
-/obj/machinery/rnd/production/circuit_imprinter,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cqx" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cqy" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"cqz" = (
-/obj/machinery/light{
- dir = 4
- },
-/obj/machinery/disposal/bin,
-/obj/structure/disposalpipe/trunk{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cqK" = (
-/obj/structure/table,
-/obj/effect/spawner/lootdrop/maintenance{
- lootcount = 2;
- name = "2maintenance loot spawner"
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"cqL" = (
-/obj/machinery/light/small{
- dir = 4
- },
-/obj/machinery/space_heater,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"cqM" = (
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
-"cqN" = (
-/obj/structure/table,
-/obj/item/stack/sheet/metal/fifty,
-/obj/item/stack/sheet/metal/fifty,
-/obj/item/stack/sheet/plasteel{
- amount = 10
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cqO" = (
-/obj/structure/table,
-/obj/item/stack/cable_coil{
- pixel_x = 3;
- pixel_y = -7
- },
-/obj/item/stack/cable_coil,
-/obj/item/electronics/airlock,
-/obj/item/electronics/airlock,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cqP" = (
-/obj/structure/table,
-/obj/item/folder/yellow,
-/obj/item/clothing/ears/earmuffs{
- pixel_x = -3;
- pixel_y = -2
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cqQ" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/dark,
-/area/security/courtroom)
-"cqR" = (
-/obj/structure/reagent_dispensers/fueltank,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cqY" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/engine/engineering)
-"crh" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"cri" = (
-/obj/machinery/door/airlock/external{
- name = "External Access";
- req_access_txt = "13"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"crk" = (
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors)
-"crl" = (
-/obj/structure/table,
-/obj/item/taperecorder,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"crm" = (
-/obj/structure/table,
-/obj/item/storage/box/matches,
-/obj/item/storage/fancy/cigarettes,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"crn" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 8
- },
-/turf/closed/wall/r_wall,
-/area/engine/gravity_generator)
-"cro" = (
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/engine/engineering)
-"crp" = (
-/obj/structure/sign/warning/electricshock,
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
-"crq" = (
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/engine/engineering)
-"crr" = (
-/obj/structure/cable,
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/engine/engineering)
-"crw" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 5
- },
-/obj/machinery/space_heater,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cry" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/corner,
-/turf/open/floor/plasteel,
-/area/hallway/secondary/entry)
-"crz" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plasteel,
-/area/hallway/secondary/entry)
-"crA" = (
-/obj/structure/transit_tube_pod,
-/obj/structure/transit_tube/station/reverse/flipped{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"crB" = (
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors)
-"crC" = (
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors)
-"crE" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors)
-"crG" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors)
-"crP" = (
-/obj/machinery/light,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"crR" = (
-/obj/structure/transit_tube,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"crW" = (
-/obj/machinery/light/small{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"crX" = (
-/obj/structure/sign/warning/vacuum/external{
- pixel_x = 32
- },
-/obj/structure/closet/emcloset/anchored,
-/turf/open/floor/plating,
-/area/engine/engineering)
-"crY" = (
-/obj/structure/window/reinforced/fulltile,
-/obj/structure/transit_tube,
-/turf/open/floor/plating,
-/area/engine/engineering)
-"csc" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/turf/open/floor/plating/asteroid/snow/icemoon,
-/area/maintenance/aft)
-"csg" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
- },
-/obj/machinery/door/airlock/external{
- name = "Engineering External Access";
- req_access_txt = "10;13"
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"csm" = (
-/obj/machinery/atmospherics/components/unary/outlet_injector/on{
- dir = 1
- },
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/maintenance/aft)
-"csq" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 4
- },
-/obj/machinery/computer/security/telescreen/turbine{
- dir = 1;
- pixel_y = -30
- },
-/turf/open/floor/plasteel,
-/area/maintenance/disposal/incinerator)
-"csr" = (
-/obj/machinery/button/ignition{
- id = "Incinerator";
- pixel_x = -6;
- pixel_y = -24
- },
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 4
- },
-/obj/machinery/meter,
-/turf/open/floor/plasteel,
-/area/maintenance/disposal/incinerator)
-"csy" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/rack,
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"csD" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat_interior)
-"csN" = (
-/obj/structure/transit_tube/horizontal,
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat_interior)
-"csO" = (
-/obj/structure/window/reinforced/fulltile,
-/obj/structure/transit_tube/horizontal,
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat_interior)
-"csT" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/landmark/xmastree,
-/turf/open/floor/plasteel/dark,
-/area/chapel/main)
-"csU" = (
-/obj/structure/transit_tube/station/reverse,
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat_interior)
-"csV" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat_interior)
-"csW" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat_interior)
-"csX" = (
-/obj/structure/sign/warning/vacuum/external{
- pixel_y = 32
- },
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat_interior)
-"csZ" = (
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors)
-"cta" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/obj/machinery/door/airlock/external{
- name = "MiniSat External Access";
- req_access_txt = "65;13"
- },
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat_interior)
-"ctb" = (
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat_interior)
-"ctc" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat_interior)
-"ctg" = (
-/obj/structure/closet/emcloset,
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat_interior)
-"cth" = (
-/obj/item/radio/intercom{
- name = "Station Intercom (General)";
- pixel_y = -29
- },
-/obj/machinery/light/small,
-/obj/machinery/space_heater,
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat_interior)
-"cti" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/sign/warning/securearea{
- pixel_y = -32
- },
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat_interior)
-"ctj" = (
-/obj/machinery/camera{
- c_tag = "MiniSat Pod Access";
- dir = 1;
- network = list("minisat");
- start_active = 1
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/obj/machinery/light/small,
-/obj/machinery/space_heater,
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat_interior)
-"ctk" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 8
- },
-/turf/closed/wall,
-/area/ai_monitored/turret_protected/aisat_interior)
-"cto" = (
-/obj/machinery/door/airlock/hatch{
- name = "MiniSat Foyer";
- req_one_access_txt = "65"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat_interior)
-"ctp" = (
-/obj/machinery/atmospherics/components/unary/outlet_injector/on{
- dir = 8
- },
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/ai_monitored/turret_protected/aisat_interior)
-"ctq" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/closed/wall,
-/area/ai_monitored/turret_protected/aisat_interior)
-"ctr" = (
-/obj/structure/table,
-/obj/machinery/light/small{
- dir = 1
- },
-/obj/item/folder{
- pixel_x = 3
- },
-/obj/item/phone{
- pixel_x = -3;
- pixel_y = 3
- },
-/obj/item/pen,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat_interior)
-"cts" = (
-/obj/structure/rack,
-/obj/machinery/light/small{
- dir = 1
- },
-/obj/machinery/light_switch{
- pixel_y = 28
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/item/radio/off{
- pixel_y = 4
- },
-/obj/item/screwdriver{
- pixel_y = 10
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat_interior)
-"ctt" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat_interior)
-"ctu" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
- },
-/turf/open/floor/plasteel/grimy,
-/area/ai_monitored/turret_protected/aisat_interior)
-"ctw" = (
-/obj/machinery/airalarm{
- dir = 4;
- pixel_x = -23
- },
-/obj/machinery/computer/station_alert{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat_interior)
-"ctx" = (
-/obj/machinery/atmospherics/pipe/manifold4w/scrubbers,
-/turf/open/floor/plasteel/grimy,
-/area/ai_monitored/turret_protected/aisat_interior)
-"cty" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/grimy,
-/area/ai_monitored/turret_protected/aisat_interior)
-"ctz" = (
-/obj/machinery/door/poddoor/shutters{
- id = "teledoor";
- name = "MiniSat Teleport Access"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat_interior)
-"ctA" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/structure/extinguisher_cabinet{
- pixel_x = -5;
- pixel_y = 30
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat_interior)
-"ctB" = (
-/obj/structure/cable,
-/obj/machinery/power/tracker,
-/turf/open/floor/plating/asteroid/snow/ice/icemoon/solarpanel,
-/area/icemoon/surface/outdoors)
-"ctE" = (
-/obj/machinery/teleport/hub,
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat_interior)
-"ctF" = (
-/obj/machinery/button/door{
- id = "teledoor";
- name = "MiniSat Teleport Shutters Control";
- pixel_y = 25;
- req_access_txt = "17;65"
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat_interior)
-"ctG" = (
-/obj/structure/chair/office/dark{
- dir = 8
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel/grimy,
-/area/ai_monitored/turret_protected/aisat_interior)
-"ctH" = (
-/obj/machinery/computer/security/telescreen/entertainment{
- pixel_x = -31
- },
-/obj/machinery/computer/monitor{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat_interior)
-"ctI" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/grimy,
-/area/ai_monitored/turret_protected/aisat_interior)
-"ctJ" = (
-/obj/machinery/holopad,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/effect/landmark/start/cyborg,
-/turf/open/floor/plasteel/grimy,
-/area/ai_monitored/turret_protected/aisat_interior)
-"ctK" = (
-/obj/machinery/door/airlock/hatch{
- name = "MiniSat Teleporter";
- req_access_txt = "17;65"
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat_interior)
-"ctL" = (
-/obj/machinery/teleport/station,
-/obj/machinery/light/small{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat_interior)
-"ctM" = (
-/obj/machinery/bluespace_beacon,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/effect/landmark/start/cyborg,
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat_interior)
-"ctP" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/turf/open/floor/plasteel/grimy,
-/area/ai_monitored/turret_protected/aisat_interior)
-"ctQ" = (
-/obj/structure/table,
-/obj/machinery/microwave{
- pixel_y = 4
- },
-/obj/machinery/firealarm{
- dir = 4;
- pixel_x = -24
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat_interior)
-"ctR" = (
-/obj/structure/sign/warning/radiation/rad_area,
-/turf/closed/wall,
-/area/engine/engineering)
-"ctS" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel/grimy,
-/area/ai_monitored/turret_protected/aisat_interior)
-"ctT" = (
-/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden,
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel/grimy,
-/area/ai_monitored/turret_protected/aisat_interior)
-"ctU" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/closed/wall,
-/area/ai_monitored/turret_protected/aisat_interior)
-"ctV" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/machinery/power/apc{
- areastring = "/area/ai_monitored/turret_protected/aisat_interior";
- dir = 4;
- name = "MiniSat Foyer APC";
- pixel_x = 27
- },
-/obj/structure/chair,
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat_interior)
-"ctW" = (
-/obj/machinery/computer/teleporter{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat_interior)
-"ctX" = (
-/obj/machinery/camera{
- c_tag = "MiniSat Teleporter";
- dir = 1;
- network = list("minisat");
- start_active = 1
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat_interior)
-"ctY" = (
-/obj/machinery/atmospherics/pipe/simple/yellow/visible,
-/obj/machinery/meter,
-/turf/closed/wall/r_wall,
-/area/ai_monitored/turret_protected/aisat/atmos)
-"ctZ" = (
-/turf/closed/wall/r_wall,
-/area/ai_monitored/turret_protected/aisat/atmos)
-"cua" = (
-/turf/closed/wall,
-/area/ai_monitored/turret_protected/aisat_interior)
-"cub" = (
-/obj/item/radio/intercom{
- name = "Station Intercom (General)";
- pixel_y = -29
- },
-/obj/machinery/light/small,
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat_interior)
-"cuc" = (
-/obj/structure/rack,
-/obj/machinery/status_display/evac{
- pixel_y = -32
- },
-/obj/item/storage/box/donkpockets,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat_interior)
-"cud" = (
-/obj/machinery/turretid{
- control_area = "/area/ai_monitored/turret_protected/aisat_interior";
- name = "Antechamber Turret Control";
- pixel_y = -24;
- req_access = null;
- req_access_txt = "65"
- },
-/obj/machinery/light/small,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/camera/motion{
- c_tag = "MiniSat Foyer";
- dir = 1;
- network = list("minisat")
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat_interior)
-"cue" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat_interior)
-"cuf" = (
-/turf/closed/wall/r_wall,
-/area/ai_monitored/turret_protected/aisat/service)
-"cug" = (
-/obj/machinery/status_display/ai{
- pixel_y = -32
- },
-/obj/structure/table,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat_interior)
-"cuh" = (
-/obj/machinery/atmospherics/pipe/simple/yellow/visible,
-/obj/structure/rack,
-/obj/item/wrench,
-/obj/item/crowbar/red,
-/obj/item/clothing/head/welding,
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat/atmos)
-"cui" = (
-/obj/machinery/atmospherics/components/unary/tank/air,
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat/atmos)
-"cuj" = (
-/turf/closed/wall/r_wall,
-/area/ai_monitored/turret_protected/aisat_interior)
-"cuk" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall/r_wall,
-/area/ai_monitored/turret_protected/aisat_interior)
-"cul" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/hatch{
- name = "MiniSat Antechamber";
- req_one_access_txt = "65"
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat_interior)
-"cum" = (
-/obj/machinery/recharge_station,
-/obj/effect/landmark/start/cyborg,
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat/service)
-"cun" = (
-/obj/machinery/atmospherics/components/binary/pump{
- name = "Mix to MiniSat"
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat/atmos)
-"cuo" = (
-/obj/machinery/portable_atmospherics/canister/air,
-/obj/machinery/firealarm{
- dir = 4;
- pixel_x = -24
- },
-/obj/effect/turf_decal/stripes/corner,
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat/atmos)
-"cup" = (
-/obj/structure/showcase/cyborg/old{
- dir = 8;
- pixel_x = 9;
- pixel_y = 2
- },
-/obj/structure/extinguisher_cabinet{
- pixel_x = -5;
- pixel_y = 30
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat/atmos)
-"cuq" = (
-/obj/machinery/atmospherics/components/binary/pump{
- name = "Air Out"
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat/atmos)
-"cur" = (
-/obj/structure/showcase/cyborg/old{
- dir = 4;
- pixel_x = -9;
- pixel_y = 2
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat_interior)
-"cus" = (
-/obj/structure/showcase/cyborg/old{
- dir = 8;
- pixel_x = 9;
- pixel_y = 2
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat_interior)
-"cuu" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat_interior)
-"cuv" = (
-/obj/structure/showcase/cyborg/old{
- dir = 4;
- pixel_x = -9;
- pixel_y = 2
- },
-/obj/structure/extinguisher_cabinet{
- pixel_x = 5;
- pixel_y = 30
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat/service)
-"cuw" = (
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat/service)
-"cux" = (
-/obj/structure/table,
-/obj/item/stack/sheet/metal/fifty,
-/obj/item/stack/sheet/glass/fifty,
-/obj/item/clothing/head/welding,
-/obj/item/stack/sheet/mineral/plasma{
- amount = 35
- },
-/obj/machinery/firealarm{
- dir = 8;
- pixel_x = 24
- },
-/obj/effect/turf_decal/stripes/corner{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat/service)
-"cuy" = (
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat_interior)
-"cuz" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat/atmos)
-"cuA" = (
-/obj/machinery/light/small{
- dir = 8
- },
-/obj/machinery/camera{
- c_tag = "MiniSat Atmospherics";
- dir = 4;
- network = list("minisat");
- start_active = 1
- },
-/obj/machinery/airalarm{
- dir = 4;
- pixel_x = -23
- },
-/obj/machinery/space_heater,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat/atmos)
-"cuB" = (
-/obj/machinery/light/small{
- dir = 4
- },
-/obj/item/radio/intercom{
- name = "Station Intercom (General)";
- pixel_x = 28
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat/atmos)
-"cuC" = (
-/obj/machinery/holopad,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/landmark/start/cyborg,
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat/atmos)
-"cuD" = (
-/obj/machinery/light/small{
- dir = 8
- },
-/obj/machinery/camera{
- c_tag = "MiniSat Antechamber";
- dir = 4;
- network = list("minisat");
- start_active = 1
- },
-/obj/machinery/turretid{
- control_area = "/area/ai_monitored/turret_protected/aisat/atmos";
- name = "Atmospherics Turret Control";
- pixel_x = -27;
- req_access = null;
- req_access_txt = "65"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat_interior)
-"cuE" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/closed/wall/r_wall,
-/area/ai_monitored/turret_protected/aisat_interior)
-"cuF" = (
-/obj/machinery/light/small{
- dir = 4
- },
-/obj/machinery/turretid{
- control_area = "/area/ai_monitored/turret_protected/aisat/service";
- name = "Service Bay Turret Control";
- pixel_x = 27;
- req_access = null;
- req_access_txt = "65"
- },
-/obj/machinery/atmospherics/pipe/manifold4w/scrubbers,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat_interior)
-"cuG" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/holopad,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/landmark/start/cyborg,
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat_interior)
-"cuH" = (
-/obj/machinery/light/small{
- dir = 8
- },
-/obj/item/radio/intercom{
- name = "Station Intercom (General)";
- pixel_x = -28
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat/service)
-"cuI" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat/service)
-"cuJ" = (
-/obj/machinery/holopad,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat/service)
-"cuK" = (
-/obj/machinery/light/small{
- dir = 4
- },
-/obj/machinery/camera{
- c_tag = "MiniSat Service Bay";
- dir = 8;
- network = list("minisat");
- start_active = 1
- },
-/obj/machinery/airalarm{
- dir = 8;
- pixel_x = 24
- },
-/obj/structure/rack,
-/obj/item/storage/toolbox/electrical{
- pixel_x = -3;
- pixel_y = 3
- },
-/obj/item/storage/toolbox/mechanical,
-/obj/item/multitool,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat/service)
-"cuL" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 5
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat/atmos)
-"cuM" = (
-/obj/machinery/power/apc{
- areastring = "/area/ai_monitored/turret_protected/aisat/atmos";
- dir = 8;
- name = "MiniSat Atmospherics APC";
- pixel_x = -27
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/machinery/portable_atmospherics/scrubber,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat/atmos)
-"cuN" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat/atmos)
-"cuO" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/ai_slipper{
- uses = 10
- },
-/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden,
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat/atmos)
-"cuP" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat_interior)
-"cuQ" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/hatch{
- name = "MiniSat Atmospherics";
- req_one_access_txt = "65"
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat_interior)
-"cuR" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat_interior)
-"cuS" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/machinery/ai_slipper{
- uses = 10
- },
-/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden,
-/mob/living/simple_animal/bot/secbot/pingsky,
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat_interior)
-"cuT" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat/service)
-"cuU" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/hatch{
- name = "MiniSat Service Bay";
- req_one_access_txt = "65"
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat_interior)
-"cuV" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat/service)
-"cuW" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/ai_slipper{
- uses = 10
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat/service)
-"cuX" = (
-/obj/machinery/power/apc{
- areastring = "/area/ai_monitored/turret_protected/aisat/service";
- dir = 4;
- name = "MiniSat Service Bay APC";
- pixel_x = 27
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/machinery/power/port_gen/pacman,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat/service)
-"cuY" = (
-/obj/machinery/porta_turret/ai{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat/atmos)
-"cuZ" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue,
-/mob/living/simple_animal/bot/floorbot,
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat/atmos)
-"cva" = (
-/turf/closed/wall/r_wall,
-/area/ai_monitored/turret_protected/ai)
-"cvb" = (
-/obj/machinery/status_display/ai,
-/turf/closed/wall/r_wall,
-/area/ai_monitored/turret_protected/ai)
-"cvc" = (
-/obj/structure/sign/warning/securearea{
- pixel_x = -32
- },
-/obj/machinery/porta_turret/ai{
- dir = 4
- },
-/obj/item/radio/intercom{
- broadcasting = 1;
- frequency = 1447;
- listening = 0;
- name = "Station Intercom (AI Private)";
- pixel_y = -29
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat_interior)
-"cvd" = (
-/obj/machinery/porta_turret/ai{
- dir = 4
- },
-/obj/structure/sign/warning/securearea{
- pixel_x = 32
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue,
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat_interior)
-"cve" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
- },
-/obj/machinery/turretid{
- control_area = "/area/ai_monitored/turret_protected/aisat/hallway";
- name = "Chamber Hallway Turret Control";
- pixel_x = 32;
- pixel_y = -24;
- req_access = null;
- req_access_txt = "65"
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat_interior)
-"cvf" = (
-/obj/machinery/status_display/evac,
-/turf/closed/wall/r_wall,
-/area/ai_monitored/turret_protected/ai)
-"cvg" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/mob/living/simple_animal/bot/cleanbot,
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat/service)
-"cvh" = (
-/obj/machinery/porta_turret/ai{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat/service)
-"cvi" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat/service)
-"cvj" = (
-/turf/closed/wall,
-/area/ai_monitored/turret_protected/aisat/hallway)
-"cvk" = (
-/turf/closed/wall/r_wall,
-/area/ai_monitored/turret_protected/aisat/hallway)
-"cvl" = (
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/ai)
-"cvm" = (
-/obj/machinery/door/airlock/maintenance_hatch{
- name = "MiniSat Maintenance";
- req_access_txt = "65"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat/hallway)
-"cvn" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall/r_wall,
-/area/ai_monitored/turret_protected/aisat/hallway)
-"cvo" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/hatch{
- name = "MiniSat Chamber Hallway";
- req_one_access_txt = "65"
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat/hallway)
-"cvp" = (
-/turf/open/floor/circuit,
-/area/ai_monitored/turret_protected/ai)
-"cvq" = (
-/obj/machinery/door/airlock/maintenance_hatch{
- name = "MiniSat Maintenance";
- req_access_txt = "65"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat/hallway)
-"cvr" = (
-/obj/machinery/porta_turret/ai{
- dir = 4
- },
-/turf/open/floor/circuit,
-/area/ai_monitored/turret_protected/ai)
-"cvs" = (
-/obj/machinery/portable_atmospherics/scrubber,
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat/hallway)
-"cvt" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat/hallway)
-"cvu" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat/hallway)
-"cvv" = (
-/turf/closed/wall,
-/area/ai_monitored/turret_protected/ai)
-"cvw" = (
-/turf/open/floor/circuit,
-/area/ai_monitored/turret_protected/aisat/hallway)
-"cvx" = (
-/obj/effect/landmark/start/ai/secondary,
-/obj/item/radio/intercom{
- freerange = 1;
- listening = 0;
- name = "Custom Channel";
- pixel_y = 28
- },
-/obj/item/radio/intercom{
- freerange = 1;
- name = "Common Channel";
- pixel_x = -27;
- pixel_y = 5
- },
-/obj/item/radio/intercom{
- freerange = 1;
- frequency = 1447;
- name = "Private Channel";
- pixel_y = -25
- },
-/turf/open/floor/circuit,
-/area/ai_monitored/turret_protected/ai)
-"cvy" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat/hallway)
-"cvz" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat/hallway)
-"cvA" = (
-/obj/effect/landmark/start/ai/secondary,
-/obj/item/radio/intercom{
- freerange = 1;
- listening = 0;
- name = "Custom Channel";
- pixel_y = 28
- },
-/obj/item/radio/intercom{
- freerange = 1;
- name = "Common Channel";
- pixel_x = 27;
- pixel_y = 5
- },
-/obj/item/radio/intercom{
- freerange = 1;
- frequency = 1447;
- name = "Private Channel";
- pixel_y = -25
- },
-/turf/open/floor/circuit,
-/area/ai_monitored/turret_protected/ai)
-"cvB" = (
-/obj/structure/rack,
-/obj/item/crowbar/red,
-/obj/item/wrench,
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat/hallway)
-"cvC" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat/hallway)
-"cvD" = (
-/obj/structure/reagent_dispensers/watertank,
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat/hallway)
-"cvE" = (
-/obj/structure/reagent_dispensers/fueltank,
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat/hallway)
-"cvG" = (
-/obj/machinery/porta_turret/ai{
- dir = 4;
- installation = /obj/item/gun/energy/e_gun
- },
-/obj/machinery/light{
- dir = 8
- },
-/turf/open/floor/circuit,
-/area/ai_monitored/turret_protected/aisat/hallway)
-"cvH" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat/hallway)
-"cvI" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat/hallway)
-"cvJ" = (
-/obj/machinery/porta_turret/ai{
- dir = 4;
- installation = /obj/item/gun/energy/e_gun
- },
-/obj/machinery/light{
- dir = 4
- },
-/turf/open/floor/circuit,
-/area/ai_monitored/turret_protected/aisat/hallway)
-"cvL" = (
-/obj/structure/sign/warning/securearea{
- pixel_x = 32
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat/hallway)
-"cvM" = (
-/obj/machinery/camera/motion{
- c_tag = "MiniSat Core Hallway";
- dir = 4;
- network = list("aicore")
- },
-/obj/machinery/firealarm{
- dir = 4;
- pixel_x = -24
- },
-/turf/open/floor/circuit,
-/area/ai_monitored/turret_protected/aisat/hallway)
-"cvN" = (
-/obj/structure/sign/warning/securearea{
- pixel_x = -32
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat/hallway)
-"cvO" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cvP" = (
-/obj/machinery/door/airlock/maintenance_hatch{
- name = "MiniSat Maintenance";
- req_access_txt = "65"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat/hallway)
-"cvQ" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 5
- },
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat/hallway)
-"cvR" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
- },
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat/hallway)
-"cvS" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/circuit,
-/area/ai_monitored/turret_protected/aisat/hallway)
-"cvT" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/holopad,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat/hallway)
-"cvU" = (
-/obj/machinery/door/airlock/maintenance_hatch{
- name = "MiniSat Maintenance";
- req_access_txt = "65"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat/hallway)
-"cvV" = (
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/turf/open/floor/circuit,
-/area/ai_monitored/turret_protected/aisat/hallway)
-"cvW" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat/hallway)
-"cvX" = (
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat/hallway)
-"cvY" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat/hallway)
-"cvZ" = (
-/obj/machinery/airalarm{
- dir = 4;
- pixel_x = -23
- },
-/turf/open/floor/circuit,
-/area/ai_monitored/turret_protected/aisat/hallway)
-"cwa" = (
-/obj/structure/cable,
-/obj/machinery/power/apc{
- areastring = "/area/ai_monitored/turret_protected/aisat/hallway";
- dir = 4;
- name = "MiniSat Chamber Hallway APC";
- pixel_x = 27
- },
-/turf/open/floor/circuit,
-/area/ai_monitored/turret_protected/aisat/hallway)
-"cwb" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 5
- },
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat/hallway)
-"cwc" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat/hallway)
-"cwd" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/item/radio/intercom{
- broadcasting = 1;
- frequency = 1447;
- listening = 0;
- name = "Station Intercom (AI Private)";
- pixel_x = -28;
- pixel_y = -29
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat/hallway)
-"cwe" = (
-/obj/structure/sign/warning/securearea,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall/r_wall,
-/area/ai_monitored/turret_protected/ai)
-"cwf" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/hatch{
- name = "MiniSat Chamber Observation";
- req_one_access_txt = "65"
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/ai)
-"cwg" = (
-/obj/machinery/airalarm{
- pixel_y = 23
- },
-/obj/structure/chair{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/ai)
-"cwh" = (
-/obj/machinery/light/small{
- dir = 1
- },
-/obj/structure/table/reinforced,
-/obj/item/paper_bin{
- pixel_x = -3;
- pixel_y = 7
- },
-/obj/item/pen{
- pixel_x = 4;
- pixel_y = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/ai)
-"cwi" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/ai)
-"cwj" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/ai)
-"cwk" = (
-/obj/machinery/light/small{
- dir = 1
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 8
- },
-/obj/machinery/firealarm{
- dir = 8;
- pixel_x = 24
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/ai)
-"cwl" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/ai)
-"cwm" = (
-/obj/structure/table/reinforced,
-/obj/item/folder/white,
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/ai)
-"cwn" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/ai)
-"cwo" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/ai)
-"cwp" = (
-/obj/structure/chair/office/dark,
-/obj/structure/extinguisher_cabinet{
- pixel_x = 27
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/ai)
-"cwq" = (
-/obj/structure/grille,
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat/hallway)
-"cwr" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/ai)
-"cws" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/ai)
-"cwt" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/command/glass{
- name = "AI Core";
- req_access_txt = "65"
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/ai)
-"cwu" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/ai_slipper{
- uses = 10
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/ai)
-"cwv" = (
-/obj/machinery/light{
- dir = 8
- },
-/obj/machinery/status_display/evac{
- pixel_x = -32
- },
-/turf/open/floor/circuit,
-/area/ai_monitored/turret_protected/ai)
-"cww" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/ai)
-"cwx" = (
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/ai)
-"cwz" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 5
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/ai)
-"cwA" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/machinery/holopad,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/ai)
-"cwB" = (
-/obj/machinery/light{
- dir = 4
- },
-/obj/machinery/status_display/ai{
- pixel_x = 32
- },
-/turf/open/floor/circuit,
-/area/ai_monitored/turret_protected/ai)
-"cwC" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/ai)
-"cwD" = (
-/obj/structure/window/reinforced{
- dir = 1
- },
-/obj/structure/window/reinforced{
- dir = 8
- },
-/obj/machinery/turretid{
- name = "AI Chamber turret control";
- pixel_x = 5;
- pixel_y = -24
- },
-/turf/open/floor/circuit,
-/area/ai_monitored/turret_protected/ai)
-"cwE" = (
-/obj/structure/window/reinforced{
- dir = 1
- },
-/obj/structure/window/reinforced{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/machinery/power/apc/highcap/five_k{
- areastring = "/area/ai_monitored/turret_protected/ai";
- name = "AI Chamber APC";
- pixel_y = -24
- },
-/obj/machinery/flasher{
- id = "AI";
- pixel_x = -11;
- pixel_y = -24
- },
-/obj/machinery/camera/motion{
- c_tag = "MiniSat AI Chamber North";
- dir = 1;
- network = list("aicore")
- },
-/turf/open/floor/circuit,
-/area/ai_monitored/turret_protected/ai)
-"cwH" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/port/fore)
-"cwT" = (
-/obj/machinery/camera{
- c_tag = "Arrivals Escape Pod 2";
- dir = 8
- },
-/obj/machinery/light/small,
-/obj/machinery/space_heater,
-/turf/open/floor/plating,
-/area/hallway/secondary/entry)
-"cxm" = (
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"cxo" = (
-/obj/structure/chair/wood/normal,
-/turf/open/floor/wood,
-/area/maintenance/bar)
-"cxN" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
- },
-/obj/machinery/door/airlock/external{
- name = "Solar Maintenance";
- req_access_txt = "10; 13"
- },
-/turf/open/floor/plating,
-/area/maintenance/solars/starboard/fore)
-"cxP" = (
-/obj/machinery/holopad,
-/turf/open/floor/plasteel,
-/area/security/processing)
-"cxW" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/obj/machinery/door/airlock/external{
- name = "External Access";
- req_access_txt = "13"
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
-"cxY" = (
-/obj/machinery/camera{
- c_tag = "Arrivals Escape Pod 1";
- dir = 8
- },
-/obj/machinery/light/small,
-/obj/machinery/space_heater,
-/turf/open/floor/plating,
-/area/hallway/secondary/entry)
-"cya" = (
-/obj/machinery/light/small,
-/turf/open/floor/plating,
-/area/maintenance/fore)
-"cyb" = (
-/obj/machinery/door/airlock/external{
- name = "Escape Pod One"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/hallway/secondary/entry)
-"cyg" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
- },
-/obj/machinery/door/airlock/command{
- name = "Command Tool Storage";
- req_access_txt = "19"
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/storage/eva)
-"cyh" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/obj/machinery/door/airlock/external{
- name = "Security Escape Airlock";
- req_access_txt = "2"
- },
-/turf/open/floor/plating,
-/area/hallway/secondary/exit)
-"cyl" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/obj/machinery/door/airlock/external{
- name = "Port Docking Bay 2"
- },
-/turf/open/floor/plating,
-/area/hallway/secondary/entry)
-"cyp" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/obj/machinery/door/airlock/external{
- name = "Escape Airlock"
- },
-/turf/open/floor/plating,
-/area/hallway/secondary/exit)
-"cyr" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/obj/machinery/door/airlock/external{
- name = "Cargo Escape Airlock"
- },
-/turf/open/floor/plating,
-/area/hallway/secondary/exit)
-"cyt" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
- },
-/obj/machinery/door/airlock/external{
- name = "Port Docking Bay 4"
- },
-/turf/open/floor/plating,
-/area/hallway/secondary/entry)
-"cyu" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
- },
-/obj/machinery/door/airlock/external{
- name = "Port Docking Bay 3"
- },
-/turf/open/floor/plating,
-/area/hallway/secondary/entry)
-"cyC" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/obj/machinery/door/airlock/external{
- req_access_txt = "13"
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard)
-"cyD" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/obj/machinery/door/airlock/external{
- name = "Supply Dock Airlock";
- req_access_txt = "31"
- },
-/turf/open/floor/plating,
-/area/quartermaster/storage)
-"cyE" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/obj/machinery/door/airlock/external{
- name = "External Access";
- req_access_txt = "13"
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"cyG" = (
-/turf/open/floor/plating,
-/area/engine/atmos)
-"cyK" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/obj/machinery/door/airlock/external{
- name = "Solar Maintenance";
- req_access_txt = "10; 13"
- },
-/turf/open/floor/plating,
-/area/maintenance/solars/port/aft)
-"cyL" = (
-/obj/machinery/door/airlock/maintenance/abandoned{
- req_access_txt = "12"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"cyM" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
- },
-/obj/machinery/door/airlock/engineering{
- name = "Engine Room";
- req_access_txt = "10"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cyU" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
- },
-/obj/machinery/door/airlock/external{
- name = "Solar Maintenance";
- req_access_txt = "10; 13"
- },
-/turf/open/floor/plating,
-/area/maintenance/solars/starboard/aft)
-"czg" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/obj/machinery/door/airlock/external{
- name = "Escape Pod Four";
- shuttledocked = 1
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"czk" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/obj/machinery/door/airlock/external{
- name = "MiniSat External Access";
- req_access_txt = "65;13"
- },
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat_interior)
-"czG" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"czH" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"czJ" = (
-/obj/machinery/atmospherics/components/unary/outlet_injector/on{
- dir = 1
- },
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/maintenance/disposal/incinerator)
-"czK" = (
-/turf/closed/wall,
-/area/security/vacantoffice)
-"czO" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/plasteel,
-/area/hallway/secondary/exit)
-"czQ" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"czR" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"czS" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6
- },
-/turf/open/floor/plating{
- icon_state = "platingdmg3"
- },
-/area/maintenance/starboard/aft)
-"czT" = (
-/obj/structure/disposalpipe/segment{
- dir = 5
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 5
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"czU" = (
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"czW" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"czX" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"czY" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"czZ" = (
-/obj/structure/chair,
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cAa" = (
-/obj/structure/chair,
-/obj/item/storage/fancy/cigarettes,
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cAb" = (
-/obj/structure/closet,
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cAc" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/closed/wall,
-/area/maintenance/starboard/aft)
-"cAd" = (
-/obj/structure/reagent_dispensers/fueltank,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cAe" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/reagent_dispensers/fueltank,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cAg" = (
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/kitchen)
-"cAh" = (
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"cAi" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"cAy" = (
-/obj/structure/closet/secure_closet/freezer/kitchen/maintenance,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"cAz" = (
-/obj/structure/disposalpipe/segment{
- dir = 5
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/turf/open/floor/plasteel/dark,
-/area/chapel/office)
-"cAA" = (
-/obj/machinery/light/small{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"cAB" = (
-/obj/structure/table,
-/obj/machinery/microwave,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"cAC" = (
-/obj/structure/sink/kitchen{
- dir = 8;
- pixel_x = 11
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"cAD" = (
-/obj/structure/table,
-/obj/item/kitchen/knife,
-/obj/item/storage/box/donkpockets,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"cAE" = (
-/obj/structure/table/glass,
-/obj/item/reagent_containers/food/condiment/saltshaker{
- pixel_y = 2
- },
-/obj/item/reagent_containers/food/condiment/peppermill{
- pixel_x = 2
- },
-/obj/item/reagent_containers/food/snacks/mint{
- pixel_y = 9
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"cAF" = (
-/turf/open/floor/plating,
-/area/maintenance/disposal)
-"cAG" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/power/apc{
- areastring = "/area/crew_quarters/heads/hop";
- name = "Head of Personnel APC";
- pixel_y = -24
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/turf/open/floor/plating,
-/area/maintenance/central)
-"cAH" = (
-/obj/machinery/processor,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"cAI" = (
-/obj/machinery/conveyor_switch/oneway{
- dir = 8;
- id = "garbage";
- name = "disposal conveyor"
- },
-/turf/open/floor/plating,
-/area/maintenance/disposal)
-"cAJ" = (
-/obj/structure/closet,
-/turf/open/floor/plating,
-/area/maintenance/disposal)
-"cAK" = (
-/obj/machinery/light/small,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"cAL" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/landmark/start/janitor,
-/turf/open/floor/plasteel,
-/area/janitor)
-"cAQ" = (
-/obj/structure/chair,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"cAR" = (
-/obj/machinery/door/window{
- dir = 1;
- name = "AI Core Door";
- req_access_txt = "16"
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/turf/open/floor/circuit,
-/area/ai_monitored/turret_protected/ai)
-"cAS" = (
-/obj/effect/landmark/start/ai,
-/obj/item/radio/intercom{
- freerange = 1;
- name = "Common Channel";
- pixel_x = -27;
- pixel_y = -9
- },
-/obj/item/radio/intercom{
- freerange = 1;
- listening = 0;
- name = "Custom Channel";
- pixel_y = -31
- },
-/obj/item/radio/intercom{
- freerange = 1;
- frequency = 1447;
- name = "Private Channel";
- pixel_x = 27;
- pixel_y = -9
- },
-/obj/machinery/newscaster/security_unit{
- pixel_x = -28;
- pixel_y = -28
- },
-/obj/machinery/requests_console{
- department = "AI";
- departmentType = 5;
- pixel_x = 28;
- pixel_y = -28
- },
-/turf/open/floor/circuit,
-/area/ai_monitored/turret_protected/ai)
-"cAT" = (
-/obj/machinery/ai_slipper{
- uses = 10
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/ai)
-"cAV" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/showcase/cyborg/old{
- dir = 8;
- pixel_x = 9;
- pixel_y = 2
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/ai)
-"cAW" = (
-/obj/structure/showcase/cyborg/old{
- dir = 4;
- pixel_x = -9;
- pixel_y = 2
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/ai)
-"cAY" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/closed/wall,
-/area/ai_monitored/turret_protected/ai)
-"cAZ" = (
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/ai)
-"cBa" = (
-/obj/machinery/power/smes{
- charge = 5e+006
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/turf/open/floor/circuit,
-/area/ai_monitored/turret_protected/ai)
-"cBb" = (
-/obj/machinery/camera/motion{
- c_tag = "MiniSat AI Chamber South";
- network = list("aicore")
- },
-/turf/open/floor/circuit,
-/area/ai_monitored/turret_protected/ai)
-"cBc" = (
-/obj/machinery/power/terminal{
- dir = 1
- },
-/obj/machinery/ai_slipper{
- uses = 10
- },
-/turf/open/floor/circuit,
-/area/ai_monitored/turret_protected/ai)
-"cBd" = (
-/obj/machinery/firealarm{
- dir = 1;
- pixel_y = -24
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/ai)
-"cBe" = (
-/obj/machinery/airalarm{
- dir = 1;
- pixel_y = -22
- },
-/obj/machinery/holopad,
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/ai)
-"cBg" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/plating,
-/area/hydroponics)
-"cBh" = (
-/obj/effect/landmark/event_spawn,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/locker)
-"cBi" = (
-/obj/effect/landmark/event_spawn,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/quartermaster/warehouse)
-"cBj" = (
-/obj/structure/table,
-/obj/item/folder/blue,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/ai_upload)
-"cBk" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"cBl" = (
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/plasteel,
-/area/hallway/secondary/exit)
-"cBm" = (
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"cBn" = (
-/obj/structure/sink{
- dir = 4;
- pixel_x = 11
- },
-/obj/structure/mirror{
- pixel_x = 28
- },
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/toilet/locker)
-"cBo" = (
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/wood,
-/area/crew_quarters/heads/captain)
-"cBp" = (
-/obj/effect/landmark/event_spawn,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plasteel,
-/area/quartermaster/storage)
-"cBq" = (
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"cBr" = (
-/obj/effect/landmark/event_spawn,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"cBt" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/plasteel/white,
-/area/science/explab)
-"cBu" = (
-/obj/machinery/status_display/ai{
- pixel_y = 32
- },
-/obj/effect/landmark/event_spawn,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel/white,
-/area/crew_quarters/heads/hor)
-"cBv" = (
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/plasteel,
-/area/security/checkpoint/supply)
-"cBw" = (
-/obj/machinery/door/firedoor,
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"cBx" = (
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment{
- dir = 6
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 5
- },
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/plasteel/white,
-/area/science/research)
-"cBy" = (
-/obj/machinery/door/airlock{
- name = "Custodial Closet";
- req_access_txt = "26"
- },
-/obj/structure/disposalpipe/segment,
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/plasteel,
-/area/janitor)
-"cBz" = (
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/engine,
-/area/science/xenobiology)
-"cBA" = (
-/obj/machinery/button/massdriver{
- id = "toxinsdriver";
- pixel_y = 24
- },
-/obj/effect/landmark/event_spawn,
-/obj/effect/turf_decal/stripes/corner{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/science/mixing)
-"cBB" = (
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"cBC" = (
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/plasteel,
-/area/storage/tech)
-"cBD" = (
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"cBE" = (
-/obj/effect/landmark/event_spawn,
-/obj/machinery/air_sensor/atmos/toxins_mixing_tank,
-/turf/open/floor/engine/vacuum,
-/area/science/mixing)
-"cBF" = (
-/obj/effect/landmark/event_spawn,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"cBH" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"cBI" = (
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/plasteel,
-/area/security/checkpoint/engineering)
-"cBJ" = (
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"cBK" = (
-/obj/item/radio/intercom{
- name = "Station Intercom (General)";
- pixel_y = -35
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
- },
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/plasteel,
-/area/tcommsat/computer)
-"cBL" = (
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cBM" = (
-/obj/structure/table/reinforced,
-/obj/machinery/cell_charger,
-/obj/item/stock_parts/cell/high/plus,
-/obj/item/twohanded/rcl/pre_loaded,
-/turf/open/floor/plasteel,
-/area/crew_quarters/heads/chief)
-"cBN" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cBO" = (
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cBP" = (
-/obj/machinery/portable_atmospherics/canister/air,
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/engine/air,
-/area/engine/atmos)
-"cBS" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat/hallway)
-"cBT" = (
-/obj/machinery/door/airlock/external{
- name = "External Access";
- req_access_txt = "13"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cBZ" = (
-/obj/structure/table/wood,
-/obj/item/clothing/under/misc/burial,
-/obj/item/clothing/under/misc/burial,
-/obj/item/clothing/under/misc/burial,
-/obj/item/clothing/under/misc/burial,
-/obj/item/clothing/under/misc/burial,
-/obj/item/clothing/under/misc/burial,
-/turf/open/floor/plasteel/grimy,
-/area/chapel/office)
-"cCb" = (
-/obj/structure/table,
-/obj/item/stack/cable_coil{
- amount = 5
- },
-/obj/item/flashlight,
-/turf/open/floor/plating,
-/area/construction)
-"cCc" = (
-/obj/structure/rack,
-/obj/item/clothing/suit/hazardvest,
-/turf/open/floor/plating,
-/area/construction)
-"cCd" = (
-/turf/open/floor/plasteel,
-/area/construction)
-"cCe" = (
-/obj/structure/closet/crate,
-/turf/open/floor/plating,
-/area/construction)
-"cCf" = (
-/obj/machinery/disposal/bin,
-/obj/structure/disposalpipe/trunk{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/construction)
-"cCi" = (
-/turf/closed/wall,
-/area/security/vacantoffice/b)
-"cCj" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/closed/wall,
-/area/security/detectives_office)
-"cCk" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/closed/wall,
-/area/security/detectives_office)
-"cCn" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/light/small{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/warehouse)
-"cCo" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/quartermaster/storage)
-"cCp" = (
-/obj/structure/closet/crate/freezer,
-/obj/item/reagent_containers/blood,
-/obj/item/reagent_containers/blood,
-/obj/item/reagent_containers/blood/AMinus,
-/obj/item/reagent_containers/blood/BMinus{
- pixel_x = -4;
- pixel_y = 4
- },
-/obj/item/reagent_containers/blood/BPlus{
- pixel_x = 1;
- pixel_y = 2
- },
-/obj/item/reagent_containers/blood/OMinus,
-/obj/item/reagent_containers/blood/OPlus{
- pixel_x = -2;
- pixel_y = -1
- },
-/obj/item/reagent_containers/blood/random,
-/obj/item/reagent_containers/blood/random,
-/obj/item/reagent_containers/blood/APlus,
-/obj/item/reagent_containers/blood/random,
-/turf/open/floor/plasteel,
-/area/medical/sleeper)
-"cCq" = (
-/obj/machinery/deepfryer,
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/kitchen)
-"cCt" = (
-/obj/structure/closet,
-/obj/effect/spawner/lootdrop/maintenance{
- lootcount = 4;
- name = "4maintenance loot spawner"
- },
-/obj/item/poster/random_official,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cCE" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/yellow/visible,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"cCF" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/engine/atmos)
-"cCT" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/closet/firecloset,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cCY" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cDl" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/vending/tool,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cDm" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/vending/engivend,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cDB" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/effect/landmark/start/station_engineer,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cDJ" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cDK" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cDL" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
-"cDN" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/turf/closed/wall,
-/area/engine/engineering)
-"cDZ" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/closet/radiation,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cEo" = (
-/obj/structure/closet/boxinggloves,
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
-"cGz" = (
-/obj/structure/table/wood,
-/obj/item/instrument/violin,
-/turf/open/floor/wood,
-/area/crew_quarters/theatre)
-"cGG" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"cHf" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/table/wood,
-/obj/item/reagent_containers/food/condiment/saltshaker{
- pixel_x = -3;
- pixel_y = 20
- },
-/obj/item/reagent_containers/food/condiment/peppermill{
- dir = 1;
- pixel_x = 3;
- pixel_y = 20
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/item/reagent_containers/food/drinks/britcup,
-/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
-"cHD" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/disposalpipe/sorting/mail/flip{
- dir = 2;
- sortType = 14
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/turf/open/floor/plating,
-/area/maintenance/department/medical/morgue)
-"cHE" = (
-/obj/machinery/door/airlock/maintenance{
- name = "Mech Bay Maintenance";
- req_access_txt = "29"
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 8
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/science/robotics/mechbay)
-"cHF" = (
-/obj/machinery/button/door{
- id = "Skynet_launch";
- name = "Mech Bay Door Control";
- pixel_x = 6;
- pixel_y = 24
- },
-/obj/effect/turf_decal/stripes/corner{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/science/robotics/mechbay)
-"cHG" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 1
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/science/robotics/mechbay)
-"cHH" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/science/robotics/mechbay)
-"cHI" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/science/robotics/mechbay)
-"cHJ" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/science/robotics/mechbay)
-"cHK" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/research/glass{
- name = "Robotics Lab";
- req_access_txt = "29"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/robotics/lab)
-"cHL" = (
-/obj/machinery/mech_bay_recharge_port{
- dir = 2
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/turf/open/floor/plating,
-/area/science/robotics/mechbay)
-"cHM" = (
-/obj/structure/chair/office/light{
- dir = 1
- },
-/turf/open/floor/plasteel/white,
-/area/science/robotics/lab)
-"cHN" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/circuit,
-/area/science/robotics/mechbay)
-"cHO" = (
-/obj/machinery/conveyor_switch/oneway{
- id = "robo1"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/white,
-/area/science/robotics/lab)
-"cHP" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/structure/table,
-/obj/item/storage/belt/utility,
-/obj/item/stack/sheet/metal/fifty,
-/obj/item/stack/sheet/metal/fifty,
-/obj/item/stack/sheet/metal/fifty,
-/obj/item/stack/sheet/glass{
- amount = 20;
- pixel_x = -3;
- pixel_y = 6
- },
-/turf/open/floor/plasteel,
-/area/science/robotics/lab)
-"cHQ" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/science/robotics/mechbay)
-"cHR" = (
-/obj/machinery/conveyor{
- dir = 4;
- id = "robo1"
- },
-/turf/open/floor/plasteel,
-/area/science/robotics/lab)
-"cHS" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/effect/landmark/start/roboticist,
-/turf/open/floor/plasteel,
-/area/science/robotics/lab)
-"cHT" = (
-/obj/machinery/holopad,
-/turf/open/floor/plasteel,
-/area/science/robotics/lab)
-"cHU" = (
-/obj/machinery/disposal/bin,
-/obj/structure/disposalpipe/trunk{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/science/robotics/lab)
-"cHV" = (
-/obj/machinery/conveyor_switch/oneway{
- id = "robo2"
- },
-/turf/open/floor/plasteel/white,
-/area/science/robotics/lab)
-"cHW" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/machinery/mecha_part_fabricator,
-/turf/open/floor/plasteel,
-/area/science/robotics/lab)
-"cHX" = (
-/obj/structure/table,
-/obj/item/storage/toolbox/mechanical{
- pixel_x = -2;
- pixel_y = -1
- },
-/obj/item/clothing/head/welding{
- pixel_x = -3;
- pixel_y = 5
- },
-/obj/item/clothing/glasses/welding,
-/obj/item/multitool{
- pixel_x = 3
- },
-/turf/open/floor/plasteel,
-/area/science/robotics/lab)
-"cHZ" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/science/robotics/lab)
-"cIa" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/science/robotics/lab)
-"cIb" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/obj/machinery/conveyor{
- dir = 4;
- id = "robo2"
- },
-/turf/open/floor/plasteel,
-/area/science/robotics/lab)
-"cIc" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/effect/turf_decal/bot,
-/obj/effect/landmark/start/cyborg,
-/turf/open/floor/plasteel,
-/area/science/robotics/lab)
-"cId" = (
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plasteel,
-/area/science/robotics/lab)
-"cIe" = (
-/obj/structure/window/reinforced{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/science/robotics/lab)
-"cIf" = (
-/obj/structure/reagent_dispensers/fueltank,
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/turf/open/floor/plasteel/white,
-/area/science/robotics/lab)
-"cIh" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
- },
-/obj/machinery/door/airlock/external{
- name = "Port Docking Bay 1"
- },
-/turf/open/floor/plating,
-/area/hallway/secondary/entry)
-"cIv" = (
-/obj/structure/sign/poster/official/cohiba_robusto_ad,
-/turf/closed/wall,
-/area/lawoffice)
-"cJW" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/circuit,
-/area/ai_monitored/nuke_storage)
-"cKC" = (
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/security/brig)
-"cKT" = (
-/obj/machinery/door/airlock/external{
- name = "Atmospherics External Airlock";
- req_access_txt = "24"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/turf/open/floor/plating,
-/area/engine/atmos)
-"cMp" = (
-/obj/machinery/light,
-/turf/open/floor/plating,
-/area/engine/engineering)
-"cMC" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/obj/machinery/computer/security/telescreen/engine{
- dir = 8;
- pixel_x = 30
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cMQ" = (
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/machinery/power/solar{
- id = "starboardsolar";
- name = "Starboard Solar Array"
- },
-/turf/open/floor/plating/asteroid/snow/ice/icemoon/solarpanel,
-/area/icemoon/surface/outdoors)
-"cNa" = (
-/obj/structure/cable,
-/obj/machinery/power/solar{
- id = "starboardsolar";
- name = "Starboard Solar Array"
- },
-/turf/open/floor/plating/asteroid/snow/ice/icemoon/solarpanel,
-/area/icemoon/surface/outdoors)
-"cNE" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/closed/wall,
-/area/crew_quarters/bar)
-"cNG" = (
-/turf/open/floor/plasteel,
-/area/quartermaster/sorting)
-"cNI" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/quartermaster/sorting)
-"cNJ" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/sorting)
-"cNL" = (
-/obj/machinery/power/apc{
- areastring = "/area/maintenance/central";
- dir = 1;
- name = "Central Maintenance APC";
- pixel_y = 24
- },
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/turf/open/floor/plating,
-/area/maintenance/central)
-"cNM" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/sorting)
-"cNN" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/sorting)
-"cNR" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard)
-"cNS" = (
-/obj/machinery/power/apc{
- areastring = "/area/maintenance/starboard";
- dir = 4;
- name = "Starboard Maintenance APC";
- pixel_x = 26
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/machinery/space_heater,
-/turf/open/floor/plating,
-/area/maintenance/starboard)
-"cNT" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 8
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard)
-"cNU" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard)
-"cNV" = (
-/obj/machinery/door/airlock/maintenance/abandoned{
- req_one_access_txt = "8;12"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard)
-"cNW" = (
-/turf/closed/wall,
-/area/maintenance/starboard/aft)
-"cNX" = (
-/obj/machinery/door/airlock/maintenance{
- req_one_access_txt = "8;12"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/disposalpipe/segment,
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cNY" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall,
-/area/maintenance/starboard/aft)
-"cNZ" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cOb" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cOe" = (
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cOw" = (
-/obj/effect/spawner/structure/window,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"cOx" = (
-/obj/structure/closet,
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cOz" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 6
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cOT" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cOV" = (
-/obj/machinery/door/firedoor,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/sign/warning/securearea{
- pixel_x = -32
- },
-/obj/machinery/door/poddoor/preopen{
- id = "Prison Gate";
- name = "prison blast door"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
-/area/security/prison)
-"cPn" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/toilet)
-"cPA" = (
-/obj/machinery/atmospherics/components/binary/valve{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cPH" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/obj/machinery/door/airlock/external{
- req_access_txt = "13;8;12"
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cPI" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/obj/machinery/door/airlock/external{
- req_access_txt = "13;8;12"
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cQw" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/closed/wall,
-/area/maintenance/starboard/aft)
-"cQB" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"cQF" = (
-/obj/structure/closet,
-/obj/effect/spawner/lootdrop/maintenance{
- lootcount = 8;
- name = "8maintenance loot spawner"
- },
-/obj/item/radio/intercom{
- pixel_y = 25
- },
-/turf/open/floor/plating,
-/area/crew_quarters/abandoned_gambling_den)
-"cQT" = (
-/obj/structure/filingcabinet,
-/obj/machinery/light{
- dir = 8;
- light_color = "#e8eaff"
- },
-/turf/open/floor/plasteel/dark,
-/area/hallway/primary/central)
-"cQU" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cSA" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/closed/wall,
-/area/security/courtroom)
-"cSE" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel/dark/telecomms,
-/area/tcommsat/server)
-"cSF" = (
-/obj/machinery/power/terminal{
- dir = 1
- },
-/turf/open/floor/plasteel/dark/telecomms,
-/area/tcommsat/server)
-"cSL" = (
-/obj/machinery/button/door{
- id = "atmos";
- name = "Atmospherics Lockdown";
- pixel_x = -24;
- pixel_y = 10;
- req_access_txt = "24"
- },
-/obj/machinery/button/door{
- desc = "A remote control-switch for secure storage.";
- id = "Secure Storage";
- name = "Engineering Secure Storage";
- pixel_x = -24;
- req_access_txt = "11"
- },
-/obj/machinery/button/door{
- desc = "A remote control-switch for the engineering security doors.";
- id = "Engineering";
- name = "Engineering Lockdown";
- pixel_x = -24;
- pixel_y = -10;
- req_access_txt = "10"
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/crew_quarters/heads/chief)
-"cSM" = (
-/obj/machinery/computer/station_alert,
-/obj/item/radio/intercom{
- name = "Station Intercom (General)";
- pixel_y = 20
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cSN" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cSO" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cSP" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cSQ" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cSR" = (
-/obj/effect/turf_decal/delivery,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/sign/warning/nosmoking{
- pixel_y = 32
- },
-/obj/machinery/camera{
- c_tag = "Engineering Power Storage"
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cSS" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 5
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cST" = (
-/obj/effect/landmark/start/station_engineer,
-/obj/effect/turf_decal/stripes/corner{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/corner,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cSU" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cSV" = (
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cSW" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cSX" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cSY" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/obj/machinery/light{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cSZ" = (
-/obj/machinery/disposal/bin,
-/obj/structure/disposalpipe/trunk{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/heads/chief)
-"cTa" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cTb" = (
-/obj/effect/turf_decal/bot{
- dir = 1
- },
-/obj/machinery/portable_atmospherics/pump,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cTc" = (
-/obj/effect/spawner/structure/window,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"cTd" = (
-/obj/effect/spawner/structure/window,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/engine/engineering)
-"cTe" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cTf" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/requests_console{
- department = "Engineering";
- departmentType = 4;
- name = "Engineering RC";
- pixel_y = 30
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cTD" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/power/apc{
- areastring = "/area/maintenance/central/secondary";
- dir = 8;
- name = "Central Maintenance APC";
- pixel_x = -24
- },
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/turf/open/floor/plating,
-/area/maintenance/central/secondary)
-"cTE" = (
-/obj/machinery/computer/shuttle/mining{
- dir = 8
- },
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/construction/mining/aux_base)
-"cTF" = (
-/obj/machinery/door/airlock/maintenance/abandoned{
- req_access_txt = "12"
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"cTJ" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/department/medical/morgue)
-"cTK" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/department/medical/morgue)
-"cTL" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/turf/open/floor/plasteel/dark,
-/area/medical/morgue)
-"cTM" = (
-/obj/machinery/power/apc{
- areastring = "/area/maintenance/department/medical/morgue";
- dir = 4;
- name = "Morgue Maintenance APC";
- pixel_x = 26
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/turf/open/floor/plasteel/dark,
-/area/medical/morgue)
-"cTO" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/department/medical/morgue)
-"cTS" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/department/medical/morgue)
-"cTT" = (
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/turf/open/floor/circuit,
-/area/ai_monitored/nuke_storage)
-"cTX" = (
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/machinery/shieldwallgen/xenobiologyaccess,
-/obj/structure/sign/poster/official/safety_eye_protection{
- pixel_x = 32
- },
-/turf/open/floor/plating,
-/area/science/xenobiology)
-"cTY" = (
-/obj/structure/sign/poster/official/safety_internals{
- pixel_x = -32
- },
-/obj/machinery/space_heater,
-/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
-"cTZ" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 1
- },
-/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
-"cUx" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel/dark,
-/area/bridge/meeting_room)
-"cVb" = (
-/turf/closed/wall,
-/area/hallway/secondary/service)
-"cVs" = (
-/obj/machinery/vending/coffee,
-/turf/open/floor/wood,
-/area/bridge/meeting_room)
-"cVt" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cVK" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
-/turf/open/floor/plasteel/white,
-/area/science/circuit)
-"cXi" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cXU" = (
-/obj/effect/turf_decal/tile/red,
-/obj/machinery/light{
- light_color = "#c9d3e8"
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/fore)
-"cZe" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/turf/open/floor/plasteel,
-/area/security/brig)
-"daI" = (
-/obj/structure/window/reinforced,
-/obj/effect/turf_decal/bot,
-/obj/machinery/portable_atmospherics/canister/nitrous_oxide,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"daY" = (
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/corner{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dbU" = (
-/obj/structure/light_construct{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
-"dce" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 8
- },
-/obj/machinery/meter,
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
-"dev" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/obj/machinery/power/apc{
- areastring = "/area/quartermaster/storage";
- name = "Cargo Bay APC";
- pixel_x = 1;
- pixel_y = -24
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"deE" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 1;
- name = "Gas to Filter"
- },
-/obj/machinery/airalarm/engine{
- dir = 4;
- pixel_x = -23
- },
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"dfh" = (
-/obj/machinery/power/apc{
- areastring = "/area/science/circuit";
- name = "Circuitry Lab APC";
- pixel_x = 30
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/turf/open/floor/plasteel,
-/area/science/circuit)
-"dfL" = (
-/obj/structure/reagent_dispensers/keg/gargle,
-/turf/open/floor/wood,
-/area/maintenance/bar)
-"dgz" = (
-/turf/closed/wall,
-/area/crew_quarters/cryopod)
-"dgO" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall/r_wall,
-/area/engine/gravity_generator)
-"dhT" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/camera{
- c_tag = "Engineering Supermatter Starboard";
- dir = 8;
- network = list("ss13","engine")
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"diq" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"dkV" = (
-/obj/machinery/space_heater,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"dly" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/security/range)
-"dlO" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
- },
-/obj/machinery/light{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dml" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/dark,
-/area/hallway/primary/central)
-"dqb" = (
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness/pool)
-"dqu" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/closed/wall/r_wall,
-/area/maintenance/disposal/incinerator)
-"dsC" = (
-/obj/structure/chair/stool{
- pixel_y = 8
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/carpet{
- icon_state = "carpetsymbol"
- },
-/area/crew_quarters/theatre)
-"dtx" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/sink{
- dir = 4;
- pixel_x = 11
- },
-/obj/structure/mirror{
- pixel_x = 25
- },
-/turf/open/floor/mineral/titanium/blue,
-/area/crew_quarters/toilet)
-"dvc" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
- },
-/turf/open/floor/carpet,
-/area/crew_quarters/cryopod)
-"dvO" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10
- },
-/turf/closed/wall,
-/area/science/circuit)
-"dyE" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/security/brig)
-"dyS" = (
-/obj/effect/turf_decal/tile/green{
- dir = 8
- },
-/obj/effect/turf_decal/tile/green{
- dir = 1
- },
-/obj/effect/turf_decal/tile/green,
-/obj/effect/turf_decal/tile/green{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/security/prison)
-"dzi" = (
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/turf/open/floor/carpet,
-/area/crew_quarters/cryopod)
-"dzQ" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/hallway/primary/central)
-"dBm" = (
-/obj/machinery/portable_atmospherics/scrubber,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"dCr" = (
-/obj/structure/pool/Rboard,
-/turf/open/floor/plasteel/yellowsiding{
- dir = 8
- },
-/area/crew_quarters/fitness/pool)
-"dCV" = (
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/security/range)
-"dDc" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 1;
- name = "Mix Bypass"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dDV" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/space_heater,
-/turf/open/floor/plasteel,
-/area/quartermaster/warehouse)
-"dFX" = (
-/turf/closed/wall,
-/area/crew_quarters/fitness/pool)
-"dIt" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dIH" = (
-/obj/structure/grille/broken,
-/obj/effect/landmark/loneopspawn,
-/turf/open/floor/plating/asteroid/snow/icemoon,
-/area/icemoon/surface/outdoors)
-"dJL" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/door/airlock/command{
- name = "Head of Security's Office";
- req_access_txt = "58"
- },
-/obj/machinery/door/firedoor,
-/turf/open/floor/plasteel/dark,
-/area/crew_quarters/heads/hos)
-"dKP" = (
-/turf/closed/wall,
-/area/maintenance/bar)
-"dKV" = (
-/obj/structure/chair/stool/bar,
-/turf/open/floor/wood,
-/area/maintenance/bar)
-"dMZ" = (
-/obj/structure/sign/poster/official/random{
- pixel_y = 32
- },
-/turf/open/floor/plasteel/white,
-/area/science/circuit)
-"dPk" = (
-/obj/structure/closet{
- name = "Costume Closet"
- },
-/obj/item/clothing/head/russobluecamohat,
-/obj/item/clothing/head/russobluecamohat,
-/obj/item/clothing/head/ushanka,
-/obj/item/clothing/head/ushanka,
-/obj/item/clothing/head/ushanka,
-/obj/item/clothing/head/ushanka,
-/obj/item/clothing/under/misc/blue_camo,
-/obj/item/clothing/under/misc/blue_camo,
-/obj/item/clothing/under/misc/blue_camo,
-/obj/item/clothing/under/misc/blue_camo,
-/obj/item/clothing/shoes/jackboots,
-/obj/item/clothing/shoes/jackboots,
-/obj/item/clothing/shoes/jackboots,
-/obj/item/clothing/shoes/jackboots,
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
-"dPq" = (
-/obj/machinery/light/small{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/fore)
-"dSF" = (
-/obj/structure/table,
-/obj/item/stack/sheet/metal/fifty,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"dSI" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 5
- },
-/obj/machinery/meter,
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
-"dTI" = (
-/obj/structure/urinal{
- pixel_y = 32
- },
-/turf/open/floor/mineral/titanium/blue,
-/area/crew_quarters/toilet)
-"dUG" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 9
- },
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors)
-"dVX" = (
-/obj/machinery/atmospherics/components/unary/thermomachine/freezer{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"dXq" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
- },
-/obj/machinery/light{
- dir = 4;
- light_color = "#c1caff"
- },
-/turf/open/floor/plasteel,
-/area/engine/gravity_generator)
-"dYZ" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/security/range)
-"eaI" = (
-/obj/structure/table/reinforced,
-/obj/item/radio/intercom{
- pixel_x = -30
- },
-/obj/item/stock_parts/cell/high,
-/obj/item/stock_parts/cell/high,
-/turf/open/floor/plasteel/white,
-/area/science/circuit)
-"ecg" = (
-/turf/open/floor/plasteel/yellowsiding/corner{
- dir = 4
- },
-/area/crew_quarters/fitness/pool)
-"ecE" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 5
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"edA" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/item/twohanded/required/kirbyplants{
- icon_state = "plant-04"
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"egt" = (
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/obj/machinery/requests_console{
- department = "Bar";
- departmentType = 2;
- pixel_x = -30;
- pixel_y = 45;
- receive_ore_updates = 1
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
-"eih" = (
-/obj/structure/chair{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/hallway/primary/central)
-"elh" = (
-/obj/structure/chair/comfy/black{
- dir = 8
- },
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"emX" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/yellow/visible,
-/turf/open/floor/plating/asteroid/snow/icemoon,
-/area/icemoon/surface/outdoors)
-"ene" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/security/brig)
-"enB" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall,
-/area/security/execution/transfer)
-"eon" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"epD" = (
-/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden,
-/obj/machinery/light{
- dir = 4;
- light_color = "#e8eaff"
- },
-/obj/structure/chair/sofa/right{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
-"eqd" = (
-/obj/item/electropack/shockcollar,
-/obj/item/assembly/signaler,
-/turf/open/floor/plating,
-/area/security/prison)
-"eqA" = (
-/obj/machinery/shower{
- dir = 8
- },
-/turf/open/floor/plasteel/freezer,
-/area/security/prison)
-"esK" = (
-/obj/machinery/door/airlock/maintenance/abandoned{
- name = "Chemical Storage";
- req_access_txt = "12"
- },
-/obj/structure/barricade/wooden,
-/obj/structure/girder,
-/turf/open/floor/plating,
-/area/maintenance/fore)
-"esL" = (
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/item/radio/intercom{
- pixel_y = 20
- },
-/turf/open/floor/plasteel,
-/area/security/brig)
-"esZ" = (
-/obj/machinery/door/airlock{
- desc = "Private study room where nerds are probably playing Dungeons and Dragons 13e, or a place for blood cult rituals.";
- id_tag = "PrivateStudy";
- name = "Private Study"
- },
-/obj/machinery/door/firedoor,
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/wood,
-/area/library)
-"etE" = (
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"evR" = (
-/turf/open/floor/plating,
-/area/maintenance/bar)
-"ewu" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6
- },
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "holoprivacy";
- name = "Holodeck Shutters"
- },
-/turf/open/floor/plating,
-/area/crew_quarters/fitness)
-"exP" = (
-/obj/item/twohanded/required/kirbyplants{
- icon_state = "plant-14"
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/port)
-"eyr" = (
-/obj/machinery/space_heater,
-/turf/open/floor/plating,
-/area/maintenance/fore)
-"eyM" = (
-/obj/machinery/mineral/ore_redemption{
- input_dir = 2;
- output_dir = 1
- },
-/obj/machinery/door/firedoor,
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"eAG" = (
-/obj/item/clothing/under/misc/pj/blue,
-/obj/item/clothing/shoes/sneakers/white,
-/turf/open/floor/plating,
-/area/maintenance/fore)
-"eAJ" = (
-/obj/structure/chair{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
-"eBm" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"eBX" = (
-/obj/machinery/vending/cola/space_up,
-/turf/open/floor/plasteel/dark,
-/area/hallway/primary/central)
-"eCr" = (
-/obj/structure/closet{
- name = "Suit Closet"
- },
-/obj/item/clothing/under/suit/white,
-/obj/item/clothing/under/suit/tan,
-/obj/item/clothing/under/suit/red,
-/obj/item/clothing/under/suit/black_really,
-/obj/item/clothing/under/suit/navy,
-/obj/item/clothing/under/suit/green,
-/obj/item/clothing/under/suit/black/skirt,
-/obj/item/clothing/under/suit/checkered,
-/obj/item/clothing/under/suit/charcoal,
-/obj/item/clothing/under/suit/burgundy,
-/obj/item/clothing/under/suit/black,
-/obj/item/clothing/under/rank/civilian/lawyer/black,
-/obj/item/clothing/under/suit/black,
-/obj/item/clothing/under/rank/civilian/lawyer/blue,
-/obj/item/clothing/under/rank/civilian/lawyer/bluesuit,
-/obj/item/clothing/under/rank/civilian/lawyer/female,
-/obj/item/clothing/under/rank/civilian/lawyer/purpsuit,
-/obj/item/clothing/under/rank/civilian/lawyer/really_black,
-/obj/item/clothing/under/rank/civilian/lawyer/red,
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
-"eCR" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
-/turf/closed/wall/r_wall,
-/area/engine/gravity_generator)
-"eEe" = (
-/obj/machinery/door/airlock{
- name = "Theatre Backstage";
- req_access_txt = "46"
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/wood,
-/area/crew_quarters/theatre)
-"eFx" = (
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/ai_monitored/security/armory)
-"eHa" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"eHI" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/maintenance/disposal/incinerator)
-"eJa" = (
-/obj/structure/table/wood/poker,
-/obj/item/toy/cards/deck{
- pixel_y = 5
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
- },
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"eMs" = (
-/obj/structure/rack,
-/obj/effect/spawner/lootdrop/maintenance{
- lootcount = 2;
- name = "2maintenance loot spawner"
- },
-/obj/machinery/light/small{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/fore/secondary)
-"ePe" = (
-/obj/machinery/light{
- dir = 1
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"ePU" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 4
- },
-/obj/machinery/light,
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"eQb" = (
-/turf/open/floor/carpet,
-/area/crew_quarters/dorms)
-"eSe" = (
-/obj/structure/closet/secure_closet/personal/cabinet,
-/turf/open/floor/carpet,
-/area/crew_quarters/dorms)
-"eVC" = (
-/obj/effect/spawner/structure/window,
-/obj/machinery/door/firedoor,
-/turf/open/floor/plating,
-/area/crew_quarters/cryopod)
-"eVJ" = (
-/turf/open/floor/plasteel/yellowsiding{
- dir = 1
- },
-/area/crew_quarters/fitness/pool)
-"eVL" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/light_switch{
- pixel_y = 28
- },
-/obj/machinery/light{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"eWL" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/poddoor/preopen{
- id = "Prison Gate";
- name = "prison blast door"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
-/area/security/prison)
-"eWV" = (
-/obj/machinery/door/airlock/external{
- name = "Atmospherics External Airlock";
- req_access_txt = "24"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"eXz" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/security/processing)
-"fcn" = (
-/obj/structure/lattice,
-/turf/closed/wall/r_wall,
-/area/ai_monitored/nuke_storage)
-"fcG" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 5
- },
-/turf/closed/wall/r_wall,
-/area/science/mixing)
-"fdQ" = (
-/obj/structure/bed,
-/obj/effect/spawner/lootdrop/bedsheet,
-/turf/open/floor/plating,
-/area/maintenance/fore)
-"feE" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating{
- icon_state = "panelscorched"
- },
-/area/maintenance/starboard/fore)
-"feG" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 4
- },
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"fft" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 5
- },
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
-"fgG" = (
-/obj/structure/table/wood,
-/obj/machinery/requests_console{
- department = "Theatre";
- name = "theatre RC";
- pixel_x = -32
- },
-/obj/item/reagent_containers/food/snacks/baguette,
-/obj/item/toy/dummy,
-/obj/item/lipstick/random{
- pixel_x = 2;
- pixel_y = 2
- },
-/obj/item/lipstick/random{
- pixel_x = -2;
- pixel_y = -2
- },
-/turf/open/floor/plasteel/white/side{
- dir = 4
- },
-/area/crew_quarters/theatre)
-"fjS" = (
-/obj/structure/closet/radiation,
-/turf/open/floor/plasteel,
-/area/engine/gravity_generator)
-"fkR" = (
-/obj/machinery/door/airlock/engineering/glass{
- name = "Supermatter Engine Room";
- req_access_txt = "10"
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"flc" = (
-/obj/structure/table/reinforced,
-/obj/item/storage/fancy/donut_box,
-/turf/open/floor/plasteel/white,
-/area/science/circuit)
-"flE" = (
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
-"fne" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
- },
-/obj/effect/landmark/start/mime,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel/white/side{
- dir = 4
- },
-/area/crew_quarters/theatre)
-"fnC" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
- },
-/obj/machinery/airalarm{
- dir = 4;
- pixel_x = -23
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/service)
-"foo" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 5
- },
-/obj/machinery/meter,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"foT" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/machinery/airalarm{
- pixel_y = 23
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/security/processing)
-"fpl" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "holoprivacy";
- name = "Holodeck Shutters"
- },
-/turf/open/floor/plating,
-/area/crew_quarters/fitness)
-"fpt" = (
-/obj/machinery/door/airlock/external{
- name = "Engineering External Access";
- req_access_txt = "10;13"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"fpz" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/turf/open/floor/plating,
-/area/maintenance/fore/secondary)
-"fpI" = (
-/obj/machinery/light{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/item/twohanded/required/kirbyplants{
- icon_state = "plant-06"
- },
-/turf/open/floor/plasteel/white/corner{
- dir = 1
- },
-/area/hallway/secondary/entry)
-"fpW" = (
-/obj/machinery/atmospherics/components/binary/pump{
- name = "Gas to Chamber"
- },
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"fqD" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/turf/open/floor/plating,
-/area/engine/engineering)
-"fsa" = (
-/obj/machinery/button/door{
- id = "armory3";
- name = "Armory Shutters";
- pixel_y = 26;
- req_access_txt = "3"
- },
-/obj/machinery/light{
- dir = 1;
- light_color = "#cee5d2"
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/ai_monitored/security/armory)
-"fsj" = (
-/obj/structure/table,
-/obj/item/clothing/glasses/sunglasses{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/item/clothing/glasses/sunglasses{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/item/clothing/ears/earmuffs{
- pixel_x = -3;
- pixel_y = -2
- },
-/obj/item/clothing/ears/earmuffs{
- pixel_x = -3;
- pixel_y = -2
- },
-/obj/machinery/firealarm{
- dir = 8;
- pixel_x = 24
- },
-/turf/open/floor/plasteel,
-/area/security/range)
-"ftE" = (
-/obj/item/radio/intercom{
- pixel_y = 25
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"fup" = (
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"fvY" = (
-/obj/machinery/computer/cryopod{
- pixel_y = 26
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/turf/open/floor/carpet,
-/area/crew_quarters/cryopod)
-"fxa" = (
-/obj/structure/chair/wood/normal,
-/turf/open/floor/wood{
- icon_state = "wood-broken4"
- },
-/area/maintenance/bar)
-"fxe" = (
-/obj/structure/chair/sofa,
-/obj/structure/window{
- dir = 1
- },
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"fxx" = (
-/obj/structure/disposalpipe/segment,
-/turf/closed/wall,
-/area/security/brig)
-"fxS" = (
-/obj/structure/window/plasma/reinforced{
- dir = 8
- },
-/obj/machinery/power/rad_collector/anchored,
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 9
- },
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"fxV" = (
-/turf/closed/wall/r_wall,
-/area/hallway/primary/central)
-"fxZ" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"fyS" = (
-/obj/structure/pool/ladder{
- dir = 1;
- pixel_y = -24
- },
-/turf/open/pool,
-/area/crew_quarters/fitness/pool)
-"fzd" = (
-/obj/effect/turf_decal/stripes/corner,
-/turf/open/floor/plasteel,
-/area/hydroponics)
-"fzU" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/space_heater,
-/turf/open/floor/plasteel,
-/area/hallway/secondary/entry)
-"fAj" = (
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/structure/sign/poster/official/love_ian{
- pixel_x = 32;
- pixel_y = -32
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"fAX" = (
-/obj/structure/table,
-/obj/item/stack/cable_coil,
-/obj/item/stack/cable_coil,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"fBy" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/crew_quarters/abandoned_gambling_den)
-"fCx" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/machinery/button/door{
- id = "holoprivacy";
- name = "Holodeck Privacy";
- pixel_y = 24
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
-"fFA" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hydroponics)
-"fGf" = (
-/obj/machinery/smartfridge/disks{
- pixel_y = 2
- },
-/obj/structure/table,
-/obj/item/radio/intercom{
- pixel_y = 25
- },
-/turf/open/floor/plasteel,
-/area/hydroponics)
-"fHs" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"fHG" = (
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
-"fJs" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/components/binary/pump{
- name = "Cooling Loop Bypass"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"fJY" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red,
-/turf/open/floor/plasteel,
-/area/security/processing)
-"fJZ" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"fKl" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/plasteel,
-/area/science/circuit)
-"fKv" = (
-/obj/machinery/portable_atmospherics/scrubber/huge,
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"fMp" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/dark,
-/area/security/courtroom)
-"fNu" = (
-/obj/machinery/door/airlock/external{
- name = "Atmospherics External Airlock";
- req_access_txt = "24"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/engine/atmos)
-"fOA" = (
-/obj/machinery/door/airlock{
- name = "Theatre Backstage";
- req_access_txt = "46"
- },
-/turf/open/floor/wood,
-/area/crew_quarters/theatre)
-"fOI" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/obj/item/twohanded/required/kirbyplants{
- icon_state = "plant-18"
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/entry)
-"fPL" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/turf/open/floor/wood,
-/area/crew_quarters/dorms)
-"fPM" = (
-/obj/structure/rack,
-/obj/item/clothing/head/welding{
- pixel_x = -3;
- pixel_y = 5
- },
-/obj/item/wrench,
-/obj/item/weldingtool,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"fPU" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"fTg" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/firealarm{
- pixel_y = 24
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"fTC" = (
-/obj/structure/filingcabinet,
-/obj/machinery/light{
- dir = 4;
- light_color = "#e8eaff"
- },
-/turf/open/floor/plasteel/dark,
-/area/hallway/primary/central)
-"fUP" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
- },
-/obj/machinery/door/airlock/engineering/glass/critical{
- heat_proof = 1;
- name = "Supermatter Chamber";
- req_access_txt = "10"
- },
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"fZm" = (
-/obj/structure/chair/sofa/left,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
-"gav" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 5
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red,
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/turf/open/floor/plasteel,
-/area/security/processing)
-"gbd" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hydroponics)
-"gbh" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/public/glass{
- name = "Holodeck Door"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
- },
-/turf/open/floor/plasteel/dark,
-/area/crew_quarters/fitness)
-"gbq" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/airalarm{
- dir = 1;
- pixel_y = -22
- },
-/turf/open/floor/plating,
-/area/construction)
-"gbu" = (
-/obj/structure/bed,
-/obj/effect/spawner/lootdrop/bedsheet,
-/turf/open/floor/plating,
-/area/security/prison)
-"gbT" = (
-/obj/structure/table,
-/obj/item/stack/sheet/metal/fifty,
-/obj/item/stack/sheet/glass/fifty,
-/turf/open/floor/plating,
-/area/maintenance/department/medical/morgue)
-"gcj" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"gcF" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/light_construct{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
-"gfC" = (
-/obj/effect/turf_decal/tile/red,
-/obj/structure/chair{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/fore)
-"gfD" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/carpet,
-/area/crew_quarters/cryopod)
-"gfJ" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"ghD" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
-"gii" = (
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"gjl" = (
-/turf/closed/wall,
-/area/quartermaster/warehouse)
-"gkD" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 6
- },
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
-"glC" = (
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"glY" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/obj/structure/closet/secure_closet/atmospherics,
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/turf/open/floor/plasteel/dark/corner{
- dir = 1
- },
-/area/engine/atmos)
-"gnf" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/sign/departments/custodian{
- pixel_y = -32
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"gpD" = (
-/obj/machinery/light_switch{
- pixel_y = 28
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/light{
- dir = 1
- },
-/turf/open/floor/circuit,
-/area/ai_monitored/nuke_storage)
-"grc" = (
-/obj/structure/rack,
-/obj/effect/spawner/lootdrop/maintenance{
- lootcount = 2;
- name = "2maintenance loot spawner"
- },
-/turf/open/floor/plating,
-/area/maintenance/fore/secondary)
-"grA" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/public/glass{
- name = "Holodeck Door"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 5
- },
-/turf/open/floor/plasteel/dark,
-/area/crew_quarters/fitness)
-"gsM" = (
-/obj/machinery/door/airlock/maintenance/abandoned{
- req_access_txt = "12"
- },
-/turf/open/floor/plating,
-/area/maintenance/fore)
-"gvX" = (
-/turf/open/floor/plasteel/yellowsiding,
-/area/crew_quarters/fitness/pool)
-"gwd" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/science/circuit)
-"gxc" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"gyr" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/security/brig)
-"gzf" = (
-/obj/structure/window/reinforced/tinted{
- dir = 8
- },
-/obj/structure/window/reinforced/tinted{
- dir = 4
- },
-/obj/structure/curtain,
-/turf/open/floor/mineral/titanium/blue,
-/area/crew_quarters/dorms)
-"gzv" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"gzY" = (
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plating,
-/area/maintenance/fore)
-"gAi" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"gAE" = (
-/obj/structure/rack,
-/obj/item/flashlight,
-/obj/item/crowbar/large,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"gBa" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"gBo" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/turf/open/floor/wood,
-/area/maintenance/bar)
-"gCd" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
- },
-/obj/machinery/camera{
- c_tag = "Engineering Supermatter Aft";
- network = list("ss13","engine");
- pixel_x = 23
- },
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"gCC" = (
-/obj/structure/sign/poster/contraband/tools,
-/turf/closed/wall,
-/area/storage/primary)
-"gDB" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"gDP" = (
-/obj/machinery/firealarm{
- dir = 8;
- pixel_x = 28
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6
- },
-/obj/item/radio/intercom{
- pixel_y = 20
- },
-/obj/machinery/space_heater,
-/turf/open/floor/plasteel,
-/area/security/processing)
-"gGH" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"gIy" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"gJm" = (
-/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"gLz" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/turf/open/floor/plasteel,
-/area/security/brig)
-"gLH" = (
-/obj/machinery/door/airlock/external{
- name = "External Access";
- req_access_txt = "13"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/maintenance/port/fore)
-"gMl" = (
-/obj/structure/chair/wood/normal{
- dir = 4
- },
-/turf/open/floor/wood,
-/area/maintenance/bar)
-"gNC" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/turf/open/floor/wood,
-/area/bridge/meeting_room)
-"gNE" = (
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/security/brig)
-"gOZ" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
-/turf/open/floor/plating,
-/area/crew_quarters/fitness)
-"gQX" = (
-/obj/machinery/button/door{
- id = "LockerShitter4";
- name = "Door Bolt Control";
- normaldoorcontrol = 1;
- pixel_x = 14;
- pixel_y = 38;
- specialfunctions = 4
- },
-/obj/structure/toilet/secret/low_loot{
- dir = 4
- },
-/obj/structure/sink{
- dir = 1;
- pixel_y = 25
- },
-/obj/structure/mirror{
- pixel_y = 32
- },
-/obj/machinery/light/small{
- dir = 8
- },
-/turf/open/floor/mineral/titanium/blue,
-/area/crew_quarters/toilet/locker)
-"gRZ" = (
-/obj/structure/bookcase{
- name = "Forbidden Knowledge"
- },
-/turf/open/floor/carpet,
-/area/library)
-"gTx" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/light,
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/nuke_storage)
-"gUu" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
- },
-/turf/closed/wall/r_wall,
-/area/engine/gravity_generator)
-"gWd" = (
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/turf/open/floor/plating,
-/area/construction)
-"gWo" = (
-/turf/closed/wall,
-/area/security/range)
-"gZG" = (
-/obj/structure/closet/crate/freezer/surplus_limbs,
-/obj/item/reagent_containers/glass/beaker/synthflesh,
-/turf/open/floor/plasteel/white/side{
- dir = 8
- },
-/area/medical/sleeper)
-"haM" = (
-/obj/item/radio/intercom{
- name = "Station Intercom (General)";
- pixel_y = -29
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/effect/turf_decal/tile/neutral,
-/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
-"hcb" = (
-/turf/open/floor/carpet,
-/area/crew_quarters/theatre)
-"hcA" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue,
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
-"hgO" = (
-/obj/structure/table,
-/obj/item/storage/pill_bottle/dice{
- pixel_x = 4;
- pixel_y = 4
- },
-/obj/item/reagent_containers/food/snacks/cherrycupcake,
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"hhc" = (
-/obj/machinery/light,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"hid" = (
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"hiV" = (
-/obj/effect/landmark/blobstart,
-/turf/open/floor/plating,
-/area/maintenance/department/electrical)
-"hlT" = (
-/obj/machinery/door/airlock/external{
- name = "Labor Camp Shuttle Airlock";
- req_access_txt = "2";
- shuttledocked = 1
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/security/processing)
-"hlV" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/closed/wall,
-/area/crew_quarters/dorms)
-"hnU" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/door/window/westleft{
- base_state = "right";
- dir = 4;
- icon_state = "right";
- name = "Shooting Range"
- },
-/turf/open/floor/plating,
-/area/security/range)
-"hrF" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors)
-"hsb" = (
-/obj/structure/table/wood,
-/obj/item/book/codex_gigas,
-/obj/item/clothing/under/suit/red,
-/obj/structure/destructible/cult/tome,
-/turf/open/floor/carpet,
-/area/library)
-"hsZ" = (
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"hzK" = (
-/turf/open/floor/plasteel/yellowsiding/corner{
- dir = 1
- },
-/area/crew_quarters/fitness/pool)
-"hAe" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/table/reinforced,
-/obj/item/clothing/glasses/meson/engine,
-/obj/item/clothing/gloves/color/black,
-/obj/item/tank/internals/emergency_oxygen/engi{
- pixel_x = 5
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"hBw" = (
-/obj/structure/lattice,
-/turf/closed/wall,
-/area/maintenance/fore)
-"hBA" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/table,
-/obj/item/storage/firstaid/regular{
- pixel_y = 5
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
-"hGf" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 10
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"hGH" = (
-/obj/machinery/door/airlock{
- desc = "Private study room where nerds are probably playing Dungeons and Dragons 13e, or a place for blood cult rituals.";
- id_tag = "PrivateStudy";
- name = "Private Study"
- },
-/obj/machinery/door/firedoor,
-/turf/open/floor/wood,
-/area/library)
-"hHQ" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
-"hIL" = (
-/obj/structure/sign/poster/contraband/space_up{
- pixel_x = -32;
- pixel_y = 32
- },
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"hIM" = (
-/obj/machinery/door/airlock{
- name = "Unisex Restrooms"
- },
-/obj/machinery/door/firedoor,
-/turf/open/floor/plasteel/dark,
-/area/hallway/primary/central)
-"hLJ" = (
-/obj/structure/cable,
-/turf/open/floor/plating,
-/area/engine/engineering)
-"hNw" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 8;
- name = "Atmos to Loop"
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"hOd" = (
-/obj/machinery/portable_atmospherics/scrubber,
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"hOv" = (
-/obj/structure/table/wood/fancy,
-/obj/item/reagent_containers/food/snacks/burger/plain,
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"hOI" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{
- dir = 4
- },
-/obj/machinery/airalarm{
- dir = 4;
- pixel_x = -22
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"hPs" = (
-/obj/machinery/airalarm{
- dir = 8;
- pixel_x = 23
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
- },
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/toilet/locker)
-"hPP" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 8
- },
-/turf/closed/wall,
-/area/quartermaster/warehouse)
-"hRa" = (
-/obj/structure/table/reinforced,
-/obj/machinery/light{
- dir = 8
- },
-/obj/machinery/cell_charger{
- pixel_y = 5
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/white,
-/area/science/circuit)
-"hRI" = (
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/turf/open/floor/plating,
-/area/crew_quarters/abandoned_gambling_den)
-"hSh" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"hSl" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/turf/open/floor/plating,
-/area/maintenance/fore)
-"hSZ" = (
-/obj/structure/chair/comfy/brown{
- dir = 1
- },
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"hUv" = (
-/obj/machinery/space_heater,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"hVs" = (
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"hWd" = (
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
-"iaZ" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"ibK" = (
-/turf/open/floor/plasteel,
-/area/security/processing)
-"idK" = (
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/machinery/camera{
- c_tag = "Firing Range";
- dir = 1
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/turf/open/floor/plasteel,
-/area/security/range)
-"iiW" = (
-/turf/open/floor/wood,
-/area/maintenance/bar)
-"ijG" = (
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/structure/window,
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"ikk" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/wood,
-/area/crew_quarters/theatre)
-"ikm" = (
-/obj/effect/turf_decal/tile/green{
- dir = 1
- },
-/obj/effect/turf_decal/tile/green{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"imH" = (
-/obj/structure/falsewall,
-/turf/open/floor/plating,
-/area/maintenance/bar)
-"inq" = (
-/obj/structure/table/wood,
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/plating,
-/area/maintenance/fore)
-"inw" = (
-/mob/living/simple_animal/hostile/retaliate/goose{
- desc = "Some evil loose goose.";
- name = "Cere"
- },
-/turf/open/floor/plating,
-/area/maintenance/fore)
-"inR" = (
-/obj/structure/chair/stool{
- pixel_y = 8
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/carpet{
- icon_state = "carpetsymbol"
- },
-/area/crew_quarters/theatre)
-"iou" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/firealarm{
- dir = 4;
- pixel_x = -24
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness/pool)
-"ipA" = (
-/obj/machinery/space_heater,
-/turf/open/floor/plating,
-/area/maintenance/department/medical/morgue)
-"itD" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/holopad,
-/turf/open/floor/plasteel,
-/area/security/brig)
-"itG" = (
-/obj/structure/table/reinforced,
-/obj/item/paper_bin,
-/obj/item/pen,
-/turf/open/floor/plasteel/white,
-/area/science/circuit)
-"itK" = (
-/obj/structure/table,
-/obj/effect/spawner/lootdrop/maintenance{
- lootcount = 3;
- name = "3maintenance loot spawner"
- },
-/obj/structure/light_construct{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
-"itQ" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/obj/machinery/light/small{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/security/range)
-"ium" = (
-/mob/living/simple_animal/bot/cleanbot{
- name = "C.L.E.A.N."
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"iuR" = (
-/obj/effect/turf_decal/tile/green{
- dir = 1
- },
-/obj/effect/turf_decal/tile/green{
- dir = 4
- },
-/obj/effect/turf_decal/tile/green,
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"izg" = (
-/obj/item/cigbutt/cigarbutt,
-/turf/open/floor/plating,
-/area/maintenance/fore)
-"izv" = (
-/obj/machinery/vending/clothing,
-/obj/machinery/light/small{
- dir = 4
- },
-/turf/open/floor/wood,
-/area/maintenance/bar)
-"izw" = (
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/machinery/atmospherics/components/binary/valve{
- dir = 4;
- name = "Output to Waste"
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"iBv" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness/pool)
-"iBR" = (
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
- dir = 6
- },
-/turf/open/floor/plating/asteroid/snow/icemoon,
-/area/icemoon/surface/outdoors)
-"iEJ" = (
-/obj/machinery/door/airlock/external{
- name = "Escape Pod One"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/hallway/secondary/entry)
-"iGX" = (
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 10
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"iHk" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10
- },
-/turf/closed/wall/r_wall,
-/area/engine/gravity_generator)
-"iJM" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/engine/engineering)
-"iLJ" = (
-/obj/item/reagent_containers/glass/bucket,
-/mob/living/simple_animal/pet/bumbles,
-/turf/open/floor/plasteel,
-/area/hydroponics)
-"iMv" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
-/obj/structure/table/glass,
-/obj/structure/bedsheetbin/towel,
-/obj/structure/extinguisher_cabinet{
- pixel_x = 27
- },
-/obj/machinery/light{
- dir = 4;
- light_color = "#c1caff"
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness/pool)
-"iNn" = (
-/obj/machinery/camera{
- c_tag = "Kitchen Cold Room"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/reagent_dispensers/cooking_oil,
-/turf/open/floor/plasteel/showroomfloor,
-/area/crew_quarters/kitchen)
-"iPp" = (
-/obj/structure/girder,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"iPX" = (
-/obj/structure/table,
-/obj/machinery/reagentgrinder{
- desc = "Used to grind things up into raw materials and liquids.";
- pixel_y = 5
- },
-/obj/item/lighter,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plating,
-/area/maintenance/fore)
-"iRj" = (
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/structure/sign/warning/electricshock{
- pixel_y = 32
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/fore)
-"iTq" = (
-/obj/structure/chair/stool{
- pixel_y = 8
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/turf/open/floor/carpet{
- icon_state = "carpetsymbol"
- },
-/area/crew_quarters/theatre)
-"iTU" = (
-/obj/structure/musician/piano{
- icon_state = "piano"
- },
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"iUK" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/security/vacantoffice/b)
-"iVJ" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"iVU" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/spawner/structure/window,
-/obj/machinery/door/firedoor,
-/turf/open/floor/plating,
-/area/crew_quarters/cryopod)
-"iWx" = (
-/obj/structure/rack,
-/obj/effect/spawner/lootdrop/maintenance,
-/obj/item/coin/silver,
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
-"iWD" = (
-/obj/machinery/airalarm{
- dir = 4;
- pixel_x = -22
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"iXc" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 5
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"iYC" = (
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/obj/machinery/door/firedoor/heavy,
-/obj/machinery/door/airlock/atmos{
- name = "Atmospherics";
- req_access_txt = "24"
- },
-/turf/open/floor/plasteel/dark/corner{
- dir = 1
- },
-/area/engine/atmos)
-"iYE" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/table/glass,
-/obj/item/storage/firstaid/regular,
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness/pool)
-"jaF" = (
-/obj/machinery/light/small,
-/obj/machinery/atmospherics/components/unary/tank/air{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
-"jaH" = (
-/obj/structure/door_assembly/door_assembly_mai,
-/obj/item/electronics/airlock,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/crew_quarters/abandoned_gambling_den)
-"jbf" = (
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/machinery/power/apc{
- areastring = "/area/hallway/secondary/service";
- dir = 1;
- name = "Service Hall APC";
- pixel_y = 25
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/service)
-"jex" = (
-/obj/machinery/smartfridge/organ/preloaded,
-/turf/closed/wall,
-/area/medical/sleeper)
-"jez" = (
-/obj/effect/landmark/blobstart,
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
-"jfm" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
-"jgm" = (
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/obj/machinery/camera{
- c_tag = "Circuitry Lab";
- dir = 8;
- network = list("ss13","rd")
- },
-/turf/open/floor/plasteel,
-/area/science/circuit)
-"jgA" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"jhU" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 10
- },
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors)
-"jjC" = (
-/obj/structure/table/wood,
-/obj/item/toy/cards/deck,
-/turf/open/floor/plasteel,
-/area/security/prison)
-"jkx" = (
-/obj/effect/decal/cleanable/cobweb/cobweb2,
-/obj/machinery/computer/slot_machine,
-/obj/item/coin/iron,
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
-"jkz" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 5
- },
-/turf/closed/wall/r_wall,
-/area/engine/gravity_generator)
-"jlm" = (
-/obj/machinery/rnd/production/techfab/department/cargo,
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"jmV" = (
-/obj/structure/table/wood/fancy,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/item/reagent_containers/food/drinks/britcup{
- desc = "Kingston's personal cup.";
- pixel_x = 5;
- pixel_y = 5
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
-"jqv" = (
-/obj/structure/chair/wood/normal{
- dir = 1
- },
-/turf/open/floor/wood{
- icon_state = "wood-broken7"
- },
-/area/maintenance/bar)
-"jqS" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"jrl" = (
-/obj/machinery/door/airlock/engineering/glass{
- name = "Supermatter Engine Room";
- req_access_txt = "10"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"jrE" = (
-/obj/structure/sign/poster/official/random{
- pixel_x = 32
- },
-/turf/open/floor/plasteel/white,
-/area/science/circuit)
-"jsT" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"juG" = (
-/obj/structure/table/reinforced,
-/obj/machinery/door/firedoor,
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "kitchen";
- name = "kitchen shutters"
- },
-/obj/item/reagent_containers/food/snacks/bluecherrycupcake{
- pixel_y = 5
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/kitchen)
-"juQ" = (
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"jvd" = (
-/obj/structure/closet/athletic_mixed,
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
-"jxF" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/obj/machinery/space_heater,
-/turf/open/floor/plasteel,
-/area/construction/mining/aux_base)
-"jyO" = (
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/corner{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
- },
-/turf/open/floor/plasteel,
-/area/ai_monitored/security/armory)
-"jAN" = (
-/obj/machinery/vr_sleeper{
- dir = 8
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel/white/side{
- dir = 8
- },
-/area/crew_quarters/fitness)
-"jBi" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/public/glass{
- name = "Holodeck Door"
- },
-/turf/open/floor/plasteel/dark,
-/area/crew_quarters/fitness)
-"jBA" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
- },
-/turf/closed/wall/r_wall,
-/area/engine/gravity_generator)
-"jCq" = (
-/obj/structure/disposalpipe/segment{
- dir = 5
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 5
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"jEc" = (
-/obj/machinery/vr_sleeper{
- dir = 8
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/turf/open/floor/plasteel/white/corner{
- dir = 1
- },
-/area/crew_quarters/fitness)
-"jFH" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/gravity_generator)
-"jGW" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/disposalpipe/trunk{
- dir = 4
- },
-/obj/machinery/disposal/bin,
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/machinery/light,
-/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
-"jHh" = (
-/obj/effect/landmark/start/assistant,
-/turf/open/floor/plasteel,
-/area/hallway/secondary/entry)
-"jHt" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"jIb" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 8
- },
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"jIs" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors)
-"jJF" = (
-/obj/machinery/door/airlock/maintenance,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/wood,
-/area/maintenance/port/aft)
-"jKP" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/turf/open/floor/plating,
-/area/maintenance/fore/secondary)
-"jLl" = (
-/obj/structure/rack,
-/obj/item/pickaxe{
- pixel_x = 5
- },
-/obj/item/shovel{
- pixel_x = -5
- },
-/obj/item/shovel{
- pixel_x = -5
- },
-/obj/item/shovel{
- pixel_x = -5
- },
-/obj/item/pickaxe{
- pixel_x = 5
- },
-/obj/item/pickaxe{
- pixel_x = 5
- },
-/obj/item/storage/bag/ore/large,
-/obj/item/storage/bag/ore/large,
-/obj/item/storage/bag/ore/large,
-/obj/item/clothing/suit/hooded/wintercoat/aformal,
-/obj/item/clothing/suit/hooded/wintercoat/aformal,
-/obj/item/clothing/suit/hooded/wintercoat/aformal,
-/obj/item/clothing/shoes/winterboots,
-/obj/item/clothing/shoes/winterboots,
-/obj/item/clothing/shoes/winterboots,
-/turf/open/floor/plasteel,
-/area/hallway/secondary/entry)
-"jLn" = (
-/obj/machinery/door/airlock/engineering{
- name = "Gravity Generator";
- req_access_txt = "11"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/engine/engine_smes)
-"jLT" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness/pool)
-"jMW" = (
-/obj/structure/chair/comfy/black{
- dir = 4
- },
-/obj/machinery/button/door{
- id = "PoolShut";
- name = "Pool Shutters";
- pixel_y = 24
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness/pool)
-"jRw" = (
-/obj/machinery/computer/arcade/minesweeper{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/security/prison)
-"jSO" = (
-/obj/machinery/light{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/science/circuit)
-"jTJ" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/cable,
-/obj/machinery/power/emitter/anchored{
- dir = 4;
- state = 2
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"jVl" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"jXN" = (
-/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{
- dir = 8;
- filter_type = "n2"
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"jZT" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/door/poddoor/preopen{
- id = "maint2"
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
-"kbm" = (
-/obj/machinery/door/window/brigdoor/security/cell{
- id = "Cell 2";
- name = "Cell 2"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/security/brig)
-"kbT" = (
-/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/engine_waste{
- dir = 1
- },
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/engine/engineering)
-"kdO" = (
-/obj/machinery/pool/controller,
-/turf/open/floor/plasteel/yellowsiding,
-/area/crew_quarters/fitness/pool)
-"kdP" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/security/range)
-"ker" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
-"keM" = (
-/obj/machinery/light/small{
- dir = 1
- },
-/obj/structure/window/reinforced{
- dir = 8
- },
-/obj/machinery/washing_machine,
-/turf/open/floor/plasteel/freezer,
-/area/security/prison)
-"kfv" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/turf/open/floor/plating,
-/area/storage/tech)
-"kfX" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
- },
-/turf/closed/wall/r_wall,
-/area/engine/engine_smes)
-"kgr" = (
-/obj/machinery/light/small{
- brightness = 3;
- dir = 8
- },
-/turf/open/floor/plating,
-/area/security/prison)
-"khb" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10
- },
-/obj/structure/table,
-/obj/item/kitchen/rollingpin,
-/obj/item/shovel/spade,
-/obj/item/reagent_containers/glass/bucket,
-/turf/open/floor/plasteel,
-/area/hallway/secondary/service)
-"khB" = (
-/obj/machinery/door/airlock/maintenance{
- name = "Pool Maintenance";
- req_access_txt = "12"
- },
-/turf/open/floor/plating,
-/area/maintenance/fore/secondary)
-"khU" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 4;
- name = "N2 to Pure"
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"khV" = (
-/obj/machinery/vending/cola/red,
-/obj/structure/sign/poster/contraband/robust_softdrinks{
- pixel_x = -32;
- pixel_y = 32
- },
-/turf/open/floor/plasteel/dark,
-/area/hallway/primary/central)
-"kjm" = (
-/obj/machinery/atmospherics/components/binary/pump/on{
- dir = 4;
- name = "Cooling Loop to Gas"
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"kmw" = (
-/obj/structure/chair/comfy/black{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
-"kmS" = (
-/obj/structure/dresser,
-/obj/item/flashlight/lamp/green{
- pixel_x = -2;
- pixel_y = 15
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/turf/open/floor/carpet,
-/area/crew_quarters/dorms)
-"knx" = (
-/obj/machinery/door/airlock/public/glass{
- name = "Central Access"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/machinery/door/poddoor/preopen{
- id = "bridge blast";
- name = "bridge blast door"
- },
-/obj/machinery/door/firedoor,
-/turf/open/floor/plasteel/dark,
-/area/hallway/primary/central)
-"kob" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"kqI" = (
-/obj/structure/window,
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"krn" = (
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
- dir = 9
- },
-/turf/open/floor/plating/asteroid/snow/icemoon,
-/area/icemoon/surface/outdoors)
-"ksp" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/turf/closed/wall,
-/area/engine/atmos)
-"ktP" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/turf/open/floor/plasteel,
-/area/engine/gravity_generator)
-"kuh" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden,
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/security/brig)
-"kuA" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/obj/item/radio/intercom{
- pixel_y = 20
- },
-/turf/open/floor/plasteel,
-/area/security/range)
-"kvI" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/space_heater,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"kvL" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/wood,
-/area/bridge/meeting_room)
-"kxf" = (
-/obj/machinery/vr_sleeper{
- dir = 4
- },
-/obj/effect/turf_decal/tile/green{
- dir = 8
- },
-/obj/effect/turf_decal/tile/green{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel/white/side{
- dir = 4
- },
-/area/crew_quarters/fitness)
-"kyF" = (
-/obj/effect/landmark/xeno_spawn,
-/turf/open/floor/wood,
-/area/maintenance/bar)
-"kyT" = (
-/obj/effect/landmark/loneopspawn,
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors)
-"kzT" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/closed/wall/r_wall,
-/area/science/mixing)
-"kAH" = (
-/obj/machinery/camera{
- c_tag = "Bar West";
- dir = 4
- },
-/obj/machinery/computer/arcade/orion_trail,
-/obj/structure/sign/poster/official/foam_force_ad{
- pixel_x = -32
- },
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"kAJ" = (
-/obj/machinery/portable_atmospherics/pump,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"kAO" = (
-/obj/structure/chair/sofa{
- dir = 1
- },
-/obj/structure/window,
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"kCa" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/obj/structure/window/reinforced{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/security/range)
-"kCo" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/theatre)
-"kGJ" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
-"kHd" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 4
- },
-/obj/machinery/camera{
- c_tag = "Prisoner Processing";
- dir = 8
- },
-/obj/machinery/airalarm{
- dir = 8;
- pixel_x = 24
- },
-/turf/open/floor/plasteel,
-/area/security/processing)
-"kJc" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 6
- },
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
-"kLz" = (
-/obj/structure/cable,
-/obj/machinery/power/emitter/anchored{
- dir = 4;
- state = 2
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"kMt" = (
-/obj/machinery/computer/prisoner/gulag_teleporter_computer,
-/turf/open/floor/plasteel,
-/area/security/prison)
-"kNt" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"kNv" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/structure/sign/poster/contraband/free_drone{
- pixel_y = 32
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"kOV" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/obj/machinery/light{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"kPd" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/service)
-"kPj" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/junction/flip,
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"kQk" = (
-/obj/structure/rack,
-/obj/effect/spawner/lootdrop/maintenance{
- lootcount = 2;
- name = "2maintenance loot spawner"
- },
-/obj/item/storage/toolbox/electrical,
-/turf/open/floor/plating,
-/area/maintenance/department/medical/morgue)
-"kQz" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/security/brig)
-"kSb" = (
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"kTj" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/door/airlock/maintenance/abandoned{
- name = "maintenance access";
- req_access_txt = "12"
- },
-/obj/structure/barricade/wooden,
-/obj/structure/girder,
-/turf/open/floor/plating,
-/area/maintenance/fore)
-"kUC" = (
-/obj/machinery/chem_master/condimaster,
-/turf/open/floor/plating,
-/area/maintenance/fore)
-"kVO" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/cable,
-/obj/machinery/power/emitter/anchored{
- dir = 8;
- state = 2
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"kXA" = (
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"kYk" = (
-/obj/machinery/door/firedoor,
-/obj/structure/sign/departments/evac{
- pixel_y = 32
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"kYy" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/toilet/locker)
-"kZE" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"kZS" = (
-/obj/machinery/light{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/security/brig)
-"laq" = (
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/security/range)
-"lcu" = (
-/obj/effect/spawner/lootdrop/maintenance,
-/obj/structure/reagent_dispensers/fueltank,
-/turf/open/floor/plating,
-/area/maintenance/port)
-"lfj" = (
-/obj/machinery/space_heater,
-/turf/open/floor/plating,
-/area/maintenance/disposal)
-"lfB" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/corner{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"lfV" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/landmark/event_spawn,
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/machinery/firealarm{
- pixel_y = 24
- },
-/turf/open/floor/plasteel,
-/area/security/brig)
-"lgA" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/obj/machinery/camera{
- c_tag = "Engineering Supermatter Port";
- dir = 4;
- network = list("ss13","engine")
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"lip" = (
-/obj/structure/closet{
- name = "Suit Closet"
- },
-/obj/item/clothing/under/suit/white,
-/obj/item/clothing/under/suit/tan,
-/obj/item/clothing/under/suit/red,
-/obj/item/clothing/under/suit/black_really,
-/obj/item/clothing/under/suit/navy,
-/obj/item/clothing/under/suit/green,
-/obj/item/clothing/under/suit/black/skirt,
-/obj/item/clothing/under/suit/checkered,
-/obj/item/clothing/under/suit/charcoal,
-/obj/item/clothing/under/suit/burgundy,
-/obj/item/clothing/under/suit/black,
-/obj/item/clothing/under/rank/civilian/lawyer/black,
-/obj/item/clothing/under/suit/black,
-/obj/item/clothing/under/rank/civilian/lawyer/blue,
-/obj/item/clothing/under/rank/civilian/lawyer/bluesuit,
-/obj/item/clothing/under/rank/civilian/lawyer/female,
-/obj/item/clothing/under/rank/civilian/lawyer/purpsuit,
-/obj/item/clothing/under/rank/civilian/lawyer/really_black,
-/obj/item/clothing/under/rank/civilian/lawyer/red,
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"lnk" = (
-/obj/item/radio/intercom{
- pixel_y = 25
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness/pool)
-"lnu" = (
-/obj/structure/chair/wood/normal{
- dir = 4
- },
-/turf/open/floor/wood{
- icon_state = "wood-broken6"
- },
-/area/maintenance/bar)
-"lpA" = (
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"lsk" = (
-/obj/machinery/vending/kink,
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
-"ltK" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
-"lva" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/hydroponics)
-"lwN" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/turf/open/floor/plasteel,
-/area/security/brig)
-"lzX" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 4
- },
-/obj/machinery/meter,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"lAB" = (
-/obj/structure/sign/nanotrasen,
-/turf/closed/wall,
-/area/science/circuit)
-"lAH" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/turf/open/floor/plasteel,
-/area/security/processing)
-"lBy" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/item/tank/internals/plasma,
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "engsm";
- name = "Radiation Chamber Shutters"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/engine/supermatter)
-"lBz" = (
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/machinery/door/window/northleft{
- name = "Brig Operations";
- req_one_access_txt = "4; 1"
- },
-/turf/open/floor/plasteel,
-/area/security/brig)
-"lCi" = (
-/obj/docking_port/stationary/public_mining_dock{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/construction/mining/aux_base)
-"lCo" = (
-/obj/machinery/light{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness/pool)
-"lGV" = (
-/obj/machinery/button/door{
- id = "maintdiy";
- name = "Shutters Control Button";
- pixel_x = -6;
- pixel_y = 24
- },
-/turf/open/floor/plating,
-/area/crew_quarters/abandoned_gambling_den)
-"lHe" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 6
- },
-/obj/item/wrench,
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"lHk" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 1;
- name = "External Gas to Loop"
- },
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"lIY" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"lJC" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/obj/machinery/door/airlock/external{
- name = "Escape Pod Three"
- },
-/turf/open/floor/plating,
-/area/security/main)
-"lLa" = (
-/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"lMg" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/turf/open/floor/plasteel,
-/area/science/circuit)
-"lNH" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/light_switch{
- pixel_x = 27
- },
-/turf/open/floor/plasteel,
-/area/security/processing)
-"lPl" = (
-/obj/machinery/light/small{
- dir = 4
- },
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/quartermaster/miningdock)
-"lPr" = (
-/obj/item/twohanded/required/kirbyplants{
- icon_state = "applebush"
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/port)
-"lQG" = (
-/obj/effect/spawner/structure/window,
-/turf/open/floor/plating,
-/area/science/circuit)
-"lRb" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/airalarm{
- dir = 8;
- pixel_x = 24
- },
-/turf/open/floor/plasteel,
-/area/security/range)
-"lSa" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 8
- },
-/turf/open/floor/carpet,
-/area/crew_quarters/theatre)
-"lUS" = (
-/obj/structure/table/wood/fancy/black,
-/obj/machinery/light/small,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/turf/open/floor/carpet,
-/area/crew_quarters/dorms)
-"lZl" = (
-/obj/structure/closet,
-/obj/effect/spawner/lootdrop/maintenance,
-/obj/item/coin/gold,
-/obj/item/coin/gold,
-/obj/item/coin/gold,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"lZn" = (
-/obj/machinery/door/airlock/security/glass{
- id_tag = "innerbrig";
- name = "Brig Infirmary";
- req_access_txt = "2"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
- },
-/obj/machinery/door/firedoor,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/security/brig)
-"lZs" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/closet,
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/plating,
-/area/maintenance/fore)
-"lZK" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
-/turf/closed/wall,
-/area/crew_quarters/fitness/pool)
-"mbP" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors)
-"mbU" = (
-/obj/machinery/vr_sleeper{
- dir = 8
- },
-/obj/effect/turf_decal/tile/green{
- dir = 8
- },
-/obj/effect/turf_decal/tile/green,
-/obj/effect/turf_decal/tile/green{
- dir = 4
- },
-/turf/open/floor/plasteel/white/corner{
- dir = 1
- },
-/area/crew_quarters/fitness)
-"mcp" = (
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plating,
-/area/security/range)
-"mdG" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"meb" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/bed,
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness/pool)
-"mgF" = (
-/obj/structure/bed,
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness/pool)
-"mjr" = (
-/obj/structure/reagent_dispensers/keg/milk,
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"mkv" = (
-/obj/machinery/camera{
- c_tag = "Gravity Generator Room";
- dir = 8
- },
-/obj/machinery/light{
- dir = 4;
- light_color = "#c1caff"
- },
-/turf/open/floor/plasteel,
-/area/engine/gravity_generator)
-"mkO" = (
-/obj/machinery/door/airlock{
- name = "Shower Room"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/dark,
-/area/crew_quarters/toilet)
-"mkU" = (
-/obj/machinery/door/airlock/external{
- name = "Labor Camp Shuttle Airlock"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/security/processing)
-"mml" = (
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/ai_monitored/security/armory)
-"mnC" = (
-/obj/structure/target_stake,
-/obj/item/target/syndicate,
-/turf/open/floor/plating,
-/area/security/range)
-"mos" = (
-/obj/machinery/light/small{
- dir = 8
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/obj/effect/turf_decal/tile/yellow,
-/obj/item/radio/intercom{
- desc = "Talk through this. It looks like it has been modified to not broadcast.";
- name = "Prison Intercom (General)";
- pixel_x = -27;
- pixel_y = -27;
- prison_radio = 1
- },
-/obj/machinery/flasher{
- id = "Cell 3";
- pixel_x = -24;
- pixel_y = -36
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
- },
-/obj/structure/bed,
-/obj/item/bedsheet/yellow,
-/turf/open/floor/plasteel,
-/area/security/brig)
-"moD" = (
-/obj/structure/table,
-/obj/item/reagent_containers/food/snacks/bluecherrycupcake{
- pixel_y = 5
- },
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"mps" = (
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
-"mpI" = (
-/obj/structure/table/wood,
-/turf/open/floor/wood{
- icon_state = "wood-broken5"
- },
-/area/maintenance/bar)
-"mqh" = (
-/obj/effect/turf_decal/stripes/corner,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"mqZ" = (
-/obj/structure/reagent_dispensers/keg/aphro/strong,
-/obj/item/reagent_containers/glass/beaker,
-/turf/open/floor/plating,
-/area/maintenance/bar)
-"mrR" = (
-/obj/effect/spawner/lootdrop/keg,
-/turf/open/floor/wood,
-/area/maintenance/bar)
-"msM" = (
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
- dir = 5
- },
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors)
-"mvt" = (
-/obj/machinery/airalarm{
- dir = 1;
- pixel_y = -22
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"mxn" = (
-/obj/machinery/door/airlock/external{
- name = "Escape Pod Three"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/security/main)
-"myh" = (
-/obj/structure/musician/piano,
-/obj/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/wood,
-/area/crew_quarters/theatre)
-"mzB" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/door/window,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/wood,
-/area/crew_quarters/theatre)
-"mAH" = (
-/obj/machinery/atmospherics/components/unary/tank/air{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
-"mAU" = (
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/yellow/visible,
-/turf/open/floor/plating/asteroid/snow/icemoon,
-/area/icemoon/surface/outdoors)
-"mCy" = (
-/obj/machinery/space_heater{
- anchored = 1
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"mDB" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "engsm";
- name = "Radiation Chamber Shutters"
- },
-/turf/open/floor/plating,
-/area/engine/supermatter)
-"mGw" = (
-/obj/machinery/door/airlock/security{
- name = "Labor Shuttle";
- req_access_txt = "2"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/door/firedoor,
-/turf/open/floor/plasteel,
-/area/security/range)
-"mHl" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"mHU" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/light_construct{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
-"mIZ" = (
-/obj/structure/falsewall,
-/turf/open/floor/plating,
-/area/security/prison)
-"mJo" = (
-/obj/structure/door_assembly/door_assembly_mai,
-/obj/item/electronics/airlock,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"mJG" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/wood,
-/area/crew_quarters/theatre)
-"mKq" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
-"mNi" = (
-/obj/machinery/light_switch{
- pixel_x = -20
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/white,
-/area/science/circuit)
-"mNW" = (
-/obj/structure/sign/poster/official/fruit_bowl{
- pixel_y = 32
- },
-/turf/open/floor/plasteel/white/corner{
- dir = 1
- },
-/area/hallway/primary/starboard)
-"mOB" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/door/airlock/engineering/glass{
- name = "Gravity Generator";
- req_access_txt = "11"
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/gravity_generator)
-"mPk" = (
-/obj/structure/bed,
-/obj/machinery/button/door{
- id = "Dorm5";
- name = "Cabin Bolt Control";
- normaldoorcontrol = 1;
- pixel_y = -25;
- specialfunctions = 4
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/obj/effect/spawner/lootdrop/bedsheet,
-/turf/open/floor/wood,
-/area/crew_quarters/dorms)
-"mPr" = (
-/obj/structure/rack,
-/obj/item/tank/internals/emergency_oxygen,
-/obj/item/tank/internals/emergency_oxygen,
-/obj/item/clothing/mask/breath,
-/obj/item/clothing/mask/breath,
-/obj/effect/decal/cleanable/cobweb,
-/obj/item/clothing/under/color/grey,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"mPE" = (
-/obj/machinery/chem_dispenser/drinks,
-/obj/structure/table/wood,
-/turf/open/floor/wood,
-/area/maintenance/bar)
-"mQS" = (
-/obj/machinery/light{
- dir = 8;
- light_color = "#e8eaff"
- },
-/turf/open/floor/plasteel,
-/area/engine/gravity_generator)
-"mRe" = (
-/obj/machinery/light{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/white,
-/area/science/circuit)
-"mRQ" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 4
- },
-/turf/open/floor/wood,
-/area/crew_quarters/heads/captain)
-"mTG" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"mZO" = (
-/obj/structure/sign/warning/vacuum/external{
- pixel_x = 32
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"naN" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"nbT" = (
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/preopen{
- id = "bridge blast";
- name = "bridge blast door"
- },
-/turf/open/floor/plating,
-/area/hallway/primary/central)
-"nbY" = (
-/obj/item/melee/baton/cattleprod,
-/obj/item/stock_parts/cell/high,
-/obj/item/electropack,
-/obj/structure/closet/secure_closet{
- name = "Persuasion Storage";
- req_access = "list(2)"
- },
-/turf/open/floor/plasteel/dark,
-/area/security/brig)
-"ncF" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 5
- },
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors)
-"ndq" = (
-/turf/open/floor/plating,
-/area/crew_quarters/abandoned_gambling_den)
-"nez" = (
-/obj/structure/table/wood,
-/obj/item/instrument/piano_synth,
-/turf/open/floor/wood,
-/area/crew_quarters/theatre)
-"nfm" = (
-/obj/machinery/vending/autodrobe,
-/turf/open/floor/wood,
-/area/maintenance/bar)
-"nfw" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
-"ngs" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
- },
-/turf/open/floor/wood,
-/area/crew_quarters/theatre)
-"ngU" = (
-/obj/structure/rack,
-/obj/item/storage/firstaid,
-/obj/item/clothing/glasses/hud/health,
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/plating,
-/area/maintenance/fore)
-"ngV" = (
-/obj/structure/table/wood,
-/obj/item/instrument/guitar,
-/turf/open/floor/wood,
-/area/crew_quarters/theatre)
-"nhY" = (
-/obj/structure/closet,
-/obj/effect/spawner/lootdrop/maintenance{
- lootcount = 4;
- name = "4maintenance loot spawner"
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
-"nkP" = (
-/obj/structure/rack,
-/obj/effect/spawner/lootdrop/maintenance{
- lootcount = 8;
- name = "8maintenance loot spawner"
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"nnp" = (
-/obj/structure/closet/secure_closet/medical1,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plating,
-/area/maintenance/fore)
-"noy" = (
-/obj/structure/sign/poster/contraband/smoke{
- desc = "This poster reminds us all that the Detective is a parasite. Year after year, they must get replacement lungs because of their addiction. ";
- pixel_y = -32
- },
-/turf/open/floor/plasteel/grimy,
-/area/security/detectives_office)
-"noF" = (
-/obj/machinery/door/airlock{
- name = "Instrument Storage"
- },
-/turf/open/floor/plasteel/dark,
-/area/maintenance/starboard/fore)
-"nss" = (
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/machinery/door/window/northright{
- name = "Brig Operations";
- req_one_access_txt = "4; 1"
- },
-/turf/open/floor/plasteel,
-/area/security/brig)
-"nsA" = (
-/turf/closed/wall,
-/area/crew_quarters/abandoned_gambling_den)
-"nuw" = (
-/obj/structure/table,
-/obj/effect/spawner/lootdrop/maintenance{
- lootcount = 4;
- name = "4maintenance loot spawner"
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
-"nxv" = (
-/obj/machinery/power/apc{
- areastring = "/area/construction";
- name = "Construction Area APC";
- pixel_y = -24
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/turf/open/floor/plating,
-/area/construction)
-"nyb" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/manifold/orange/visible{
- dir = 4
- },
-/obj/machinery/light{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"nBI" = (
-/obj/item/cigbutt/cigarbutt,
-/obj/effect/decal/cleanable/blood/old,
-/obj/structure/chair{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/maintenance/port/fore)
-"nEj" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/sign/warning/vacuum/external{
- pixel_y = 32
- },
-/turf/open/floor/plating,
-/area/security/processing)
-"nEI" = (
-/obj/structure/closet/emcloset/anchored,
-/obj/machinery/light/small{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"nGf" = (
-/obj/machinery/hydroponics/constructable,
-/obj/machinery/light{
- dir = 1
- },
-/turf/open/floor/plasteel/dark,
-/area/hydroponics)
-"nGt" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"nLu" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue,
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
-"nLw" = (
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue,
-/obj/structure/window{
- dir = 1
- },
-/obj/structure/window{
- dir = 4
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"nNP" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 4;
- name = "O2 to Pure"
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"nQi" = (
-/obj/machinery/recharge_station,
-/turf/open/floor/plating,
-/area/maintenance/fore/secondary)
-"nRl" = (
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
- dir = 1
- },
-/obj/machinery/button/door{
- id = "engsm";
- name = "Radiation Shutters Control";
- pixel_y = -24;
- req_access_txt = "10"
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"nRG" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"nSt" = (
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
-"nTd" = (
-/obj/machinery/space_heater,
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat/hallway)
-"nTG" = (
-/obj/structure/chair{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
- },
-/turf/open/floor/plasteel,
-/area/security/processing)
-"nUV" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hydroponics)
-"nVR" = (
-/obj/docking_port/stationary{
- dir = 4;
- dwidth = 1;
- height = 4;
- name = "escape pod loader";
- roundstart_template = /datum/map_template/shuttle/escape_pod/default;
- width = 3
- },
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors)
-"nYe" = (
-/obj/structure/safe,
-/obj/item/clothing/head/bearpelt,
-/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass,
-/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass,
-/obj/item/reagent_containers/food/drinks/bottle/vodka/badminka,
-/obj/effect/turf_decal/bot_white/left,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/item/gun/ballistic/revolver/nagant,
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/nuke_storage)
-"nZE" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/tile/neutral,
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
-"nZL" = (
-/obj/machinery/computer/arcade/minesweeper,
-/turf/open/floor/wood,
-/area/crew_quarters/heads/captain)
-"oax" = (
-/obj/structure/table/wood/fancy,
-/obj/machinery/light,
-/obj/item/reagent_containers/food/condiment/saltshaker{
- pixel_x = -3;
- pixel_y = 20
- },
-/obj/item/reagent_containers/food/condiment/peppermill{
- dir = 1;
- pixel_x = 3;
- pixel_y = 20
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
- },
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"oby" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/item/radio/intercom{
- pixel_y = 20
- },
-/turf/open/floor/plasteel,
-/area/security/brig)
-"oce" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
-/turf/open/floor/plasteel/white,
-/area/science/mixing)
-"ocv" = (
-/obj/structure/table,
-/obj/item/clothing/gloves/boxing/yellow,
-/obj/item/clothing/gloves/boxing/green,
-/obj/item/clothing/gloves/boxing/blue,
-/obj/item/clothing/gloves/boxing/blue,
-/obj/item/clothing/gloves/boxing,
-/obj/item/clothing/gloves/boxing,
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"odx" = (
-/obj/machinery/vending/kink,
-/turf/open/floor/plating,
-/area/maintenance/bar)
-"ofU" = (
-/obj/structure/chair/comfy/black{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
-"ohq" = (
-/obj/machinery/airalarm{
- dir = 4;
- pixel_x = -22
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness/pool)
-"okG" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
-"okK" = (
-/obj/machinery/light/small{
- dir = 8
- },
-/obj/effect/turf_decal/tile/green{
- dir = 8
- },
-/obj/effect/turf_decal/tile/green,
-/obj/item/radio/intercom{
- desc = "Talk through this. It looks like it has been modified to not broadcast.";
- name = "Prison Intercom (General)";
- pixel_x = -27;
- pixel_y = -27;
- prison_radio = 1
- },
-/obj/machinery/flasher{
- id = "Cell 1";
- pixel_x = -24;
- pixel_y = -36
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
- },
-/obj/structure/bed,
-/obj/item/bedsheet/green,
-/turf/open/floor/plasteel,
-/area/security/brig)
-"old" = (
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/structure/sign/departments/security{
- pixel_x = -32;
- pixel_y = -32
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/fore)
-"olr" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/white,
-/area/science/circuit)
-"omX" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/holopad,
-/turf/open/floor/plasteel,
-/area/security/prison)
-"omY" = (
-/obj/machinery/button/door{
- id = "LockerShitter4";
- name = "Door Bolt Control";
- normaldoorcontrol = 1;
- pixel_x = 14;
- pixel_y = 38;
- specialfunctions = 4
- },
-/obj/structure/toilet/secret/low_loot{
- dir = 4
- },
-/obj/structure/sink{
- dir = 1;
- pixel_y = 25
- },
-/obj/machinery/light/small{
- dir = 8
- },
-/turf/open/floor/mineral/titanium/blue,
-/area/crew_quarters/toilet/locker)
-"oqj" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
- },
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "holoprivacy";
- name = "Holodeck Shutters"
- },
-/turf/open/floor/plating,
-/area/crew_quarters/fitness)
-"oqO" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/light{
- dir = 4;
- light_color = "#c1caff"
- },
-/turf/open/floor/plasteel,
-/area/engine/gravity_generator)
-"osB" = (
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/engine/engineering)
-"ouQ" = (
-/obj/structure/table,
-/obj/item/paper_bin{
- pixel_y = 6
- },
-/obj/item/pen/fountain,
-/turf/open/floor/plasteel/dark,
-/area/hallway/primary/central)
-"ovv" = (
-/obj/structure/table,
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/machinery/recharger,
-/obj/item/gun/energy/laser/practice,
-/obj/item/gun/energy/laser/practice,
-/turf/open/floor/plasteel,
-/area/security/range)
-"owT" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/table/reinforced,
-/obj/item/geiger_counter,
-/obj/item/clothing/glasses/meson,
-/obj/item/clothing/suit/radiation,
-/obj/item/clothing/head/radiation,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"oxl" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"oxm" = (
-/obj/structure/flora/ausbushes/fullgrass,
-/obj/structure/flora/ausbushes/sparsegrass,
-/obj/structure/flora/ausbushes/ppflowers,
-/obj/structure/flora/ausbushes/ywflowers,
-/obj/structure/flora/ausbushes/brflowers,
-/obj/effect/spawner/structure/window,
-/turf/open/floor/grass,
-/area/crew_quarters/bar)
-"oyl" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue,
-/obj/machinery/door/window/eastleft{
- name = "Blue Corner"
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"oyz" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/turf/open/floor/wood,
-/area/crew_quarters/theatre)
-"oyX" = (
-/obj/machinery/atmospherics/components/binary/pump/on{
- dir = 4;
- name = "Air In"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/maintenance/fore/secondary)
-"oAb" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/closed/wall,
-/area/crew_quarters/bar)
-"oAB" = (
-/obj/structure/fireplace{
- pixel_y = -6
- },
-/turf/open/floor/carpet,
-/area/crew_quarters/dorms)
-"oDb" = (
-/obj/effect/landmark/loneopspawn,
-/turf/open/floor/plating/asteroid/snow/icemoon,
-/area/icemoon/surface/outdoors)
-"oDm" = (
-/obj/machinery/gulag_teleporter,
-/turf/open/floor/plasteel,
-/area/security/prison)
-"oDN" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
- },
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "holoprivacy";
- name = "Holodeck Shutters"
- },
-/turf/open/floor/plating,
-/area/crew_quarters/fitness)
-"oEe" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"oEr" = (
-/obj/machinery/space_heater,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"oEZ" = (
-/obj/effect/spawner/lootdrop/keg,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"oFT" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall,
-/area/storage/art)
-"oHB" = (
-/turf/open/floor/plasteel/dark,
-/area/crew_quarters/dorms)
-"oHU" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/science/circuit)
-"oIJ" = (
-/obj/structure/chair/comfy/brown{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"oIW" = (
-/obj/structure/toilet/secret/low_loot{
- dir = 8
- },
-/turf/open/floor/mineral/titanium/blue,
-/area/crew_quarters/dorms)
-"oKh" = (
-/obj/structure/chair/wood/normal{
- dir = 8
- },
-/turf/open/floor/wood,
-/area/maintenance/bar)
-"oLl" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/light_switch{
- pixel_y = -25
- },
-/turf/open/floor/plating,
-/area/crew_quarters/abandoned_gambling_den)
-"oMH" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/obj/machinery/space_heater{
- anchored = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"oNz" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/hallway/primary/central)
-"oNQ" = (
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "engsm";
- name = "Radiation Chamber Shutters"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/engine/supermatter)
-"oRG" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"oSl" = (
-/obj/machinery/door/airlock/security{
- name = "Firing Range";
- req_access_txt = "2"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/door/firedoor,
-/turf/open/floor/plasteel,
-/area/security/range)
-"oTW" = (
-/obj/structure/chair/stool{
- pixel_y = 8
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
- },
-/turf/open/floor/carpet{
- icon_state = "carpetsymbol"
- },
-/area/crew_quarters/theatre)
-"oUh" = (
-/obj/structure/disposalpipe/trunk{
- dir = 1
- },
-/obj/machinery/disposal/bin,
-/turf/open/floor/plasteel/white,
-/area/science/circuit)
-"oVo" = (
-/obj/structure/pool/ladder,
-/turf/open/pool,
-/area/crew_quarters/fitness/pool)
-"oXJ" = (
-/obj/structure/sign/warning/fire,
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
-"oYj" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/machinery/atmospherics/pipe/manifold/green/visible{
- dir = 1
- },
-/obj/machinery/firealarm{
- dir = 1;
- pixel_y = -26
- },
-/obj/machinery/camera{
- c_tag = "Engineering Supermatter Fore";
- dir = 1;
- network = list("ss13","engine");
- pixel_x = 23
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"oYS" = (
-/obj/structure/window/plasma/reinforced{
- dir = 8
- },
-/obj/machinery/power/rad_collector/anchored,
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"oZl" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/closet/wardrobe/pjs,
-/obj/item/clothing/under/rank/civilian/janitor/maid,
-/obj/machinery/light{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
-"oZv" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"pck" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/space_heater,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"pem" = (
-/obj/machinery/button/door{
- desc = "Bolts the doors to the Private Study.";
- id = "PrivateStudy";
- name = "Private Study Lock";
- pixel_x = 25;
- pixel_y = 25;
- req_access_txt = "";
- req_one_access_txt = "28;63"
- },
-/turf/open/floor/wood,
-/area/library)
-"peI" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"pgf" = (
-/turf/open/floor/mineral/titanium/blue,
-/area/crew_quarters/dorms)
-"pgn" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/security/range)
-"pjg" = (
-/obj/structure/table/wood,
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/plating,
-/area/maintenance/fore)
-"pkF" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/extinguisher_cabinet{
- pixel_x = -27;
- pixel_y = 1
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness/pool)
-"plC" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"plL" = (
-/obj/machinery/portable_atmospherics/pump,
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"plS" = (
-/obj/machinery/door/window/brigdoor/security/cell{
- id = "Cell 1";
- name = "Cell 1"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/security/brig)
-"poc" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/obj/structure/chair{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/science/mixing)
-"pou" = (
-/obj/machinery/light{
- dir = 4;
- light_color = "#e8eaff"
- },
-/turf/open/floor/plating,
-/area/crew_quarters/abandoned_gambling_den)
-"pqe" = (
-/obj/structure/chair/sofa,
-/obj/structure/window{
- dir = 1
- },
-/obj/effect/landmark/start/assistant,
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"pqs" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"psk" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel/dark,
-/area/bridge/meeting_room)
-"pst" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/door/airlock/vault,
-/obj/effect/mapping_helpers/airlock/locked,
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/nuke_storage)
-"puh" = (
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/machinery/light/small,
-/obj/structure/extinguisher_cabinet{
- pixel_x = 5;
- pixel_y = -32
- },
-/turf/open/floor/plasteel/white/side{
- dir = 1
- },
-/area/crew_quarters/fitness)
-"pzk" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/hallway/primary/central)
-"pAK" = (
-/obj/machinery/door/window/brigdoor/security/cell{
- id = "Cell 3";
- name = "Cell 3"
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/turf/open/floor/plasteel,
-/area/security/brig)
-"pBd" = (
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"pBp" = (
-/obj/effect/landmark/event_spawn,
-/turf/closed/wall,
-/area/crew_quarters/fitness)
-"pDe" = (
-/obj/machinery/door/window/southright{
- name = "Target Storage"
- },
-/obj/item/target/alien,
-/obj/item/target/alien,
-/obj/item/target/syndicate,
-/turf/open/floor/plating,
-/area/security/range)
-"pHl" = (
-/obj/structure/table,
-/obj/item/storage/box/beakers{
- pixel_x = 2;
- pixel_y = 2
- },
-/obj/item/storage/box/syringes,
-/obj/item/reagent_containers/glass/bottle/epinephrine{
- pixel_x = 7;
- pixel_y = -3
- },
-/obj/item/reagent_containers/glass/bottle/morphine{
- pixel_x = 8;
- pixel_y = -3
- },
-/obj/item/reagent_containers/syringe{
- pixel_x = 6;
- pixel_y = -3
- },
-/obj/item/radio/intercom{
- frequency = 1485;
- name = "Station Intercom (Medbay)";
- pixel_x = 30
- },
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
-"pHH" = (
-/obj/machinery/door/airlock/external{
- name = "Mining Dock Airlock";
- req_access_txt = "48";
- shuttledocked = 1
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plating,
-/area/quartermaster/miningdock)
-"pHO" = (
-/obj/effect/turf_decal/tile/blue,
-/obj/structure/sign/poster/contraband/fun_police{
- pixel_x = 32
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/fore)
-"pIf" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel/white/side{
- dir = 4
- },
-/area/crew_quarters/theatre)
-"pJR" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/chair/comfy/brown{
- dir = 1
- },
-/turf/open/floor/wood,
-/area/library)
-"pLn" = (
-/obj/machinery/conveyor/inverted{
- dir = 5;
- id = "garbage"
- },
-/turf/open/floor/plating,
-/area/maintenance/disposal)
-"pPi" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
-"pPs" = (
-/obj/structure/reflector/single/anchored{
- dir = 9
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"pPv" = (
-/obj/structure/sign/warning/radiation,
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
-"pPI" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 4
- },
-/turf/closed/wall/r_wall,
-/area/engine/gravity_generator)
-"pQp" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "holoprivacy";
- name = "Holodeck Shutters"
- },
-/turf/open/floor/plating,
-/area/crew_quarters/fitness)
-"pQr" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/effect/turf_decal/tile/green,
-/obj/effect/turf_decal/tile/green{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/security/brig)
-"pQN" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/hallway/primary/central)
-"pRg" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/closed/wall,
-/area/maintenance/aft)
-"pRs" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 5
- },
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "holoprivacy";
- name = "Holodeck Shutters"
- },
-/turf/open/floor/plating,
-/area/crew_quarters/fitness)
-"pRx" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "engsm";
- name = "Radiation Chamber Shutters"
- },
-/turf/open/floor/plating,
-/area/engine/supermatter)
-"pRW" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/maintenance/fore/secondary)
-"pSn" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
- dir = 8
- },
-/obj/machinery/light{
- dir = 8
- },
-/obj/machinery/meter,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"pUy" = (
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/security/processing)
-"pZr" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/space_heater,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"qaY" = (
-/obj/structure/table/reinforced,
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
-"qcm" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel/dark,
-/area/crew_quarters/heads/captain)
-"qeb" = (
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/machinery/power/apc{
- areastring = "/area/crew_quarters/abandoned_gambling_den";
- name = "Abandoned Gambling Den APC";
- pixel_y = -24
- },
-/turf/open/floor/plating,
-/area/crew_quarters/abandoned_gambling_den)
-"qeA" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/public/glass{
- name = "Pool"
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness/pool)
-"qeF" = (
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"qeQ" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/science/circuit)
-"qfk" = (
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/structure/window,
-/obj/structure/window{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/landmark/start/assistant,
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"qfD" = (
-/obj/machinery/door/poddoor/shutters/preopen{
- desc = "Privacy shutters for the Private Study. Stops people spying in on your game.";
- id = "PrivateStudy1";
- name = "Private Study Privacy Shutters"
- },
-/obj/effect/spawner/structure/window,
-/turf/open/floor/wood,
-/area/library)
-"qiK" = (
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 9
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"qje" = (
-/obj/structure/sign/mining{
- pixel_y = 7
- },
-/turf/closed/wall,
-/area/quartermaster/miningdock)
-"qmn" = (
-/obj/machinery/computer/libraryconsole/bookmanagement,
-/obj/structure/table,
-/turf/open/floor/plasteel,
-/area/security/prison)
-"qmG" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"qqs" = (
-/obj/structure/mirror{
- pixel_y = 32
- },
-/obj/structure/sink{
- dir = 1;
- pixel_y = 25
- },
-/turf/open/floor/mineral/titanium/blue,
-/area/crew_quarters/toilet)
-"qus" = (
-/obj/structure/table/reinforced,
-/obj/machinery/door/firedoor,
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "kitchen";
- name = "kitchen shutters"
- },
-/obj/item/reagent_containers/food/snacks/cheesynachos{
- pixel_y = 5
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/kitchen)
-"qyj" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,
-/turf/open/floor/plasteel/dark,
-/area/maintenance/fore)
-"qzA" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"qBi" = (
-/obj/structure/lattice,
-/turf/closed/wall/r_wall,
-/area/crew_quarters/heads/captain)
-"qBq" = (
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/machinery/camera{
- c_tag = "Supermatter Chamber";
- network = list("engine");
- pixel_x = 23
- },
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"qGd" = (
-/obj/machinery/atmospherics/components/binary/pump/on{
- dir = 8;
- name = "Gas to Cooling Loop"
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"qIw" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/carpet,
-/area/crew_quarters/cryopod)
-"qLR" = (
-/obj/structure/mirror{
- pixel_y = 32
- },
-/obj/structure/sink{
- dir = 1;
- pixel_y = 25
- },
-/obj/machinery/light/small{
- dir = 4
- },
-/turf/open/floor/mineral/titanium/blue,
-/area/crew_quarters/dorms)
-"qOc" = (
-/obj/effect/turf_decal/tile/green{
- dir = 8
- },
-/obj/effect/turf_decal/tile/green,
-/obj/machinery/camera{
- c_tag = "VR Sleepers";
- dir = 1
- },
-/obj/machinery/light/small,
-/turf/open/floor/plasteel/white/side{
- dir = 1
- },
-/area/crew_quarters/fitness)
-"qOB" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel/dark,
-/area/crew_quarters/heads/captain)
-"qTA" = (
-/obj/machinery/light/small{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"qTG" = (
-/obj/machinery/light{
- dir = 8
- },
-/turf/open/floor/carpet,
-/area/crew_quarters/theatre)
-"qTV" = (
-/obj/item/twohanded/required/kirbyplants{
- icon_state = "plant-22"
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"qVP" = (
-/obj/effect/spawner/structure/window,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/crew_quarters/abandoned_gambling_den)
-"qWV" = (
-/obj/machinery/pool/filter{
- pixel_y = 24
- },
-/turf/open/pool,
-/area/crew_quarters/fitness/pool)
-"qXg" = (
-/obj/structure/chair/sofa/left,
-/turf/open/floor/plasteel,
-/area/security/prison)
-"qXZ" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 8
- },
-/obj/machinery/light{
- dir = 4
- },
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"rcD" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/closed/wall/r_wall,
-/area/science/circuit)
-"rcI" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/closet/secure_closet/brig{
- id = "Cell 1";
- name = "Cell 1 Locker"
- },
-/obj/item/radio/headset{
- desc = "An updated, modular intercom that fits over the head. Takes encryption keys. It looks like it has been modified to not broadcast.";
- name = "prisoner headset";
- prison_radio = 1
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/effect/turf_decal/tile/green,
-/obj/effect/turf_decal/tile/green{
- dir = 8
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/security/brig)
-"rdG" = (
-/obj/machinery/hydroponics/constructable,
-/obj/item/radio/intercom{
- name = "Station Intercom (General)";
- pixel_x = 29
- },
-/turf/open/floor/plasteel/dark,
-/area/hydroponics)
-"reA" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/light{
- dir = 4;
- light_color = "#e8eaff"
- },
-/obj/machinery/vending/games,
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
-"rfW" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/maintenance/disposal/incinerator)
-"rgx" = (
-/obj/structure/window/plasma/reinforced{
- dir = 4
- },
-/obj/machinery/power/rad_collector/anchored,
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 5
- },
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"rhX" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/security/processing)
-"rjG" = (
-/obj/machinery/space_heater,
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"rjH" = (
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"rjQ" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/wood,
-/area/crew_quarters/theatre)
-"rmN" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
- },
-/obj/structure/chair/comfy/brown,
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"rmX" = (
-/obj/structure/table,
-/obj/item/reagent_containers/food/drinks/beer,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"rnt" = (
-/obj/structure/chair/comfy/black{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 8
- },
-/turf/open/floor/carpet,
-/area/bridge/meeting_room)
-"roP" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 10
- },
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
-"rqf" = (
-/obj/machinery/light{
- dir = 1
- },
-/obj/item/radio/intercom{
- pixel_y = 25
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"rqk" = (
-/obj/structure/reagent_dispensers/water_cooler,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/effect/turf_decal/tile/neutral,
-/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
-"rqE" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
- },
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"rqW" = (
-/obj/machinery/light/small{
- dir = 8
- },
-/obj/structure/dresser,
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/machinery/power/apc{
- areastring = "/area/crew_quarters/theatre";
- dir = 8;
- name = "Theatre APC";
- pixel_x = -25
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/theatre)
-"rrM" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 4
- },
-/obj/structure/closet/wardrobe/black,
-/obj/item/clothing/under/dress/sundress,
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
-"rtl" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/obj/machinery/camera{
- c_tag = "Bar Backroom"
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/gravity_generator)
-"rto" = (
-/obj/machinery/portable_atmospherics/scrubber,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"rtC" = (
-/obj/effect/decal/cleanable/blood/old,
-/turf/open/floor/plating,
-/area/maintenance/fore)
-"ruo" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/effect/turf_decal/tile/neutral,
-/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
-"rvr" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/structure/chair{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
-"rvC" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"rvS" = (
-/obj/structure/chair/comfy/brown{
- color = "#66b266";
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/security/prison)
-"ryr" = (
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
-"rAR" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/security/brig)
-"rBq" = (
-/obj/item/clothing/head/kitty,
-/obj/item/clothing/under/costume/maid,
-/obj/item/clothing/mask/muzzle,
-/turf/open/floor/plating,
-/area/maintenance/bar)
-"rBE" = (
-/obj/structure/ladder,
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"rBP" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"rCl" = (
-/obj/machinery/door/firedoor,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/machinery/door/airlock/security/glass{
- id_tag = "outerbrig";
- name = "Brig";
- req_access_txt = "63"
- },
-/turf/open/floor/plasteel,
-/area/security/brig)
-"rEB" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
- },
-/obj/machinery/light,
-/obj/machinery/meter,
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"rEJ" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"rGq" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/light{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"rGC" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"rIA" = (
-/obj/machinery/light{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/crew_quarters/abandoned_gambling_den)
-"rJv" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/machinery/door/poddoor/preopen{
- id = "Secure Gate";
- name = "brig shutters"
- },
-/turf/open/floor/plating,
-/area/security/brig)
-"rJw" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating/airless,
-/area/maintenance/port/fore)
-"rKP" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/construction)
-"rMN" = (
-/obj/structure/bed,
-/obj/item/tank/internals/anesthetic,
-/obj/item/clothing/mask/breath,
-/obj/effect/decal/cleanable/semen,
-/obj/effect/spawner/lootdrop/bedsheet,
-/turf/open/floor/plating,
-/area/maintenance/bar)
-"rNc" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/obj/machinery/computer/security/telescreen/toxins{
- dir = 1;
- network = list("toxins");
- pixel_y = -28
- },
-/obj/structure/chair{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/science/mixing)
-"rOg" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/obj/machinery/door/airlock/engineering/glass/critical{
- heat_proof = 1;
- name = "Supermatter Chamber";
- req_access_txt = "10"
- },
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"rPU" = (
-/turf/open/floor/plasteel/white/side{
- dir = 4
- },
-/area/crew_quarters/theatre)
-"rQJ" = (
-/obj/machinery/light/small{
- dir = 8
- },
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plating,
-/area/maintenance/fore)
-"rQX" = (
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/quartermaster/miningdock)
-"rTu" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/door/airlock/command{
- name = "Command Access To Vault";
- req_access = "19"
- },
-/turf/open/floor/plasteel/dark,
-/area/bridge/meeting_room)
-"rTD" = (
-/obj/machinery/vending/snack/random,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/dark,
-/area/hallway/primary/central)
-"rUG" = (
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"rXl" = (
-/obj/structure/chair/office/light,
-/obj/machinery/firealarm{
- dir = 4;
- pixel_x = -24
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/turf/open/floor/plasteel,
-/area/engine/gravity_generator)
-"saK" = (
-/obj/structure/closet/crate,
-/obj/item/target/alien,
-/obj/item/target/alien,
-/obj/item/target/clown,
-/obj/item/target/clown,
-/obj/item/target/syndicate,
-/obj/item/target/syndicate,
-/obj/item/gun/energy/laser/practice,
-/obj/item/gun/energy/laser/practice,
-/turf/open/floor/plasteel/white,
-/area/science/circuit)
-"saU" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/closed/wall/r_wall,
-/area/engine/engine_smes)
-"saX" = (
-/obj/item/reagent_containers/glass/bucket,
-/turf/open/floor/grass,
-/area/security/prison)
-"sci" = (
-/obj/machinery/vr_sleeper{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel/white/side{
- dir = 4
- },
-/area/crew_quarters/fitness)
-"seP" = (
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/machinery/door/poddoor/preopen{
- id = "Secure Gate";
- name = "brig shutters"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/turf/open/floor/plating,
-/area/security/brig)
-"sfs" = (
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/plating,
-/area/maintenance/fore)
-"siv" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 9
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"slk" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/turf/open/floor/plating,
-/area/maintenance/department/medical/morgue)
-"snF" = (
-/obj/structure/window/plasma/reinforced{
- dir = 4
- },
-/obj/machinery/power/rad_collector/anchored,
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"spl" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
-/obj/structure/table/reinforced,
-/obj/item/pipe_dispenser,
-/obj/item/flashlight,
-/obj/item/storage/toolbox/mechanical,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"spz" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/junction{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
-"sqg" = (
-/obj/structure/table/wood,
-/obj/item/clothing/under/misc/pj/red,
-/obj/item/clothing/shoes/sneakers/white,
-/turf/open/floor/plating,
-/area/maintenance/fore)
-"sqp" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/door/airlock/command{
- name = "Captain's Vault Access";
- req_access_txt = "20"
- },
-/turf/open/floor/plasteel/dark,
-/area/crew_quarters/heads/captain)
-"sra" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible,
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"srG" = (
-/obj/machinery/airalarm{
- dir = 1;
- pixel_y = -22
- },
-/turf/open/floor/plating,
-/area/crew_quarters/abandoned_gambling_den)
-"ssh" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"ssB" = (
-/obj/effect/turf_decal/tile/green{
- dir = 1
- },
-/obj/effect/turf_decal/tile/green{
- dir = 4
- },
-/obj/effect/turf_decal/tile/green{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"sth" = (
-/obj/structure/table/glass,
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness/pool)
-"str" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
- },
-/turf/closed/wall,
-/area/crew_quarters/fitness/pool)
-"stF" = (
-/obj/structure/closet/secure_closet/personal,
-/obj/item/toy/poolnoodle/yellow,
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness/pool)
-"svN" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/obj/machinery/light{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"swf" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 6
- },
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors)
-"sxs" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/table,
-/obj/item/storage/box/beakers{
- pixel_x = -3;
- pixel_y = 7
- },
-/obj/item/storage/box/beakers{
- pixel_x = 2;
- pixel_y = 2
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/service)
-"syJ" = (
-/obj/machinery/light{
- dir = 4
- },
-/turf/open/floor/carpet,
-/area/crew_quarters/theatre)
-"szG" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/wood,
-/area/crew_quarters/theatre)
-"sAk" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/security/brig)
-"sAM" = (
-/turf/open/floor/wood{
- icon_state = "wood-broken6"
- },
-/area/maintenance/bar)
-"sAQ" = (
-/obj/machinery/firealarm{
- dir = 8;
- pixel_x = 24
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"sCS" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"sEi" = (
-/obj/machinery/vr_sleeper{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/turf/open/floor/plasteel/white/corner{
- dir = 4
- },
-/area/crew_quarters/fitness)
-"sEt" = (
-/turf/open/floor/wood{
- icon_state = "wood-broken7"
- },
-/area/maintenance/bar)
-"sEM" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "holoprivacy";
- name = "Holodeck Shutters"
- },
-/turf/open/floor/plating,
-/area/crew_quarters/fitness)
-"sFW" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/structure/sign/departments/restroom{
- pixel_y = -32
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
-"sHx" = (
-/obj/structure/table,
-/obj/item/book/manual/hydroponics_pod_people{
- pixel_x = -4;
- pixel_y = 5
- },
-/obj/item/paper/guides/jobs/hydroponics{
- pixel_x = -5;
- pixel_y = 3
- },
-/turf/open/floor/plasteel,
-/area/hydroponics)
-"sJx" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/hydroponics)
-"sJI" = (
-/obj/structure/table/wood/fancy,
-/obj/item/reagent_containers/food/condiment/saltshaker{
- pixel_x = -3;
- pixel_y = 9
- },
-/obj/item/reagent_containers/food/condiment/peppermill{
- dir = 1;
- pixel_x = 3;
- pixel_y = 9
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
-"sKd" = (
-/obj/machinery/status_display/evac,
-/turf/closed/wall,
-/area/hallway/primary/central)
-"sLa" = (
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/structure/window{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"sLj" = (
-/obj/structure/chair/comfy/brown{
- dir = 4
- },
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"sLv" = (
-/obj/structure/closet,
-/obj/effect/spawner/lootdrop/maintenance,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"sNK" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/wood,
-/area/crew_quarters/theatre)
-"sOs" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/door/airlock/maintenance/abandoned,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"sOA" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/grimy,
-/area/security/detectives_office)
-"sPm" = (
-/obj/machinery/atmospherics/components/binary/pump/on{
- dir = 8;
- name = "Engine Coolant Bypass"
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"sPT" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
- },
-/obj/machinery/light{
- dir = 8;
- light_color = "#e8eaff"
- },
-/turf/open/floor/plasteel,
-/area/engine/gravity_generator)
-"sPY" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall/r_wall,
-/area/engine/engine_smes)
-"sRH" = (
-/obj/machinery/autolathe/secure{
- name = "public autolathe"
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"sRO" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/door/airlock/maintenance{
- req_one_access_txt = "8;12"
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"sRT" = (
-/obj/machinery/vending/cola/random,
-/turf/open/floor/wood,
-/area/maintenance/bar)
-"sSW" = (
-/obj/structure/chair/office/light,
-/turf/open/floor/plasteel/white,
-/area/science/circuit)
-"sTo" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"sTI" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"sTP" = (
-/obj/machinery/light/small{
- dir = 8
- },
-/obj/machinery/space_heater,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"sUh" = (
-/obj/machinery/atmospherics/pipe/simple/yellow/visible,
-/turf/closed/wall,
-/area/engine/atmos)
-"sVb" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/obj/structure/cable/yellow{
- icon_state = "2-8"
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"sWR" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/computer/bounty{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
-"sXl" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"sXy" = (
-/obj/machinery/door/airlock/external{
- name = "Security External Airlock";
- req_access_txt = "63"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/maintenance/fore/secondary)
-"sXA" = (
-/obj/machinery/vending/boozeomat,
-/turf/closed/wall,
-/area/maintenance/bar)
-"sXM" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/space_heater,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"sXV" = (
-/turf/closed/wall/r_wall,
-/area/security/range)
-"sYC" = (
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/turf/open/floor/plating,
-/area/engine/engineering)
-"sYR" = (
-/obj/machinery/door/airlock{
- name = "Unisex Restrooms"
- },
-/obj/machinery/door/firedoor,
-/turf/open/floor/plasteel/dark,
-/area/crew_quarters/bar)
-"sZN" = (
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 6
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"tal" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall,
-/area/hallway/secondary/service)
-"taY" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
-"tcF" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"tgH" = (
-/obj/structure/filingcabinet/employment,
-/turf/open/floor/wood,
-/area/crew_quarters/heads/captain)
-"thz" = (
-/obj/machinery/door/airlock/external{
- name = "Engineering External Access";
- req_access_txt = "10;13"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/turf/open/floor/plating,
-/area/engine/engineering)
-"tif" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"tiF" = (
-/obj/machinery/space_heater,
-/turf/open/floor/plating,
-/area/maintenance/aft)
-"tkq" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
-"tkB" = (
-/obj/structure/sign/poster/official/help_others{
- pixel_y = -32
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"tkU" = (
-/turf/open/floor/wood{
- icon_state = "wood-broken5"
- },
-/area/maintenance/bar)
-"tlu" = (
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"tmO" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/obj/machinery/light/small{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/security/range)
-"tqg" = (
-/obj/machinery/cryopod{
- dir = 4
- },
-/obj/machinery/firealarm{
- pixel_y = 24
- },
-/turf/open/floor/carpet,
-/area/crew_quarters/cryopod)
-"trb" = (
-/obj/machinery/light{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/security/courtroom)
-"ttL" = (
-/obj/structure/sign/poster/contraband/random{
- pixel_y = 32
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"tur" = (
-/obj/item/restraints/handcuffs/fake,
-/turf/open/floor/plating,
-/area/maintenance/bar)
-"tvi" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/chair/comfy/brown{
- dir = 8
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/effect/turf_decal/tile/neutral,
-/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
-"twn" = (
-/obj/machinery/door/airlock/engineering/glass{
- name = "Supermatter Engine Room";
- req_access_txt = "10"
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"tyX" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/nuke_storage)
-"tzQ" = (
-/obj/machinery/shower{
- dir = 4
- },
-/obj/item/soap,
-/turf/open/floor/mineral/titanium/blue,
-/area/crew_quarters/dorms)
-"tAC" = (
-/obj/structure/closet/athletic_mixed,
-/obj/item/toy/poolnoodle/red,
-/obj/item/toy/poolnoodle/blue,
-/obj/item/toy/poolnoodle/yellow,
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness/pool)
-"tAH" = (
-/obj/machinery/door/airlock/external{
- req_access_txt = "13"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/maintenance/fore/secondary)
-"tAR" = (
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"tCa" = (
-/obj/structure/table/wood,
-/obj/item/instrument/guitar{
- pixel_x = -7
- },
-/obj/item/instrument/eguitar{
- pixel_x = 5
- },
-/obj/item/instrument/violin,
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"tCd" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/effect/turf_decal/tile/blue{
- alpha = 255;
- dir = 1
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"tGG" = (
-/obj/structure/reflector/double/anchored{
- dir = 6
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"tHh" = (
-/obj/machinery/disposal/bin,
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/structure/disposalpipe/trunk,
-/obj/structure/window/reinforced{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/security/brig)
-"tIV" = (
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"tJi" = (
-/obj/machinery/airalarm{
- dir = 4;
- pixel_x = -22
- },
-/obj/structure/closet/crate/wooden/toy,
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/structure/sign/poster/contraband/clown{
- pixel_y = -32
- },
-/obj/item/megaphone/clown,
-/turf/open/floor/plasteel,
-/area/crew_quarters/theatre)
-"tJK" = (
-/obj/machinery/door/airlock/engineering{
- name = "Gravity Generator";
- req_access_txt = "11"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/engine/gravity_generator)
-"tJS" = (
-/obj/effect/spawner/lootdrop/keg,
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
-"tKb" = (
-/obj/item/radio/intercom{
- pixel_y = 20
- },
-/turf/open/floor/plating,
-/area/security/vacantoffice/b)
-"tKk" = (
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/structure/sign/warning/fire{
- desc = "A sign that states the labeled room's number.";
- icon_state = "roomnum";
- name = "Room Number 1";
- pixel_x = -30;
- pixel_y = -7
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
-"tMj" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 9
- },
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors)
-"tMl" = (
-/obj/effect/turf_decal/loading_area,
-/turf/open/floor/plasteel/showroomfloor,
-/area/crew_quarters/kitchen)
-"tNF" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/engine/gravity_generator)
-"tOn" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{
- dir = 4
- },
-/obj/machinery/meter,
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"tOq" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/mixing)
-"tPe" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
-"tPT" = (
-/obj/machinery/chem_dispenser/drinks/beer,
-/obj/structure/table/wood,
-/turf/open/floor/wood,
-/area/maintenance/bar)
-"tQY" = (
-/obj/machinery/atmospherics/components/binary/valve/digital/on{
- dir = 4;
- name = "Output Release"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"tRe" = (
-/obj/machinery/chem_master,
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"tRi" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 4
- },
-/obj/machinery/meter,
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"tRB" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 5
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
-"tRF" = (
-/obj/machinery/light/small{
- dir = 8
- },
-/turf/open/floor/wood,
-/area/maintenance/bar)
-"tWj" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
- },
-/turf/open/floor/wood,
-/area/crew_quarters/theatre)
-"tXL" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
-/turf/closed/wall/r_wall,
-/area/maintenance/disposal/incinerator)
-"tZe" = (
-/obj/effect/turf_decal/bot,
-/obj/structure/sign/poster/official/pda_ad{
- pixel_y = -32
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"uaw" = (
-/obj/machinery/power/apc{
- areastring = "/area/storage/art";
- dir = 1;
- name = "Maint bar";
- pixel_y = 24
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/turf/open/floor/wood,
-/area/maintenance/bar)
-"ubj" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/machinery/door/window/westright{
- name = "Red Corner"
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"ucq" = (
-/obj/structure/sign/poster/contraband/red_rum{
- pixel_y = 32
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"uei" = (
-/obj/structure/sign/warning/vacuum/external{
- pixel_y = 32
- },
-/turf/open/floor/plating,
-/area/maintenance/fore/secondary)
-"ufD" = (
-/obj/machinery/vr_sleeper{
- dir = 4
- },
-/obj/effect/turf_decal/tile/green{
- dir = 8
- },
-/obj/effect/turf_decal/tile/green,
-/obj/effect/turf_decal/tile/green{
- dir = 1
- },
-/turf/open/floor/plasteel/white/corner{
- dir = 4
- },
-/area/crew_quarters/fitness)
-"uge" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 4;
- name = "Gas to Mix"
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"ugu" = (
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plasteel,
-/area/engine/gravity_generator)
-"uhm" = (
-/obj/machinery/door/airlock{
- name = "Recharging Station"
- },
-/turf/open/floor/plating,
-/area/maintenance/fore/secondary)
-"ujv" = (
-/obj/structure/sign/departments/restroom,
-/turf/closed/wall,
-/area/crew_quarters/toilet)
-"ujF" = (
-/obj/machinery/cryopod{
- dir = 4
- },
-/turf/open/floor/carpet,
-/area/crew_quarters/cryopod)
-"ujS" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness/pool)
-"ulB" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 1
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"ulM" = (
-/obj/structure/closet/secure_closet/personal,
-/obj/item/toy/poolnoodle/red,
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness/pool)
-"uml" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 9
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"unA" = (
-/obj/machinery/light{
- dir = 8
- },
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"unR" = (
-/turf/open/floor/plasteel/yellowsiding{
- dir = 8
- },
-/area/crew_quarters/fitness/pool)
-"uoB" = (
-/obj/structure/table/reinforced,
-/obj/item/multitool,
-/obj/item/screwdriver,
-/obj/machinery/camera{
- c_tag = "Circuitry Lab North";
- network = list("ss13","rd")
- },
-/turf/open/floor/plasteel/white,
-/area/science/circuit)
-"uoG" = (
-/obj/machinery/power/apc{
- areastring = "/area/security/detectives_office";
- dir = 4;
- name = "Detective's Office APC";
- pixel_x = 24
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/turf/open/floor/plasteel/grimy,
-/area/security/detectives_office)
-"uqX" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 4
- },
-/obj/machinery/meter,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"usE" = (
-/obj/effect/spawner/lootdrop/maintenance,
-/obj/structure/rack,
-/turf/open/floor/plating,
-/area/maintenance/fore)
-"usO" = (
-/obj/machinery/vending/snack/random,
-/obj/machinery/light/small{
- dir = 4
- },
-/turf/open/floor/wood,
-/area/maintenance/bar)
-"utp" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 4
- },
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors)
-"uua" = (
-/obj/machinery/atmospherics/components/binary/valve,
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
-"uut" = (
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 6
- },
-/obj/effect/turf_decal/stripes/corner,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"uuG" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"uvd" = (
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/turf/open/floor/plating,
-/area/engine/engineering)
-"uve" = (
-/obj/structure/table,
-/obj/effect/spawner/lootdrop/maintenance,
-/obj/item/coin/silver,
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
-"uvZ" = (
-/obj/structure/mineral_door/wood,
-/turf/open/floor/wood,
-/area/maintenance/bar)
-"uxY" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/structure/disposalpipe/junction,
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/effect/turf_decal/tile/neutral,
-/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
-"uzi" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 1
- },
-/obj/machinery/portable_atmospherics/canister/nitrogen,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"uzs" = (
-/turf/open/floor/plasteel/yellowsiding{
- dir = 4
- },
-/area/crew_quarters/fitness/pool)
-"uAH" = (
-/turf/open/floor/plasteel/yellowsiding/corner{
- dir = 8
- },
-/area/crew_quarters/fitness/pool)
-"uBa" = (
-/obj/structure/table,
-/obj/item/reagent_containers/food/drinks/soda_cans/starkist{
- pixel_x = 5;
- pixel_y = 7
- },
-/obj/item/reagent_containers/food/drinks/soda_cans/dr_gibb{
- pixel_x = -3;
- pixel_y = 2
- },
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"uBP" = (
-/obj/structure/reflector/box/anchored{
- dir = 1
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"uCo" = (
-/obj/structure/chair{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/maintenance/fore)
-"uCU" = (
-/obj/machinery/door/airlock/security{
- name = "Interrogation";
- req_access_txt = "2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/door/firedoor,
-/turf/open/floor/plasteel/dark,
-/area/security/brig)
-"uDO" = (
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors)
-"uEx" = (
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "PoolShut";
- name = "Pool Shutters"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/crew_quarters/fitness/pool)
-"uEI" = (
-/obj/structure/chair/comfy/brown{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/security/prison)
-"uFp" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/sign/poster/official/cohiba_robusto_ad{
- pixel_y = -32
- },
-/turf/open/floor/plasteel/grimy,
-/area/security/detectives_office)
-"uFZ" = (
-/obj/structure/closet/emcloset,
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/obj/machinery/light{
- light_color = "#cee5d2"
- },
-/turf/open/floor/plasteel,
-/area/security/processing)
-"uGI" = (
-/turf/open/floor/grass,
-/area/security/prison)
-"uHp" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall,
-/area/security/main)
-"uIO" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/effect/turf_decal/tile/neutral,
-/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
-"uJx" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/carpet,
-/area/crew_quarters/theatre)
-"uNu" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line,
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/turf/open/floor/plasteel,
-/area/science/circuit)
-"uOJ" = (
-/obj/effect/mapping_helpers/airlock/locked,
-/obj/machinery/door/airlock/vault,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/nuke_storage)
-"uPT" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/closed/wall/r_wall,
-/area/maintenance/disposal/incinerator)
-"uQS" = (
-/obj/machinery/light/small,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
- },
-/turf/open/floor/mineral/titanium/blue,
-/area/crew_quarters/toilet)
-"uRd" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 5
- },
-/turf/closed/wall/r_wall,
-/area/engine/gravity_generator)
-"uRx" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 10
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"uRS" = (
-/obj/structure/chair/stool{
- pixel_y = 8
- },
-/turf/open/floor/carpet{
- icon_state = "carpetsymbol"
- },
-/area/crew_quarters/theatre)
-"uSC" = (
-/obj/machinery/pool/drain,
-/turf/open/pool,
-/area/crew_quarters/fitness/pool)
-"uSL" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 10
- },
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
-"uTe" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/security/brig)
-"uUi" = (
-/obj/effect/decal/cleanable/vomit,
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/plating,
-/area/maintenance/fore)
-"uVS" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"uWy" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
- },
-/obj/machinery/space_heater,
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
-"uXt" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/turf/open/floor/plasteel,
-/area/security/brig)
-"vaW" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
-"vbi" = (
-/obj/structure/table,
-/obj/item/instrument/guitar{
- pixel_x = -7
- },
-/obj/item/instrument/eguitar{
- pixel_x = 5
- },
-/obj/item/instrument/violin,
-/obj/item/instrument/trombone,
-/obj/item/instrument/saxophone,
-/obj/item/instrument/piano_synth,
-/obj/item/instrument/recorder,
-/obj/item/instrument/accordion,
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
-"vbD" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/command/glass{
- name = "EVA Storage";
- req_access_txt = "18"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/ai_monitored/storage/eva)
-"vcN" = (
-/obj/machinery/light{
- dir = 4
- },
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"vda" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/obj/structure/window/reinforced{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/security/range)
-"vdu" = (
-/obj/structure/table/wood,
-/obj/machinery/airalarm{
- dir = 1;
- pixel_y = -22
- },
-/turf/open/floor/wood,
-/area/security/vacantoffice)
-"veS" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/closed/wall,
-/area/crew_quarters/fitness/pool)
-"vfX" = (
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/security/brig)
-"vgJ" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/power/apc{
- areastring = "/area/maintenance/fore";
- dir = 1;
- name = "Fore Maintenance APC";
- pixel_y = 24
- },
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/turf/open/floor/plating,
-/area/maintenance/fore)
-"vhb" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/structure/window{
- dir = 1
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/locker)
-"viD" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/structure/cable/yellow{
- icon_state = "2-8"
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"viF" = (
-/obj/structure/table/wood,
-/obj/item/instrument/trumpet,
-/turf/open/floor/wood,
-/area/crew_quarters/theatre)
-"vjm" = (
-/obj/structure/table/wood,
-/obj/item/reagent_containers/rag,
-/obj/machinery/light/small{
- dir = 1
- },
-/turf/open/floor/wood,
-/area/maintenance/bar)
-"vke" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/toilet/locker)
-"vmQ" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10
- },
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "holoprivacy";
- name = "Holodeck Shutters"
- },
-/turf/open/floor/plating,
-/area/crew_quarters/fitness)
-"vnu" = (
-/obj/machinery/status_display/evac,
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
-"vnI" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/power/apc{
- areastring = "/area/quartermaster/warehouse";
- dir = 4;
- name = "Cargo Warehouse APC";
- pixel_x = 26
- },
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"voa" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 9
- },
-/obj/machinery/meter,
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
-"vob" = (
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/turf/open/floor/plating,
-/area/engine/supermatter)
-"voW" = (
-/obj/structure/pool/Lboard,
-/turf/open/pool,
-/area/crew_quarters/fitness/pool)
-"vpY" = (
-/obj/structure/closet/lasertag/blue,
-/obj/item/clothing/under/misc/pj/blue,
-/obj/item/clothing/under/misc/pj/blue,
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
-"vqP" = (
-/obj/structure/bed/dogbed{
- desc = "A comfy-looking pet bed. You can even strap your pet in, in case the gravity turns off.";
- name = "pet bed"
- },
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/plating,
-/area/maintenance/fore)
-"vsM" = (
-/obj/machinery/power/apc/auto_name/south,
-/obj/structure/cable,
-/turf/open/floor/carpet,
-/area/crew_quarters/cryopod)
-"vsQ" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/structure/closet/emcloset,
-/turf/open/floor/plasteel/white/corner{
- dir = 1
- },
-/area/hallway/secondary/entry)
-"vsT" = (
-/obj/structure/closet/crate,
-/obj/item/book/manual/wiki/telescience,
-/obj/item/book/manual/wiki/engineering_guide,
-/obj/item/book/manual/wiki/engineering_construction,
-/obj/item/book/manual/wiki/atmospherics,
-/obj/item/book/manual/wiki/detective,
-/obj/item/book/manual/wiki/tcomms,
-/obj/item/book/manual/wiki/engineering_singulo_tesla,
-/obj/item/book/manual/wiki/experimentor,
-/obj/item/book/manual/wiki/research_and_development,
-/obj/item/book/manual/wiki/robotics_cyborgs,
-/obj/item/book/manual/wiki/security_space_law,
-/obj/item/book/manual/wiki/medicine,
-/obj/item/book/manual/wiki/medical_cloning,
-/obj/item/book/manual/wiki/infections,
-/obj/item/book/manual/ripley_build_and_repair,
-/obj/item/book/manual/hydroponics_pod_people,
-/obj/item/book/manual/wiki/toxins,
-/obj/item/book/manual/wiki/grenades,
-/obj/item/book{
- desc = "An undeniably handy book.";
- icon_state = "bookknock";
- name = "A Simpleton's Guide to Safe-cracking with Stethoscopes"
- },
-/turf/open/floor/wood,
-/area/library)
-"vwZ" = (
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"vxh" = (
-/obj/structure/table,
-/obj/effect/spawner/lootdrop/maintenance{
- lootcount = 8;
- name = "8maintenance loot spawner"
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"vxV" = (
-/obj/structure/reflector/single/anchored{
- dir = 5
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"vxX" = (
-/obj/machinery/door/airlock/external{
- name = "Labor Camp Shuttle Airlock"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/security/processing)
-"vyp" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/closed/wall,
-/area/crew_quarters/dorms)
-"vyK" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/machinery/door/poddoor/preopen{
- id = "Secure Gate";
- name = "brig shutters"
- },
-/turf/open/floor/plating,
-/area/security/brig)
-"vzp" = (
-/obj/structure/table/reinforced,
-/obj/machinery/firealarm{
- dir = 4;
- pixel_x = -24
- },
-/obj/item/stock_parts/cell/high,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/white,
-/area/science/circuit)
-"vzO" = (
-/obj/structure/chair/wood/normal{
- dir = 1
- },
-/turf/open/floor/wood,
-/area/maintenance/bar)
-"vAi" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"vAl" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/obj/machinery/camera{
- c_tag = "Pool East";
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness/pool)
-"vBa" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 5
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel/dark,
-/area/bridge/meeting_room)
-"vCa" = (
-/obj/machinery/light/small{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"vCb" = (
-/obj/machinery/rnd/production/techfab/department/service,
-/turf/open/floor/plasteel,
-/area/hallway/secondary/service)
-"vCn" = (
-/obj/structure/chair{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/hallway/primary/central)
-"vCt" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/turf/open/floor/plasteel/white,
-/area/science/circuit)
-"vCy" = (
-/obj/machinery/power/apc{
- areastring = "/area/maintenance/starboard/fore";
- dir = 1;
- name = "Starboard Bow Maintenance APC";
- pixel_y = 24
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
-"vEc" = (
-/obj/machinery/power/supermatter_crystal/engine,
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"vEi" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/extinguisher_cabinet{
- pixel_x = 5;
- pixel_y = -32
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"vEp" = (
-/obj/structure/sign/poster/contraband/lizard{
- pixel_x = -32
- },
-/obj/structure/sign/poster/contraband/lizard{
- pixel_x = -32
- },
-/obj/structure/sign/poster/contraband/lizard{
- pixel_x = -32
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
-"vFr" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plasteel,
-/area/engine/gravity_generator)
-"vGn" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/security/glass{
- name = "Prisoner Processing";
- req_access_txt = "2"
- },
-/turf/open/floor/plasteel,
-/area/security/processing)
-"vHj" = (
-/obj/machinery/door/airlock/public/glass{
- name = "Cryogenics "
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/door/firedoor,
-/turf/open/floor/plasteel,
-/area/crew_quarters/cryopod)
-"vHx" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/manifold/green/visible{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"vHz" = (
-/obj/structure/chair{
- dir = 8
- },
-/obj/machinery/light/small{
- dir = 4;
- light_color = "#d8b1b1"
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
-"vHT" = (
-/obj/machinery/door/firedoor,
-/obj/structure/sign/departments/evac{
- pixel_y = -32
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/starboard)
-"vHY" = (
-/turf/open/floor/plating,
-/area/science/mixing)
-"vIi" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/machinery/light{
- dir = 4
- },
-/obj/machinery/power/apc{
- areastring = "/area/security/range";
- dir = 4;
- name = "Firing Range APC";
- pixel_x = 24
- },
-/turf/open/floor/plasteel,
-/area/security/range)
-"vIo" = (
-/obj/machinery/light{
- dir = 4;
- light_color = "#e8eaff"
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/camera{
- c_tag = "Brig East";
- dir = 8
- },
-/obj/machinery/firealarm{
- pixel_y = 24
- },
-/turf/open/floor/plasteel,
-/area/security/brig)
-"vJu" = (
-/obj/machinery/disposal/bin,
-/obj/structure/disposalpipe/trunk{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"vLo" = (
-/obj/structure/closet/secure_closet/chemical,
-/obj/machinery/light/small{
- dir = 1
- },
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plating,
-/area/maintenance/fore)
-"vLM" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"vOF" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 4
- },
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
-"vOU" = (
-/obj/structure/sign/warning/securearea,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/closed/wall/r_wall,
-/area/ai_monitored/nuke_storage)
-"vPs" = (
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors)
-"vPE" = (
-/obj/machinery/light{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/circuit)
-"vTP" = (
-/obj/machinery/door/airlock/external{
- name = "Labor Camp Shuttle Airlock";
- req_access_txt = "2"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/security/processing)
-"vUs" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 8;
- name = "Mix to Gas"
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"vUI" = (
-/obj/machinery/status_display/evac,
-/turf/closed/wall,
-/area/ai_monitored/storage/eva)
-"vZA" = (
-/obj/structure/cable,
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors)
-"vZR" = (
-/obj/structure/chair/comfy/brown{
- dir = 1
- },
-/turf/open/floor/wood,
-/area/library)
-"wag" = (
-/obj/structure/chair/comfy/black{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness/pool)
-"wbd" = (
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"wbE" = (
-/obj/effect/turf_decal/tile/blue{
- alpha = 255
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- alpha = 255;
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
-"wcr" = (
-/obj/machinery/portable_atmospherics/pump,
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"wcB" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10
- },
-/obj/structure/chair/comfy/brown{
- dir = 4
- },
-/turf/open/floor/carpet,
-/area/crew_quarters/heads/captain)
-"wcR" = (
-/turf/open/floor/plasteel/yellowsiding/corner,
-/area/crew_quarters/fitness/pool)
-"wdr" = (
-/obj/machinery/door/window/southleft{
- name = "Target Storage"
- },
-/obj/item/target/clown,
-/obj/item/target/clown,
-/obj/item/target,
-/obj/item/target,
-/turf/open/floor/plating,
-/area/security/range)
-"wfR" = (
-/obj/item/electropack/shockcollar,
-/obj/item/assembly/signaler,
-/turf/open/floor/plating,
-/area/maintenance/bar)
-"wgZ" = (
-/obj/structure/cable,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"wig" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 5
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness/pool)
-"wiI" = (
-/obj/machinery/space_heater,
-/turf/open/floor/wood,
-/area/security/vacantoffice)
-"wje" = (
-/obj/structure/rack,
-/obj/item/instrument/banjo,
-/obj/item/instrument/harmonica,
-/obj/item/instrument/accordion,
-/obj/item/instrument/recorder,
-/turf/open/floor/plating,
-/area/maintenance/fore)
-"wjz" = (
-/obj/structure/table,
-/obj/item/pipe_dispenser,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"wkN" = (
-/turf/closed/wall,
-/area/science/circuit)
-"wlf" = (
-/obj/machinery/door/airlock/engineering/glass{
- name = "Supermatter Engine Room";
- req_access_txt = "10"
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"wlI" = (
-/obj/machinery/holopad,
-/turf/open/floor/plasteel/showroomfloor,
-/area/security/main)
-"woR" = (
-/obj/machinery/cryopod{
- dir = 1
- },
-/turf/open/floor/carpet,
-/area/crew_quarters/cryopod)
-"wph" = (
-/obj/docking_port/stationary{
- area_type = /area/construction/mining/aux_base;
- dheight = 4;
- dir = 8;
- dwidth = 4;
- height = 9;
- id = "aux_base_zone";
- name = "aux base zone";
- roundstart_template = /datum/map_template/shuttle/aux_base/default;
- width = 9
- },
-/turf/open/floor/plating,
-/area/construction/mining/aux_base)
-"wpr" = (
-/obj/machinery/space_heater,
-/turf/open/floor/plating,
-/area/maintenance/port)
-"wql" = (
-/obj/structure/extinguisher_cabinet,
-/turf/closed/wall/r_wall,
-/area/hallway/primary/central)
-"wqF" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/chair/comfy/brown{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/machinery/airalarm{
- dir = 1;
- pixel_y = -22
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
-"wrp" = (
-/obj/machinery/light{
- dir = 8
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/service)
-"wun" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"wvX" = (
-/obj/structure/table/reinforced,
-/obj/machinery/light,
-/obj/item/stack/sheet/metal/ten,
-/turf/open/floor/plasteel/white,
-/area/science/circuit)
-"wxT" = (
-/obj/structure/chair/sofa/left,
-/obj/structure/window{
- dir = 1
- },
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
-"wzX" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/layer_manifold,
-/turf/open/floor/plating,
-/area/engine/atmos)
-"wAh" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 4
- },
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"wAN" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"wBd" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
- },
-/turf/closed/wall,
-/area/hallway/secondary/service)
-"wHk" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness/pool)
-"wHz" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 5
- },
-/turf/closed/wall/r_wall,
-/area/maintenance/disposal/incinerator)
-"wHR" = (
-/obj/machinery/light,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/machinery/space_heater,
-/turf/open/floor/plasteel/white/corner,
-/area/hallway/secondary/entry)
-"wHT" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
-"wIY" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"wJF" = (
-/obj/machinery/space_heater,
-/turf/open/floor/plating,
-/area/storage/tech)
-"wKe" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "maintdiy";
- name = "Security Shutters"
- },
-/turf/open/floor/plating,
-/area/crew_quarters/abandoned_gambling_den)
-"wKZ" = (
-/turf/open/floor/engine,
-/area/engine/engineering)
-"wLY" = (
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"wQg" = (
-/obj/structure/pool/ladder{
- dir = 2;
- pixel_y = 24
- },
-/turf/open/pool,
-/area/crew_quarters/fitness/pool)
-"wTf" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
-"wUg" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
- },
-/obj/machinery/airalarm{
- dir = 4;
- pixel_x = -22
- },
-/turf/open/floor/plasteel,
-/area/engine/gravity_generator)
-"wUr" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/carpet,
-/area/crew_quarters/theatre)
-"wUY" = (
-/obj/structure/table,
-/obj/item/stack/packageWrap,
-/obj/item/stack/packageWrap,
-/obj/item/hand_labeler,
-/turf/open/floor/plasteel,
-/area/hallway/secondary/service)
-"wWu" = (
-/turf/open/openspace/icemoon,
-/area/icemoon/surface/outdoors)
-"wWT" = (
-/obj/effect/landmark/start/roboticist,
-/turf/open/floor/plasteel/white,
-/area/science/robotics/lab)
-"wWW" = (
-/obj/structure/closet/secure_closet/personal,
-/obj/item/toy/poolnoodle/yellow,
-/obj/machinery/button/door{
- id = "PoolShut";
- name = "Pool Shutters";
- pixel_y = 24
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness/pool)
-"wXl" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/obj/machinery/camera{
- c_tag = "Pool West";
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness/pool)
-"wYc" = (
-/obj/machinery/vr_sleeper{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/security/prison)
-"wZI" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel/dark,
-/area/crew_quarters/heads/captain)
-"xal" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/machinery/door/poddoor/preopen{
- id = "Secure Gate";
- name = "brig shutters"
- },
-/turf/open/floor/plating,
-/area/security/brig)
-"xaB" = (
-/obj/structure/closet/athletic_mixed,
-/obj/item/toy/poolnoodle/red,
-/obj/item/toy/poolnoodle/blue,
-/obj/item/toy/poolnoodle/yellow,
-/obj/machinery/button/door{
- id = "PoolShut";
- name = "Pool Shutters";
- pixel_y = 24
- },
-/obj/machinery/light{
- dir = 4;
- light_color = "#c1caff"
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness/pool)
-"xaS" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/firealarm{
- dir = 8;
- pixel_x = 24
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"xbn" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
- },
-/obj/structure/table,
-/obj/item/coin/gold,
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
-"xfY" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"xgk" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"xgC" = (
-/obj/machinery/power/apc{
- areastring = "/area/engine/gravity_generator";
- dir = 8;
- name = "Gravity Generator APC";
- pixel_x = -25;
- pixel_y = 1
- },
-/obj/structure/table,
-/obj/item/paper/guides/jobs/engi/gravity_gen,
-/obj/item/pen/blue,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/machinery/light{
- dir = 8;
- light_color = "#e8eaff"
- },
-/turf/open/floor/plasteel,
-/area/engine/gravity_generator)
-"xgF" = (
-/obj/structure/chair/stool/bar,
-/turf/open/floor/wood{
- icon_state = "wood-broken5"
- },
-/area/maintenance/bar)
-"xhS" = (
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line,
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/turf/open/floor/plasteel,
-/area/engine/gravity_generator)
-"xhV" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/turf/open/floor/plating,
-/area/construction)
-"xib" = (
-/obj/machinery/door/window/westleft{
- base_state = "right";
- icon_state = "right";
- name = "Unisex Showers"
- },
-/turf/open/floor/plasteel/freezer,
-/area/security/prison)
-"xiw" = (
-/obj/machinery/door/airlock{
- name = "Service Hall";
- req_one_access_txt = "25;26;35;28"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/hallway/secondary/service)
-"xkd" = (
-/obj/machinery/light/small{
- dir = 4;
- light_color = "#d8b1b1"
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
-"xmo" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/wood,
-/area/crew_quarters/theatre)
-"xmS" = (
-/obj/structure/chair/comfy/beige{
- dir = 8
- },
-/obj/effect/landmark/start/assistant,
-/turf/open/floor/plasteel/grimy,
-/area/hallway/secondary/entry)
-"xnm" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/security/brig)
-"xol" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
- dir = 8
- },
-/obj/machinery/meter,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"xqG" = (
-/obj/structure/table/reinforced,
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/obj/item/reagent_containers/food/drinks/soda_cans/starkist{
- pixel_x = -3;
- pixel_y = 5
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
-"xrc" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"xrN" = (
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/light,
-/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
-"xtP" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/turf/open/floor/plating,
-/area/maintenance/fore)
-"xuz" = (
-/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"xxi" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plating,
-/area/maintenance/fore)
-"xxp" = (
-/turf/open/floor/plating,
-/area/security/range)
-"xzv" = (
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/security/brig)
-"xAk" = (
-/obj/structure/chair/stool{
- pixel_y = 8
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
-"xAv" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
-"xBk" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/airalarm{
- dir = 8;
- pixel_x = 23
- },
-/turf/open/floor/mineral/titanium/blue,
-/area/crew_quarters/toilet)
-"xBw" = (
-/obj/structure/closet/wardrobe/cargotech,
-/obj/item/radio/headset/headset_cargo,
-/turf/open/floor/plasteel,
-/area/quartermaster/storage)
-"xBF" = (
-/obj/machinery/atmospherics/pipe/manifold/yellow/visible{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"xDM" = (
-/obj/machinery/camera{
- c_tag = "Locker Room South";
- dir = 8
- },
-/obj/structure/closet/secure_closet/personal,
-/turf/open/floor/plasteel,
-/area/crew_quarters/locker)
-"xEu" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6
- },
-/turf/closed/wall/r_wall,
-/area/maintenance/disposal/incinerator)
-"xEB" = (
-/obj/machinery/power/apc{
- areastring = "/area/ai_monitored/nuke_storage";
- dir = 1;
- name = "Vault APC";
- pixel_y = 25
- },
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/light{
- dir = 1
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/turf/open/floor/circuit,
-/area/ai_monitored/nuke_storage)
-"xEC" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 1
- },
-/obj/machinery/portable_atmospherics/canister,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"xEE" = (
-/obj/item/radio/intercom{
- pixel_y = 25
- },
-/obj/machinery/vending/wardrobe/curator_wardrobe,
-/turf/open/floor/carpet,
-/area/library)
-"xGQ" = (
-/obj/structure/sign/plaques/golden{
- pixel_y = 32
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/ai_monitored/security/armory)
-"xIa" = (
-/obj/structure/table,
-/obj/effect/spawner/lootdrop/grille_or_trash,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
-"xJV" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
-"xJW" = (
-/obj/machinery/door/airlock/maintenance{
- name = "Security Maintenance";
- req_access_txt = "1"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/security/main)
-"xJY" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/junction{
- dir = 8
- },
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
-"xOx" = (
-/obj/structure/chair/comfy/brown{
- color = "#596479";
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/security/prison)
-"xPk" = (
-/obj/structure/bed,
-/obj/machinery/button/door{
- id = "Dorm6";
- name = "Cabin Bolt Control";
- normaldoorcontrol = 1;
- pixel_y = -25;
- specialfunctions = 4
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/obj/effect/spawner/lootdrop/bedsheet,
-/turf/open/floor/wood,
-/area/crew_quarters/dorms)
-"xPY" = (
-/obj/structure/table/wood,
-/obj/machinery/light{
- dir = 4
- },
-/obj/item/instrument/trombone,
-/turf/open/floor/wood,
-/area/crew_quarters/theatre)
-"xSW" = (
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/corner{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/ai_monitored/security/armory)
-"xTe" = (
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/turf/open/floor/plasteel,
-/area/ai_monitored/security/armory)
-"xTy" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/engine/gravity_generator)
-"xUe" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/security/prison)
-"xUL" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/light,
-/obj/machinery/camera/motion{
- c_tag = "Vault";
- dir = 1;
- network = list("vault")
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/nuke_storage)
-"xUX" = (
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/rack,
-/obj/item/storage/box/zipties{
- pixel_x = -1;
- pixel_y = 1
- },
-/obj/item/storage/box/zipties{
- pixel_x = 1;
- pixel_y = -1
- },
-/turf/open/floor/plasteel,
-/area/security/brig)
-"xWq" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/sign/warning/vacuum/external{
- pixel_y = -32
- },
-/turf/open/floor/plating,
-/area/security/processing)
-"xXg" = (
-/obj/machinery/space_heater,
-/turf/open/floor/plasteel,
-/area/quartermaster/warehouse)
-"xXi" = (
-/obj/machinery/vending/clothing,
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
-"xZo" = (
-/obj/machinery/space_heater,
-/turf/open/floor/plating,
-/area/construction)
-"xZD" = (
-/obj/structure/closet/lasertag/red,
-/obj/item/clothing/under/misc/pj/red,
-/obj/item/clothing/under/misc/pj/red,
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
-"xZL" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/light{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness/pool)
-"ycd" = (
-/obj/structure/toilet/secret/low_loot{
- dir = 4
- },
-/obj/structure/mirror{
- pixel_y = 32
- },
-/obj/structure/sink{
- dir = 1;
- pixel_y = 25
- },
-/obj/machinery/button/door{
- id = "LockerShitter2";
- name = "Door Bolt Control";
- normaldoorcontrol = 1;
- pixel_x = 14;
- pixel_y = 38;
- specialfunctions = 4
- },
-/obj/machinery/light/small{
- dir = 8
- },
-/turf/open/floor/mineral/titanium/blue,
-/area/crew_quarters/toilet/locker)
-"ycu" = (
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/turf/open/floor/plasteel,
-/area/science/circuit)
-"ycY" = (
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/machinery/light{
- dir = 1;
- light_color = "#d1dfff"
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/fore)
-"yds" = (
-/obj/effect/decal/cleanable/vomit,
-/obj/structure/chair{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/maintenance/port/fore)
-"ydD" = (
-/obj/effect/turf_decal/bot,
-/obj/machinery/suit_storage_unit/rd,
-/turf/open/floor/plasteel,
-/area/science/mixing)
-"ydM" = (
-/obj/machinery/meter,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plating,
-/area/maintenance/fore/secondary)
-"yhx" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 5
- },
-/turf/closed/wall/r_wall,
-/area/security/brig)
-"yhz" = (
-/obj/structure/table,
-/obj/item/folder/blue,
-/turf/open/floor/plasteel/dark,
-/area/hallway/primary/central)
-"yjo" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/space_heater,
-/turf/open/floor/plating,
-/area/maintenance/starboard)
-"ykN" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple,
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors)
-
-(1,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(2,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(3,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(4,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(5,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(6,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(7,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(8,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(9,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(10,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(11,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(12,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(13,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(14,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(15,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(16,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(17,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(18,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(19,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(20,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(21,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(22,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(23,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(24,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(25,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(26,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(27,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-crk
-crk
-crk
-crk
-crk
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(28,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-crk
-crk
-crk
-crk
-crk
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-crk
-crk
-crk
-crk
-crk
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(29,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-crk
-crk
-aud
-crk
-crk
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-crk
-crk
-auC
-crk
-crk
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(30,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-crk
-crk
-crk
-crk
-crk
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-crk
-crk
-crk
-crk
-crk
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(31,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-crk
-crk
-crk
-crk
-crk
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-crk
-crk
-crk
-crk
-crk
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(32,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-crk
-crk
-crk
-crk
-crk
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-crk
-crk
-crk
-crk
-crk
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(33,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-crk
-aBM
-aBM
-aBM
-aBM
-crk
-crk
-auj
-crk
-crk
-aBM
-aBM
-crk
-crk
-crk
-crk
-crk
-aBM
-aBM
-crk
-crk
-auj
-crk
-crk
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(34,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-crk
-crk
-aBM
-crk
-crk
-aBM
-crk
-crk
-aBM
-arB
-asE
-cyb
-asE
-arB
-aBM
-aBM
-crk
-crk
-crk
-crk
-crk
-aBM
-aBM
-arB
-asE
-cyb
-asE
-arB
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(35,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-apJ
-apJ
-apJ
-apJ
-apJ
-apJ
-apJ
-apJ
-apJ
-apJ
-apJ
-auO
-auP
-cwT
-aAC
-aBM
-aBM
-crk
-crk
-crk
-crk
-crk
-aBM
-aBM
-aAC
-auO
-auP
-cxY
-arB
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(36,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-apJ
-apN
-apN
-apN
-apN
-apN
-apN
-apN
-apN
-apN
-apJ
-avP
-iEJ
-asE
-arB
-aBM
-crk
-crk
-crk
-crk
-crk
-crk
-crk
-aBM
-arB
-asE
-iEJ
-avP
-arB
-aBM
-aBM
-aBM
-aBM
-aBM
-arB
-arB
-arB
-arB
-aAC
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(37,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-crk
-apJ
-apN
-apN
-apN
-apN
-apN
-apN
-apN
-apN
-apN
-apJ
-fpI
-ayk
-awW
-aAD
-awW
-crk
-crk
-crk
-crk
-crk
-crk
-crk
-awW
-awW
-awW
-aQG
-wHR
-arB
-aBM
-aBM
-aBM
-aBM
-aBM
-arB
-vsQ
-ayk
-awW
-aAD
-awW
-crk
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(38,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-crk
-apJ
-apN
-apN
-apN
-apN
-apN
-apN
-apN
-apN
-apN
-apJ
-awZ
-ayl
-azy
-auP
-cIh
-crk
-crk
-crk
-crk
-crk
-crk
-crk
-azy
-auP
-cIh
-ayl
-aRY
-awW
-aBM
-aBM
-aBM
-aBM
-aBM
-awW
-awZ
-ayl
-beK
-auP
-cyt
-avb
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(39,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-crk
-apJ
-apN
-apN
-apN
-apN
-apN
-apN
-apN
-apN
-apN
-apJ
-awZ
-ayk
-awW
-awW
-awW
-crk
-crk
-crk
-crk
-crk
-crk
-crk
-awW
-awW
-awW
-awV
-aRY
-awW
-aBM
-aBM
-aBM
-aBM
-aBM
-awW
-awZ
-ayk
-awW
-awW
-awW
-crk
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(40,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-apJ
-apN
-apN
-apN
-apN
-wph
-apN
-apN
-apN
-apN
-apJ
-awZ
-cqr
-azz
-aAF
-awW
-crk
-crk
-crk
-crk
-crk
-crk
-crk
-awW
-aOf
-azz
-aPu
-aRY
-awW
-aBM
-aBM
-aBM
-aBM
-aBM
-awW
-awZ
-aym
-azz
-aAF
-awW
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(41,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-crk
-apJ
-apN
-apN
-apN
-apN
-apN
-apN
-apN
-apN
-apN
-apJ
-awZ
-aIK
-ayl
-aAE
-awW
-crk
-crk
-crk
-crk
-crk
-crk
-crk
-awW
-aOe
-ayl
-ayl
-aRY
-awW
-aBM
-aBM
-aBM
-aBM
-aBM
-awW
-awZ
-jHh
-ayl
-jLl
-awW
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(42,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-crk
-apJ
-apN
-apN
-apN
-apN
-apN
-apN
-apN
-apN
-apN
-apJ
-awZ
-aIK
-ayl
-aAH
-awW
-crk
-crk
-crk
-crk
-crk
-crk
-crk
-awW
-aOh
-ayl
-jHh
-aRY
-awW
-aBM
-aBM
-aBM
-aBM
-aBM
-awW
-awZ
-jHh
-ayl
-bgi
-awW
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(43,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-crk
-apJ
-apN
-apN
-apN
-apN
-apN
-apN
-apN
-apN
-apN
-apJ
-awZ
-cry
-azA
-aAG
-awW
-crk
-crk
-crk
-crk
-crk
-crk
-crk
-awW
-aOg
-azA
-aQH
-aRY
-awW
-aBM
-aBM
-aBM
-aBM
-aBM
-awW
-awZ
-ayn
-azA
-bgh
-awW
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(44,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-crk
-apJ
-apN
-apN
-apN
-apN
-lCi
-apN
-apN
-apN
-apN
-apJ
-awZ
-crz
-awW
-awW
-awW
-crk
-crk
-crk
-crk
-crk
-crk
-crk
-awW
-awW
-awW
-awV
-aRY
-awW
-aBM
-aBM
-aBM
-aBM
-aBM
-awW
-awZ
-ayk
-awW
-awW
-awW
-crk
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(45,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-apJ
-apJ
-apJ
-ajZ
-asF
-atp
-asF
-asF
-asF
-asF
-apJ
-axh
-aIK
-azy
-auP
-cIh
-crk
-crk
-crk
-crk
-crk
-crk
-crk
-azy
-auP
-cIh
-ayl
-aRY
-awW
-aBM
-crk
-auS
-crk
-aBM
-awW
-awZ
-ayl
-beL
-auP
-cyu
-crk
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(46,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-apJ
-asH
-atI
-atI
-arE
-ayq
-jxF
-auc
-avp
-axI
-ayp
-awW
-aAD
-awW
-crk
-crk
-crk
-crk
-crk
-crk
-crk
-awW
-awW
-awW
-aQG
-aRX
-arB
-aBM
-aWa
-aXI
-awW
-aBM
-arB
-awY
-ayk
-awW
-aAD
-awW
-crk
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(47,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-asF
-asI
-auQ
-auQ
-auQ
-auQ
-aCX
-aub
-aLu
-axH
-ayo
-azB
-awW
-aBM
-crk
-crk
-crk
-auA
-crk
-crk
-crk
-aBM
-awW
-aPt
-aPu
-aRY
-arB
-awW
-awW
-auP
-awW
-awW
-arB
-awZ
-aym
-fOI
-awW
-crk
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(48,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-apJ
-asJ
-cTE
-avQ
-axc
-aCT
-atb
-aIH
-apJ
-clB
-aIK
-azC
-arB
-arB
-arB
-awW
-awW
-awW
-awW
-awW
-arB
-arB
-arB
-aPv
-ayl
-aRZ
-asE
-aAF
-awW
-cyl
-awW
-baF
-asE
-bbb
-ayl
-beN
-arB
-crk
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(49,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-apJ
-apJ
-apJ
-apJ
-apJ
-apJ
-apJ
-apJ
-apJ
-axG
-aIK
-aym
-aAI
-aBH
-azz
-azz
-azz
-azz
-azz
-azz
-aLv
-aBH
-azz
-aPu
-ayl
-ayl
-aNh
-aym
-azz
-ayl
-azz
-aPu
-aNh
-aIK
-ayl
-beM
-aAC
-crk
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(50,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-alU
-atJ
-amC
-aKf
-bEJ
-axb
-ayr
-azD
-aAJ
-azD
-aCp
-aEz
-aFG
-aHu
-ayl
-ayl
-ayl
-aNb
-ayl
-ayl
-ayl
-ayl
-aTr
-aUM
-ayl
-ayl
-aWc
-baG
-aNh
-aIK
-ayl
-fzU
-arB
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(51,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-alU
-alU
-alU
-aCW
-amC
-asK
-alU
-alU
-atO
-alU
-alU
-aBI
-aBI
-aBI
-aBI
-aBI
-aNh
-aKj
-aLw
-aLw
-aLw
-aLw
-aQI
-aNh
-czK
-czK
-czK
-czK
-aXX
-czK
-czK
-bbc
-beO
-beO
-beO
-beO
-beO
-beO
-beO
-beO
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(52,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-oDb
-ayF
-ayF
-ayF
-ayF
-aqJ
-amC
-gLH
-ase
-avq
-aum
-avq
-avq
-cwH
-avq
-aAj
-aBK
-aCL
-aEG
-aFI
-aBI
-aIM
-aKk
-aLy
-aNd
-aOj
-aPx
-aQJ
-ayl
-czK
-aUO
-aUy
-aWm
-aWf
-vdu
-czK
-bhN
-bcl
-beQ
-pLn
-bhI
-bjb
-bkz
-blS
-bnv
-wWu
-wWu
-wWu
-wWu
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(53,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-alU
-alU
-alU
-alU
-asc
-atn
-aLt
-aue
-aue
-aue
-aue
-aAe
-aBJ
-aCs
-aEE
-aFH
-aGZ
-aIJ
-aJX
-aLi
-aMO
-aNR
-aOY
-aQl
-bcD
-aTs
-aUN
-baH
-aWi
-aXY
-baH
-aTs
-bbd
-beO
-beP
-bgj
-beO
-bja
-beO
-bja
-bja
-wWu
-wWu
-wWu
-wWu
-wWu
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(54,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-alU
-apL
-aqK
-alU
-asc
-atq
-aon
-amC
-axe
-ays
-alU
-auT
-aBI
-aCY
-aEI
-aFK
-aHy
-aIM
-aKk
-aLz
-aNe
-aNe
-aLz
-aQo
-aSb
-czK
-aUQ
-aUA
-aWr
-aXZ
-aUQ
-czK
-bbe
-beO
-beS
-bgj
-bhJ
-bjd
-bkB
-cAI
-bja
-wWu
-wWu
-wWu
-wWu
-wWu
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayB
-ayB
-ayB
-ayB
-ayB
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(55,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-crk
-alU
-alU
-apM
-aqL
-alU
-asc
-atq
-auX
-avS
-amC
-amC
-alU
-auT
-aBI
-aDc
-aEH
-bxM
-aHa
-aIL
-aJY
-aLj
-aMP
-aMP
-aPa
-aQn
-ayl
-czK
-aUO
-aUO
-aXL
-aXZ
-wiI
-czK
-bbe
-beO
-beR
-bgj
-bgj
-bjc
-cAF
-lfj
-bja
-wWu
-wWu
-wWu
-wWu
-wWu
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayB
-ayF
-ayF
-ayF
-ayB
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(56,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayB
-ayB
-ayB
-ayB
-ayB
-ayB
-ayB
-ayB
-ayB
-ayB
-ayB
-ayB
-aAM
-ayB
-ayB
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-alU
-aoS
-amC
-aom
-ank
-asc
-atq
-auZ
-bsU
-axf
-amC
-alU
-auT
-aBI
-aDf
-aEK
-aFM
-aHy
-ayl
-aKk
-aLA
-xmS
-aNf
-aLA
-aQD
-aSd
-czK
-aUQ
-aUW
-aXL
-aXZ
-baJ
-czK
-bbe
-beO
-beU
-bgk
-bhL
-bjc
-cAF
-blV
-beO
-wWu
-wWu
-wWu
-wWu
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayB
-ayF
-chJ
-ayF
-ayB
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(57,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBD
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-anO
-ayF
-ayF
-ayF
-atl
-ayF
-ayB
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-alU
-aoR
-apO
-aqM
-arF
-asc
-atq
-auY
-amC
-amC
-ayt
-alU
-aAw
-aBl
-aCZ
-aEJ
-aFL
-aBI
-aIO
-aKk
-asE
-asE
-asE
-asE
-aQD
-ayl
-czK
-aUl
-aUR
-aWs
-aXZ
-aUQ
-czK
-bbf
-beT
-beT
-bdQ
-beZ
-bje
-bkC
-cAJ
-beO
-wWu
-wWu
-wWu
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayB
-ayB
-ayB
-ayB
-ayB
-ayF
-ayF
-ayF
-hrF
-ayF
-ayF
-ayF
-ayB
-ayB
-aAM
-ayB
-ayB
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(58,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBD
-ayF
-ads
-adS
-aeG
-ayF
-ads
-adS
-aeG
-ayF
-ads
-adS
-aeG
-ayF
-ayB
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-alU
-aoT
-atJ
-aqO
-arG
-asc
-atq
-ava
-amC
-axg
-ayu
-azF
-azF
-azF
-azF
-azF
-azF
-azF
-aIQ
-aKk
-aLC
-aNg
-aOk
-aPy
-aRd
-aRM
-aTt
-aUm
-aUm
-aWt
-aYd
-aZn
-aTt
-bbg
-bdG
-bdu
-bdT
-beO
-bjf
-beO
-beO
-beO
-wWu
-wWu
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayB
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-hrF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayB
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(59,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBD
-ayF
-ads
-adu
-aeG
-ayF
-ads
-adu
-aeG
-ayF
-ads
-adu
-aeG
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-alU
-alU
-alU
-alU
-arG
-ash
-atq
-alU
-alU
-alU
-alU
-azF
-aAP
-aAP
-aAP
-aEF
-aFN
-azF
-aIP
-aKl
-aLB
-aLB
-aLB
-aLB
-aQK
-aSe
-czK
-aUQ
-aUQ
-aXN
-aUO
-aUQ
-czK
-bcI
-aPz
-bdt
-bdR
-aSg
-aYf
-bkD
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayB
-ayF
-cca
-cca
-cca
-cca
-cca
-ayF
-csZ
-ayF
-cca
-cca
-cca
-cca
-cca
-ayF
-ayB
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(60,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBD
-ayF
-ads
-adu
-aeG
-ayF
-ads
-adu
-aeG
-ayF
-ads
-adu
-aeG
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ali
-aoX
-arI
-asi
-atr
-atN
-atN
-atN
-ayi
-azq
-aAK
-aBv
-aDa
-aAQ
-aAQ
-azF
-aIR
-ayl
-ayl
-aNi
-ayl
-ayl
-ayl
-aSf
-czK
-czK
-czK
-czK
-czK
-czK
-czK
-aPz
-aPz
-bdB
-aWv
-aTu
-bjg
-bkD
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayB
-ayF
-ccc
-ccX
-ccX
-ccX
-ccX
-vZA
-crk
-uDO
-cjH
-cjH
-cjH
-cjH
-cnl
-ayF
-ayB
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(61,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ads
-adu
-aeG
-ayF
-ads
-adu
-aeG
-ayF
-ads
-adu
-aeG
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ali
-amC
-arH
-atP
-auV
-auV
-auV
-axK
-ayh
-azi
-aAx
-aBm
-aAQ
-aAQ
-aAQ
-azF
-azF
-azF
-aLD
-aNh
-aNh
-aPz
-aPz
-aPz
-aPz
-wpr
-aWj
-aXP
-aZr
-baL
-bbI
-bcK
-aPz
-bdB
-aWv
-bfh
-aPz
-aPz
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayB
-ayF
-ccb
-ccb
-ccb
-ccb
-ccb
-ayF
-vPs
-ayF
-ccb
-ccb
-ccb
-ccb
-ccb
-ayF
-ayB
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(62,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayB
-ayB
-ayB
-ayF
-ayF
-ads
-adu
-aeG
-ayF
-ads
-adu
-aeG
-ayF
-ads
-adu
-aeG
-ayF
-ayF
-ayF
-ajV
-alR
-alR
-alR
-alR
-alU
-alU
-alU
-aqP
-arJ
-alU
-atQ
-ats
-atV
-atO
-asK
-azF
-aAT
-aBw
-aDg
-aAQ
-aAQ
-aHz
-aIS
-aKn
-aLF
-aLF
-aLF
-aPz
-aQL
-aSg
-aSg
-aSg
-aWl
-aSg
-aZs
-baN
-bbK
-bcM
-bdH
-bdD
-bea
-bfq
-bji
-bkF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayB
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-hrF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aAM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(63,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayB
-ayF
-ayF
-ayF
-ayF
-ayF
-csZ
-ayF
-ayF
-ayF
-csZ
-ayF
-ayF
-ayF
-csZ
-ayF
-ayF
-ajV
-ajV
-ajV
-alQ
-amy
-ang
-alR
-aoj
-amC
-apP
-amC
-arH
-alU
-ats
-atS
-ats
-atO
-asK
-azF
-aAS
-aFP
-aAQ
-aAQ
-aAQ
-aAQ
-aAQ
-aKm
-aLE
-aNj
-aLE
-aPz
-aPz
-aPz
-aTu
-aUS
-aWk
-aWk
-aWk
-baM
-bbJ
-bcL
-aWk
-bdC
-bdZ
-bhO
-bjh
-bkE
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayB
-ayF
-cca
-cca
-cca
-cca
-cca
-ayF
-csZ
-ayF
-cca
-cca
-cca
-cca
-cca
-ayF
-ayB
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(64,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayB
-ayF
-abX
-jIs
-jIs
-vZA
-crk
-uDO
-jIs
-vZA
-crk
-uDO
-jIs
-vZA
-crk
-uDO
-jIs
-ajW
-akB
-alh
-alT
-amA
-ani
-anI
-aol
-aol
-aol
-aol
-arL
-alU
-atR
-atQ
-atV
-atO
-asK
-azF
-aAU
-aBG
-aAQ
-aAQ
-aAQ
-aAQ
-aAQ
-aKn
-aLE
-aNl
-aOm
-aPB
-aQM
-aQM
-aTv
-aUT
-aPz
-aXQ
-aXQ
-aXQ
-aXQ
-aXQ
-aXQ
-aXQ
-aXQ
-bhQ
-bjj
-bkF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayB
-ayF
-ccc
-ccX
-ccX
-ccX
-ccX
-vZA
-crk
-uDO
-cjH
-cjH
-cjH
-cjH
-cnl
-ayF
-ayB
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(65,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayB
-ayF
-ayF
-ayF
-ayF
-ayF
-vPs
-ayF
-ayF
-ayF
-vPs
-ayF
-ayF
-ayF
-vPs
-ayF
-ayF
-ajV
-ajV
-ajV
-alS
-amz
-anh
-anH
-amC
-aok
-anJ
-aFJ
-arK
-alU
-alU
-ali
-alU
-atO
-asK
-azF
-aAP
-aAP
-aAP
-aAQ
-aFO
-aHA
-aIT
-azF
-aLG
-aNk
-aOl
-aPA
-aPA
-aPA
-aPA
-aPA
-aPA
-aXQ
-aZt
-aXQ
-ycd
-aXQ
-omY
-aXQ
-gQX
-bhQ
-bjj
-bkF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayB
-ayF
-ccb
-ccb
-ccb
-ccb
-ccb
-ayF
-vPs
-ayF
-ccb
-ccb
-ccb
-ccb
-ccb
-ayF
-ayB
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(66,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayB
-aAM
-ayB
-ayF
-ayF
-ads
-crE
-aeG
-ayF
-ads
-crE
-aeG
-ayF
-ads
-crE
-aeG
-ayF
-ayF
-ayF
-ajV
-alR
-alR
-alR
-alR
-amC
-aom
-apP
-amC
-arN
-amC
-amC
-amC
-amC
-axi
-asK
-azF
-azF
-azF
-azF
-aEL
-azF
-azF
-azF
-azF
-aLE
-aNm
-aOl
-aPA
-aQO
-aSh
-aTw
-aUU
-aWn
-aXQ
-aZv
-aXQ
-bbL
-aXQ
-bdJ
-aXQ
-bgr
-bhQ
-bjj
-bkF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-aAM
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-hrF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayB
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(67,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ads
-crE
-aeG
-ayF
-ads
-crE
-aeG
-ayF
-ads
-crE
-aeG
-ayF
-ayF
-ayF
-ayF
-ayF
-alU
-alF
-anj
-anJ
-aoU
-alU
-amC
-arM
-alU
-avc
-asO
-avV
-atO
-ayw
-atN
-aAV
-aBQ
-aDh
-aDo
-aFQ
-aHe
-aIN
-aKp
-aLE
-aNm
-aOl
-aPA
-aQN
-aQN
-aQN
-aUn
-aTy
-aWy
-aYe
-bbq
-aZw
-kYy
-bct
-bfa
-bfa
-bhQ
-bjk
-bkE
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayB
-ayF
-cca
-cca
-cca
-cca
-cca
-ayF
-csZ
-ayF
-cca
-cca
-cca
-cca
-cca
-ayF
-ayB
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(68,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayB
-ayF
-ads
-crE
-aeG
-ayF
-ads
-crE
-aeG
-ayF
-ads
-crE
-aeG
-ayF
-ayF
-ayF
-ayF
-ayF
-alU
-alF
-anl
-amC
-alU
-alU
-amC
-alU
-alU
-apP
-alU
-alU
-atP
-auV
-axK
-aAN
-aBL
-aDd
-aDd
-aFR
-aDd
-aDd
-aJZ
-aLk
-aNo
-aOo
-aPA
-aQS
-aQN
-aSV
-aUo
-aUX
-aXp
-vke
-baO
-baw
-baO
-hPs
-cBn
-bfa
-bhQ
-bjk
-bkF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-avd
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-avT
-aBM
-aBM
-aBM
-ayF
-ayB
-ayF
-ccc
-ccX
-ccX
-ccX
-ccX
-vZA
-crk
-uDO
-cjH
-cjH
-cjH
-cjH
-cnl
-ayF
-ayB
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(69,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayB
-ayF
-ads
-crE
-aeG
-ayF
-ads
-crE
-aeG
-ayF
-ads
-crE
-aeG
-ayF
-ayF
-ayF
-ayF
-ayF
-alU
-alU
-ank
-alU
-alU
-alU
-amC
-amC
-amC
-arN
-alU
-avW
-amC
-ayx
-atO
-aAL
-aBQ
-aDb
-aDo
-aFY
-aDo
-aDo
-aKp
-aLE
-aLE
-aOn
-aPA
-aQP
-aQN
-aTB
-aUt
-aWo
-aXQ
-aXQ
-aXQ
-aXQ
-aXQ
-aXQ
-aXQ
-aXQ
-bhQ
-bjk
-aPz
-ayF
-ayF
-boI
-bqi
-brJ
-boI
-brJ
-bvS
-boI
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-avU
-ayF
-ayF
-crk
-ayF
-ayB
-ayF
-ccb
-ccb
-ccb
-ccb
-ccb
-ayF
-vPs
-ayF
-ccb
-ccb
-ccb
-ccb
-ccb
-ayF
-ayB
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(70,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayB
-ayF
-ads
-crG
-aeG
-ayF
-ads
-crG
-aeG
-ayF
-ads
-crG
-aeG
-ayF
-ayB
-ayF
-ayF
-ayF
-alU
-amD
-anm
-amC
-amC
-ali
-amC
-alU
-asO
-atL
-alU
-avX
-axf
-amC
-atO
-aAY
-aBQ
-aDl
-bxk
-aDo
-aDo
-aIX
-gCC
-aLE
-aLE
-aOp
-aPA
-aQR
-aQN
-aQN
-aUt
-aWq
-aQN
-aQN
-aQN
-aQN
-vhb
-bbO
-aPA
-bgt
-bhS
-bjk
-aPz
-ayF
-ayF
-blW
-bqj
-brK
-blW
-brK
-bvT
-blW
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-oDb
-avU
-ayF
-ayF
-ayF
-ayF
-ayB
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-hrF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayB
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(71,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayB
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayB
-ayF
-ayF
-ayF
-alU
-amC
-amC
-amC
-amC
-ali
-amC
-alU
-alU
-alU
-alU
-alU
-axj
-alU
-atO
-aAY
-aBQ
-aDk
-aDo
-aDo
-aDo
-aIW
-aBQ
-aLE
-aLE
-aOl
-aPC
-aQN
-aQN
-aTz
-aUp
-ubj
-aXr
-aZx
-aQN
-aQN
-cBh
-bdL
-aPA
-lcu
-bhR
-bjk
-aZE
-blW
-blW
-blW
-bqi
-cyD
-aZE
-cyD
-bvS
-blW
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-avU
-ayF
-ayF
-ayF
-ayF
-ayB
-ayB
-ayB
-ayF
-ayF
-ayF
-ayF
-ayF
-hrF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayB
-ayB
-ayB
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(72,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayB
-ayB
-ayB
-ayB
-ayB
-ayF
-ayB
-ayB
-ayB
-ayB
-ayB
-ayB
-ayB
-ayB
-ayB
-ayF
-ayF
-ayF
-alU
-amE
-ann
-amC
-atJ
-alU
-amC
-alU
-arN
-atU
-alU
-atU
-amC
-atJ
-atO
-aAY
-aBQ
-aDn
-aDo
-aDo
-aHD
-aIZ
-aBQ
-aLE
-aLE
-aOq
-aPD
-aQT
-aQN
-aTC
-aUs
-aUY
-aXv
-aYS
-aQN
-aQN
-vhb
-bbO
-aPA
-aSg
-bhT
-bjk
-aZE
-blY
-bnw
-boJ
-bql
-brL
-btr
-bnw
-bvV
-blW
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-avU
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-cfx
-chO
-cfx
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(73,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-oDb
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-alU
-alU
-alU
-ank
-alU
-alU
-amC
-amC
-amC
-amC
-alU
-avc
-amC
-atJ
-atO
-aAY
-aBQ
-aDm
-aDo
-aDo
-aDo
-aIY
-gCC
-aLE
-aLE
-aOl
-aPA
-pqs
-aQN
-aTC
-aUs
-mTG
-aXt
-ijG
-aQN
-aQN
-aPA
-aPA
-aPA
-bel
-bfI
-bgq
-bhY
-bkj
-bqm
-bqm
-bps
-bjr
-bjr
-buB
-bvU
-aZE
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-bVx
-caf
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-cfx
-chN
-cfx
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(74,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-alU
-amF
-alU
-amC
-alU
-alU
-alU
-alU
-amC
-amC
-alU
-atM
-axl
-auV
-azG
-aAY
-aBQ
-aDp
-aDo
-aFU
-aDo
-aJb
-aKp
-aLE
-aLE
-aOl
-aPE
-aQV
-aQN
-aTC
-aUu
-gxc
-aXt
-ijG
-aQN
-aQN
-aZB
-aPA
-bfc
-bew
-bfM
-bjl
-bkG
-bkp
-bmj
-bjt
-cCo
-bjt
-bjt
-biq
-bvV
-blW
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-lPl
-rQX
-lPl
-ayF
-ayF
-ayF
-bCq
-bCq
-bCq
-bLv
-bCq
-ayF
-cbj
-crk
-crk
-crk
-ayF
-bCq
-bCq
-bCq
-bCq
-bCq
-bCq
-cfx
-cfx
-cyK
-cfx
-cfx
-ayF
-ayF
-oDb
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(75,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-alU
-alU
-alU
-amC
-alU
-crk
-rJw
-arO
-amC
-amC
-avc
-atO
-axk
-ayy
-ayy
-aAO
-aBN
-aDe
-aDe
-aFT
-aDe
-aIU
-aKa
-aLH
-aLE
-aOl
-aPA
-aiB
-aQN
-nLw
-sLa
-oyl
-aXw
-qfk
-aQN
-aQN
-aZA
-aPA
-aWv
-aYb
-aZE
-aZE
-aZE
-bkn
-bmh
-bjr
-bmb
-bjr
-bjr
-buC
-bvV
-blW
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-bxy
-bxy
-pHH
-bxy
-bxy
-ayF
-ayF
-bCq
-ajD
-bCq
-bSn
-bCq
-bCq
-cbj
-bLv
-bXv
-bLv
-ayF
-bCq
-cAy
-cAB
-ajG
-cAD
-cAH
-cfw
-cgA
-chP
-ciQ
-cfw
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(76,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ali
-anK
-ali
-ayF
-alU
-rJw
-alU
-atW
-atW
-atO
-axn
-alU
-aoX
-atJ
-aBQ
-aDq
-aDo
-aFZ
-aHE
-aJc
-aKs
-aLK
-aLK
-aOr
-aPA
-aQX
-aQN
-aSi
-aUv
-aWp
-aTy
-aTy
-aTy
-aTy
-bbs
-bcw
-bfd
-bgw
-aZE
-bjn
-bjr
-bkt
-bmh
-boK
-bpz
-boK
-bjr
-bkt
-bvV
-blW
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-bxy
-vCa
-avl
-vCa
-bxy
-ayF
-ayF
-bCq
-bHE
-bJP
-bHE
-bJP
-bCq
-cbk
-bLv
-bHE
-bLv
-ayF
-bCq
-cAA
-bHE
-bHE
-ccZ
-cAK
-cfw
-cgC
-chR
-ciS
-cfw
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(77,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ali
-aKY
-ali
-ayF
-ayF
-ayF
-alU
-ali
-ali
-atO
-axo
-ayz
-ayz
-ayz
-aBR
-aBR
-aBR
-aBR
-aBR
-aBR
-aBR
-aLm
-aLE
-aOl
-aPA
-vJu
-aQN
-aTD
-ocv
-aUZ
-aYU
-aYU
-aYU
-aYU
-aYU
-bcu
-bfe
-aYb
-aZE
-bjm
-bjr
-bjr
-bmh
-boK
-bjr
-boK
-bjr
-bjr
-bvV
-bxu
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-bxy
-juQ
-gzv
-byE
-bxy
-ayF
-ayF
-bCq
-bHE
-bHE
-bHE
-bHE
-bCq
-bVy
-bLv
-cyE
-bLv
-bLv
-bCq
-bHE
-cAC
-ccZ
-cAE
-ceV
-cfw
-cgB
-chQ
-ciR
-cfw
-crk
-crk
-crk
-ayF
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(78,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ali
-ali
-amC
-alU
-alU
-alU
-ayF
-ayF
-ayF
-crk
-avY
-axo
-arP
-fgG
-rqW
-aGD
-tJi
-aCr
-hcb
-qTG
-hcb
-aKu
-aLM
-aLF
-aOs
-aPG
-aPG
-aPG
-aPG
-aPG
-lip
-aQW
-aQW
-aQW
-aQW
-xDM
-aPA
-aWv
-aYb
-aZE
-bjp
-bjr
-bjr
-bmh
-boK
-bjr
-cBp
-bjr
-buB
-bvV
-bxu
-bxu
-bxx
-bxu
-bxu
-avf
-ayF
-bxy
-avl
-rBE
-byE
-bxy
-ayF
-ayF
-bCq
-bHE
-bPW
-bHE
-bHE
-bCq
-bVB
-bHE
-bHE
-bYu
-bZk
-bCq
-cTF
-bCq
-bCq
-bCq
-bCq
-cfw
-cgE
-chS
-cfw
-cfw
-bCq
-bXv
-bCq
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(79,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ali
-yds
-amC
-aon
-aoW
-arP
-aqQ
-aqQ
-aqQ
-aqQ
-avZ
-axo
-arP
-rPU
-fne
-aGr
-aHI
-fOA
-tWj
-oyz
-hcb
-aKu
-aLL
-bDe
-aOl
-aPF
-aQY
-aSk
-aTE
-aPG
-aPA
-aPA
-aPA
-aPA
-aPA
-aPA
-aPA
-aWv
-aYb
-aZE
-bjo
-bjr
-bjr
-bmh
-boK
-bjr
-boK
-bjr
-bjr
-bub
-bxu
-bvF
-bzP
-bAS
-bxu
-ayF
-ayF
-bxy
-gii
-eBm
-byE
-bxy
-ayF
-ayF
-bCq
-bHE
-bHE
-bSo
-bHE
-bCq
-bVA
-bWw
-bXw
-bYt
-bZj
-bCq
-bHE
-bCq
-bSq
-cdW
-ceW
-bCq
-cgD
-bUs
-bHE
-cjI
-bCq
-clA
-bCq
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(80,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ali
-aKY
-amC
-amC
-amC
-gsM
-aqR
-aqR
-aGh
-aqR
-awb
-axo
-arP
-aCh
-pIf
-kCo
-aHK
-aCr
-uJx
-ikk
-hcb
-aKu
-aLN
-aLE
-aOl
-aPH
-aRa
-aRa
-aTG
-aPG
-aWu
-aYc
-aZD
-aZD
-vnI
-aZD
-aZD
-bff
-dev
-aZE
-xBw
-bjr
-ama
-bmh
-bjr
-bjr
-bjr
-bjr
-bjr
-bvX
-bxu
-byA
-bzR
-byd
-bxx
-ayF
-ayF
-bxy
-qTA
-avl
-qTA
-bxy
-ayF
-ayF
-bCq
-bPV
-bCq
-bCq
-cTF
-bCq
-bVD
-bWy
-bXx
-bYw
-bZj
-bYy
-bHE
-bTz
-bHE
-bUs
-ceY
-bCq
-bJP
-bUs
-bHE
-bLu
-bCq
-cyE
-bCq
-ayF
-ayF
-ayF
-ayF
-bCq
-bCq
-bLv
-bLv
-bLv
-ayF
-aBD
-aBD
-aBD
-aBD
-aBD
-aBD
-aBD
-aBD
-aBD
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(81,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ali
-nBI
-anL
-aoo
-aoX
-arP
-arP
-arP
-arP
-arP
-avZ
-axp
-ayC
-azH
-eEe
-aGv
-aCr
-aCr
-uJx
-ikk
-hcb
-aKu
-aLN
-aLE
-aOl
-aPF
-aQZ
-aRa
-aTF
-oFT
-aSX
-hPP
-aZF
-aZF
-aZF
-aZF
-aZF
-aZF
-bgy
-gjl
-bjq
-bjr
-bjr
-bmh
-bjr
-bjr
-bjr
-bjr
-bjr
-bjr
-bxw
-byz
-bzQ
-byc
-bxx
-ayF
-ayF
-bGi
-bGi
-bJb
-bGi
-bGi
-ayF
-ayF
-bCq
-bPU
-bHE
-bSp
-bHE
-bCq
-bVC
-bWx
-bWy
-bYv
-bZl
-bCq
-bHE
-bCq
-cda
-cgF
-bCq
-cqn
-cAh
-chT
-bHE
-bHE
-sTP
-bHE
-bCq
-bLv
-bLv
-bLv
-bLv
-bCq
-ciT
-cqK
-crl
-bLv
-ayF
-aBD
-azl
-azl
-azl
-azl
-azl
-azl
-azl
-aBD
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(82,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ali
-ali
-ali
-alU
-alU
-arP
-aqR
-wje
-rQJ
-uUi
-avZ
-xtP
-ayA
-sNK
-xmo
-aBV
-mzB
-mJG
-szG
-aHG
-aJe
-aKw
-aLP
-aMR
-aNU
-aPJ
-aPJ
-aPJ
-aPJ
-aPJ
-aVC
-aXJ
-dDV
-aZp
-baY
-bcJ
-bcF
-bfg
-bgA
-bhW
-bjt
-biq
-bjr
-bmh
-bjr
-bqn
-brN
-brN
-brN
-brN
-bxx
-byC
-bzT
-byl
-bxx
-ayF
-ayF
-bGi
-bHz
-avl
-bKk
-bGi
-ayF
-ayF
-bCq
-bPW
-bCq
-bCq
-cOw
-bCq
-bVF
-bWA
-bXy
-bYx
-bWz
-bCq
-bHE
-bCq
-bQa
-cpY
-cyL
-cqy
-cAi
-bQa
-bHE
-bHE
-bHE
-bHE
-bHE
-bHE
-bHE
-bHE
-bHE
-cpR
-bHE
-cAQ
-crm
-bLv
-ayF
-aBD
-aBD
-aBD
-aBD
-aBD
-aBD
-aBD
-aBD
-aBD
-oDb
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(83,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-crk
-crk
-crk
-crk
-crk
-crk
-crk
-crk
-crk
-arP
-vqP
-inw
-gzY
-rtC
-izg
-awa
-axq
-qyj
-azI
-rjQ
-aBU
-myh
-inR
-wUr
-iTq
-hcb
-aKu
-aLN
-aMQ
-aNT
-aPI
-aRb
-aRb
-aRb
-aRb
-aWx
-aXE
-baS
-baS
-bbP
-bcR
-bcE
-baS
-bex
-aZF
-bgu
-bic
-bku
-bmh
-bjr
-aZE
-brM
-bts
-buD
-bvY
-bxx
-byB
-bwS
-byg
-bxx
-ayF
-ayF
-bGi
-bHy
-avl
-bKj
-bGi
-ayF
-ayF
-bCq
-bHE
-bHE
-mPr
-cdb
-bCq
-bVE
-bWz
-bHE
-bHE
-bLu
-bCq
-bLu
-bCq
-cdb
-bSs
-bCq
-bCq
-cgG
-bCq
-bCq
-bCq
-bCq
-cTF
-bCq
-bLv
-bLv
-bLv
-bLv
-bCq
-cqv
-cqL
-bJe
-bLv
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBD
-aBD
-aBD
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(84,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-crk
-crk
-crk
-crk
-crk
-crk
-crk
-crk
-crk
-aqQ
-uCo
-gzY
-eAG
-aqR
-aqR
-kTj
-xxi
-ayD
-cGz
-aMr
-ngs
-aDv
-uRS
-uJx
-dsC
-hcb
-aKu
-aLN
-aMS
-aOt
-aPK
-aPK
-aPK
-aPK
-aPK
-aWA
-aXM
-bfi
-cBi
-bbS
-bcS
-bbt
-bfi
-beD
-gjl
-aZE
-biA
-bmg
-bmH
-bkJ
-aZE
-aZE
-aZE
-aZE
-aZE
-bxu
-byD
-bwU
-byn
-bxu
-ayF
-bxy
-bxy
-bxy
-bJd
-bKm
-bxy
-ayF
-ayF
-bCq
-bPY
-cOw
-bCq
-bCq
-bCq
-bCq
-bCq
-bYy
-bCq
-bCq
-bCq
-bCq
-bCq
-bCq
-bCq
-bCq
-bCq
-bUs
-bLv
-ayF
-bCq
-ckv
-bHE
-bCq
-ayF
-ayF
-ayF
-ayF
-bCq
-bCq
-bCq
-bCq
-bCq
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBD
-azl
-aBD
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(85,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-crk
-crk
-crk
-crk
-crk
-crk
-crk
-crk
-crk
-aqQ
-aqR
-aqR
-pjg
-sqg
-inq
-avZ
-xxi
-ayD
-viF
-aMr
-aMr
-aOH
-uRS
-lSa
-oTW
-hcb
-aKu
-aLN
-aMS
-aOi
-lPr
-aPK
-aSl
-aTH
-aPK
-aWz
-aWC
-baS
-baS
-baS
-bcR
-baS
-baS
-baS
-gjl
-bju
-biv
-bmf
-bmt
-boN
-bqo
-brO
-btt
-buE
-bvZ
-bxu
-bxx
-bwT
-bym
-bxu
-bxy
-bxy
-bGj
-bHA
-tIV
-bKl
-bxy
-crk
-crk
-bCq
-bPX
-bRg
-bRg
-bCq
-bHE
-bVG
-bHE
-bHE
-bCq
-tPT
-tRF
-mrR
-dKP
-odx
-rBq
-evR
-bCq
-bUs
-bLv
-ayF
-bLv
-bJf
-ccd
-bCq
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-gUu
-crn
-bij
-bij
-bij
-bij
-bij
-jkz
-btG
-ayF
-aBD
-azl
-aBD
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(86,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-crk
-crk
-crk
-crk
-crk
-crk
-crk
-crk
-crk
-aqQ
-uCo
-gzY
-arP
-arP
-arP
-avZ
-xxi
-ayD
-nez
-ngV
-xPY
-aOH
-hcb
-hcb
-syJ
-hcb
-aKu
-aLN
-aMS
-aOi
-aLE
-aRc
-aSm
-aTJ
-aPK
-aWA
-aWC
-xXg
-aZI
-xXg
-cCn
-bdS
-bdU
-ckQ
-gjl
-bgz
-biT
-boU
-bmP
-buF
-bbR
-bbR
-btu
-bbR
-bOL
-qje
-byF
-bwW
-bGm
-bCo
-bDk
-bEK
-byE
-byE
-avl
-rjG
-bGi
-ayF
-ayF
-bLv
-bQa
-bHE
-bHE
-bCq
-bHE
-bCq
-bCq
-bCq
-sXA
-mPE
-kyF
-sAM
-imH
-evR
-evR
-rMN
-bCq
-bUs
-bLv
-ayF
-cjJ
-cjJ
-cjJ
-cjJ
-cjJ
-cjJ
-cjJ
-kfX
-saU
-saU
-bij
-crn
-bij
-bij
-eCR
-wUg
-bnT
-bph
-bsc
-mQS
-bsc
-tNF
-btG
-ayF
-aBD
-azl
-aBD
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(87,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-crk
-crk
-crk
-crk
-crk
-crk
-ato
-crk
-crk
-arP
-aqR
-aqR
-arP
-asQ
-aqR
-awb
-axr
-ayE
-ayE
-ayE
-ayE
-ayE
-ayE
-ayE
-ayE
-ayE
-ayE
-aLl
-aMT
-aOi
-aPL
-aPK
-aSm
-aTI
-aPK
-aWB
-cCj
-apd
-apd
-apd
-cCk
-apd
-aZK
-bgB
-bhX
-bgv
-biF
-bkw
-bnE
-bny
-btv
-btv
-bjv
-btv
-buc
-bxz
-eVL
-bwV
-byy
-bBa
-bAb
-bzY
-bBa
-bEQ
-bGM
-bKn
-bGi
-ayF
-ayF
-bLv
-bPZ
-bHE
-bHE
-cTF
-bHE
-bCq
-iiW
-iiW
-iiW
-iiW
-iiW
-dfL
-dKP
-mqZ
-tur
-wfR
-bCq
-bUs
-bLv
-ayF
-cjJ
-ckw
-clC
-cmy
-cnm
-cnL
-cov
-cpj
-cpS
-cjJ
-fjS
-sPT
-btG
-rXl
-xgC
-ugu
-bnV
-bph
-bih
-big
-bii
-bsc
-btG
-ayF
-aBD
-azl
-aBD
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(88,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aiU
-hlT
-aiU
-ayF
-aiU
-vxX
-aiU
-ayF
-arP
-lZs
-dPq
-arP
-asP
-cya
-awa
-axu
-ayH
-ayH
-ayH
-ayH
-ayH
-ayH
-aFV
-ayH
-ayH
-aKy
-aLn
-aMU
-aOw
-aPN
-aPK
-aSn
-aTK
-aPK
-uoG
-sOA
-asW
-baW
-bLE
-bLG
-apd
-bfj
-bgC
-bia
-aZK
-bjs
-bkx
-bmQ
-bnA
-bpB
-bpB
-brR
-bsV
-bwc
-bxA
-bvI
-bwX
-byG
-bvI
-bAm
-bBG
-bDo
-xJV
-gzv
-bKp
-bGi
-ayF
-ayF
-bLv
-bHE
-bHE
-bSs
-bCq
-bHE
-bCq
-uvZ
-dKP
-vjm
-bcU
-bcU
-bcU
-dKP
-dKP
-dKP
-dKP
-bCq
-bUs
-bLv
-ayF
-cjJ
-cky
-clE
-cmA
-clE
-cnN
-cox
-cpl
-cpU
-jLn
-xTy
-xTy
-tJK
-xTy
-xTy
-xhS
-mOB
-bph
-big
-bgN
-big
-bsc
-btG
-ayF
-aBD
-azl
-aBD
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(89,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-aoV
-ayF
-ayF
-ayF
-gWo
-gWo
-gWo
-dYZ
-gWo
-gWo
-ayF
-ayF
-ayF
-aiU
-alp
-aiU
-ayF
-aiU
-alp
-aiU
-arP
-arP
-arP
-arP
-arP
-arP
-arP
-avZ
-axt
-ayG
-ayG
-ayG
-ayG
-ayG
-ayG
-ayG
-ayG
-ayG
-ayG
-aLm
-aMS
-aOv
-aPM
-aPQ
-aPQ
-aPQ
-aPQ
-apd
-aYi
-aqW
-aqW
-bbQ
-uFp
-apd
-aZH
-aZK
-bhZ
-aZK
-cNM
-bfQ
-bnG
-bnz
-bpA
-bbR
-sWR
-jlm
-bud
-eyM
-kSb
-bAZ
-bGm
-bzF
-bAc
-bGm
-byE
-cBB
-byE
-bKo
-bxy
-crk
-crk
-bCq
-ceW
-bRh
-bLu
-bCq
-bHE
-bCq
-iiW
-iiW
-dKV
-xgF
-dKV
-dKV
-iiW
-gMl
-gMl
-iiW
-bLv
-bUs
-bLv
-ayF
-cjJ
-ckx
-clD
-cmz
-cnn
-cnM
-cow
-cpk
-cpT
-cjJ
-fjS
-dXq
-btG
-rtl
-oqO
-vFr
-bnV
-bph
-bii
-big
-bih
-bsc
-btG
-ayF
-aBD
-azl
-aBD
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(90,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-abc
-abc
-abc
-afu
-abc
-wdr
-itQ
-pgn
-tmO
-gWo
-xUe
-aiU
-aiT
-nEj
-vTP
-aiU
-amK
-aiU
-mkU
-xWq
-arP
-asR
-gzY
-fdQ
-ngU
-kUC
-arP
-awc
-axt
-ayG
-azK
-aBe
-aBe
-aDj
-aER
-aFX
-aHj
-aJa
-aKc
-aLp
-aMV
-aOy
-aLE
-aPQ
-aRV
-aSW
-aVa
-apd
-aWE
-aqW
-aqW
-bcG
-bLG
-apd
-aZH
-bgD
-bfN
-bgE
-cNN
-bkH
-bfm
-boS
-bfm
-bNK
-bkN
-bfm
-bwe
-bwe
-bwd
-bwY
-byJ
-bwe
-bAc
-bBI
-bGn
-bGn
-bGn
-bKq
-bxy
-ayF
-ayF
-bCq
-bOK
-bCq
-bCq
-bCq
-bUt
-bCq
-uaw
-tkU
-iiW
-lnu
-cjn
-iiW
-cxo
-bcU
-bcU
-vzO
-bLv
-bUs
-bLv
-ayF
-cjJ
-cky
-clG
-cmB
-clG
-cnP
-coz
-cpn
-sPY
-sPY
-bgO
-dgO
-bgO
-pPI
-uRd
-ktP
-bnW
-bph
-bsc
-mkv
-bsc
-jFH
-btG
-ayF
-aBD
-azl
-aBD
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(91,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-abc
-aea
-aeH
-aft
-abc
-pDe
-dly
-mnC
-mcp
-gWo
-oDm
-ibK
-akb
-ahq
-akI
-ahU
-aiT
-aiD
-akI
-uFZ
-hBw
-vLo
-gzY
-aqR
-gzY
-gzY
-esK
-awb
-axt
-ayG
-azJ
-aBd
-aBX
-aDi
-aEQ
-aFW
-aHh
-aIV
-ayG
-aLN
-aMS
-aOx
-aPc
-aRe
-aRT
-aSt
-aWF
-apd
-aWG
-aZa
-baX
-bcH
-bdE
-apd
-aZH
-bnL
-cNG
-cNJ
-cNM
-cNI
-bnI
-boR
-bqs
-bbR
-bkM
-bbR
-bwd
-bxB
-bvL
-byI
-byH
-bwe
-bAn
-bBH
-bxy
-bxy
-bxy
-bxy
-bxy
-bLv
-bLv
-bCq
-bHE
-bLv
-ayF
-bLv
-uuG
-jJF
-gBo
-sEt
-cxo
-bcU
-bcU
-jqv
-cxo
-bcU
-mpI
-vzO
-bLv
-bUs
-bLv
-ayF
-cjJ
-ckz
-clF
-cmy
-cnp
-cnO
-coy
-cpm
-cjJ
-ayF
-ayF
-ayF
-ayF
-ayF
-iHk
-bgO
-bgO
-bgO
-bgO
-bgO
-bgO
-jBA
-btG
-ayF
-aBD
-azl
-aBD
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(92,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-crk
-abc
-abu
-abu
-abu
-abc
-abc
-aec
-aeJ
-afw
-abc
-abc
-dly
-xxp
-mcp
-dYZ
-kMt
-nTG
-rhX
-ahr
-ahD
-ahV
-agr
-fJY
-eXz
-pUy
-arP
-arP
-arP
-arP
-iPX
-nnp
-arP
-awb
-axt
-ayG
-azM
-aBg
-aBZ
-aDx
-aET
-aET
-bCx
-aHJ
-aKd
-aLq
-aMY
-aOA
-aPO
-aRf
-aSc
-aSc
-aUw
-apd
-aXK
-avr
-aZJ
-bbT
-bSy
-apd
-aZH
-beF
-bfl
-bmi
-bjw
-bmk
-bbR
-boT
-bbR
-bbR
-buI
-bbR
-bwd
-bxD
-byL
-byK
-byT
-bwe
-bAx
-bTE
-bCq
-bHD
-bJe
-bCq
-nkP
-bHE
-bHE
-bHE
-bHE
-bLv
-ayF
-bLv
-bUs
-bCq
-iiW
-iiW
-fxa
-bcU
-bcU
-vzO
-iiW
-oKh
-oKh
-iiW
-bLv
-bUs
-bLv
-ayF
-cjJ
-cjJ
-cjJ
-cjJ
-cjJ
-cnR
-coB
-cjJ
-cjJ
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBD
-azl
-aBD
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(93,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-aai
-aai
-aai
-abb
-abt
-aca
-acz
-acX
-adC
-aeb
-aeI
-afv
-agf
-abc
-dly
-xxp
-mcp
-gWo
-gDP
-lAH
-lNH
-akG
-akG
-kHd
-vGn
-gav
-cxP
-pUy
-arP
-aqU
-arg
-arP
-arP
-arP
-arP
-vgJ
-hSl
-ayG
-azL
-aBf
-aBY
-aDw
-aES
-aJh
-aHv
-aJh
-aKA
-aLN
-aMS
-aOz
-exP
-aPQ
-aSa
-aSr
-aSr
-apd
-aYZ
-bLE
-aqW
-aqW
-noy
-apd
-beA
-bqp
-cNG
-cNJ
-bLF
-aZK
-sRH
-bbR
-bqt
-cBq
-bbR
-bbR
-bwd
-bxC
-byK
-cBv
-byO
-bwe
-bAo
-bTE
-bGo
-bHC
-ceW
-bCq
-bCq
-bLv
-bLv
-bHE
-bLv
-bCq
-ayF
-bLv
-bUs
-bCq
-sRT
-usO
-iiW
-oKh
-oKh
-iiW
-iiW
-iiW
-izv
-nfm
-bCq
-bUs
-bCq
-ayF
-ayF
-ayF
-ayF
-ayF
-cjJ
-cnQ
-coA
-cpo
-cjJ
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBD
-aBD
-aBD
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(94,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-aai
-eqd
-kgr
-abe
-abw
-acc
-acB
-acZ
-adE
-aee
-aeL
-afy
-agh
-abc
-kCa
-hnU
-vda
-sXV
-agv
-amM
-aiX
-aiX
-aiX
-aiX
-aiX
-foT
-ibK
-pUy
-arP
-aqR
-arl
-arP
-asS
-sfs
-eyr
-awb
-axt
-ayG
-azN
-aBe
-aBe
-aDy
-aEU
-aGf
-aHL
-aJi
-aKB
-aLT
-aNp
-aOC
-aPQ
-aPQ
-aTL
-aTP
-aWD
-apd
-aYj
-aZL
-baU
-baU
-bcV
-apf
-bfn
-beW
-bfR
-bKF
-bNH
-aZK
-bnJ
-bbR
-bbR
-bbR
-bty
-buJ
-bwe
-bxE
-byM
-bAd
-bBf
-bwe
-bAJ
-bCe
-bCq
-bHE
-bJf
-bCq
-ayF
-ayF
-bLv
-bHE
-bLv
-ayF
-ayF
-bTB
-bUv
-bES
-bES
-bES
-bES
-bGp
-bGp
-bGp
-bGp
-bES
-bES
-bES
-car
-bUs
-bCq
-bCq
-bCq
-bCq
-bCq
-bCq
-cjJ
-cnS
-coC
-cpp
-cjJ
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(95,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-aai
-gbu
-aay
-abd
-abv
-acb
-acA
-acI
-adD
-aed
-aeK
-afx
-agg
-abc
-ovv
-dCV
-idK
-age
-kZS
-agu
-agj
-amL
-apK
-amX
-aiX
-aiE
-aiK
-aiN
-arP
-arc
-arP
-arP
-usE
-aqR
-aqR
-awb
-axt
-ayG
-ayG
-ayG
-ayG
-ayG
-ayG
-ayG
-ayG
-ayG
-ayG
-aHP
-aNc
-aOB
-aPQ
-aPQ
-aSs
-aSs
-aSs
-apd
-apd
-apd
-baV
-bON
-apd
-apd
-aZK
-beV
-cNI
-bKP
-cNI
-aZK
-bnK
-bnK
-bqu
-bqu
-bnK
-bnK
-bwe
-bwe
-bwe
-bwe
-bwe
-bwe
-bAI
-bCd
-bCq
-bCq
-bCq
-bCq
-bLv
-bLv
-bLv
-bOK
-bLv
-bLv
-bLv
-bTA
-bUu
-bLw
-bLw
-bLw
-bLw
-bLw
-bLw
-bLw
-bLw
-bLw
-bLw
-bLw
-caq
-cbw
-ceW
-ciT
-bCq
-bSs
-ceY
-ccw
-ccw
-cnR
-cgT
-cjJ
-ccw
-ccw
-ccw
-ccw
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(96,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-aai
-acd
-mIZ
-abg
-enB
-aby
-aby
-aby
-aby
-aeg
-aeN
-afA
-afA
-abc
-kuA
-laq
-kdP
-mGw
-akm
-akr
-alZ
-amO
-arQ
-aor
-aiX
-aiF
-aqI
-asv
-aqT
-apS
-arn
-apS
-apS
-apS
-apS
-ajw
-ajy
-ayJ
-ayJ
-aBi
-aqR
-aqR
-aqR
-aqR
-aqR
-aqR
-arP
-aLI
-aNr
-bBo
-aJq
-aRh
-aJq
-aJq
-aJq
-aJq
-aJq
-aLY
-aJq
-aJq
-aRh
-bbV
-bfo
-bkS
-bfo
-bgn
-bfo
-bmn
-bfo
-boW
-bmE
-bmE
-btz
-btz
-bwf
-btz
-btz
-btz
-bBh
-bCr
-bAK
-bCn
-bGq
-bGq
-bGq
-rGq
-bLw
-bGq
-bGq
-bGq
-bLw
-bGq
-rGq
-bTD
-bUx
-bVI
-bVI
-bVI
-bVI
-bVI
-bVI
-bVI
-bVI
-bVI
-bVI
-bVI
-bTA
-xgk
-bHE
-bHE
-bHE
-bHE
-bHE
-cmD
-cnr
-cnU
-chD
-cpq
-cpV
-cqw
-cqO
-crp
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(97,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-aai
-aai
-abf
-aaK
-jRw
-aaU
-acd
-acC
-ada
-adF
-aef
-aeM
-afz
-oSl
-ail
-lRb
-vIi
-fsj
-sXV
-xnm
-rAR
-uCU
-and
-arS
-anq
-aiX
-aiT
-ass
-aiT
-arP
-arP
-arP
-arP
-arP
-arP
-arP
-ajx
-axw
-ayI
-azO
-aBh
-akL
-aDz
-aEV
-aGg
-aHx
-aqZ
-apg
-aLx
-aNq
-aOD
-aPe
-aJq
-aJq
-aJq
-aJq
-aJq
-aJq
-aLY
-aJq
-aJq
-bHt
-aJq
-aJq
-beX
-aJq
-bgm
-bjx
-bmm
-bnM
-boV
-bnM
-bnM
-bnM
-bnM
-bnM
-bnM
-bnM
-bAe
-bBg
-bCq
-bCq
-bDt
-bGp
-bGp
-bGp
-bES
-bGp
-bGp
-bGp
-bGp
-bGp
-bGp
-bES
-bTC
-bAx
-bVI
-bWB
-bWB
-bYz
-bYz
-cag
-cbl
-bYz
-bWB
-bWB
-bVI
-cax
-cbx
-cdh
-ciU
-cjK
-ckA
-ckA
-cmC
-cmC
-cfJ
-chB
-cpW
-cgR
-cgR
-cqN
-cro
-swf
-ncF
-swf
-ykN
-ykN
-ykN
-ykN
-ykN
-ncF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(98,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aiS
-aai
-aai
-aai
-aai
-aaI
-aat
-aat
-aat
-aat
-ace
-aat
-aat
-adH
-aei
-aeO
-afJ
-sXV
-sXV
-sXV
-sXV
-sXV
-sXV
-oby
-ajX
-agj
-amL
-asp
-nbY
-aiX
-iRj
-anz
-aov
-cCi
-apU
-ajd
-arU
-apU
-apU
-cCi
-awg
-axy
-ayL
-azQ
-aBk
-ayL
-ayL
-ayL
-ayW
-ayW
-ayW
-ayW
-aLW
-aNs
-aJq
-aLX
-aLX
-aLX
-aLX
-aLX
-aJq
-aYl
-aZN
-aYl
-aYl
-aYl
-aYl
-aYl
-bgG
-bid
-aYl
-bBi
-aLY
-bnN
-boY
-bqw
-aJq
-aJq
-aYl
-fAj
-aLX
-aJq
-aJq
-bBi
-aJw
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-bCq
-bTF
-bAx
-bVI
-bWD
-bXA
-bYB
-bYz
-cai
-cSF
-ccg
-cdd
-cea
-bVI
-caz
-cby
-cdj
-cdv
-cem
-cem
-cem
-cfe
-cfD
-cgv
-chE
-ciN
-ciN
-cji
-cDZ
-crr
-utp
-utp
-utp
-swf
-ykN
-ykN
-ykN
-ykN
-dUG
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(99,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-aai
-aan
-aaw
-aaB
-qmn
-aaJ
-aat
-abh
-aat
-acd
-abK
-acY
-adG
-aeh
-aeO
-ado
-afq
-afH
-agY
-ahS
-aiI
-afn
-vfX
-akD
-agj
-agj
-agj
-agj
-aiX
-ycY
-anz
-aov
-cCi
-air
-aqY
-arT
-apU
-apU
-cCi
-awg
-axy
-ayK
-azE
-aBj
-aBO
-aDC
-ayL
-aGo
-aHN
-aJj
-ayW
-aLV
-aJq
-aOE
-aJn
-aJn
-aJn
-aJn
-aJs
-aJq
-aYk
-aZM
-aZM
-bbW
-bcX
-bcX
-aZM
-aZM
-aZM
-bjz
-bkT
-bjz
-bjz
-aiV
-bqv
-bqv
-bqv
-bqv
-bwg
-aJw
-aJq
-aJq
-bBi
-aJw
-ayF
-bEU
-bGr
-bGr
-bGr
-bKr
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-bCq
-bTE
-bAx
-bVI
-bWC
-bXz
-bYA
-bZn
-cah
-bWB
-ccf
-cdc
-cdZ
-bVI
-cay
-ccw
-ccw
-ccw
-ccw
-ccw
-ccw
-ccw
-ccw
-cfL
-coH
-cBO
-cgR
-cDB
-cqP
-crq
-utp
-utp
-utp
-jhU
-ykN
-ykN
-ykN
-ykN
-ncF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(100,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-aak
-aap
-saX
-aaD
-aau
-aat
-aat
-aat
-abA
-acd
-acd
-acd
-acd
-aek
-acp
-aav
-agO
-afI
-ahb
-ahZ
-aiL
-lZn
-akg
-kuh
-aly
-anP
-gyr
-okK
-xal
-aqC
-anz
-aov
-cCi
-aqX
-arR
-asj
-iUK
-ajr
-atY
-auo
-axy
-ayN
-azE
-aAW
-aCa
-aDB
-aDI
-azW
-azW
-azW
-ayW
-aLX
-aJq
-aOE
-aJn
-ayF
-ayF
-aJn
-aJs
-aJq
-aYn
-aZM
-aZu
-bbY
-bcY
-bdX
-bbX
-bgH
-bie
-bjB
-bkW
-bmp
-bjz
-ajh
-bqy
-cBr
-bqy
-buK
-tZe
-aJw
-aJq
-aJq
-bBi
-aJw
-ayF
-bEW
-bGt
-bHG
-bJh
-bEW
-ayF
-ayF
-ayF
-ayF
-bKv
-bLB
-bES
-bMj
-bAx
-bVI
-bWF
-bXC
-bXC
-bZp
-cak
-bWB
-bWB
-bWB
-cec
-bVI
-kNv
-ccw
-chY
-ciX
-cjM
-ckB
-ckB
-ckB
-ccw
-cnY
-coH
-cgR
-cgR
-cqx
-cgR
-crp
-utp
-utp
-utp
-swf
-ykN
-ykN
-ykN
-ykN
-dUG
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(101,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-aaj
-aao
-aax
-aaC
-aaA
-aat
-aat
-aat
-aei
-acd
-acE
-add
-adF
-aej
-aeQ
-adp
-ahv
-afK
-aht
-aid
-aiM
-ajz
-alz
-cZe
-alg
-plS
-dyE
-pQr
-aou
-aqC
-anz
-aov
-ape
-arT
-aqV
-ajf
-apU
-ajt
-cCi
-awg
-axy
-ayM
-azs
-aAR
-aBP
-aDA
-aEW
-aGi
-aHB
-aEZ
-aBt
-aJs
-aJq
-aOE
-aJn
-ayF
-ayF
-aJw
-aVb
-aWH
-aYm
-aZM
-aZq
-bbX
-bbX
-bbX
-bfp
-aZP
-aZP
-bjA
-cAG
-bmo
-bmr
-boZ
-bqx
-brU
-bmr
-bmr
-bmr
-bmr
-byN
-aJq
-bBj
-aJw
-ayF
-bEV
-bGs
-cBC
-bJg
-bKs
-ayF
-ayF
-ayF
-ayF
-bJQ
-bLg
-cem
-cem
-bNg
-bVI
-bWE
-bXB
-bYC
-bZo
-bWB
-bWB
-cch
-cde
-ceb
-bVI
-cay
-ccw
-chY
-ciZ
-ciW
-ckB
-ckB
-ckC
-ccw
-cnX
-coH
-cps
-cpX
-cqz
-cqR
-ccw
-utp
-utp
-utp
-jhU
-ykN
-ykN
-ykN
-ykN
-ncF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(102,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-aal
-aar
-uGI
-aaF
-aat
-aat
-aaW
-aat
-abB
-acf
-abM
-acG
-adI
-aem
-omX
-afG
-aim
-afL
-ahu
-aie
-aiO
-afn
-xzv
-agL
-akT
-gNE
-gLz
-rcI
-seP
-aqC
-anz
-aov
-cCi
-tKb
-arT
-arT
-asn
-atK
-auq
-avs
-axz
-ayP
-azU
-aBo
-aCg
-azW
-aEX
-aEZ
-aEZ
-aEZ
-vbD
-aJs
-aJq
-bJx
-aJn
-ayF
-ayF
-aTQ
-aVd
-aWJ
-aYp
-aZM
-aZz
-baI
-bda
-bda
-bca
-bgJ
-aZP
-cNL
-bkY
-bmo
-bnP
-bpc
-bqA
-brW
-btB
-buM
-bwi
-bmr
-aMm
-aJq
-vEi
-bCs
-bCs
-bEY
-bGu
-bHI
-bJi
-bEY
-bCs
-bCs
-bNI
-bNI
-bRn
-cce
-bNI
-bNI
-bUz
-bVI
-bWG
-bXD
-bYz
-cSE
-bWB
-bYz
-bYz
-cdf
-ced
-bVI
-cay
-ccw
-ciZ
-ciZ
-ciZ
-ckC
-ckC
-ckC
-ccw
-coa
-coJ
-clJ
-clJ
-cig
-cig
-ccw
-utp
-utp
-utp
-swf
-ykN
-ykN
-ykN
-ykN
-dUG
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(103,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-aaj
-aaq
-dyS
-aaE
-aat
-aaN
-aaV
-rvS
-aat
-acd
-abL
-adb
-acd
-ael
-aeO
-afF
-agj
-agj
-afn
-afn
-agj
-agj
-agM
-sAk
-akp
-akQ
-amB
-amn
-amS
-anz
-anz
-aov
-cCi
-arT
-arT
-asl
-arT
-apU
-cCi
-awg
-axy
-ayv
-azE
-aBn
-aCb
-aDD
-aEY
-aGj
-aHC
-aEZ
-aBt
-aJs
-aJq
-aOE
-aJn
-ayF
-ayF
-aPR
-aVc
-aWI
-aYo
-aZM
-aZy
-bay
-bcZ
-bdY
-bdF
-bgI
-aZP
-bjC
-bkX
-bmo
-bnO
-bpb
-bqz
-bqq
-brS
-bsY
-bue
-bmr
-aMn
-aJq
-bBi
-bCs
-bDv
-bEX
-bFb
-kfv
-bFa
-bKt
-bLx
-bCs
-cCe
-bRl
-apV
-bLC
-cCf
-bNI
-bUz
-bVI
-bWB
-bWB
-bYz
-bZq
-cal
-cbm
-bYz
-bWB
-bWB
-bVI
-cay
-ccw
-ccw
-ciY
-ciY
-ccw
-ccw
-ccw
-ccw
-cnZ
-coH
-cgR
-oEr
-cig
-nEI
-ccw
-utp
-utp
-utp
-jhU
-ykN
-ykN
-ykN
-ykN
-ncF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(104,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-aal
-aat
-aat
-aat
-aat
-qXg
-jjC
-xOx
-abD
-acd
-acd
-acd
-acd
-aen
-aeO
-ahE
-afq
-aii
-afM
-aig
-agp
-agj
-lfV
-akl
-akM
-amm
-gyr
-anM
-rJv
-aqC
-anz
-aox
-cCi
-cCi
-cCi
-cCi
-cCi
-cCi
-cCi
-awg
-axy
-ayQ
-azE
-aBq
-aBr
-aDE
-aFc
-azW
-azW
-aJf
-ayW
-aJr
-aJq
-aOE
-aJn
-ayF
-aPR
-aPR
-aPR
-aWL
-aPR
-aZM
-bbX
-bay
-bbM
-bcN
-bdK
-bgL
-aZP
-aZP
-aZP
-bmo
-bnR
-bpe
-bqB
-bqq
-btD
-buO
-bwk
-bmr
-aLY
-cBw
-bBk
-bCs
-bDx
-bFa
-bFa
-bHJ
-bFa
-bFa
-bLz
-bCs
-cCe
-bNJ
-apV
-xhV
-gWd
-bNI
-bUz
-bVJ
-bWI
-bXF
-bXF
-bZs
-cao
-cbo
-bXF
-bXF
-cef
-bVJ
-cay
-ccw
-cig
-cjb
-cjb
-cig
-cig
-cmG
-cnt
-cob
-coL
-wgZ
-cgR
-thz
-mZO
-fpt
-utp
-jhU
-dUG
-swf
-ykN
-ykN
-ykN
-ykN
-dUG
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(105,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-aaj
-aas
-aat
-aat
-aat
-aat
-uEI
-aat
-abC
-acd
-acH
-adc
-acd
-aeo
-aev
-aeS
-ahw
-ajg
-afM
-akU
-afM
-lBz
-alA
-ene
-alg
-kbm
-dyE
-cKC
-seP
-aqC
-anR
-aow
-apg
-aqZ
-aqZ
-aqZ
-apW
-aqZ
-avh
-awh
-axz
-ayO
-azE
-aBp
-aCc
-aDF
-ayL
-aGq
-aHO
-aJl
-ayW
-ftE
-aJq
-aOE
-aJn
-ayF
-aPR
-aTR
-aVe
-aWK
-aYq
-aZO
-aZC
-baK
-rnt
-bbC
-bdI
-bgK
-bgK
-bjE
-bgK
-bmq
-bnQ
-bpd
-bpd
-bqr
-btC
-buN
-bwj
-bmr
-byP
-aJq
-bBi
-bCs
-bDw
-bEZ
-bGv
-bHH
-bJj
-bKu
-bLy
-bCs
-xZo
-bNJ
-bKx
-cjL
-gbq
-bNI
-bUz
-bVJ
-bWH
-bXE
-bYD
-bZr
-can
-cbn
-cci
-cdg
-cee
-bVJ
-cay
-ccw
-cia
-cSN
-cSS
-ckD
-cTc
-cTe
-cfG
-cgw
-abY
-fkR
-uvd
-ccw
-ccw
-ccw
-xJY
-gkD
-sYC
-spz
-sYC
-sYC
-fft
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(106,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-aam
-aav
-aav
-aav
-aav
-aav
-aav
-aav
-abE
-acg
-acJ
-ade
-adJ
-aep
-aeT
-ahE
-aim
-ajL
-akj
-afM
-afM
-nss
-kQz
-alB
-akT
-gNE
-gLz
-anB
-amR
-aqC
-anz
-aov
-aph
-aph
-aph
-arW
-aso
-auf
-avi
-awi
-axy
-ayS
-azS
-aBs
-aCi
-aDI
-ayL
-ayW
-ayW
-ayW
-vUI
-aJq
-aJq
-aOE
-aJn
-ayF
-aPR
-aTT
-aVg
-aWN
-aYs
-aZQ
-bbi
-bde
-kvL
-bcd
-bcd
-gNC
-bcd
-bcd
-bcd
-bms
-bnS
-ajs
-bqC
-brZ
-btE
-bnS
-bwl
-bxG
-byR
-bnM
-bBl
-bCs
-bFa
-bFa
-bFa
-bHH
-bFa
-bFa
-bFa
-bCs
-xZo
-bNJ
-apV
-cjL
-nxv
-bNI
-bUz
-bVJ
-bOo
-bOD
-bQb
-bZv
-bSd
-bXG
-bOC
-bWt
-cBK
-bVJ
-cay
-ccw
-cid
-cSO
-cen
-ckG
-clJ
-cmF
-cgR
-cgI
-hsZ
-eon
-bHg
-bHg
-bHg
-lgA
-gDB
-hOI
-qmG
-uqX
-oEe
-oMH
-uSL
-fft
-ccw
-ccw
-ccw
-ccw
-ccw
-ccw
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(107,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-aai
-wYc
-wYc
-aaG
-wYc
-aaP
-aaX
-keM
-xib
-acd
-acD
-acY
-adG
-aeq
-aeV
-agj
-agj
-agj
-tHh
-ahG
-ajY
-fxx
-ako
-ene
-amj
-akQ
-amB
-amn
-amS
-anz
-anz
-aov
-aph
-aob
-ara
-arV
-apZ
-aph
-aph
-awg
-axA
-ayR
-azR
-aBr
-azW
-afO
-azW
-agm
-aBt
-ayF
-aJn
-aLY
-aLY
-aOF
-aPR
-aPR
-aPR
-aTS
-aVf
-aWM
-aYr
-aZP
-bbh
-bcc
-bdd
-cVs
-bfr
-bgM
-bif
-aZM
-aZM
-bmr
-bmr
-bmr
-bmr
-bmr
-bmr
-bmr
-bmr
-bmr
-byQ
-aJq
-bBi
-bCs
-bFa
-bFa
-bGw
-bER
-bJk
-bFa
-bLA
-bCs
-cCd
-bQc
-bKA
-rKP
-bSv
-bNI
-bUB
-bVJ
-bOl
-bOC
-bPQ
-bQK
-bYF
-bTI
-bUy
-bWs
-ceg
-bVJ
-cay
-ccw
-cic
-cSP
-cST
-cTa
-ceZ
-clQ
-cgR
-vOF
-hSh
-ssh
-wKZ
-wKZ
-wKZ
-wKZ
-qGd
-wKZ
-wKZ
-kjm
-wKZ
-mdG
-tcF
-vOF
-fAX
-hVs
-iWD
-hUv
-fPM
-ccw
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(108,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-aai
-aai
-aai
-aai
-aai
-aai
-aai
-abj
-abF
-acd
-acd
-acd
-acd
-aeP
-afC
-agk
-cOV
-agP
-ajJ
-agT
-all
-all
-aku
-akl
-amk
-amm
-gyr
-mos
-rJv
-aqC
-anz
-aov
-aph
-aoc
-ata
-arY
-ata
-auh
-aph
-awg
-axA
-ayT
-azR
-azW
-azW
-aBt
-azW
-aio
-aBt
-ayF
-aJn
-aJq
-aJq
-aOE
-aPT
-aRj
-aSv
-aTV
-aVi
-aWP
-aYu
-aYt
-bbk
-bbk
-bfu
-bbk
-bfs
-rTu
-aZM
-aZM
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-fxV
-aXf
-aJq
-bBi
-bCs
-bAM
-bFa
-bGy
-bFc
-bJm
-bFa
-bHO
-bCs
-cCd
-cCd
-aYg
-cjL
-cCc
-bNI
-bEP
-bVJ
-bVJ
-bOM
-bQd
-bQP
-bSt
-bUc
-bVb
-bWv
-cei
-bVJ
-cay
-ccw
-cif
-cSQ
-cSU
-cTb
-cTd
-ckF
-ckF
-qiK
-cQU
-wKZ
-uut
-cVt
-cVt
-svN
-vHx
-rjH
-fJs
-nyb
-rBP
-foo
-sZN
-tAR
-oRG
-oRG
-mHl
-hVs
-hVs
-ccw
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(109,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aai
-abi
-eqA
-ach
-acK
-adf
-acd
-aer
-afB
-agi
-eWL
-afN
-ajK
-aiH
-akF
-aiy
-akv
-uXt
-alg
-pAK
-dyE
-anQ
-seP
-aqC
-anz
-aov
-api
-ata
-arb
-arX
-atc
-aug
-aph
-awg
-axA
-azW
-ayU
-azW
-aCj
-ayW
-ayW
-ayW
-ayW
-aJn
-aJn
-aJq
-aJq
-aOE
-aPS
-aRi
-aSu
-aTU
-cpC
-aWO
-aYt
-aYx
-bbj
-bce
-bdf
-beb
-aYv
-cUx
-fcn
-ayF
-ayF
-ayF
-ayF
-ayF
-fxV
-fxV
-fxV
-fxV
-fxV
-fxV
-aXf
-aJq
-byU
-bCs
-bAL
-bFa
-bGx
-bET
-bJl
-bHh
-bHN
-bCs
-cjo
-cCd
-bSx
-cjL
-cCb
-bNI
-bEP
-bLu
-bVJ
-bVJ
-bVJ
-bVJ
-bVJ
-bVJ
-bUC
-bWu
-bVJ
-bVJ
-cay
-ccw
-cie
-cdT
-cCY
-cnA
-cev
-cfg
-cgU
-osB
-kZE
-wKZ
-tRi
-lHe
-xEC
-vnu
-oNQ
-lBy
-oNQ
-vnu
-oZv
-iVJ
-glC
-jrl
-peI
-kXA
-ciZ
-ciZ
-cMp
-ccw
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(110,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-aiS
-aai
-aai
-aai
-aai
-aai
-aai
-aai
-aaZ
-aaZ
-aiX
-aiX
-afS
-ahx
-aiX
-aiQ
-xUX
-akx
-uTe
-akT
-amx
-any
-arD
-amR
-aqC
-anz
-aov
-aph
-aqb
-are
-arZ
-ata
-aui
-aph
-awg
-axA
-ayX
-azY
-azW
-azW
-afP
-aFb
-aEZ
-cyg
-aJp
-aKE
-aMa
-aNw
-aOE
-aPU
-aRl
-aSx
-aTX
-aVi
-aWR
-aYv
-aZS
-aZR
-aZR
-bbm
-bec
-bfu
-vBa
-aBa
-aBa
-aBa
-aBa
-aBa
-aBa
-fxV
-bsb
-yhz
-ouQ
-cQT
-nbT
-aXf
-aJq
-bBi
-bCs
-wJF
-bFa
-bFa
-bET
-bJn
-bHi
-bHQ
-bCs
-cjo
-bJu
-bSx
-cmX
-bSz
-bNI
-bUD
-bVM
-bVM
-bVM
-bVM
-bVM
-cat
-bCq
-bVd
-bWK
-bYp
-bCq
-cay
-ccw
-cig
-cSR
-cSV
-cig
-cig
-cTf
-cgR
-ccw
-spl
-sXl
-eHa
-tOn
-xEC
-bkZ
-qBq
-sTo
-vwZ
-bkZ
-cOz
-jXN
-dIt
-uvd
-ciZ
-cxm
-jTJ
-kLz
-ciZ
-ccw
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(111,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-aAu
-ayF
-abx
-aaZ
-aeF
-ack
-agJ
-acT
-adK
-aew
-afT
-ahy
-aij
-aiR
-ajc
-akz
-ene
-als
-akQ
-amB
-amn
-amS
-aqD
-anz
-aov
-aph
-cIv
-ard
-ard
-ard
-aph
-aph
-awj
-axA
-ayW
-ayW
-aBt
-aBt
-ayW
-ayW
-ayW
-ayW
-aJo
-aJq
-aLZ
-aNv
-aOE
-aPS
-aRk
-aSw
-aTW
-aVj
-aWQ
-aYv
-aZR
-aZR
-aZR
-aZR
-aZR
-bft
-psk
-aBa
-aBT
-aDs
-aEN
-aGb
-aBa
-bqD
-bsa
-vCn
-dzQ
-bsa
-nbT
-byS
-aJq
-wTf
-bCs
-bCs
-bCs
-bCs
-bFe
-bCs
-bLD
-bCs
-bCs
-bNI
-bNI
-bKU
-cnB
-bNI
-bNI
-bCq
-bCq
-bCq
-bCq
-bCq
-bCq
-cas
-bCq
-bVc
-bWJ
-bYn
-bZB
-caC
-ccw
-cSM
-cjd
-cSW
-ckI
-clJ
-cmL
-cBO
-ccw
-hAe
-wKZ
-ePU
-pPv
-bkZ
-kJc
-snF
-snF
-rgx
-bkZ
-dlO
-gAi
-dIt
-ccw
-ePe
-hVs
-hVs
-hVs
-hVs
-ccw
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(112,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-aAu
-ayF
-abG
-aaZ
-aeW
-acl
-agJ
-adg
-adL
-adL
-ago
-ahz
-aim
-aiW
-ajc
-akz
-ene
-alg
-alt
-amp
-aot
-apR
-aqE
-anz
-old
-apk
-anw
-anw
-anw
-anw
-aVh
-avj
-awl
-axC
-ayY
-cpF
-azZ
-azZ
-azZ
-azZ
-aGt
-aHQ
-aJr
-aJq
-aMc
-aNy
-aOE
-aPS
-aRn
-aSz
-aTY
-aVl
-aWT
-aYx
-aZR
-bbm
-bbm
-bdh
-bee
-bfv
-xUL
-aBb
-gpD
-aDr
-cJW
-aGa
-aHF
-bqF
-buQ
-buQ
-pzk
-buQ
-bxI
-bwa
-bAg
-bBq
-bCu
-bAO
-bFd
-bFd
-bFj
-bJp
-bHk
-bHR
-bIe
-bFd
-bJz
-bRp
-cav
-bSA
-bTJ
-bSA
-bSA
-bWL
-bSA
-bSA
-bZx
-bSR
-bUl
-bVf
-bXm
-bYE
-bCq
-bHE
-ccw
-cij
-cjf
-cSX
-ckK
-clJ
-cmL
-cgR
-fkR
-sVb
-lIY
-oYj
-taY
-deE
-voa
-vAi
-vAi
-vAi
-bkZ
-hid
-lLa
-gGH
-uvd
-tGG
-hVs
-hVs
-pPs
-hVs
-ccw
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(113,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-aBD
-ayF
-abG
-aaZ
-aeX
-acm
-agK
-aaZ
-aaZ
-aex
-agt
-aaZ
-aaZ
-aaZ
-fsa
-akz
-itD
-alg
-vyK
-amI
-alg
-alv
-aqE
-anS
-aoy
-apj
-anz
-anz
-anz
-anz
-anz
-anz
-awk
-axB
-anz
-anz
-anz
-anz
-anz
-anz
-apj
-aHP
-aJq
-aJq
-aMb
-aNx
-aOE
-aPS
-aRm
-aSy
-aTX
-aVk
-aWS
-aYw
-aZT
-cBj
-bcf
-bdg
-bed
-bfv
-tyX
-pst
-cTT
-alu
-aEM
-aGd
-uOJ
-bqE
-bqE
-bqE
-bqE
-bqE
-knx
-bvW
-bAf
-bBp
-aHP
-bAN
-bQg
-bQg
-bFh
-bGN
-bHj
-bNN
-bNN
-bNN
-bNN
-bNN
-cau
-cBH
-bMG
-bLZ
-bLZ
-bLZ
-bLZ
-bLZ
-bQQ
-bSw
-cbr
-bVe
-bXk
-bYq
-bCq
-ceW
-ccw
-cdk
-cMC
-cSY
-ckI
-clJ
-cmL
-cnv
-uvd
-sCS
-wKZ
-sPm
-rOg
-pBd
-fUP
-pBd
-vEc
-pBd
-vob
-gCd
-wAh
-wAh
-uvd
-uBP
-hVs
-uBP
-iPp
-hVs
-ccw
-ayF
-oDb
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(114,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-aAu
-ayF
-abG
-aaZ
-aeY
-acn
-agR
-agW
-ahA
-aeE
-agz
-ahW
-ain
-aiZ
-jyO
-ajC
-akC
-akX
-alw
-amJ
-aoY
-rCl
-aqE
-anz
-aoz
-apm
-aqd
-anA
-asa
-atd
-anA
-avk
-awk
-axE
-ayZ
-pHO
-aBu
-aAa
-aAa
-aAa
-aGu
-aHR
-aJt
-aJq
-aMe
-aNA
-aOE
-aPV
-aRp
-aSB
-aTZ
-aVn
-aWV
-aYz
-aZR
-bbm
-bbm
-bdh
-bef
-bfv
-gTx
-aBc
-xEB
-aDt
-aEO
-aGc
-vOU
-rTD
-dml
-dml
-oNz
-dml
-bxK
-bwh
-bAh
-bBs
-bzG
-bAP
-bCp
-bDp
-bFq
-bGO
-bHl
-bHS
-bLI
-apI
-bQg
-bQg
-bQg
-bQg
-bQg
-bQg
-bQg
-bQg
-bQg
-bYI
-bDG
-bHP
-cbt
-bVh
-bXo
-bYM
-cfb
-cfb
-cfb
-cfb
-cfb
-cfb
-cfb
-ccw
-cmN
-cgR
-fkR
-viD
-lIY
-nRl
-mKq
-fpW
-dSI
-fxZ
-fxZ
-fxZ
-bkZ
-wLY
-gJm
-qzA
-uvd
-hVs
-hVs
-hVs
-vxV
-hVs
-ccw
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(115,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aAu
-ayF
-abG
-aaZ
-aeZ
-aco
-agS
-aho
-ahX
-afb
-agH
-agH
-aip
-aja
-xTe
-akz
-alg
-agn
-agn
-amN
-aoZ
-apT
-anw
-anz
-cXU
-apl
-aqc
-aqc
-aqc
-aqc
-aqc
-aqc
-awm
-axD
-ahn
-ahn
-ahn
-ahn
-ahn
-ahn
-ahn
-ahn
-aJs
-aJq
-aMd
-aNz
-aOE
-aPS
-aRo
-aSA
-aTX
-aVm
-aWU
-aYy
-aZR
-aZR
-aZR
-aZR
-aZR
-bfw
-wZI
-aBa
-aBW
-bjy
-aEP
-nYe
-aBa
-bqG
-bsa
-eih
-pQN
-bsa
-nbT
-bwb
-aJq
-bBr
-bCv
-bCv
-bCv
-bCv
-bCv
-bJq
-bKw
-bLH
-bQf
-bNO
-bQg
-bQf
-bQt
-bTK
-bTK
-bVU
-bUE
-bWM
-bXJ
-bMK
-bMK
-bYH
-bYH
-bVg
-bXn
-bYG
-cfb
-cfF
-cfb
-cik
-cjg
-cjU
-cfb
-clM
-cfz
-cgR
-ccw
-owT
-wKZ
-rEB
-bkZ
-oXJ
-roP
-oYS
-oYS
-fxS
-bkZ
-dlO
-gAi
-dIt
-ccw
-ePe
-hVs
-hVs
-hVs
-hVs
-ccw
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(116,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-aBD
-ayF
-abG
-aaZ
-afc
-aco
-agU
-ahp
-ahY
-afd
-afd
-ahB
-aiq
-ajb
-mml
-ajF
-akN
-akY
-alE
-amU
-apH
-apX
-aqC
-anz
-gfC
-aod
-aqf
-ahT
-ahT
-ahT
-ahT
-ahT
-awn
-axF
-anF
-anF
-anF
-anF
-anF
-anF
-anF
-aoa
-aJu
-aKF
-aMf
-aNB
-aOE
-aPS
-aRr
-aSD
-ceh
-aVp
-aWX
-aYB
-aZU
-aZR
-aZR
-bbm
-beh
-bfx
-qcm
-aBa
-aBa
-aBa
-aBa
-aBa
-aBa
-wql
-bsg
-yhz
-ouQ
-fTC
-nbT
-aJq
-aJq
-bBu
-bCv
-bAT
-bDL
-bDq
-bCv
-bJs
-bKy
-bLK
-bLK
-bML
-bOT
-bQi
-bRs
-bSC
-bUO
-bUG
-bVO
-bWO
-bXK
-bLK
-bZz
-caw
-bYH
-bVo
-bXq
-bZe
-cfb
-cfH
-cSL
-cim
-cim
-ceo
-cfb
-cfa
-cje
-cgR
-ccw
-owT
-fJZ
-fPU
-lHk
-uzi
-bkZ
-qeF
-naN
-xrc
-bkZ
-lpA
-xuz
-dIt
-uvd
-ciZ
-wbd
-kVO
-hLJ
-ciZ
-ccw
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(117,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-adR
-abo
-adR
-adR
-adR
-abI
-acM
-adh
-adM
-afe
-agI
-ahQ
-ait
-aje
-eFx
-alj
-afM
-akZ
-alM
-amV
-apc
-aqr
-aqC
-anT
-aoA
-apn
-aqe
-arf
-arf
-arf
-arf
-arf
-arf
-arf
-arf
-arf
-dgz
-dgz
-dgz
-dgz
-dgz
-dgz
-aJn
-aJn
-aJq
-aJq
-aOE
-aPS
-aRq
-aSC
-aUa
-aVo
-aWW
-aYA
-aYz
-bbn
-bcg
-aZU
-beg
-aYB
-qOB
-qBi
-ayF
-ayF
-ayF
-ayF
-ayF
-fxV
-fxV
-fxV
-fxV
-fxV
-fxV
-aJq
-aJq
-bBt
-bCv
-bDH
-bFf
-bGB
-bCv
-bJs
-bKy
-bLJ
-agd
-bNP
-bOS
-bQh
-bRr
-bSB
-bTL
-bUF
-bVN
-bWN
-bXM
-bLK
-bRi
-bZy
-cbu
-bVm
-bXp
-bYO
-cfc
-cgO
-ccj
-cBM
-cdU
-cSZ
-ckL
-cmF
-cje
-cgR
-uvd
-oxl
-gAi
-fPU
-lHk
-uzi
-vnu
-mDB
-pRx
-mDB
-vnu
-gIy
-gAi
-izw
-jrl
-peI
-gBa
-ciZ
-ciZ
-cMp
-ccw
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(118,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-adR
-aaY
-abJ
-abR
-adR
-acq
-ahX
-adi
-adP
-ahK
-ahK
-ahR
-aiv
-adg
-xSW
-ajI
-alC
-ala
-alN
-amW
-apv
-aqt
-aqF
-anz
-aoB
-aod
-aqe
-arf
-aqa
-atf
-arf
-aqa
-atf
-arf
-aqa
-atf
-dgz
-tqg
-ujF
-ujF
-ujF
-dgz
-ayF
-aJn
-aJq
-aJq
-aOE
-aPX
-aRs
-aSE
-aUc
-aVm
-aWY
-aYC
-aYA
-bbp
-bbp
-bfx
-bbp
-bfz
-sqp
-aZV
-aZV
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-fxV
-aJq
-aJq
-aXf
-bCv
-bDK
-bFi
-bGE
-bCv
-bJs
-bKy
-bLM
-alk
-bNQ
-bOV
-bQk
-bVQ
-bSD
-bTM
-bUH
-bVQ
-bVZ
-bXM
-iYC
-cew
-bTh
-cdt
-bVq
-bXI
-bZg
-bZD
-cbq
-ccl
-cdm
-cio
-cjY
-ceq
-clQ
-cje
-cgR
-uvd
-oxl
-gAi
-daY
-rGC
-rGC
-kOV
-xol
-etE
-dDc
-pSn
-uml
-uRx
-sra
-uvd
-hVs
-sTI
-iaZ
-hVs
-hVs
-ccw
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(119,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-abo
-abk
-abk
-abk
-adR
-agq
-agV
-aaZ
-aaZ
-agX
-aih
-aaZ
-aaZ
-aaZ
-xGQ
-ajN
-amc
-alo
-alY
-ans
-ary
-agn
-anA
-anz
-gfC
-aod
-aqe
-arf
-apY
-ate
-arf
-apY
-ath
-arf
-apY
-ath
-dgz
-fvY
-dvc
-dzi
-vsM
-dgz
-ayF
-aJn
-aLY
-aLY
-aOG
-aPR
-aPR
-aPR
-aUb
-aVq
-aWM
-aYr
-aZV
-bbo
-bch
-bdi
-bbw
-bfy
-bgS
-bik
-aZV
-aZV
-bmx
-bmx
-bmx
-bqH
-bsh
-bsh
-bsh
-bsh
-bqH
-aJq
-aJq
-gnf
-bCv
-bDJ
-bCt
-bGD
-bCv
-bJs
-bKy
-bLL
-bOd
-bNQ
-bOU
-bQj
-bOd
-bMK
-bTN
-bTP
-bRy
-cfN
-bXL
-bLK
-bRj
-bTg
-bUm
-bVp
-bXH
-bUm
-bZC
-cbp
-cck
-cin
-cjj
-cjX
-ckO
-ckH
-cja
-cny
-ccw
-jqS
-lfB
-hNw
-wKZ
-wKZ
-wKZ
-vUs
-wKZ
-wKZ
-uge
-wKZ
-mqh
-tQY
-ccw
-dSF
-vLM
-sAQ
-hUv
-gAE
-ccw
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(120,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-adR
-abO
-wlI
-abO
-abV
-ags
-ags
-adj
-afQ
-afr
-akc
-aik
-akh
-adR
-esL
-aiG
-amf
-anr
-aqN
-arC
-asq
-agn
-anA
-anz
-aoD
-aod
-aqe
-arf
-aqn
-ath
-arf
-auw
-ath
-arf
-ayV
-ath
-dgz
-aCd
-qIw
-gfD
-woR
-dgz
-aJw
-sKd
-aMh
-aJq
-aOE
-aJn
-ayF
-aPR
-aUe
-aVs
-aXa
-aYD
-aZX
-baf
-bdk
-mRQ
-bek
-bfB
-bgU
-bdk
-bjF
-blc
-bmz
-bnY
-bpk
-bqJ
-bsj
-btI
-btd
-bwr
-bqH
-aMm
-aJq
-bBv
-cBy
-bDM
-bCw
-bDr
-bCy
-bGP
-bHn
-bLN
-alX
-bNS
-bOX
-bQm
-bRv
-bRs
-glY
-bTP
-bVX
-bWQ
-bWQ
-bWQ
-bRm
-bTj
-caA
-cer
-ccs
-bZu
-cfb
-cfb
-cgS
-ciq
-cfb
-cfb
-cfb
-clR
-cgR
-cgR
-uvd
-fqD
-jsT
-xfY
-xaS
-fHs
-dhT
-gcj
-fHs
-fHs
-gcj
-wun
-rvC
-jfm
-tPe
-tPe
-okG
-ccw
-ccw
-ccw
-ccw
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(121,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-abo
-abO
-abO
-abO
-abO
-abO
-abO
-adk
-abo
-afD
-afU
-aju
-aki
-akk
-akq
-lwN
-amq
-agn
-amb
-ant
-agn
-agn
-anA
-anz
-aoC
-aod
-aqe
-arf
-asd
-atg
-arf
-asd
-awo
-arf
-asd
-aAb
-dgz
-iVU
-aDK
-vHj
-eVC
-dgz
-aJv
-khV
-aMg
-bHt
-aOE
-aJn
-ayF
-aPR
-aUd
-aVr
-aWZ
-aYq
-aZW
-aZG
-bej
-bdj
-bej
-bfA
-bgT
-bil
-bej
-blb
-bmy
-bnX
-bpj
-bqI
-bsi
-btH
-btc
-bwq
-bqH
-aJq
-aJq
-aXf
-bCv
-bAU
-cAL
-bFg
-bFs
-bJt
-bKy
-bLK
-bMK
-bNR
-bOW
-bQl
-bRu
-bRs
-glY
-bUI
-bVR
-bWQ
-bOO
-bQe
-bRk
-bTi
-caA
-bVr
-bXN
-bZt
-bZE
-cbs
-cCT
-cdn
-cej
-cep
-ces
-clN
-ccm
-ckF
-ckF
-tlu
-wlf
-rUG
-ccw
-ccw
-ccw
-lzX
-hVs
-hVs
-kNt
-wIY
-wjz
-iGX
-iJM
-kbT
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(122,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-adR
-abl
-abN
-abN
-abN
-abN
-acO
-adl
-aet
-agy
-aha
-aah
-afo
-adR
-agD
-agF
-gyr
-alq
-amd
-anu
-asb
-agn
-aqH
-anz
-aoF
-apo
-aqh
-arh
-asg
-atj
-aul
-auR
-atj
-mps
-tKk
-atj
-aAX
-azc
-atj
-aFe
-aul
-aHT
-aJy
-aJy
-aMj
-aJq
-aOE
-aJn
-ayF
-aPR
-aPR
-aPR
-aXc
-aPR
-aZV
-baq
-baQ
-wcB
-bcQ
-bfC
-bgV
-bim
-bjG
-aZV
-bmB
-bnZ
-bpl
-bqH
-bsl
-btK
-buW
-bwt
-bqH
-aLY
-aLY
-bBx
-bCv
-apG
-bFk
-bDs
-bCv
-bJs
-bHo
-bLK
-bMK
-bMK
-bOY
-bQn
-bRs
-bMK
-bUP
-bUJ
-bVS
-bWQ
-bXP
-cBI
-bRS
-bTH
-caA
-bWh
-cdt
-bZA
-cfh
-cfM
-cco
-cdp
-cel
-cyM
-ckT
-cgU
-cco
-cgU
-cgU
-cis
-cjN
-wAN
-cgR
-uvd
-hVs
-ulB
-cXi
-cXi
-rEJ
-hVs
-hhc
-ccw
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(123,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-abo
-abm
-abP
-abS
-abS
-abS
-acP
-adm
-afR
-agx
-agZ
-ahI
-aiw
-adR
-vIo
-ake
-ame
-aaQ
-amg
-anv
-apQ
-agn
-anA
-anz
-aoE
-aod
-aqg
-aun
-asf
-ati
-auk
-aux
-avt
-axL
-bbl
-azT
-nZE
-ker
-aDG
-aFd
-auk
-aHH
-aJg
-aKo
-aLO
-aJq
-aOE
-aJn
-ayF
-ayF
-aPR
-aVt
-aXb
-aYo
-aZV
-bao
-baP
-asD
-bcP
-cBo
-bgS
-bbw
-bbw
-aZV
-bmA
-bmx
-bmx
-bqH
-bsk
-btJ
-buV
-bws
-bqH
-aJq
-aJq
-byW
-bCv
-bAV
-bCv
-bCv
-bCv
-bJs
-bKz
-bLK
-bQr
-bNT
-bQu
-bQo
-bRw
-bSF
-daI
-bTP
-bRA
-bWQ
-bXO
-bQq
-bRo
-bTG
-caA
-bVK
-bYb
-bZw
-cap
-ctR
-ccn
-cdo
-cek
-ccw
-cet
-cfd
-cfB
-cfI
-cgQ
-cjS
-cjN
-wAN
-cgR
-twn
-sAQ
-jIb
-qXZ
-dVX
-dVX
-mCy
-mCy
-ccw
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(124,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-adR
-abn
-abH
-abn
-abn
-abn
-adR
-adR
-adR
-agA
-afU
-ahF
-aiz
-adR
-akf
-akJ
-yhx
-agn
-agn
-agn
-agn
-agn
-anC
-anU
-anC
-cSA
-aqe
-arf
-arf
-arf
-arf
-arf
-ltK
-xAv
-awr
-awr
-ruo
-aAh
-aAh
-aAh
-aAh
-aAh
-aAh
-aAh
-aLR
-aJq
-aOE
-aJn
-ayF
-ayF
-aTQ
-aVd
-aXe
-aYp
-aZV
-bbv
-bcm
-bcm
-bem
-bfD
-bgW
-bfD
-bjI
-aZV
-bmC
-boa
-bpm
-bqH
-bsn
-btL
-buY
-buY
-bqH
-ftE
-aJq
-aXf
-bCv
-bDP
-bCv
-bAw
-bHV
-bJw
-bKC
-bLK
-bMN
-bNV
-bOV
-bQo
-bRw
-bSF
-daI
-bVW
-bVY
-bWQ
-bWQ
-bWQ
-bWQ
-caD
-bWQ
-ccw
-ccw
-cey
-ccw
-ccw
-ccw
-ccw
-ccw
-ccw
-ccw
-ccw
-ccw
-ccw
-ccw
-cDl
-cjN
-hGf
-iXc
-ccw
-ccw
-ccw
-ccw
-ccw
-uvd
-uvd
-uvd
-ccw
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(125,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-abq
-abq
-abq
-abT
-abW
-abq
-abq
-aff
-aeU
-ajA
-akd
-adB
-agl
-uHp
-agQ
-agN
-akw
-alb
-alG
-amr
-amY
-amY
-ajp
-ajp
-aoG
-cSA
-aqe
-arf
-aqo
-atm
-fPL
-arf
-avv
-awu
-awr
-aAd
-tkq
-aAh
-aDL
-aAh
-aGk
-aAh
-aJz
-aAh
-aLQ
-aJq
-aOE
-aJn
-ayF
-ayF
-aJw
-aVu
-aXd
-aYE
-aZV
-bbu
-bbw
-bbw
-bbw
-bbw
-bbw
-bbw
-bjH
-aZV
-bmx
-bmx
-bmx
-bqH
-bsm
-btL
-buX
-buX
-bqH
-aJq
-aJq
-bBy
-bzs
-bDO
-bFl
-bGH
-bHU
-bJv
-bKB
-bLK
-bMM
-bOd
-bOQ
-bQj
-bRy
-cfN
-bUQ
-bUK
-bVT
-bWR
-bXQ
-cfN
-bZF
-bXT
-bYK
-ccv
-cdw
-cex
-caG
-cfN
-cbF
-bLQ
-cdx
-bOh
-bOh
-bOh
-bOh
-bOh
-ccw
-cDm
-cjP
-ckF
-cDJ
-ckF
-cpE
-cjR
-crW
-csg
-crk
-crk
-crk
-ayF
-ayF
-ayF
-ayF
-azl
-azl
-azl
-aAu
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(126,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-abq
-adN
-aeu
-aez
-aci
-acs
-acR
-afh
-afV
-agB
-ahd
-ahI
-akO
-abp
-ajj
-ajP
-aky
-alc
-alI
-ams
-amZ
-amZ
-cqQ
-anW
-aoH
-cSA
-aqe
-arf
-asm
-atm
-blU
-avg
-awp
-axN
-awr
-awr
-haM
-aAh
-aDQ
-aAh
-aGl
-aAh
-aBy
-aAh
-rqf
-aJq
-aOE
-aJn
-ayF
-ayF
-aJn
-aVv
-aXg
-aYF
-aZV
-nZL
-bcn
-tgH
-ben
-bfE
-bgX
-bbw
-bjJ
-bld
-bmD
-cTD
-bmD
-bqK
-bso
-btN
-buZ
-buZ
-bqH
-byN
-aJq
-bBA
-bCz
-bDQ
-bFn
-bGJ
-bHX
-bJy
-bKE
-bLP
-bMP
-bIG
-bJB
-bKV
-bRB
-bSI
-bUS
-bUM
-bVV
-bVV
-bVV
-bWT
-bZG
-bOd
-bOd
-bOd
-bOd
-bOd
-bOd
-bOd
-cgW
-cit
-axs
-ckb
-ckV
-clU
-clU
-bOh
-ccw
-coZ
-cgU
-cgU
-cDK
-crw
-cjO
-ccw
-crX
-cfK
-ayF
-ayF
-crk
-ayF
-ayF
-ayF
-ayF
-aAu
-aAu
-aAu
-aAu
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(127,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-aaL
-adO
-acr
-acQ
-adn
-agw
-abq
-afg
-afU
-afU
-ahc
-ahH
-akR
-abp
-aji
-ajO
-akw
-ajn
-alH
-amr
-amY
-amY
-ajp
-anV
-ajo
-cSA
-aqe
-arf
-ari
-asu
-mPk
-aun
-avR
-xAv
-ofU
-awr
-sFW
-aAh
-aDM
-aGx
-aDM
-aDM
-aDM
-aAh
-aMm
-aJq
-aOE
-aJn
-aJn
-aJn
-aJn
-aJs
-aXf
-aYk
-aZV
-aZV
-aZV
-aZV
-aZV
-aZV
-aZV
-aZV
-aZV
-aZV
-bmx
-bmx
-bmx
-bqH
-bqH
-btM
-bqH
-bqH
-bqH
-aJq
-bHt
-bBz
-bzs
-bzs
-bFm
-bGI
-bHW
-cBD
-bKD
-bLO
-bMO
-bIF
-bOZ
-bQp
-bRx
-bTO
-bTR
-bOd
-bOd
-bOd
-bOd
-bXS
-bOd
-bOd
-bOd
-bOd
-bOd
-bZI
-cfi
-bOd
-cgV
-bMQ
-crk
-bQA
-ckU
-clT
-cmU
-bOh
-ccw
-cpa
-cjc
-cqo
-cDL
-cjk
-cjm
-ccw
-ccw
-cig
-ayF
-ayF
-crk
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aAu
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(128,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-aaM
-abr
-abQ
-abU
-acj
-acv
-dJL
-afj
-afX
-agC
-ahf
-aks
-akS
-abp
-ajl
-ajR
-akw
-ald
-alJ
-amt
-ajp
-ajp
-ajp
-anY
-ajo
-apq
-aqe
-arf
-arf
-arf
-arf
-arf
-ltK
-axP
-azb
-aAi
-uIO
-aCn
-xBk
-dtx
-aGm
-aHV
-aDM
-hIM
-aJq
-aJq
-aJq
-aJr
-aJr
-aJr
-aJr
-aJr
-aXh
-aYG
-aZY
-aYG
-aYG
-bdn
-bep
-aYG
-aYG
-aYG
-aYG
-ble
-bmE
-bmE
-bpn
-bqL
-bsp
-btO
-bva
-bwu
-bwu
-bwu
-kPj
-bBB
-eBX
-bzs
-bFp
-bGJ
-bHX
-bJA
-bKG
-bLK
-bMR
-bIH
-bJF
-bRt
-bRA
-bTP
-bVP
-bOd
-bOd
-bOd
-bOd
-bXS
-bOd
-bOd
-bOd
-bOd
-bOd
-dkV
-fKv
-cfQ
-cgY
-ciu
-aAg
-ckb
-ckW
-clU
-clU
-bOh
-ccw
-ccw
-cpI
-ccw
-cDL
-cjl
-cjQ
-cjV
-cig
-ayF
-ayF
-ayF
-crk
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aAu
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(129,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aaO
-adQ
-act
-acu
-acu
-acF
-abq
-afi
-afW
-afW
-ahe
-ahJ
-ais
-abp
-ajk
-ajQ
-akw
-ajn
-alH
-amr
-amY
-amY
-ajp
-anX
-ajo
-app
-aqi
-arf
-ask
-atm
-fPL
-arf
-awq
-axO
-aza
-kmw
-xrN
-aAh
-aAh
-aAh
-aAh
-aAh
-aDN
-aAh
-aMo
-aNC
-aJq
-aJq
-aJq
-aJq
-aJq
-aJq
-aJq
-aJq
-aLY
-aJq
-bco
-aJq
-beo
-aJq
-aJq
-aJq
-aJq
-aJq
-aJq
-aJq
-aJq
-aLY
-aJq
-bAk
-aJq
-aJq
-aJq
-aJq
-bAj
-aJq
-aKG
-bzs
-bFo
-bDu
-bFt
-bGQ
-bHp
-bLK
-bMQ
-bNY
-bPa
-bMQ
-bRC
-bSK
-bWP
-bZH
-bOd
-bOd
-bOd
-bXS
-bOd
-bOd
-bOd
-bOd
-bOd
-rto
-wcr
-apa
-cgX
-apF
-crk
-bOh
-bOh
-bOh
-bOh
-bOh
-cig
-cpb
-ciZ
-cqp
-cDN
-cjT
-cgR
-crP
-cig
-ayF
-ayF
-ayF
-crk
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aAM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(130,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-abq
-aes
-aey
-aeD
-afs
-acL
-acS
-afk
-afZ
-agE
-ahh
-ahM
-aiC
-abp
-aiY
-ajE
-ajH
-akn
-ale
-alD
-ana
-ana
-fMp
-amu
-ajo
-aps
-aqk
-arf
-aqo
-atm
-aHw
-avn
-awv
-axX
-aze
-awr
-flE
-aAh
-aDU
-aBz
-aBz
-aAh
-dTI
-ujv
-aJq
-aJq
-aJq
-aJq
-aRt
-aJq
-aJq
-aJq
-aJq
-aJq
-aLY
-aJq
-bcp
-aJq
-beq
-aJq
-bgY
-aJq
-aJq
-aJq
-bAi
-bmS
-bmS
-bpC
-bqN
-aNr
-aJq
-aJq
-bxL
-byX
-aXh
-bmE
-bCA
-bzs
-bCC
-bDA
-bFx
-bGW
-bKI
-bLQ
-bMT
-bOb
-bPd
-cBF
-bRD
-bSK
-bWP
-bZH
-bOd
-bOd
-bOd
-bXS
-bOd
-bOd
-bOd
-cBJ
-bOd
-hOd
-plL
-bTP
-cha
-civ
-axs
-ckb
-ckY
-clW
-clW
-bOh
-cig
-cig
-czg
-cig
-cDN
-crh
-crA
-crR
-crY
-azj
-crk
-ayF
-crk
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aAu
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(131,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-abq
-abq
-abq
-abq
-abq
-abq
-abq
-afg
-afY
-afY
-ahg
-ahL
-aiu
-abp
-ajm
-ajS
-ajn
-ajT
-akA
-amr
-amY
-amY
-ajp
-anV
-ajo
-apr
-aqj
-arf
-ark
-asu
-xPk
-aun
-awt
-awr
-awr
-azX
-aAZ
-aCe
-aDT
-cPn
-cPn
-mkO
-uQS
-aAh
-aJC
-aJC
-aJC
-aQg
-bYP
-aJC
-aQg
-aJC
-aJC
-aQg
-aJC
-aJC
-aHP
-aHP
-aHP
-bfF
-bfF
-bfF
-bfF
-bfF
-bfF
-bfF
-bfF
-bfF
-bqM
-brV
-bof
-bwv
-bvj
-bvj
-bvj
-bvj
-bvj
-bvj
-bCB
-bCP
-bvj
-bvd
-bKH
-bLK
-bMS
-cfQ
-bPc
-bQs
-cez
-bSJ
-bWP
-bZH
-bOd
-bOd
-bOd
-bXR
-bOd
-bOd
-bOd
-bOd
-bOd
-cfQ
-cez
-siv
-cgZ
-bSK
-crk
-bQA
-ckX
-clV
-cmV
-bOh
-cig
-crk
-nVR
-crk
-cDN
-cqY
-cqY
-cqY
-cig
-crk
-azn
-ayF
-crk
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-dIH
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(132,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-abo
-aeB
-afm
-agb
-agG
-ahi
-ahN
-aix
-abp
-ajp
-ajU
-ajn
-trb
-ajn
-amr
-ajp
-ajp
-ajp
-ajp
-ajo
-apt
-aqm
-arf
-arf
-arf
-arf
-arf
-awz
-awr
-awr
-avG
-aBA
-aAh
-aDP
-aBx
-aBx
-aAh
-qqs
-sYR
-aMq
-adq
-aQb
-aPZ
-aRu
-kAH
-aKR
-tCa
-aXi
-hgO
-baa
-aJC
-bcq
-bcq
-bcq
-bfF
-bha
-bio
-bgF
-blf
-bmF
-bob
-bnB
-bfF
-bqR
-brX
-bof
-bwx
-bvj
-bwB
-bxa
-byZ
-bzI
-bAX
-bCF
-bDB
-bFB
-bvd
-bKJ
-bLR
-bMV
-bTP
-bOR
-bQv
-bRF
-bSM
-bXU
-bOd
-bOd
-bOd
-bOd
-bOd
-bOd
-bOd
-bOd
-bOd
-bOd
-bTP
-cfQ
-cbD
-chb
-wzX
-aAg
-ckb
-ckZ
-clW
-clW
-bOh
-cig
-ayF
-ayF
-ayF
-cDN
-ayF
-ayF
-ayF
-ayF
-ayF
-azP
-ayF
-crk
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(133,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-abo
-aeA
-afl
-aga
-abp
-ahj
-abp
-xJW
-abp
-ajo
-ajo
-ajo
-ajo
-ajo
-ajo
-ajo
-ajo
-ajo
-aoa
-ajo
-apt
-aql
-pRW
-pRW
-pRW
-pRW
-avw
-awy
-nfw
-nfw
-vaW
-wqF
-aAh
-aAh
-aAh
-aAh
-aAh
-aAh
-aAh
-aKR
-aKR
-fxe
-aPY
-kAO
-aRx
-aKR
-iTU
-pqe
-aPY
-aZZ
-aQg
-aYV
-aYV
-aYV
-bfF
-bgZ
-bin
-bin
-bjK
-bkK
-bkK
-bkK
-bpD
-bqO
-bLX
-btf
-bui
-bvi
-bww
-bwZ
-byY
-bzH
-bAW
-bCE
-bFv
-bFz
-bvd
-bKH
-bLK
-bMU
-bOc
-bPe
-bMY
-bRE
-bUL
-bYJ
-caE
-cGG
-ecE
-bOd
-bOd
-bOd
-bOd
-bOd
-bOd
-bOd
-khU
-nNP
-cfP
-ccz
-bSJ
-crk
-bOh
-bOh
-bOh
-bOh
-bOh
-ccw
-ayF
-ayF
-ayF
-cDL
-ayF
-ayF
-ayF
-ayF
-ayF
-azV
-ayF
-crk
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aAM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(134,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-asX
-abp
-abp
-adR
-abp
-lJC
-agj
-adR
-ahl
-uHp
-aic
-ahT
-ahT
-ahT
-ahT
-ahT
-ahT
-ahT
-alL
-ahT
-anb
-ahT
-ydM
-anZ
-apu
-arf
-arf
-arf
-arf
-arf
-awA
-axT
-axW
-aAl
-cHf
-aJC
-aDR
-aFl
-kqI
-aHZ
-aJC
-aKJ
-hIL
-aKR
-wxT
-moD
-aQd
-aQa
-aKR
-elh
-wxT
-uBa
-bac
-aJC
-aYV
-aYV
-aYV
-bfF
-bhc
-bip
-bgP
-bjL
-bkL
-bmT
-bnD
-bpM
-bqT
-bFD
-bJG
-bJG
-bvl
-bwE
-bxc
-bzb
-bzK
-bBb
-cpG
-bDC
-bId
-bvd
-bKH
-bLK
-bMX
-bMY
-bPg
-bQx
-bSE
-bTQ
-bTU
-cbA
-bOd
-gfJ
-bOd
-bOd
-bOd
-bOd
-bOd
-bOd
-bOd
-xBF
-caH
-cbE
-chd
-bQy
-axv
-ckc
-clb
-clY
-clZ
-bOh
-ayF
-ayF
-ayF
-ayF
-awX
-ayF
-ayF
-ayF
-ayF
-ayF
-azV
-ayF
-crk
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aAu
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(135,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-crk
-acU
-adr
-sXy
-aeC
-anF
-agc
-abp
-ahk
-aoJ
-aib
-aif
-aif
-aif
-aif
-aif
-fpz
-bkV
-jKP
-alK
-aif
-anc
-anc
-anD
-aoI
-arf
-eSe
-asN
-aur
-avy
-nSt
-axS
-azk
-aAk
-tvi
-aJC
-aDY
-aDY
-kqI
-aKR
-aJk
-aKR
-aKR
-aKR
-aKR
-aKR
-aKR
-aKR
-aKR
-aKR
-aKR
-aKR
-bab
-aJC
-ucq
-aYV
-ber
-bfF
-bhb
-bip
-bjO
-bip
-bmG
-bip
-bnC
-bpF
-bqS
-brY
-bwz
-bwy
-bvj
-bza
-bxb
-bvh
-bCD
-bAY
-bCH
-bDR
-bIc
-bvd
-bKH
-bLK
-bMW
-bOe
-bPf
-bQw
-bRG
-bSN
-bYN
-ccy
-bTS
-cCE
-bWa
-bTS
-bTS
-bTS
-bYL
-bTS
-bTS
-caF
-cbB
-cfT
-chc
-bMQ
-crk
-bQA
-cla
-cBP
-cmW
-bOh
-ayF
-ayF
-axR
-ayF
-awX
-ayF
-ayF
-ayF
-ayF
-ayF
-azV
-ayF
-crk
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBD
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(136,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-crk
-abp
-abp
-abp
-abp
-mxn
-abp
-abp
-ahn
-ahn
-ahn
-uhm
-ahn
-aiA
-ahn
-bMs
-anE
-aod
-ahn
-apx
-ahn
-ahn
-ahn
-ahn
-ahn
-arf
-oAB
-eQb
-aut
-arf
-aXF
-awr
-awr
-aAn
-rqk
-aJC
-aEc
-aFk
-aGw
-aKR
-aJC
-aKr
-aKR
-aKR
-sLj
-sLj
-vcN
-aKR
-aKR
-aKR
-sLj
-aKR
-aKR
-bbx
-aYV
-aYV
-tkB
-bfF
-bhd
-bis
-bjR
-bis
-bmI
-bod
-bpt
-bfF
-bqV
-bEe
-bBL
-bwA
-bvj
-bAl
-bAl
-bvh
-bzS
-bBc
-bCJ
-gZG
-cCp
-bvd
-bKH
-bLK
-bMZ
-bOg
-bPi
-bQz
-bRJ
-bUN
-bTV
-bUT
-bWc
-bWU
-bXV
-bYT
-bZK
-cfT
-cbG
-ccA
-cdC
-ceB
-cbC
-cez
-chf
-cix
-axv
-ckd
-clc
-clZ
-clZ
-bOh
-ayF
-ayF
-ayF
-ayF
-awX
-ayF
-ayF
-ayF
-ayF
-ayF
-azP
-ayF
-crk
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aAu
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(137,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-abp
-crk
-nVR
-crk
-abp
-aBM
-ayF
-ahn
-nQi
-ahn
-uei
-ahn
-grc
-anE
-aod
-aoK
-oyX
-aqp
-ahn
-tzQ
-pgf
-gzf
-eQb
-eQb
-eQb
-lUS
-aun
-avz
-awr
-awr
-aAn
-jGW
-aJC
-aJC
-plC
-oAb
-aJC
-aJC
-aKq
-aKR
-aNF
-hOv
-oax
-oxm
-aSH
-aKR
-rmN
-eJa
-hSZ
-aKR
-aQg
-aYV
-aYV
-bes
-bfF
-bfF
-bir
-bjQ
-blh
-bfF
-bfF
-bfF
-bfF
-bqU
-bsq
-bvj
-bvj
-bvj
-bvj
-bvj
-bvj
-bvj
-bvd
-bFu
-jex
-bvj
-bvd
-bKH
-bLK
-bLK
-bOf
-bPh
-bQy
-bRI
-ceA
-bPh
-cdB
-bRI
-cCF
-bPh
-bQy
-bRI
-bQy
-bPh
-bQy
-bRI
-ceA
-bVO
-bLK
-che
-bLK
-crk
-bOh
-bOh
-bOh
-bOh
-bOh
-ayF
-ayF
-ayF
-ayF
-awX
-ayF
-ayF
-ayF
-ayF
-ayF
-azV
-ayF
-crk
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aAu
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(138,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-bBR
-ayF
-ayF
-ayF
-adR
-aBM
-ayF
-ahn
-ahn
-ahn
-tAH
-ahn
-eMs
-anG
-aoe
-aoL
-apy
-aqq
-ahn
-qLR
-oIW
-arf
-kmS
-ast
-eQb
-auv
-arf
-avA
-axW
-azo
-aAp
-uxY
-aBC
-aCt
-aEA
-aGz
-aIb
-aJC
-aKN
-aKR
-aKR
-aOJ
-oIJ
-unA
-aKR
-akH
-aUg
-bFC
-hSZ
-aKR
-bbx
-aYV
-aYV
-bet
-bfH
-aiP
-wbE
-bhh
-wbE
-bmJ
-bof
-bpu
-bqP
-bsy
-bEe
-bvh
-ajv
-bxN
-bze
-bAp
-bvh
-bCG
-bBd
-bFw
-bDD
-bFJ
-bvd
-bKH
-bzs
-iBR
-avx
-mAU
-avx
-emX
-avx
-mAU
-krn
-avB
-awd
-awe
-awN
-aws
-awN
-awe
-awN
-aws
-awN
-awN
-ksp
-chg
-ksp
-mbP
-mbP
-mbP
-mbP
-mbP
-mbP
-mbP
-mbP
-mbP
-mbP
-tMj
-ayF
-ayF
-ayF
-ayF
-ayF
-azV
-ayF
-crk
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aAM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(139,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-aBM
-aBM
-ayF
-ayF
-ayF
-crk
-crk
-ahn
-ahn
-khB
-ahn
-ahn
-ahn
-ahn
-ahn
-arf
-arf
-arf
-asd
-arf
-arf
-arf
-arf
-hlV
-oHB
-azf
-aAo
-vyp
-aBB
-aBB
-aBB
-aGy
-aIa
-cNE
-aKM
-aMu
-aMu
-feG
-tif
-aMu
-aMu
-aMu
-jgA
-aSq
-aKR
-bad
-bby
-aYV
-aYV
-bet
-bfG
-bhe
-bit
-bjS
-tCd
-bli
-boe
-bli
-bpN
-bqX
-bEe
-btg
-bDR
-bDR
-bDR
-bDR
-bzc
-bDR
-bDZ
-bCK
-bFy
-bFF
-bvd
-bKH
-bzs
-avm
-bOh
-bPj
-bQA
-bPj
-bOh
-bPj
-bQA
-bPj
-bOh
-bPj
-bQA
-bPj
-bOh
-bPj
-bQA
-bPj
-bOh
-ayF
-bMK
-cyG
-bMK
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-azV
-ayF
-crk
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aAu
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(140,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-dFX
-wWW
-dqb
-lCo
-ohq
-wXl
-iou
-pkF
-xZL
-wig
-str
-rrM
-clO
-ahC
-ahP
-oZl
-awB
-att
-azh
-fHG
-fHG
-kxf
-ufD
-alP
-aGI
-aId
-aJD
-aKP
-aMx
-aMx
-aQe
-aOL
-aMx
-aMx
-aMx
-aMx
-rqE
-aKR
-aZb
-aJC
-aYV
-aYV
-bet
-bfG
-bhe
-bhh
-bjU
-blk
-blk
-boh
-biu
-bpO
-bqY
-bss
-btg
-buk
-bvm
-bDT
-buk
-bvh
-bzU
-bBe
-bCS
-bDE
-bFK
-bvd
-bKH
-bzs
-avm
-bOh
-bPl
-bQB
-bRL
-bOh
-bTX
-bUV
-bWd
-bOh
-bXX
-bYV
-bZL
-bOh
-cbI
-ccC
-cdD
-bOh
-ayF
-bMQ
-cyG
-bMK
-bMK
-bMK
-crk
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-azP
-ayF
-crk
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aAM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(141,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-asY
-ayF
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-uEx
-ulM
-wcR
-uzs
-uzs
-uzs
-uzs
-uzs
-ecg
-jLT
-veS
-arm
-fHG
-aya
-fHG
-fHG
-auB
-atZ
-azg
-azp
-fHG
-aCu
-qOc
-alP
-aGH
-aIc
-aJC
-aKO
-aMw
-aNI
-aKR
-aKR
-acN
-acN
-acN
-acN
-acN
-aKR
-aKR
-aJC
-bcr
-aYV
-bet
-bfG
-bhe
-bhh
-bjV
-blj
-bmK
-bog
-bog
-bhh
-bsx
-bsr
-bvh
-bwD
-bDR
-bDR
-bAq
-bvj
-bCQ
-bDW
-bCP
-bvj
-bvj
-bJC
-bKH
-bzs
-avm
-bOh
-bPk
-bPm
-bPm
-bOh
-bTW
-bUU
-bTW
-bOh
-bXW
-bYU
-bXW
-bOh
-cbH
-ccB
-cbH
-bOh
-ayF
-bMQ
-cyG
-cKT
-cyG
-fNu
-crk
-crk
-crk
-crk
-crk
-crk
-crk
-crk
-crk
-crk
-crk
-crk
-crk
-crk
-azV
-crk
-crk
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aAM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(142,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-uEx
-azm
-gvX
-qWV
-con
-oVo
-con
-con
-eVJ
-ujS
-aqs
-coh
-fHG
-fHG
-fHG
-fHG
-pPi
-fHG
-ayb
-hWd
-fHG
-aCv
-mbU
-alP
-aGJ
-aIe
-aJC
-aJC
-aJC
-aJC
-aJC
-aJC
-aXj
-aVy
-aSY
-aVy
-xqG
-acN
-bah
-aJC
-aYV
-bdo
-beu
-bvk
-biu
-biu
-bjT
-blm
-bmL
-boi
-bpw
-ium
-bsx
-btX
-bvj
-bwG
-bxR
-bxR
-bvj
-bvj
-bzW
-bDZ
-bCT
-bGR
-bIj
-bJC
-bKH
-bzs
-avm
-bOh
-bPm
-bQC
-bPm
-bOh
-bTW
-bUW
-bTW
-bOh
-bXY
-bYW
-bXW
-bOh
-cbH
-ccD
-cbH
-bOh
-ayF
-bMQ
-cyG
-bMK
-bMK
-bMK
-crk
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-azV
-ayF
-crk
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBD
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(143,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-uEx
-stF
-gvX
-con
-con
-con
-con
-con
-eVJ
-dqb
-qeA
-ahm
-fHG
-fHG
-fHG
-fHG
-pPi
-fHG
-ayb
-hWd
-fHG
-sci
-sEi
-alP
-aGJ
-aIe
-aka
-aLU
-aKQ
-aNu
-aJC
-aaz
-egt
-aQc
-aSZ
-aQc
-qaY
-acN
-bag
-aJC
-aYV
-aYV
-bet
-bfJ
-bhh
-bhh
-bgQ
-bll
-bhh
-bhh
-bpv
-bhh
-bsx
-btV
-bvh
-bwF
-bxQ
-bxQ
-bAr
-bvj
-bzV
-bDZ
-bzf
-bDR
-bIi
-bJC
-bKH
-bzs
-avm
-bOh
-bOh
-bOh
-bOh
-bOh
-bOh
-bOh
-bOh
-bOh
-bOh
-bOh
-bOh
-bOh
-bOh
-bOh
-bOh
-bOh
-ayF
-bMK
-axm
-sUh
-aAg
-aAg
-aAg
-aAg
-msM
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-azV
-ayF
-crk
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ctZ
-ctZ
-ctZ
-ctZ
-ctZ
-ayF
-ayF
-ayF
-aBS
-ayF
-aBM
-aBM
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-aCm
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(144,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-dFX
-lnk
-gvX
-wQg
-con
-con
-con
-fyS
-eVJ
-dqb
-veS
-ahs
-sJI
-ahO
-fHG
-eAJ
-rvr
-nLu
-hcA
-ryr
-fHG
-aCu
-puh
-alP
-aGA
-aHS
-aJx
-aJx
-aMi
-aNE
-aOO
-aQi
-aRz
-aSF
-aQc
-aQc
-aXl
-aKR
-bai
-aJC
-aYV
-aYV
-bet
-bfH
-qTV
-bhh
-bhg
-bln
-bmM
-boj
-bof
-bhh
-bsx
-btV
-bvj
-bwI
-bxT
-bxQ
-bAt
-bvj
-bCM
-bDZ
-bDR
-bDR
-bIl
-bJC
-bKH
-bzs
-avu
-avx
-avx
-avx
-avx
-avx
-avx
-avx
-avx
-avx
-avx
-avx
-avx
-aww
-ayF
-ayF
-ayF
-ayF
-ayF
-cfj
-cfU
-cfj
-cfj
-ckf
-cfj
-cfj
-aAm
-aAg
-aAg
-aAg
-aAg
-aAg
-aAg
-aAg
-aAg
-aAg
-aAg
-aAg
-aAf
-aAg
-aAg
-aAg
-aAg
-aAg
-aAg
-aAg
-msM
-ctZ
-ctZ
-cuo
-cuA
-cuM
-ctZ
-cvk
-cvk
-cvk
-cvk
-ayF
-ayF
-ayF
-ayF
-cvk
-cvk
-cvk
-cvk
-cvk
-cvk
-cvk
-cva
-cva
-cva
-cva
-cva
-cva
-cva
-cva
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(145,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-uEx
-dqb
-gvX
-con
-con
-con
-con
-con
-eVJ
-iBv
-lZK
-fZm
-jmV
-epD
-ghD
-hBA
-xbn
-fHG
-reA
-lsk
-xXi
-jAN
-jEc
-alP
-aGL
-aHM
-aJm
-aKz
-mjr
-akt
-aJC
-aab
-aRg
-aQc
-aac
-aQc
-aXk
-aKR
-aKR
-aJC
-aYV
-aYV
-bev
-bfK
-bhi
-bhi
-bhi
-bfK
-bfK
-bfK
-bof
-bhh
-bsx
-btV
-bvh
-bwH
-bxS
-bzh
-bAs
-bvj
-bCL
-bxO
-bDR
-bDR
-bIk
-bJC
-bKH
-bzs
-bzs
-bzs
-bPn
-bPn
-bPn
-bzs
-bzs
-bPn
-bzs
-eWV
-bzs
-bzs
-bPn
-caI
-bPn
-bzs
-bzs
-bzs
-cfj
-cfj
-cjp
-chh
-ciy
-cke
-clg
-cfj
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-azV
-crk
-crk
-crk
-ayF
-ayF
-ayF
-ayF
-aAm
-ctY
-cuh
-cun
-cuz
-cuL
-cuY
-cvj
-cvs
-cvD
-cvk
-cvk
-cvk
-cvk
-cvk
-cvk
-cvX
-cvX
-cvX
-nTd
-cwq
-cwq
-cva
-cva
-cva
-cva
-cva
-cva
-cva
-cva
-cva
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(146,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-uEx
-dqb
-kdO
-con
-con
-uSC
-con
-con
-akE
-wHk
-ewu
-pQp
-pQp
-oqj
-jBi
-fpl
-fpl
-jBi
-oDN
-sEM
-sEM
-pRs
-arj
-alP
-aGL
-aIe
-aJC
-aKS
-aMC
-aJC
-aJC
-aJI
-aJI
-aSI
-aJI
-aVA
-aJI
-aYK
-aJI
-aJI
-bcs
-aYV
-aYV
-bfK
-bhk
-bix
-bjX
-blp
-bmO
-bhi
-bpy
-bwz
-brg
-btZ
-bvj
-bwI
-bxV
-bzj
-bAv
-bvj
-bCO
-bDR
-bDR
-bDR
-bIn
-bJC
-bKL
-bLT
-bLT
-bLT
-bLT
-bLT
-bLT
-bLT
-bLT
-bUY
-pRg
-bWe
-pRg
-kvI
-bWe
-cdE
-bAw
-bzs
-tiF
-caK
-cfj
-ciB
-ckh
-chj
-ciA
-cjr
-clh
-cfj
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-azV
-csD
-cta
-csD
-cua
-ayF
-ayF
-ayF
-ayF
-ctZ
-cui
-cuq
-cuC
-cuO
-cuz
-cvm
-cvt
-cvt
-cvt
-cvL
-cvQ
-cvX
-cvX
-cvX
-cvX
-cva
-cva
-cva
-cva
-cva
-cva
-cva
-cva
-cvx
-cva
-cva
-cva
-cva
-cva
-cva
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(147,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-uEx
-dqb
-gvX
-con
-con
-con
-con
-con
-eVJ
-wHk
-aqu
-aro
-aro
-aro
-aro
-aro
-aro
-aro
-aro
-aro
-aro
-aCw
-ayF
-alP
-aGL
-aIg
-aJH
-aKR
-aMB
-aJC
-aOP
-aJI
-aRA
-aVz
-aVz
-aVz
-aVz
-aYJ
-aJI
-mNW
-aYV
-aYV
-aYV
-bfK
-bhj
-biw
-bhs
-bjM
-bmN
-bok
-bpx
-bpP
-brf
-bhh
-bvh
-bwJ
-bxU
-bzi
-bAu
-bvj
-bCN
-bEa
-pHl
-bFA
-bIm
-bJD
-bKK
-pck
-bNc
-bOj
-bNc
-bNc
-bNc
-bNc
-bTY
-bKH
-bzs
-bWV
-bzs
-bAw
-bZM
-cbJ
-ceC
-ceC
-cfW
-cfX
-chk
-chl
-ciz
-chi
-ciz
-cjq
-ckg
-cmb
-cpO
-cpQ
-cpQ
-cpQ
-cpQ
-czJ
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-azV
-csD
-csX
-ctg
-cua
-cua
-cua
-cua
-cua
-ctZ
-ctZ
-cup
-cuB
-cuN
-cuZ
-cvj
-cvj
-cvj
-cvj
-cvj
-cvP
-cvj
-cvj
-cvj
-cvj
-cva
-cva
-cva
-cva
-cvp
-cwv
-cvr
-cvp
-cvl
-cvr
-cwv
-cvp
-cva
-cva
-cva
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(148,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-dFX
-jMW
-gvX
-wQg
-con
-con
-con
-fyS
-eVJ
-wHk
-aqu
-aro
-aro
-aro
-aro
-aro
-aro
-aro
-aro
-aro
-aro
-aCw
-ayF
-alP
-aGL
-aIe
-aJI
-aJI
-aJI
-aJI
-aJI
-aJI
-aRC
-aSK
-aVz
-aVz
-aVz
-aYL
-aJI
-bbz
-aYV
-bdq
-aYV
-bfK
-bhl
-biy
-bjY
-bjN
-bkO
-bmU
-bnH
-bqQ
-bsx
-bhh
-bvj
-bvj
-bxR
-bxR
-bvj
-bvj
-bCQ
-bEd
-bof
-bof
-bof
-bJE
-bJE
-bJE
-bNd
-bIJ
-bPo
-bQE
-bRM
-bOr
-bTZ
-bKH
-bAw
-bAw
-bAw
-bAw
-bzs
-bzs
-bzs
-ccF
-cdG
-ceE
-cfl
-cfZ
-cki
-cld
-eHI
-cjt
-csq
-xEu
-wHz
-cmd
-cmd
-cmd
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-csD
-csO
-csD
-czk
-cti
-cua
-cua
-ctw
-ctH
-ctQ
-cuc
-cuj
-cuj
-cuE
-cuQ
-cuj
-cvk
-cvw
-cvw
-cvG
-cvM
-cvS
-cvZ
-cvG
-cvw
-cvw
-cvf
-cwh
-cwm
-cwr
-cvp
-cwx
-cwj
-cwu
-cAV
-cAZ
-cvl
-cvl
-cva
-cva
-cva
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(149,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-uEx
-sth
-gvX
-con
-con
-con
-con
-con
-eVJ
-wHk
-aqu
-aro
-aro
-aro
-aro
-aro
-aro
-aro
-aro
-aro
-aro
-aCw
-ayF
-alP
-aGN
-aIh
-aJI
-aKT
-aMD
-aNM
-aOI
-aJI
-aRy
-aSJ
-aTM
-aVB
-aVz
-aVz
-baj
-bbz
-aYV
-bdp
-mvt
-bfK
-bfK
-bfK
-bfK
-bfK
-bfK
-bfK
-bnF
-bqQ
-bsx
-bhh
-bfJ
-bhh
-bhh
-bhh
-bhh
-bhh
-bzX
-bBm
-bof
-bGT
-bIo
-bof
-tRe
-bLU
-bNd
-bII
-bOr
-bQD
-bLY
-bMa
-bTZ
-bKH
-bzs
-tiF
-bXZ
-bAw
-bZN
-caK
-bzs
-ccE
-cdF
-ceD
-cfk
-cfY
-rfW
-ckj
-cjs
-cle
-cli
-uPT
-cmY
-cme
-cop
-cmd
-cmd
-cqs
-ayF
-ayF
-ayF
-ayF
-ayF
-csD
-csN
-csV
-ctb
-cth
-cua
-ctr
-ctu
-ctG
-ctP
-cub
-cuj
-cur
-cuD
-cuP
-cvc
-cvk
-cvu
-cvu
-cvu
-cvu
-cvR
-cvY
-cwb
-cvu
-cvu
-cva
-cwg
-cwl
-cwr
-cvl
-cww
-cwD
-cvv
-cvv
-cAY
-cBb
-cBd
-cva
-cva
-cva
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(150,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-uEx
-wag
-gvX
-con
-con
-voW
-con
-con
-eVJ
-wHk
-aqu
-aro
-aro
-aro
-aro
-aro
-aro
-aro
-aro
-aro
-aro
-aCw
-ayF
-alP
-aGB
-aIf
-aJA
-aKC
-aKC
-aKC
-aON
-aQk
-aRD
-aSM
-aVD
-aVE
-aXm
-aVz
-juG
-bbz
-aYV
-bdp
-aYV
-bfL
-bhn
-biz
-biz
-biz
-bmR
-bfL
-bol
-bqQ
-bsx
-bst
-bfJ
-bhh
-ajB
-bwK
-bhh
-bhh
-bhh
-btV
-bof
-bGV
-bIp
-bof
-bKM
-bLW
-bNd
-bOn
-bOr
-bOr
-bRO
-bSQ
-bTZ
-bUZ
-bLT
-bLT
-bLT
-bLT
-bLT
-caM
-cbL
-cbL
-cdI
-ceG
-cfj
-cgb
-chn
-ciE
-cjv
-clj
-ckk
-cmf
-cna
-cnC
-cor
-ciM
-cpN
-cqt
-ayF
-ayF
-ayF
-ayF
-ayF
-csD
-csU
-csW
-ctc
-ctc
-cto
-ctt
-cty
-ctJ
-ctT
-cue
-cul
-cuu
-cuG
-cuS
-cve
-cvo
-cvz
-cvz
-cvI
-cvz
-cvT
-cBS
-cwc
-cvz
-cwd
-cwf
-cwj
-cwo
-cwt
-cwu
-cwA
-cAR
-cAS
-cvv
-cBa
-cBc
-cBe
-cva
-cva
-cva
-aCq
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(151,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-oDb
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-uEx
-tAC
-uAH
-unR
-unR
-dCr
-unR
-unR
-hzK
-iYE
-aqu
-aro
-aro
-aro
-aro
-aro
-aro
-aro
-aro
-aro
-aro
-aCw
-ayF
-alP
-aGL
-aHY
-aQj
-iNn
-aMk
-aNK
-aOM
-aQj
-aRB
-aSL
-aTN
-cCq
-aVz
-cAg
-bak
-bbz
-aYV
-bdp
-cBm
-bfL
-bhm
-bhm
-bhm
-bhm
-bkP
-bmV
-boc
-bqW
-brh
-bua
-bua
-bua
-bua
-bua
-bua
-bhh
-bhh
-btV
-bof
-bGU
-bqQ
-bof
-fTg
-bLV
-bNd
-bOm
-bPp
-bQF
-bRN
-bSS
-bUa
-bNc
-bNc
-bOj
-bNc
-bNc
-bZO
-caL
-cbK
-ccG
-cdH
-ceF
-cfj
-cga
-chm
-ciD
-cju
-clf
-csr
-cme
-cmZ
-cme
-coq
-cmd
-cmd
-cqs
-ayF
-ayF
-ayF
-ayF
-ayF
-csD
-ctb
-csV
-ctb
-ctj
-ctk
-cts
-ctx
-ctI
-ctS
-cud
-cuk
-cus
-cuF
-cuR
-cvd
-cvn
-cvy
-cvy
-cvH
-cvy
-cvy
-cvy
-cvy
-cvy
-cvy
-cwe
-cwi
-cwn
-cws
-cwn
-cwz
-cwE
-cvv
-cvv
-cvv
-cvp
-cvl
-cva
-cva
-cva
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(152,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-dFX
-xaB
-mgF
-mgF
-mgF
-vAl
-meb
-meb
-meb
-iMv
-vmQ
-pQp
-pQp
-pQp
-grA
-fpl
-fpl
-gbh
-sEM
-sEM
-sEM
-aCy
-arj
-alP
-aGL
-avI
-aJK
-aKV
-tMl
-aMl
-aMF
-aJI
-aRG
-aSO
-aTO
-cCq
-aVz
-aVz
-qus
-bbz
-aYV
-bdp
-bdc
-bfL
-beY
-bhm
-bhm
-bhm
-bkR
-bfL
-boo
-bqQ
-bhg
-bua
-bvn
-bwL
-bxX
-bsL
-bua
-bBJ
-bhh
-bBn
-bof
-bDF
-bIr
-bof
-bKN
-bHT
-bNd
-bNd
-bNd
-bNd
-bNd
-bSU
-bUb
-bVa
-bWf
-bWX
-bOP
-bNd
-bTZ
-bKH
-bzs
-bzs
-bzs
-bzs
-cfj
-cfj
-cfj
-cfj
-cjx
-cfl
-cfl
-dqu
-tXL
-cmd
-cos
-cmd
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-csD
-csD
-csD
-csD
-cti
-ctq
-cua
-ctA
-cuy
-ctV
-cug
-cuj
-cuj
-cuE
-cuU
-cuj
-cvk
-cvw
-cvw
-cvJ
-cvw
-cvV
-cwa
-cvJ
-cvw
-cvw
-cvb
-cwk
-cwp
-cwr
-cvp
-cwC
-cwn
-cAT
-cAW
-cvl
-cvl
-cvl
-cva
-cva
-cva
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(153,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayB
-ayF
-ayB
-ayB
-ayB
-ayB
-ayB
-ayB
-ayB
-ayB
-ayB
-ayB
-ayF
-dFX
-dFX
-uEx
-uEx
-uEx
-dFX
-uEx
-uEx
-uEx
-dFX
-dFX
-ayF
-ayF
-arj
-fCx
-avD
-awC
-ayb
-eCr
-jvd
-cEo
-xZD
-vpY
-alP
-aGJ
-avI
-aJI
-aJI
-aJI
-aNO
-aOT
-aJI
-aRF
-aSN
-aVF
-aVF
-aVF
-aYM
-aJI
-bbA
-aYV
-bdr
-bdb
-bdN
-blr
-bho
-bho
-bho
-bkQ
-bmW
-bom
-bIq
-bri
-bsu
-bsL
-bsL
-bvo
-bzl
-bua
-bzd
-bhh
-btT
-bCU
-bCR
-bqQ
-bGX
-bCR
-edA
-bRN
-bIK
-bPq
-bLd
-bNd
-bST
-bOr
-bOr
-bOr
-bWW
-bYa
-bYX
-bTZ
-caN
-cbM
-cbM
-cdJ
-bzs
-cfm
-cgc
-bAw
-ciF
-cjw
-ckl
-clk
-clk
-bAw
-bzs
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-ctp
-cua
-ctz
-ctK
-ctU
-cuf
-cuf
-cuv
-cuH
-cuT
-cvg
-cvj
-cvj
-cvj
-cvj
-cvj
-cvU
-cvj
-cvj
-cvj
-cvj
-cva
-cva
-cva
-cva
-cvp
-cwB
-cvr
-cvp
-cvl
-cvr
-cwB
-cvp
-cva
-cva
-cva
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(154,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayB
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-arj
-auz
-avC
-vHz
-aya
-fHG
-fHG
-xkd
-fHG
-fHG
-gOZ
-aGJ
-avI
-aJL
-aKX
-aJI
-aJI
-aJI
-aJI
-aRH
-aVz
-aVz
-aVH
-aXn
-aYN
-aJI
-bbz
-aYV
-aYV
-bey
-bfL
-bhm
-biz
-biz
-biz
-bla
-bmY
-boq
-boq
-brj
-bpE
-btk
-bum
-bvq
-bzn
-bua
-bBL
-bhh
-bBC
-bCV
-bDN
-bFM
-btR
-bDN
-bIa
-bIf
-bIL
-bOq
-bLf
-bRP
-bSW
-bMH
-bNi
-bOr
-bWZ
-bYd
-bYY
-bZP
-caO
-cbN
-ccI
-cdL
-ceI
-cfo
-bAw
-bAw
-bAw
-cjz
-ceJ
-clm
-cmg
-cnc
-cnD
-bzs
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-cua
-ctF
-ctM
-ctX
-cuf
-cum
-cuw
-cuJ
-cuW
-cvi
-cvq
-cvC
-cvC
-cvC
-cvN
-cvW
-cvX
-cvX
-cvX
-cvX
-cva
-cva
-cva
-cva
-cva
-cva
-cva
-cva
-cvA
-cva
-cva
-cva
-cva
-cva
-cva
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(155,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayB
-ayF
-ads
-adS
-aeG
-ayF
-ads
-adS
-aeG
-ayF
-ads
-adS
-aeG
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-alO
-arj
-arj
-arj
-pBp
-gOZ
-cVb
-cVb
-cVb
-cVb
-cVb
-cVb
-aGQ
-aIk
-aIp
-aKW
-aMG
-aIp
-aIp
-aJI
-aJI
-aSP
-aUh
-aJI
-aJI
-aJI
-aJI
-aJI
-bcq
-bcq
-bcq
-bfL
-bhp
-biB
-biB
-cTL
-bkU
-bmX
-bpE
-bpE
-bpE
-bpE
-bti
-bul
-bvp
-bzm
-bua
-bBK
-bwz
-bBw
-bJG
-bDI
-bFL
-bli
-bKO
-bHY
-bNf
-bOp
-bPr
-bQH
-bNd
-bSV
-bSQ
-bNh
-bWg
-bWY
-bYc
-bNd
-bNd
-bzs
-bzs
-bMb
-cdK
-ceH
-cfn
-cgd
-ceJ
-ccM
-cjy
-ceJ
-cll
-ccM
-cnb
-bHd
-ceI
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-cua
-ctE
-ctL
-ctW
-cuf
-cum
-cuw
-cuI
-cuV
-cvh
-cvj
-cvB
-cvE
-cvk
-cvk
-cvk
-cvk
-cvk
-cvk
-cvX
-cvX
-cvX
-cvX
-cwq
-cwq
-cva
-cva
-cva
-cva
-cva
-cva
-cva
-cva
-cva
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(156,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayB
-ayF
-ads
-adT
-aeG
-ayF
-ads
-adT
-aeG
-ayF
-ads
-adT
-aeG
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-crk
-alO
-arp
-alO
-aBF
-aBF
-anf
-anf
-anf
-cVb
-jbf
-wrp
-fnC
-kPd
-xiw
-aGS
-aIm
-aIp
-aKH
-aMI
-aIp
-aOV
-aOX
-aOX
-aSR
-aUi
-aVJ
-aOX
-aiJ
-bal
-bam
-aYV
-aYV
-aYV
-bfL
-bhq
-bhm
-bkb
-cTM
-bla
-bmZ
-bpH
-bra
-bsK
-bpE
-bpE
-buq
-bvt
-bye
-bon
-bBN
-bEi
-bEi
-bEi
-bDU
-bFO
-bBN
-bKR
-bMc
-bNd
-bNd
-bNd
-bNd
-bNd
-bSX
-bMI
-bNk
-bNU
-bXb
-bWi
-bYZ
-bZR
-caQ
-bzs
-ccK
-ccM
-ceJ
-ceJ
-cgf
-ceJ
-ccM
-ccM
-ceJ
-clo
-cmi
-cbQ
-cnF
-cot
-csc
-csm
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-ayF
-cua
-cua
-cua
-cua
-cuf
-cuf
-cux
-cuK
-cuX
-cuf
-cvk
-cvk
-cvk
-cvk
-ayF
-ayF
-ayF
-ayF
-cvk
-cvk
-cvk
-cvk
-cvk
-cvk
-cvk
-cva
-cva
-cva
-cva
-cva
-cva
-cva
-cva
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(157,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayB
-ayF
-ads
-adT
-aeG
-ayF
-ads
-adT
-aeG
-ayF
-ads
-adT
-aeG
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-crk
-cxW
-anf
-aqv
-ayf
-dce
-uua
-awE
-tRB
-cVb
-vCb
-wUY
-khb
-sxs
-tal
-aCI
-aIj
-aJB
-aKD
-aMs
-aNL
-aOQ
-aQf
-aRE
-aSQ
-aVI
-aVI
-aVI
-aYO
-aRJ
-bbB
-aYV
-aYV
-aYV
-bfL
-bfL
-bfL
-bfL
-bfL
-blg
-bmZ
-bpG
-bqZ
-brk
-bsv
-bsv
-bun
-bvr
-bzo
-bon
-aFa
-bCY
-bEh
-bCW
-bDS
-bFN
-bBN
-bKQ
-bMb
-bNd
-bOr
-bOt
-bOr
-bRQ
-bOr
-bSQ
-bNj
-bNs
-bXa
-bYa
-bNd
-bZQ
-caP
-cbO
-ccJ
-bLS
-bLS
-cfp
-cge
-cbK
-ciG
-bLS
-ckm
-cln
-cmh
-cnd
-cnE
-bPn
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-cuf
-cuf
-cuf
-cuf
-cuf
-ayF
-ayF
-ayF
-aCf
-ayF
-aBM
-aBM
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-aCo
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(158,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ads
-adT
-aeG
-ayF
-ads
-adT
-aeG
-ayF
-ads
-adT
-aeG
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-crk
-alO
-anf
-alO
-mAH
-jaF
-alP
-anf
-aCG
-cVb
-cVb
-cVb
-cVb
-cVb
-wBd
-aGC
-aIl
-aIq
-aia
-aMy
-aIp
-nGf
-aQm
-fzd
-fFA
-fFA
-aVK
-aRJ
-aRJ
-aRJ
-bbB
-aYV
-aYV
-aYV
-bfO
-bfS
-biD
-bkd
-bfS
-cTO
-bmZ
-bpJ
-brc
-bsL
-bug
-btl
-but
-bvw
-bzq
-bon
-bBP
-bCZ
-bEk
-bFG
-bCY
-bFP
-bBN
-bKQ
-bMb
-bNd
-bOt
-bOr
-bOr
-bRQ
-bOr
-bSQ
-bWj
-bOm
-bXc
-bYe
-bNd
-bZS
-caR
-bzs
-ccL
-ccM
-ceL
-ceJ
-cgh
-ceJ
-ceJ
-ccM
-ceJ
-cAe
-cmj
-cne
-sXM
-bPn
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(159,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayB
-ayB
-ayB
-ayF
-ayF
-ads
-adT
-aeG
-ayF
-ads
-adT
-aeG
-ayF
-ads
-adT
-aeG
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-amw
-aof
-aof
-aof
-aof
-alP
-alP
-alP
-alP
-alP
-awF
-aCG
-alP
-nhY
-aBE
-aCz
-vEp
-aCJ
-aGT
-aIn
-aIp
-aKI
-aMt
-aIp
-aOW
-aQm
-coI
-aSS
-aUj
-sJx
-aRJ
-aYQ
-cBg
-bam
-aYV
-aYV
-aYV
-aYV
-bhr
-biC
-bkc
-bfS
-blo
-bmZ
-bpI
-brb
-bsL
-buf
-bvs
-bur
-bvp
-bzp
-bon
-bBO
-bCY
-bEj
-bCY
-bGZ
-bFE
-bBN
-bKS
-bMd
-bNd
-bOs
-bOt
-bQJ
-bRR
-bOr
-bSQ
-bWj
-bWj
-bWj
-bWj
-bNd
-bzs
-bzs
-bzs
-bMb
-bFr
-ceK
-ceJ
-cgg
-ccM
-ccM
-cjA
-ceJ
-ccM
-cdN
-bFr
-cnG
-bzs
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(160,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayB
-ayF
-ayF
-ayF
-ayF
-ayF
-csZ
-ayF
-ayF
-ayF
-csZ
-ayF
-ayF
-ayF
-csZ
-ayF
-ayF
-ayF
-ayF
-ayF
-amw
-amw
-amw
-aoh
-aoN
-apA
-aof
-arq
-itK
-atv
-auD
-alP
-aoQ
-cqM
-ayg
-ayg
-ayg
-aCA
-aFn
-aFp
-aGW
-anf
-aIp
-fGf
-aMA
-aIp
-aOX
-aQm
-coI
-aST
-aUk
-sJx
-aRJ
-aYQ
-bam
-ssB
-aYV
-aYV
-aYV
-beE
-bfS
-biE
-bkf
-bfS
-cTO
-bmZ
-bpL
-bre
-bsN
-bre
-bvv
-bur
-bvp
-bzr
-bon
-bBQ
-bDa
-bEl
-bFH
-bHb
-bIw
-bBN
-pZr
-bMb
-bNd
-bOt
-bPu
-bOr
-bRQ
-bOr
-bSQ
-bWj
-bOm
-bXc
-bYe
-bNd
-bZU
-caS
-cbN
-ccN
-bHd
-bzs
-bzs
-bKT
-bAw
-bAw
-bFr
-ceJ
-ccM
-ccM
-cng
-bzs
-bzs
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(161,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayB
-ayF
-abX
-jIs
-jIs
-vZA
-crk
-uDO
-jIs
-vZA
-crk
-uDO
-jIs
-vZA
-crk
-uDO
-jIs
-jIs
-jIs
-jIs
-amv
-ane
-cxN
-aog
-aoM
-apz
-aqw
-arr
-asw
-asw
-auE
-alP
-awG
-auF
-alP
-alP
-alP
-alP
-alP
-aFo
-aGV
-aIp
-aIp
-aKL
-aMz
-aNQ
-aOX
-aQm
-lva
-nUV
-nUV
-gbd
-aRJ
-aYR
-ban
-ikm
-aYV
-aYV
-bez
-bfP
-bfS
-bfS
-bfS
-bfS
-cTO
-bmZ
-bpK
-brd
-bpK
-bpK
-bvu
-bux
-bvy
-bon
-bon
-bBN
-bBN
-bBN
-bBN
-bHa
-bBN
-bBN
-bKB
-bMb
-bNd
-bOr
-bPt
-bOr
-bRQ
-bSY
-bMJ
-bNl
-bNW
-bXd
-bPu
-bNd
-bZT
-bMb
-bFr
-ccM
-cdN
-bzs
-cfq
-bKT
-bAw
-ciH
-sXM
-bzs
-bAw
-cmk
-cnf
-bzs
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(162,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayB
-ayF
-ayF
-ayF
-ayF
-ayF
-vPs
-ayF
-ayF
-ayF
-vPs
-ayF
-ayF
-ayF
-vPs
-ayF
-ayF
-ayF
-ayF
-ayF
-amw
-amw
-amw
-aoi
-aoO
-apB
-aqx
-art
-aBF
-aBF
-auF
-alP
-awH
-auF
-alP
-aAr
-aBF
-alP
-ayF
-aus
-auu
-aIp
-sHx
-aKU
-aME
-aNN
-aOR
-aQh
-aRI
-aSU
-aXo
-aXo
-aXo
-iLJ
-bap
-ikm
-aYV
-bci
-beB
-bfS
-bfS
-kQk
-ipA
-gbT
-cTO
-bmZ
-bon
-bon
-bon
-bon
-bon
-buG
-bvA
-bon
-tiF
-bzg
-bLS
-bLS
-bLS
-cbQ
-bLS
-bLS
-bKE
-caU
-bNc
-bOj
-bPw
-bNc
-bNc
-bNc
-bNc
-bNc
-bNc
-bNc
-bPw
-bNc
-bLS
-caU
-cbQ
-cNY
-cNY
-cNY
-cNY
-cgj
-cNY
-cNY
-chp
-bzs
-clp
-bzs
-bzs
-bzs
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(163,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayB
-ayF
-ayB
-anO
-ayF
-ads
-adW
-aeG
-ayF
-ads
-adW
-aeG
-ayF
-ads
-adW
-aeG
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-amw
-aof
-aof
-aof
-aof
-vCy
-aoP
-atw
-auF
-alP
-aoP
-auF
-azr
-jez
-atw
-alP
-alP
-aFo
-aGV
-aIp
-aJO
-aLd
-aMN
-aNQ
-aOZ
-aOX
-aOX
-rdG
-aUz
-aVM
-aOX
-aYT
-bam
-iuR
-baR
-bcb
-bdl
-cTJ
-cHD
-bgo
-cTK
-cTK
-blq
-cTS
-cTK
-bpQ
-cTK
-slk
-btm
-buy
-bvz
-bdO
-bLT
-bna
-bLT
-bLT
-bLT
-bDV
-bLT
-bLT
-bHq
-bMe
-bIg
-bIM
-bLT
-bLT
-bLT
-bLT
-bLT
-bLT
-bLT
-bLT
-bLT
-bLT
-bLT
-caT
-cbP
-ccO
-cdO
-cdO
-cdO
-cnH
-czH
-czT
-czY
-cNW
-bAw
-bAw
-clp
-kyT
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(164,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ads
-adW
-aeG
-ayF
-ads
-adW
-aeG
-ayF
-ads
-adW
-aeG
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-apC
-aqy
-anf
-anf
-aty
-auF
-alP
-aAt
-jZT
-alP
-alP
-alP
-alP
-uWy
-aFm
-aGF
-aIq
-aIq
-aIq
-aIq
-aIq
-aIq
-aIq
-aIq
-aIq
-aIq
-aIq
-aIq
-aXS
-aIq
-aIq
-baZ
-bck
-bdm
-bdP
-cHE
-bdP
-bdP
-bdP
-bdP
-bnc
-boC
-bpV
-boC
-boC
-bto
-buL
-bvB
-cbK
-bxg
-bzk
-bDb
-bDb
-bDb
-bDb
-bDb
-bDb
-bDb
-bDb
-bIs
-bIN
-bDb
-bDb
-bDb
-bDb
-bDb
-bDb
-bDb
-bDb
-bDb
-bDb
-bDb
-bDb
-bDb
-bDb
-bDb
-bDb
-bDb
-cNW
-cNW
-cQB
-czY
-cNW
-bPn
-bPn
-bPn
-crk
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(165,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayB
-ayF
-ads
-adW
-aeG
-ayF
-ads
-adW
-aeG
-ayF
-ads
-adW
-aeG
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-apC
-anf
-jez
-alP
-atx
-auF
-alP
-auD
-auF
-apE
-aAs
-vbi
-alP
-aCG
-aFr
-aGE
-aIo
-aIo
-aIo
-aIo
-aIo
-aIo
-aIo
-aRK
-aIo
-aIo
-aUx
-aVL
-aXR
-aZc
-aZc
-baT
-bcj
-beC
-bfT
-cHF
-biG
-blw
-blu
-bnb
-bfT
-bor
-bpS
-bsO
-bfV
-btn
-buH
-byf
-byf
-byf
-byf
-bDb
-bEm
-bEm
-bEm
-bDb
-bJH
-bKW
-bMg
-bIh
-bOx
-bPx
-bJN
-bRT
-aad
-bEm
-bJN
-bRT
-aad
-bEm
-bJN
-bRT
-aad
-bEm
-bDb
-cfr
-cho
-bDb
-ayF
-cNW
-cQB
-czY
-cOT
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(166,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayB
-ayF
-ads
-adW
-aeG
-ayF
-ads
-adW
-aeG
-ayF
-ads
-adW
-aeG
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-apC
-anf
-alP
-alP
-apE
-auG
-alP
-iWx
-auF
-apE
-anf
-anf
-noF
-aCG
-aDZ
-aFu
-aFu
-aFu
-aFu
-aFu
-aFu
-aFu
-aFu
-aFu
-aFu
-aFu
-aFu
-aVO
-bdp
-aYV
-aYV
-bba
-aXq
-bfU
-bhu
-cHG
-biI
-bkh
-biI
-cHQ
-bfT
-boE
-bpY
-bsQ
-box
-btx
-buU
-byf
-bzu
-bAz
-bzu
-bDb
-bEm
-bEm
-bEm
-bIx
-bJJ
-bKY
-bMi
-bNo
-bIP
-bPA
-bJN
-bRU
-aml
-bEm
-bJN
-bRU
-aop
-bEm
-bJN
-bRU
-aml
-bEm
-bDb
-cgi
-chq
-ccQ
-ayF
-cOT
-cQB
-czY
-cOT
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(167,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayB
-ayF
-ads
-crG
-aeG
-ayF
-ads
-crG
-aeG
-ayF
-ads
-crG
-aeG
-ayF
-ayB
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-apC
-arA
-anf
-asx
-anf
-auF
-alP
-alP
-auF
-alP
-alP
-alP
-aCB
-aEB
-aFs
-bbE
-aIr
-bav
-aLf
-aNV
-qfD
-aRO
-aQp
-aRN
-aIt
-aUB
-aFu
-aVN
-bdp
-bar
-bar
-aYV
-aXq
-bfU
-bhu
-cHH
-biH
-cHN
-blv
-bls
-bfT
-boD
-bpY
-bsP
-box
-btw
-buT
-byf
-bzt
-bAy
-bBS
-bDb
-bEm
-bEm
-cBz
-bEm
-bJI
-bKX
-bMh
-bIt
-bOx
-bPz
-bJN
-bRU
-amo
-bEm
-bJN
-bRU
-amo
-bEm
-bJN
-bRU
-amo
-cBz
-bDb
-cgi
-chq
-ccQ
-ayF
-cOT
-cQB
-czY
-cOT
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(168,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayB
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-atl
-ayF
-ayB
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-apC
-alP
-alP
-alP
-dbU
-auH
-avF
-awI
-ayc
-gcF
-asw
-asw
-aCD
-aEa
-aFv
-aGG
-aIu
-aJQ
-aIt
-aIt
-qfD
-aRO
-aIt
-aRN
-aIt
-aUB
-aFu
-aVZ
-aXT
-aFu
-aFu
-bcv
-aXq
-bfU
-bhu
-cHI
-biJ
-bhM
-biJ
-blx
-bfT
-boL
-bpY
-bsR
-box
-buo
-bxd
-byf
-bzw
-bAB
-bBV
-bDb
-bEn
-akK
-akP
-akP
-akV
-akW
-alf
-alm
-aln
-alr
-bJN
-bRW
-amG
-bUe
-bJN
-bWl
-aoq
-bYg
-bJN
-bZV
-apw
-cbS
-bDb
-cgl
-chs
-bDb
-ayF
-cNW
-cQB
-czY
-cNW
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(169,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayB
-ayB
-ayB
-ayB
-ayB
-ayB
-ayB
-ayB
-ayB
-ayB
-ayB
-ayB
-aAM
-ayB
-ayB
-oDb
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-alO
-aqz
-aru
-alP
-anf
-anf
-avE
-anf
-anf
-awD
-anf
-aty
-aCC
-aDZ
-anf
-aFu
-aIs
-aJP
-vZR
-aIt
-hGH
-aYW
-aYW
-aYW
-aYW
-aYW
-aYW
-aVY
-aYY
-bas
-aFu
-aYV
-cBk
-aYV
-bht
-cHJ
-cHL
-blw
-bjP
-blt
-bfT
-boG
-bqa
-cIe
-box
-buo
-bvb
-byh
-bzv
-bAA
-bBU
-bDb
-bEm
-bEm
-bEm
-bIy
-bJK
-bKZ
-bMi
-bIu
-bIO
-alx
-bLe
-bRV
-amH
-bUd
-bVi
-bRV
-amH
-bYf
-bVi
-bRV
-amH
-cbR
-bDb
-cgk
-chr
-bDb
-ayF
-cNW
-cBN
-czY
-cNW
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(170,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-alO
-aBF
-anf
-asy
-anf
-anf
-alP
-alP
-anf
-alP
-alP
-alP
-aCE
-aDZ
-aFu
-aFu
-aIw
-aJS
-pJR
-aNP
-esZ
-aOS
-aOS
-aOS
-aOS
-aOS
-aOS
-aWb
-aXU
-bau
-aFu
-aYV
-aXq
-aYV
-bfV
-cHK
-blA
-blA
-blA
-blD
-box
-cHU
-cHZ
-cIf
-box
-btA
-bxd
-byf
-bzy
-bAD
-bBX
-bDb
-bEm
-bEm
-bEm
-bIx
-bJM
-bLc
-bMi
-bNo
-bOx
-alV
-bQM
-bMi
-bOx
-bRZ
-bVj
-bMi
-bOx
-bRZ
-bZa
-bMi
-bOx
-bRZ
-cTY
-cTZ
-chu
-ccQ
-ayF
-cOT
-cQB
-cAa
-cOT
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(171,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-alO
-aqA
-arz
-alP
-anf
-anf
-alP
-awJ
-anf
-alP
-aAv
-tJS
-aCE
-aDZ
-aFu
-aHb
-aIv
-aJR
-aIt
-aIt
-qfD
-aRO
-aIt
-aPd
-aIt
-aPb
-aIt
-aXu
-aYW
-bat
-bbD
-aYV
-aXq
-beE
-bfV
-bhv
-biK
-bkk
-blz
-bly
-bos
-bpR
-bqc
-bsS
-box
-buo
-bxd
-byf
-bzx
-bAC
-bBW
-bDb
-bEm
-bEm
-bEm
-bDb
-cTX
-bLb
-bMk
-bNn
-bIQ
-alW
-amh
-ami
-amP
-anp
-anx
-anN
-amP
-anp
-anx
-anN
-amP
-aqG
-aqS
-aqS
-ars
-asr
-asC
-czQ
-czU
-czZ
-cOT
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(172,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-alP
-alP
-alP
-alP
-alP
-anf
-anf
-alP
-anf
-anf
-apE
-anf
-anf
-aCE
-aDZ
-aFu
-aHd
-aIx
-aJF
-aQq
-aNS
-qfD
-aRO
-aIt
-aPd
-aIt
-aPb
-aIt
-aXu
-aYW
-aVQ
-aFu
-aYV
-aXq
-bds
-bfV
-bhx
-biL
-bkm
-cHO
-blG
-biL
-cHV
-cIa
-biL
-box
-buo
-bvc
-byf
-byf
-byf
-byf
-bDb
-bDb
-bDb
-bDb
-bDb
-bJN
-bJN
-bMm
-bNp
-bOx
-bMi
-bQN
-bRZ
-bOx
-bMi
-bVk
-bRZ
-bOx
-bMi
-bZb
-bRZ
-bOx
-bMi
-cfy
-cgn
-cjB
-ccQ
-ayF
-cOT
-cgm
-czY
-cOT
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(173,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-alP
-apD
-aEl
-anf
-arx
-anf
-anf
-alP
-alP
-atB
-alP
-alP
-alP
-aCF
-aDZ
-alP
-aFw
-aFw
-aFw
-aFw
-aFw
-aFu
-aPf
-aQq
-aRP
-pem
-aIt
-aIt
-aWd
-aXV
-vsT
-bbD
-aYV
-aXq
-aYV
-bfV
-bhw
-cHM
-wWT
-blB
-blF
-cHS
-cHW
-cIb
-bsT
-box
-btP
-bxd
-byi
-bzz
-bAE
-bBY
-bDc
-bEo
-bFI
-bHe
-bIz
-bIz
-bJN
-bMl
-bIv
-bIR
-bPE
-bLe
-bRY
-amQ
-bUg
-bVi
-bWm
-amQ
-bUg
-bVi
-bZW
-amQ
-bUg
-bDb
-bDb
-bDb
-bDb
-ayF
-cNW
-cgm
-czY
-cNW
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(174,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-alO
-aBF
-anf
-arw
-nuw
-uve
-anf
-alP
-awL
-anf
-anf
-apE
-aBF
-aCH
-aED
-aFy
-aGO
-aIB
-aJJ
-aKZ
-aFw
-aFu
-aFu
-aFu
-aFu
-aTc
-aUD
-aVS
-aYW
-aYW
-bax
-aFu
-aYV
-aXq
-aYV
-bfV
-bfV
-biO
-biL
-cHP
-cHR
-bou
-bpT
-bqd
-biL
-box
-btS
-bxd
-byi
-bwN
-bAG
-bCa
-bDc
-bEo
-bIC
-bEc
-bIB
-bIB
-bJN
-bMo
-bNp
-bOx
-bPH
-bJN
-bSa
-amT
-bUh
-bJN
-bWn
-aos
-bYh
-bJN
-bZX
-aqB
-cbU
-bDb
-ayF
-ayF
-ayF
-ayF
-cNW
-cgm
-czY
-cNW
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(175,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-alO
-aoQ
-anf
-arv
-asz
-atA
-anf
-alP
-awK
-anf
-awD
-apE
-anf
-aCk
-aEC
-aFx
-aGM
-aIy
-aJG
-cAz
-aFw
-gRZ
-aPg
-aQr
-aFu
-aTb
-aIt
-aLg
-aYW
-aYW
-aUD
-bbD
-aYV
-aXq
-aYV
-bfW
-bhy
-biN
-biL
-bni
-blM
-bou
-cHX
-cIc
-biL
-buj
-btQ
-bve
-byj
-bwM
-bAF
-bBZ
-bDc
-bEp
-bCX
-bEc
-bIA
-bIA
-bJN
-bMn
-bNp
-bOz
-bPG
-bJN
-bEm
-amo
-bRU
-bJN
-bEm
-amo
-bRU
-bJN
-bEm
-amo
-bRU
-bDb
-ayF
-ayF
-ayF
-ayF
-cOT
-cgm
-czY
-cOT
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(176,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-alP
-jkx
-ayf
-xAk
-mHU
-aFn
-aFn
-aBB
-awM
-ayg
-ayg
-ayg
-ayg
-aCl
-aEe
-aFw
-aFw
-aFw
-aLo
-aLb
-aFw
-xEE
-aYW
-aYW
-aRQ
-aIt
-aUF
-aLg
-aYW
-aYW
-aVQ
-aFu
-aYV
-aXq
-aYV
-bfX
-bhz
-biQ
-biL
-blC
-bou
-cHT
-bou
-cId
-biL
-bsw
-btU
-bxe
-bvC
-bzD
-bxv
-bCc
-bDc
-bEo
-bDj
-bDY
-bIA
-bIA
-bJN
-bMq
-bNp
-bOx
-bPJ
-bJN
-bEm
-ano
-bRU
-bJN
-bEm
-apb
-bRU
-bJN
-bEm
-ano
-bRU
-bDb
-ayF
-ayF
-ayF
-ayF
-cOT
-cgm
-czY
-cOT
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(177,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-nsA
-nsA
-nsA
-nsA
-qVP
-nsA
-nsA
-atB
-alP
-alP
-awx
-aye
-ayd
-aAc
-ayd
-aCI
-aEd
-aFw
-aHf
-aIz
-aJM
-aLa
-aFw
-hsb
-aYW
-aQs
-aFu
-aTd
-aUE
-aVT
-aYW
-aYW
-aZd
-aFu
-aYV
-aXq
-aYV
-bfX
-bhy
-biP
-bko
-blE
-bnj
-bov
-bpU
-brq
-bsW
-buj
-bvE
-bxd
-byk
-bzC
-bAH
-bCb
-bDc
-bJY
-bDf
-bEb
-bGY
-bGY
-bJN
-bMp
-bNp
-bOx
-bPI
-bJN
-bEm
-abz
-bUi
-bJN
-bEm
-abz
-bUi
-bJN
-bEm
-abz
-bUi
-bDb
-ayF
-ayF
-ayF
-ayF
-cOT
-cgm
-czY
-cOT
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(178,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-nsA
-cQF
-ndq
-rIA
-fBy
-hRI
-jaH
-hHQ
-feE
-hHQ
-kGJ
-wHT
-asA
-apE
-dPk
-aCG
-aEf
-aFw
-aGU
-aIC
-aJU
-aLe
-aFw
-aCR
-aCR
-aCR
-aCR
-aCR
-aCR
-aCR
-aWe
-aWe
-aCR
-aCR
-bcs
-aXq
-aYV
-bfX
-bfV
-bfV
-bfV
-bfV
-bfV
-box
-bpW
-brs
-box
-box
-buo
-bxd
-byk
-byk
-byk
-byk
-bDc
-bDc
-bJR
-bEg
-bDc
-bDc
-bLe
-bMr
-bNr
-bIT
-bJN
-bJN
-bJN
-bJN
-bJN
-bJN
-bJN
-bJN
-bDb
-bDb
-bDb
-bDb
-bDb
-bDb
-cNW
-cNW
-cNW
-cNW
-cNW
-czX
-cAc
-cNW
-cNW
-cNW
-cNW
-cNW
-cNW
-cNW
-cOT
-cOT
-crk
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(179,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-wKe
-ndq
-ndq
-ndq
-ndq
-oLl
-asB
-asB
-asB
-avo
-awx
-avH
-asB
-asB
-asB
-aCK
-aEf
-aFw
-aHg
-cBZ
-aJT
-aLc
-aFw
-aFz
-aFz
-aFz
-aRR
-aTe
-aUG
-aFz
-aRS
-aXW
-baz
-aCR
-bcx
-aXq
-aYV
-bfY
-bhA
-biR
-bkq
-bjZ
-bvx
-boz
-boM
-bzE
-bsX
-bsz
-btW
-bxf
-bzE
-bzE
-bzE
-bzE
-bDd
-bEq
-bDl
-bEf
-bFQ
-bHc
-bHK
-bIb
-bID
-bOA
-bPK
-bQO
-bSb
-bOu
-bUj
-bVl
-bWo
-bXh
-bQZ
-bTl
-bZY
-caX
-bTl
-bQZ
-cdQ
-cOe
-cNW
-czG
-czR
-czW
-cAb
-cko
-clq
-cmq
-ciI
-cnJ
-cri
-cOe
-cOe
-cBT
-crk
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(180,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-wKe
-ndq
-ndq
-ndq
-ndq
-qeb
-asB
-atD
-auJ
-asB
-awQ
-avK
-azt
-aAy
-asB
-aCN
-aEf
-aFw
-aGY
-aII
-aJW
-aMX
-aNW
-aFz
-aPl
-aQv
-aPl
-aTg
-aUI
-aTg
-aRS
-aZf
-aFz
-bbF
-aYV
-aXq
-aYV
-bfX
-bhB
-bgp
-bhU
-bhU
-blX
-bow
-boO
-bhU
-bsZ
-cdX
-ceX
-bvg
-bvD
-bvD
-cBx
-bzB
-bAa
-bBE
-bDm
-bEr
-bFR
-bHf
-bHM
-bFR
-bIE
-bJr
-bJO
-bWr
-bWr
-bWr
-bUk
-bVn
-bWq
-bXj
-bYj
-bZc
-bTl
-bTl
-bTl
-bQZ
-bNB
-ceM
-ccU
-cgo
-czS
-cOb
-cAd
-cNW
-cOx
-cBL
-cOe
-cvO
-cNW
-cNW
-cOT
-cOT
-crk
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(181,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-nsA
-ndq
-ndq
-ndq
-ndq
-ndq
-asB
-atC
-auI
-auI
-awP
-avJ
-awO
-awO
-asB
-aCM
-aEg
-aFw
-aHi
-aHi
-aJV
-aFw
-aFw
-aFz
-aPk
-aQu
-aPk
-aTf
-aUH
-aTf
-aRS
-aZf
-baA
-bbF
-aYV
-aXq
-aYV
-bfZ
-bhA
-biS
-bkr
-blH
-bnm
-boy
-bpX
-brt
-brm
-bsA
-bvH
-bvf
-brt
-bwO
-bxF
-bzA
-bzZ
-bBD
-bBD
-bBD
-bBD
-bBD
-bHL
-bBD
-bBD
-bJo
-bPK
-bWr
-bWr
-bWr
-bWr
-bWr
-bWp
-bXi
-bYi
-bTl
-bTl
-caY
-cbV
-bQZ
-blQ
-cPA
-cfs
-cgm
-cQw
-cNW
-cNW
-cNW
-cNW
-cNW
-cOe
-fup
-csy
-cko
-axY
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(182,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-wKe
-ndq
-ndq
-ndq
-ndq
-ndq
-asB
-atE
-auI
-auI
-awT
-avM
-azv
-aAA
-asB
-aCE
-aEi
-aFw
-aHl
-aID
-aID
-aFw
-aMM
-aFz
-aFz
-aQw
-aRS
-aRS
-aRS
-aRS
-aRS
-aZf
-aRS
-bbF
-aYV
-aXq
-aYV
-bga
-bgc
-bgc
-bgc
-bgc
-bgc
-boB
-boB
-boB
-btb
-buo
-bvJ
-bvJ
-bvJ
-bwQ
-bxW
-bvK
-bvK
-bEt
-bDn
-bEz
-bFS
-bJT
-bLh
-bvx
-bvx
-bvx
-bPN
-bQS
-bSf
-bWr
-bWr
-bWr
-bWr
-bXl
-caZ
-cba
-bTl
-cbc
-bTl
-bQZ
-cdR
-ceO
-cNW
-cgm
-chw
-ciK
-cjC
-ckp
-cls
-cmr
-cOe
-cOe
-cou
-cNW
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(183,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-wKe
-ndq
-ndq
-ndq
-ndq
-ndq
-asB
-asB
-asB
-avL
-awR
-hiV
-azu
-aAz
-asB
-aCO
-aEh
-aFz
-aHk
-aFz
-aFz
-aTe
-aML
-aFz
-aFz
-aQw
-cdl
-aRS
-aRS
-aRS
-aRS
-aZf
-aRS
-bbF
-aYV
-aXq
-aYV
-bfX
-bhC
-biU
-bks
-blI
-bnn
-boA
-bpZ
-boB
-bta
-buo
-bvJ
-bCk
-byo
-aDH
-bxP
-bCf
-bvK
-bEs
-bGc
-bHm
-bGc
-bEs
-bEs
-wWu
-wWu
-wWu
-bPN
-bQR
-bSe
-bMf
-bNe
-bNm
-bNX
-bTf
-bQZ
-bTl
-bTl
-cbb
-bTl
-bQZ
-cdR
-ceN
-cNW
-cgp
-chv
-ciJ
-cbf
-diq
-clr
-bnt
-cOe
-cOe
-bMB
-cOT
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(184,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-nsA
-lGV
-ndq
-pou
-ndq
-srG
-asB
-atG
-auL
-avN
-axa
-auI
-azw
-aAA
-asB
-aCQ
-aEk
-aFB
-aHn
-aFB
-csT
-aFB
-aLr
-aFB
-aPn
-aQy
-aPn
-aTi
-aUK
-aVU
-aWg
-aZf
-baA
-bbF
-aYV
-aXq
-aYV
-bfX
-bhD
-biV
-biW
-blK
-bnp
-bng
-boQ
-brx
-bro
-buo
-bvJ
-bxj
-byq
-bwR
-bxY
-bCh
-bvK
-bEv
-bFU
-bFU
-bFU
-bJV
-bEC
-bMu
-bMu
-bMu
-bEC
-bQU
-bQU
-bTl
-bQU
-bXr
-bWr
-bOw
-bQZ
-bQZ
-bQZ
-cka
-bQZ
-bQZ
-bQZ
-bQZ
-bQZ
-cgr
-chx
-cNW
-cNW
-cNW
-clt
-cQw
-cOe
-cOe
-bNA
-cOT
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(185,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-nsA
-nsA
-nsA
-nsA
-nsA
-nsA
-asB
-atF
-auK
-auJ
-awS
-auI
-awO
-awO
-asB
-aCP
-aEj
-aFA
-aHm
-aEj
-aEj
-aEj
-aEj
-aEj
-aPm
-aQx
-aPm
-aTh
-aUJ
-aTh
-aXz
-aZg
-aFz
-bbF
-aYV
-bdv
-aYV
-bgb
-bhC
-biU
-biW
-blJ
-bno
-bnf
-boP
-bqf
-brn
-bsC
-bvK
-bxi
-byp
-bzJ
-bxY
-bCg
-bvK
-bEu
-bFU
-bFU
-bFU
-bJU
-bEC
-bMt
-bNt
-bNt
-bEC
-bQT
-bSg
-bTk
-bSh
-bXr
-bWr
-bOv
-bYk
-bYk
-bZZ
-cjW
-bZZ
-ccR
-cdS
-ceP
-bQZ
-cgq
-chx
-cNW
-ayF
-cNW
-clt
-cQw
-cNW
-mJo
-cNW
-cNW
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(186,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-asB
-atH
-auM
-avO
-awU
-ayj
-azx
-aAB
-asB
-aCR
-aEm
-aCR
-aPl
-aQv
-aPl
-aQv
-aCR
-aNY
-aCR
-aQA
-aCR
-aTj
-aFz
-aVV
-aXB
-aZh
-baB
-aCR
-kYk
-bdx
-vHT
-bgc
-bgc
-biX
-bhV
-bka
-blZ
-bnk
-bpo
-bqk
-brp
-bsD
-bvK
-bxl
-bys
-bzM
-bya
-bCj
-bvK
-bEx
-bFU
-bFU
-bGl
-bJX
-bEC
-bMw
-cBE
-bOE
-bEC
-bQV
-coT
-bTm
-bUn
-bXr
-bWr
-bOv
-bYm
-bYm
-bZZ
-ckN
-bZZ
-ccR
-cdS
-ceP
-bQZ
-cgt
-chx
-cOT
-ayF
-cOT
-clt
-cQw
-oEZ
-cOe
-cOe
-cNW
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(187,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-asB
-asB
-asB
-asB
-asB
-asB
-asB
-asB
-asB
-aCR
-bfb
-aCR
-aHo
-aIE
-aKe
-aIE
-aCR
-aNX
-aPo
-aQz
-aCR
-aCR
-aCR
-aCR
-aXy
-aZe
-aCR
-aCR
-bcy
-bdw
-beG
-bgc
-bhE
-biW
-bkv
-blL
-biW
-bnh
-biW
-brx
-bte
-bup
-bvK
-cBu
-byr
-bzL
-bxZ
-bCi
-bvK
-bEw
-bFU
-bEL
-bGk
-bJW
-bEC
-bMv
-bNu
-bMv
-bEC
-bQT
-bSi
-bUn
-bTl
-bXr
-bNZ
-bOy
-bZd
-bYl
-caa
-ckM
-cbW
-ceQ
-ceQ
-ceQ
-cft
-cgs
-chy
-cOT
-ayF
-cOT
-clt
-cQw
-ttL
-cOe
-cOe
-cNW
-oDb
-ayB
-ayB
-ayB
-ayB
-ayB
-ayB
-ayB
-ayB
-ayB
-ayF
-ayB
-ayB
-ayB
-ayB
-ayB
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(188,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-atz
-ayF
-aBM
-aBM
-atz
-wWu
-wWu
-wWu
-atz
-aCR
-aEn
-aCR
-aHq
-aHq
-aHq
-aHq
-aCR
-aCR
-aCR
-aCR
-aCR
-aTl
-aUL
-aVW
-aXD
-aZj
-baD
-bbG
-aTk
-bdy
-beI
-bgc
-bhF
-biW
-bib
-bki
-bma
-bnl
-bpq
-boB
-bth
-bus
-bvK
-bxm
-byu
-bzN
-byb
-aGs
-bvK
-bBF
-bFU
-oce
-bGz
-bJZ
-kzT
-bMx
-bNw
-bOF
-fcG
-bQW
-bSj
-bTn
-bUo
-bNq
-bOk
-bOB
-bPs
-bYo
-bSc
-bSc
-cbd
-ccT
-bSc
-bSc
-cfu
-cgu
-chA
-cNW
-ayF
-cNW
-clt
-cQw
-ajM
-cOe
-cOe
-cNW
-ayF
-ayB
-ayF
-ayF
-ayF
-anO
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayB
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(189,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-atz
-aBM
-aBM
-aBM
-atz
-wWu
-wWu
-wWu
-atz
-wWu
-wWu
-wWu
-wWu
-wWu
-wWu
-wWu
-aMZ
-aNZ
-aPp
-aQB
-aNa
-aTk
-aPq
-aPq
-aXC
-aZi
-baC
-aPq
-aPq
-bdy
-beH
-bgc
-bgc
-bgc
-bgc
-bgc
-bgc
-bgc
-bpp
-bgc
-brr
-bsE
-bvK
-bvK
-byt
-byt
-byt
-byt
-byt
-bEy
-bFU
-bFT
-bFU
-bFU
-bEC
-bMv
-bNv
-bMv
-rcD
-wkN
-wkN
-wkN
-wkN
-wkN
-lAB
-lQG
-bPb
-bQG
-lAB
-wkN
-wkN
-bSl
-bQZ
-bQZ
-bQZ
-cNW
-chz
-cNW
-cNW
-cNW
-clt
-cQw
-cCt
-cOe
-cOe
-cNW
-ayF
-ayB
-ayF
-cMQ
-crB
-cNa
-ayF
-cMQ
-crB
-cNa
-ayF
-cMQ
-adS
-cNa
-ayF
-ayB
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(190,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-atz
-aBM
-aBM
-aBM
-crk
-wWu
-wWu
-wWu
-atz
-wWu
-wWu
-wWu
-wWu
-wWu
-wWu
-wWu
-aMZ
-aOb
-aPr
-aQC
-aRU
-aQC
-aQC
-aQC
-czO
-aZl
-baE
-bbH
-bcA
-bdz
-beJ
-bge
-bhH
-biY
-biY
-biY
-bmd
-bnr
-bpr
-bgc
-btj
-buu
-bvM
-bxo
-bqe
-bzO
-bzO
-bzO
-bqe
-bEB
-bFW
-bFT
-tOq
-bFU
-bLi
-bMz
-bNy
-bOH
-dvO
-bQY
-vzp
-hRa
-bUp
-mNi
-mRe
-olr
-bPL
-cVK
-bTo
-eaI
-cbZ
-bSl
-cmo
-cNW
-lZl
-cNW
-chC
-ciL
-cou
-cOe
-clv
-cQw
-cNW
-cNW
-cNW
-cNW
-ayF
-ayF
-ayF
-cMQ
-crC
-cNa
-ayF
-cMQ
-crC
-cNa
-ayF
-cMQ
-adu
-cNa
-ayF
-ayB
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(191,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-atz
-aBM
-aBM
-aBM
-crk
-wWu
-wWu
-wWu
-atz
-wWu
-wWu
-wWu
-wWu
-wWu
-wWu
-wWu
-aMZ
-aOa
-aVX
-aTm
-aRL
-aTm
-aTm
-aTm
-aWh
-aZk
-aTm
-aTm
-bcz
-aTm
-aTm
-bgd
-bhG
-yjo
-yjo
-blO
-bmc
-bnq
-bgc
-bgc
-bru
-bsF
-btY
-bxn
-bqe
-bzO
-bzO
-bzO
-bqe
-bEA
-bFV
-bFT
-bGA
-bFU
-bFU
-bMy
-bNx
-bOG
-wkN
-uoB
-bSk
-bXs
-bXs
-lMg
-qeQ
-qeQ
-bPF
-bQI
-bXs
-sSW
-cbY
-bSl
-cOe
-cNW
-cNW
-cNW
-ccp
-cbf
-cbf
-cbf
-clu
-cmt
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-cMQ
-crC
-cNa
-ayF
-cMQ
-crC
-cNa
-ayF
-cMQ
-adu
-cNa
-ayF
-ayB
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(192,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-crk
-aBM
-aBM
-aBM
-atz
-wWu
-wWu
-wWu
-atz
-wWu
-wWu
-wWu
-wWu
-wWu
-wWu
-wWu
-aNa
-aOd
-aOU
-aPq
-aNa
-aPq
-aPq
-aPq
-aOU
-aPq
-aPq
-aPq
-bcC
-cBl
-aPq
-bgg
-aMZ
-bky
-bky
-bqh
-bme
-bnx
-bqe
-brA
-brw
-buw
-bvO
-bxq
-byv
-bzO
-bAR
-bzO
-bqe
-bED
-bFX
-bFT
-bGF
-bKa
-bFU
-bMA
-bNz
-bOI
-wkN
-bRa
-cbe
-bTp
-vCt
-bVs
-fKl
-bXt
-bPM
-bZh
-itG
-cbe
-wvX
-bSl
-cOe
-ceS
-cae
-cNW
-ccq
-cdq
-cjE
-ckr
-clw
-cmu
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-cMQ
-crC
-cNa
-ayF
-cMQ
-crC
-cNa
-ayF
-cMQ
-adu
-cNa
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(193,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-atz
-aBM
-aBM
-aBM
-atz
-wWu
-wWu
-wWu
-wWu
-wWu
-wWu
-wWu
-wWu
-wWu
-wWu
-wWu
-aNa
-aOc
-aPs
-aPq
-aNa
-aPq
-aPs
-aPs
-aXG
-aZm
-aPs
-aPq
-bcB
-aPq
-aPs
-bgf
-aNa
-ayF
-bky
-blP
-bns
-boF
-bqe
-brz
-brv
-cBt
-bvN
-bxp
-byv
-bzO
-bAQ
-bCl
-bqe
-bEC
-bEC
-bEM
-bGC
-bEC
-bEC
-bEC
-bEC
-bEC
-bSl
-dMZ
-bXs
-bXs
-bXs
-gwd
-ycu
-oHU
-uNu
-bXs
-bXs
-bXs
-bXs
-bSl
-cOe
-ceR
-cbf
-cbv
-uVS
-cQw
-cjD
-cjD
-cjD
-cjD
-cnj
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-cMQ
-crC
-cNa
-ayF
-cMQ
-crC
-cNa
-ayF
-cMQ
-adu
-cNa
-ayF
-ayF
-ayB
-ayB
-ayB
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(194,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-atz
-aBM
-aBM
-aBM
-atz
-wWu
-wWu
-wWu
-wWu
-wWu
-wWu
-wWu
-wWu
-wWu
-wWu
-wWu
-aNa
-aNa
-aNa
-aQF
-aNa
-aTn
-aNa
-aNa
-aNa
-aNa
-aNa
-cyp
-aNa
-bdA
-aNa
-aNa
-aNa
-ayF
-bky
-blR
-bns
-boF
-bqe
-brC
-brv
-buv
-bvO
-bxr
-byv
-bzO
-bzO
-bzO
-bqe
-bEF
-bky
-bEO
-bGK
-bKc
-cNW
-bMB
-bNA
-cOe
-bSl
-bUq
-flc
-vPE
-bXs
-bVt
-dfh
-jSO
-jgm
-oUh
-vPE
-jrE
-saK
-bSl
-cOx
-sLv
-ckS
-cNW
-jVl
-cds
-cjD
-ckt
-cly
-cmw
-cnj
-cnj
-cnj
-ayF
-ayF
-ayF
-ayF
-ayF
-csZ
-ayF
-ayF
-ayF
-csZ
-ayF
-ayF
-ayF
-csZ
-ayF
-ayF
-ayF
-ayF
-ayF
-ayB
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(195,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-aBM
-aBM
-aBM
-atz
-wWu
-wWu
-wWu
-wWu
-wWu
-wWu
-wWu
-wWu
-wWu
-wWu
-wWu
-aBM
-aBM
-aNa
-aQE
-aNa
-aQE
-aNa
-ayF
-ayF
-ayF
-aNa
-aQE
-aNa
-aQE
-aNa
-ayF
-ayF
-ayF
-bky
-cyC
-bns
-boF
-bqe
-brB
-brv
-bsG
-bvP
-bxn
-bqe
-bzO
-bzO
-bzO
-bqe
-bEE
-bFY
-bEN
-bGG
-bKb
-cNX
-cNZ
-cNZ
-jCq
-bSl
-bSl
-bSl
-bSl
-bSl
-bSl
-bSl
-bSl
-bSl
-bSl
-bSl
-bSl
-bSl
-bSl
-cNW
-cgr
-cNW
-cNW
-ccr
-cdr
-cjF
-cks
-clx
-cmv
-cnk
-cnK
-cyU
-jIs
-jIs
-jIs
-jIs
-vZA
-crk
-crk
-crk
-crk
-crk
-uDO
-jIs
-vZA
-crk
-uDO
-jIs
-jIs
-ctB
-ayF
-ayB
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(196,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-aBM
-aBM
-aBM
-aBM
-wWu
-wWu
-wWu
-wWu
-wWu
-wWu
-wWu
-wWu
-wWu
-wWu
-aBM
-aBM
-aBM
-aNa
-aQE
-aNa
-aQE
-aNa
-ayF
-ayF
-ayF
-aNa
-aQE
-aNa
-aQE
-aNa
-ayF
-ayF
-ayF
-crk
-crk
-bns
-boF
-bqe
-brD
-brP
-bsI
-bvO
-bxs
-byw
-bzO
-bzO
-bzO
-bqe
-bEG
-bGa
-bHs
-bGL
-bKd
-cNY
-bMC
-cOb
-jHt
-bPO
-kob
-bSm
-bTr
-bTr
-bTr
-bTr
-bTr
-bTr
-bTr
-bTr
-cbg
-bTr
-bTr
-bTr
-nGt
-cbg
-bTr
-cct
-cdu
-cjG
-cku
-clz
-cmx
-cnj
-cnj
-cnj
-ayF
-ayF
-ayF
-ayF
-ayF
-vPs
-ayF
-ayF
-ayF
-vPs
-ayF
-ayF
-ayF
-vPs
-ayF
-ayF
-ayF
-ayF
-ayF
-ayB
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(197,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-wWu
-wWu
-wWu
-aBM
-aBM
-aBM
-wWu
-wWu
-aBM
-aBM
-aBM
-aBM
-aNa
-aeR
-aNa
-aQE
-aNa
-ayF
-ayF
-ayF
-aNa
-aQE
-aNa
-afE
-aNa
-ayF
-ayF
-ayF
-ayF
-ayF
-bns
-boF
-bqe
-bqe
-bry
-bsH
-bqe
-bqe
-bqe
-bqe
-bqe
-bqe
-bqe
-bEG
-bFZ
-bHr
-bIS
-bEs
-bEs
-bEs
-cNW
-sOs
-cNW
-cNW
-cNW
-cNW
-cNW
-cNW
-cNW
-cNW
-cNW
-cNW
-cNW
-cNW
-cNW
-cNW
-cNW
-sRO
-cNW
-cNW
-cNW
-cNW
-cjD
-cjD
-cjD
-cjD
-cnj
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-cMQ
-crE
-cNa
-ayF
-cMQ
-crE
-cNa
-ayF
-cMQ
-adW
-cNa
-ayF
-ayF
-ayB
-ayB
-ayB
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(198,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aNa
-aQE
-aNa
-aQE
-aNa
-ayF
-ayF
-ayF
-aNa
-aQE
-aNa
-aQE
-aNa
-ayF
-ayF
-ayF
-ayF
-aBM
-bns
-boH
-biY
-brF
-brQ
-bsM
-buz
-buz
-buz
-buz
-buz
-cNU
-buz
-bEI
-bFZ
-bHu
-bIV
-bKf
-bLk
-bEs
-bNC
-nRG
-cbf
-cbf
-cbf
-cbf
-cbf
-cbf
-cbf
-bYr
-cbf
-clr
-cad
-cbi
-cNW
-ccW
-cdV
-clt
-cNW
-cgy
-ccV
-cNW
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-cMQ
-crE
-cNa
-ayF
-cMQ
-crE
-cNa
-ayF
-cMQ
-adW
-cNa
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(199,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aaf
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aNa
-cyh
-aRW
-aTo
-aNa
-ayF
-ayF
-ayF
-aNa
-aTo
-aRW
-cyr
-aNa
-aBM
-ayF
-ayF
-ayF
-aBM
-bnu
-bhG
-bhG
-bhG
-bhG
-bsJ
-brE
-bhG
-bhG
-bhG
-bhG
-cNV
-bhG
-bEH
-bGb
-cBA
-bIU
-bKe
-bLj
-bEs
-bNB
-cac
-bPP
-cNW
-cNW
-cNW
-cNW
-cNW
-cNW
-cNW
-kAJ
-clt
-cac
-cbh
-cou
-ccV
-cOe
-clt
-cfv
-cBL
-cou
-cNW
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-cMQ
-crE
-cNa
-ayF
-cMQ
-crE
-cNa
-ayF
-cMQ
-adW
-cNa
-ayF
-ayB
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(200,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-aBM
-aBM
-aBM
-crk
-crk
-crk
-auN
-crk
-ayF
-ayF
-ayF
-crk
-crk
-crk
-crk
-crk
-aBM
-aBM
-aBM
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-bky
-btp
-brH
-bvQ
-bxt
-cNT
-bCm
-bDh
-bEs
-ydD
-bHv
-bIW
-bKe
-vHY
-bEs
-rmX
-xIa
-vxh
-cNW
-aBM
-aBM
-ayF
-aBM
-aBM
-cNW
-bYs
-nRG
-ciJ
-cbf
-cbf
-cbf
-cbf
-ceT
-cNW
-dBm
-chH
-cNW
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-cMQ
-crE
-cNa
-ayF
-cMQ
-crE
-cNa
-ayF
-cMQ
-adW
-cNa
-ayF
-ayB
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(201,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-bZi
-bqg
-brG
-brG
-cNR
-brG
-brG
-bDg
-bEs
-bGd
-poc
-rNc
-bEs
-bLm
-bEs
-cOT
-cOT
-cOT
-cNW
-aBM
-aBM
-ayF
-aBM
-aBM
-cNW
-cNW
-cOT
-cOT
-cOT
-cNW
-cNW
-cNW
-cPH
-cNW
-cNW
-cNW
-cNW
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-cMQ
-crG
-cNa
-ayF
-cMQ
-crG
-cNa
-ayF
-cMQ
-crG
-cNa
-ayF
-ayB
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(202,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-ayF
-ayF
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-bZi
-btq
-brI
-bvR
-cNS
-byx
-brI
-bky
-bky
-bEs
-bGc
-bGc
-bEs
-bLl
-bEs
-ayF
-ayF
-ayF
-ayF
-crk
-crk
-ayF
-crk
-crk
-ayF
-ayF
-ayF
-crk
-crk
-ayF
-ayF
-cNW
-ceU
-cNW
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-oDb
-ayF
-ayF
-ayF
-ayF
-ayB
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(203,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-oDb
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-aBM
-ayF
-ayF
-ayF
-aBM
-aBM
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-bky
-bky
-bky
-bky
-bky
-bky
-bky
-bky
-ayF
-aBM
-crk
-crk
-crk
-crk
-crk
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-ayF
-aBM
-aBM
-ayF
-oDb
-ayF
-aBM
-aBM
-ayF
-ayF
-cNW
-cPI
-cNW
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayB
-ayB
-ayB
-ayB
-ayB
-ayB
-ayB
-ayB
-ayB
-ayB
-ayB
-ayB
-ayB
-ayB
-ayB
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(204,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-aBM
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-aBM
-ayF
-ayF
-aBM
-ayF
-aBM
-aBM
-ayF
-aBM
-aBM
-aBM
-ayF
-crk
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-ayF
-aBM
-aBM
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-crk
-crk
-crk
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(205,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-aBM
-ayF
-ayF
-aBM
-ayF
-aBM
-aBM
-ayF
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-aBM
-aBM
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(206,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-ayF
-aBM
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-aBM
-ayF
-ayF
-aBM
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-crk
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(207,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-aBM
-aBM
-aBM
-aBM
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-crk
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(208,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-aBM
-aBM
-aBM
-aBM
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-oDb
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(209,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-aBM
-ayF
-aBM
-aBM
-aBM
-aBM
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(210,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-aBM
-ayF
-aBM
-aBM
-aBM
-aBM
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-crk
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(211,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-crk
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(212,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-crk
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(213,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(214,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-crk
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(215,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-crk
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(216,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-crk
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(217,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-crk
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(218,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-crk
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(219,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-crk
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(220,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(221,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-crk
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(222,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-crk
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(223,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(224,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(225,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-bGf
-bLo
-bGf
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(226,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-bIX
-bGf
-bLn
-bGf
-bIX
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(227,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-bGf
-bGf
-bKh
-bLo
-bMD
-bGf
-bGf
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(228,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-bGe
-bGe
-bIY
-bKg
-bKg
-bKg
-bND
-bGe
-bGe
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(229,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-bGf
-bHw
-bJa
-bKg
-bLp
-bKg
-bNF
-bOJ
-bGf
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(230,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-bGe
-bGe
-bIZ
-bKg
-bKg
-bKg
-bNE
-bGe
-bGe
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(231,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-bGf
-bGf
-bKi
-bLr
-bME
-bNG
-bNG
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(232,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-bIX
-bGf
-bLq
-bGf
-bIX
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(233,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-bGf
-bGe
-bGf
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(234,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(235,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-ayF
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(236,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(237,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-ayF
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(238,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(239,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(240,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(241,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(242,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(243,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(244,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(245,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(246,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(247,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(248,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(249,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(250,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(251,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(252,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(253,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(254,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
-(255,1,1) = {"
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-aCx
-"}
diff --git a/_maps/map_files/IceBoxStation/IcemoonUnderground_Above.dmm b/_maps/map_files/IceBoxStation/IcemoonUnderground_Above.dmm
deleted file mode 100644
index c3866d387c..0000000000
--- a/_maps/map_files/IceBoxStation/IcemoonUnderground_Above.dmm
+++ /dev/null
@@ -1,69846 +0,0 @@
-//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
-"aa" = (
-/obj/docking_port/stationary{
- dir = 8;
- dwidth = 2;
- height = 5;
- id = "laborcamp_away";
- name = "labor camp";
- width = 9
- },
-/turf/closed/mineral/random/snow,
-/area/icemoon/underground/unexplored/rivers)
-"ah" = (
-/turf/closed/mineral/random/snow,
-/area/icemoon/underground/unexplored/rivers)
-"ak" = (
-/turf/closed/mineral/random/high_chance/snow,
-/area/icemoon/underground/unexplored/rivers)
-"ao" = (
-/obj/machinery/computer/shuttle/labor/one_way{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"ap" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/mine/laborcamp)
-"aq" = (
-/turf/closed/wall,
-/area/mine/laborcamp)
-"au" = (
-/obj/structure/table,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"az" = (
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"aC" = (
-/obj/structure/sign/poster/official/safety_report{
- pixel_x = -32
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/camera{
- c_tag = "Labor Camp Central";
- dir = 4;
- network = list("labor")
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"aF" = (
-/obj/machinery/door/poddoor/preopen{
- id = "labor";
- name = "labor camp blast door"
- },
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"aG" = (
-/obj/structure/table,
-/obj/item/trash/plate,
-/obj/item/kitchen/fork,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"aJ" = (
-/obj/structure/table,
-/obj/effect/decal/cleanable/dirt,
-/obj/item/book/manual/chef_recipes{
- pixel_x = 2;
- pixel_y = 6
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"aM" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable,
-/turf/open/floor/plating,
-/area/mine/eva)
-"aN" = (
-/obj/machinery/status_display/evac{
- pixel_y = 32
- },
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"aS" = (
-/obj/structure/sign/warning/docking{
- pixel_x = -32
- },
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"aV" = (
-/obj/effect/turf_decal/tile/purple{
- dir = 4
- },
-/obj/machinery/computer/mech_bay_power_console{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/mine/eva)
-"aY" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/obj/machinery/door/airlock/security/glass{
- name = "Labor Camp Shuttle Security Airlock";
- req_access_txt = "2"
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"bd" = (
-/obj/machinery/mineral/processing_unit_console,
-/turf/closed/wall,
-/area/mine/laborcamp)
-"bf" = (
-/turf/closed/wall,
-/area/mine/eva)
-"bg" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/mine/eva)
-"bh" = (
-/turf/open/floor/plasteel,
-/area/mine/laborcamp/security)
-"bi" = (
-/obj/structure/gulag_beacon,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"bn" = (
-/obj/structure/table,
-/obj/item/pickaxe,
-/obj/item/gps/mining,
-/obj/item/gps/mining,
-/obj/item/gps/mining,
-/obj/item/gps/mining,
-/obj/effect/turf_decal/tile/purple{
- dir = 1
- },
-/obj/effect/turf_decal/tile/purple{
- dir = 4
- },
-/obj/effect/turf_decal/tile/purple{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/mine/eva)
-"bo" = (
-/obj/machinery/suit_storage_unit/mining,
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/eva)
-"bp" = (
-/obj/machinery/suit_storage_unit/mining,
-/obj/effect/turf_decal/tile/purple{
- dir = 1
- },
-/obj/effect/turf_decal/tile/purple,
-/obj/effect/turf_decal/tile/purple{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/eva)
-"bq" = (
-/turf/closed/wall,
-/area/mine/production)
-"br" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/mine/production)
-"bs" = (
-/obj/machinery/camera{
- c_tag = "EVA";
- dir = 4;
- network = list("mine")
- },
-/obj/machinery/airalarm{
- dir = 4;
- pixel_x = -23
- },
-/obj/machinery/light{
- dir = 8
- },
-/obj/structure/table,
-/obj/item/storage/toolbox/mechanical{
- pixel_x = -2;
- pixel_y = -1
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/mine/eva)
-"bt" = (
-/turf/open/floor/plasteel,
-/area/mine/eva)
-"bu" = (
-/obj/machinery/light_switch{
- pixel_x = 27
- },
-/obj/effect/turf_decal/tile/brown,
-/obj/effect/turf_decal/tile/brown{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/eva)
-"bw" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp/security)
-"bx" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/obj/machinery/door/airlock/security/glass{
- name = "Labor Camp Shuttle Prisoner Airlock"
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"by" = (
-/obj/machinery/power/apc{
- dir = 1;
- name = "Labor Camp APC";
- pixel_y = 23
- },
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/turf/open/floor/plating,
-/area/mine/laborcamp)
-"bB" = (
-/obj/structure/toilet{
- dir = 8
- },
-/obj/machinery/light/small{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/mine/laborcamp/security)
-"bD" = (
-/obj/structure/closet/crate,
-/obj/item/dice/d4,
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"bE" = (
-/obj/structure/reagent_dispensers/watertank,
-/obj/effect/turf_decal/tile/purple,
-/turf/open/floor/plasteel,
-/area/mine/production)
-"bF" = (
-/obj/effect/spawner/structure/window,
-/turf/open/floor/plating,
-/area/mine/eva)
-"bG" = (
-/obj/structure/table,
-/obj/item/stack/packageWrap,
-/obj/item/stack/packageWrap,
-/obj/item/stack/packageWrap,
-/obj/item/hand_labeler,
-/obj/effect/turf_decal/tile/purple{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/mine/eva)
-"bH" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/turf/open/floor/plasteel,
-/area/mine/eva)
-"bI" = (
-/obj/structure/tank_dispenser/oxygen,
-/obj/effect/turf_decal/tile/purple,
-/turf/open/floor/plasteel,
-/area/mine/eva)
-"bJ" = (
-/obj/machinery/light/small{
- dir = 1
- },
-/obj/effect/turf_decal/tile/purple{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/mine/eva)
-"bK" = (
-/obj/structure/extinguisher_cabinet{
- pixel_x = -5;
- pixel_y = 30
- },
-/obj/machinery/shower{
- dir = 8
- },
-/obj/effect/turf_decal/tile/purple,
-/turf/open/floor/plasteel,
-/area/mine/eva)
-"bL" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
-/obj/machinery/door/airlock/highsecurity{
- name = "Labor Camp Monitoring";
- req_access_txt = "2"
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"bM" = (
-/obj/effect/turf_decal/tile/red,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp/security)
-"bN" = (
-/obj/structure/sign/warning/docking,
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/mine/production)
-"bO" = (
-/obj/item/beacon,
-/obj/effect/turf_decal/tile/purple{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"bP" = (
-/turf/open/floor/plasteel,
-/area/mine/production)
-"bQ" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{
- dir = 1
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"bR" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/brown,
-/obj/effect/turf_decal/tile/brown{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"bS" = (
-/obj/machinery/door/airlock/mining/glass{
- name = "Mining Station EVA";
- req_access_txt = "54"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/mine/eva)
-"bT" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/mine/eva)
-"bU" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 9
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/mine/eva)
-"bV" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/mine/eva)
-"bW" = (
-/obj/effect/turf_decal/tile/brown,
-/obj/effect/turf_decal/tile/brown{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/mine/eva)
-"bX" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/obj/machinery/door/airlock/external{
- glass = 1;
- name = "Mining External Airlock";
- opacity = 0;
- req_access_txt = "54"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/turf/open/floor/plasteel,
-/area/mine/eva)
-"bY" = (
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/mine/eva)
-"ca" = (
-/turf/closed/wall,
-/area/mine/laborcamp/security)
-"cb" = (
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/structure/table,
-/obj/item/restraints/handcuffs,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp/security)
-"cc" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/mob/living/simple_animal/bot/secbot/beepsky{
- desc = "Powered by the tears and sweat of laborers.";
- name = "Prison Ofitser"
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp/security)
-"ch" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp/security)
-"cj" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/obj/machinery/door/airlock/external{
- glass = 1;
- name = "Mining Shuttle Airlock";
- opacity = 0
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"ck" = (
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"cl" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"cm" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"cn" = (
-/obj/effect/turf_decal/tile/purple{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"co" = (
-/obj/machinery/power/apc{
- name = "Mining EVA APC";
- pixel_x = 1;
- pixel_y = -23
- },
-/obj/machinery/recharge_station,
-/obj/effect/turf_decal/tile/purple{
- dir = 1
- },
-/obj/structure/cable,
-/turf/open/floor/plasteel,
-/area/mine/eva)
-"cp" = (
-/obj/machinery/mech_bay_recharge_port,
-/obj/structure/cable,
-/turf/open/floor/plating,
-/area/mine/eva)
-"cq" = (
-/turf/open/floor/mech_bay_recharge_floor,
-/area/mine/eva)
-"cs" = (
-/obj/effect/turf_decal/tile/purple{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/mine/eva)
-"cy" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plating,
-/area/mine/production)
-"cB" = (
-/obj/structure/chair/office{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp/security)
-"cC" = (
-/obj/structure/table,
-/obj/effect/turf_decal/tile/red,
-/obj/item/paper_bin,
-/obj/item/pen,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp/security)
-"cD" = (
-/obj/effect/turf_decal/tile/purple{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"cE" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"cF" = (
-/obj/effect/turf_decal/tile/brown,
-/obj/effect/turf_decal/tile/brown{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"cG" = (
-/obj/machinery/light{
- dir = 8
- },
-/obj/structure/closet/secure_closet/freezer/gulag_fridge,
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp/security)
-"cH" = (
-/obj/effect/turf_decal/tile/purple{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"cI" = (
-/obj/effect/turf_decal/tile/purple,
-/obj/effect/turf_decal/tile/purple{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"cJ" = (
-/obj/machinery/door/airlock{
- name = "Closet"
- },
-/turf/open/floor/plating,
-/area/mine/production)
-"cK" = (
-/obj/machinery/light/small{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/mine/production)
-"cL" = (
-/obj/machinery/space_heater,
-/turf/open/floor/plating,
-/area/mine/production)
-"cM" = (
-/turf/closed/wall,
-/area/mine/living_quarters)
-"cO" = (
-/obj/item/radio/intercom{
- dir = 8;
- name = "Station Intercom (General)";
- pixel_x = -28
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"cP" = (
-/obj/structure/extinguisher_cabinet{
- pixel_x = 30
- },
-/obj/effect/turf_decal/tile/brown,
-/obj/effect/turf_decal/tile/brown{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"cQ" = (
-/turf/closed/wall/r_wall,
-/area/mine/maintenance)
-"cR" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/mine/living_quarters)
-"cS" = (
-/obj/machinery/power/smes{
- charge = 5e+006
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/turf/open/floor/plating,
-/area/mine/living_quarters)
-"cT" = (
-/obj/machinery/light/small{
- dir = 1
- },
-/obj/structure/closet/crate/secure/loot,
-/obj/structure/sign/warning/electricshock{
- pixel_y = 32
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plating,
-/area/mine/living_quarters)
-"cU" = (
-/obj/machinery/portable_atmospherics/canister/oxygen,
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/turf/open/floor/plating,
-/area/mine/living_quarters)
-"cV" = (
-/turf/open/floor/plating,
-/area/mine/living_quarters)
-"cW" = (
-/obj/structure/reagent_dispensers/fueltank,
-/turf/open/floor/plating,
-/area/mine/living_quarters)
-"cX" = (
-/obj/machinery/power/apc{
- dir = 8;
- name = "Mining Station Starboard Wing APC";
- pixel_x = -25;
- pixel_y = 2
- },
-/obj/machinery/light{
- dir = 8
- },
-/obj/effect/turf_decal/tile/purple{
- dir = 1
- },
-/obj/effect/turf_decal/tile/purple{
- dir = 8
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"cZ" = (
-/obj/machinery/mineral/equipment_vendor,
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/obj/effect/turf_decal/tile/brown,
-/obj/effect/turf_decal/tile/brown{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"db" = (
-/obj/machinery/light/small{
- dir = 1
- },
-/obj/effect/turf_decal/loading_area{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"dc" = (
-/obj/structure/closet/crate,
-/obj/machinery/airalarm{
- pixel_y = 23
- },
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plasteel,
-/area/mine/production)
-"dd" = (
-/obj/structure/extinguisher_cabinet{
- pixel_x = -5;
- pixel_y = 30
- },
-/obj/structure/table,
-/obj/item/paper/fluff/stations/lavaland/orm_notice,
-/turf/open/floor/plasteel,
-/area/mine/production)
-"de" = (
-/obj/structure/ore_box,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plasteel,
-/area/mine/production)
-"df" = (
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plasteel,
-/area/mine/production)
-"dg" = (
-/turf/open/floor/circuit,
-/area/mine/maintenance)
-"dh" = (
-/obj/machinery/power/apc{
- dir = 1;
- name = "Mining Communications APC";
- pixel_x = 1;
- pixel_y = 23
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3,
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/turf/open/floor/plasteel/dark,
-/area/mine/maintenance)
-"di" = (
-/obj/machinery/telecomms/relay/preset/mining,
-/obj/machinery/light/small{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/mine/maintenance)
-"dj" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/turf/open/floor/plasteel/dark,
-/area/mine/maintenance)
-"dk" = (
-/obj/machinery/airalarm{
- pixel_y = 24
- },
-/turf/open/floor/circuit,
-/area/mine/maintenance)
-"dl" = (
-/obj/machinery/light/small{
- dir = 8
- },
-/obj/machinery/airalarm{
- pixel_y = 23
- },
-/obj/machinery/iv_drip,
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/mine/living_quarters)
-"dm" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3,
-/turf/open/floor/plasteel/white,
-/area/mine/living_quarters)
-"dn" = (
-/obj/structure/table,
-/obj/item/storage/firstaid/toxin{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/mine/living_quarters)
-"do" = (
-/obj/machinery/power/terminal{
- dir = 1
- },
-/obj/machinery/power/port_gen/pacman{
- anchored = 1
- },
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/turf/open/floor/plating,
-/area/mine/living_quarters)
-"dp" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
- },
-/obj/machinery/meter,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/mine/living_quarters)
-"dq" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/mine/living_quarters)
-"dr" = (
-/obj/machinery/atmospherics/components/unary/tank/air{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/mine/living_quarters)
-"ds" = (
-/obj/machinery/mineral/equipment_vendor,
-/obj/effect/turf_decal/tile/purple,
-/obj/effect/turf_decal/tile/purple{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"du" = (
-/obj/effect/turf_decal/loading_area,
-/turf/open/floor/plasteel,
-/area/mine/production)
-"dv" = (
-/obj/effect/turf_decal/loading_area{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"dw" = (
-/obj/machinery/light/small{
- dir = 4
- },
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
-/area/mine/production)
-"dx" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 5
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/turf/open/floor/circuit,
-/area/mine/maintenance)
-"dy" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 10
- },
-/obj/machinery/bluespace_beacon,
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/turf/open/floor/plasteel/dark,
-/area/mine/maintenance)
-"dz" = (
-/obj/machinery/light_switch{
- pixel_y = -25
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
-/turf/open/floor/circuit,
-/area/mine/maintenance)
-"dA" = (
-/obj/machinery/camera{
- c_tag = "Communications Relay";
- dir = 8;
- network = list("mine")
- },
-/turf/open/floor/circuit,
-/area/mine/maintenance)
-"dB" = (
-/obj/structure/closet/crate/freezer,
-/obj/item/reagent_containers/blood,
-/obj/item/reagent_containers/blood{
- pixel_x = -3;
- pixel_y = -3
- },
-/obj/item/reagent_containers/blood/AMinus,
-/obj/item/reagent_containers/blood/BMinus{
- pixel_x = -4;
- pixel_y = 4
- },
-/obj/item/reagent_containers/blood/BPlus{
- pixel_x = 1;
- pixel_y = 2
- },
-/obj/item/reagent_containers/blood/OMinus,
-/obj/item/reagent_containers/blood/OPlus{
- pixel_x = -2;
- pixel_y = -1
- },
-/obj/item/reagent_containers/blood/random,
-/obj/item/reagent_containers/blood/random,
-/obj/item/reagent_containers/blood/random,
-/obj/machinery/camera{
- c_tag = "Sleeper Room";
- dir = 1;
- network = list("mine")
- },
-/turf/open/floor/plasteel/white,
-/area/mine/living_quarters)
-"dC" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 5
- },
-/turf/open/floor/plasteel/white,
-/area/mine/living_quarters)
-"dD" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 10
- },
-/turf/open/floor/plasteel/white,
-/area/mine/living_quarters)
-"dE" = (
-/obj/structure/table,
-/obj/item/storage/firstaid/regular,
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/mine/living_quarters)
-"dF" = (
-/obj/machinery/power/port_gen/pacman{
- anchored = 1
- },
-/obj/structure/cable,
-/turf/open/floor/plating,
-/area/mine/living_quarters)
-"dH" = (
-/obj/machinery/atmospherics/components/binary/pump/on,
-/obj/structure/cable,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/mine/living_quarters)
-"dI" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 5
- },
-/turf/open/floor/plating,
-/area/mine/living_quarters)
-"dJ" = (
-/obj/effect/turf_decal/tile/purple{
- dir = 1
- },
-/obj/effect/turf_decal/tile/purple{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"dK" = (
-/obj/machinery/light{
- dir = 4
- },
-/obj/machinery/camera{
- c_tag = "Shuttle Docking Foyer";
- dir = 8;
- network = list("mine")
- },
-/obj/machinery/newscaster{
- pixel_x = 30;
- pixel_y = 1
- },
-/obj/effect/turf_decal/tile/brown,
-/obj/effect/turf_decal/tile/brown{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"dL" = (
-/obj/structure/closet/crate{
- icon_state = "crateopen"
- },
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plasteel,
-/area/mine/production)
-"dM" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/turf/open/floor/plasteel,
-/area/mine/production)
-"dN" = (
-/obj/machinery/camera{
- c_tag = "Processing Area Room";
- dir = 8;
- network = list("mine")
- },
-/obj/item/radio/intercom{
- dir = 8;
- name = "Station Intercom (General)";
- pixel_x = 28
- },
-/obj/effect/turf_decal/tile/brown,
-/obj/effect/turf_decal/tile/brown{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"dO" = (
-/obj/machinery/mineral/unloading_machine{
- dir = 1;
- icon_state = "unloader-corner";
- input_dir = 1;
- output_dir = 2
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/turf/open/floor/plating,
-/area/mine/production)
-"dP" = (
-/obj/machinery/door/airlock/maintenance{
- name = "Mining Station Communications";
- req_access_txt = "48"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/mine/maintenance)
-"dQ" = (
-/obj/effect/spawner/structure/window,
-/turf/open/floor/plating,
-/area/mine/living_quarters)
-"dR" = (
-/obj/machinery/door/airlock/medical/glass{
- name = "Infirmary"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
-/turf/open/floor/plasteel/white,
-/area/mine/living_quarters)
-"dS" = (
-/obj/machinery/door/airlock/maintenance{
- name = "Mining Station Maintenance";
- req_access_txt = "48"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/mine/living_quarters)
-"dT" = (
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"dU" = (
-/obj/effect/turf_decal/tile/purple,
-/turf/open/floor/plasteel,
-/area/mine/production)
-"dV" = (
-/obj/effect/spawner/structure/window,
-/turf/open/floor/plating,
-/area/mine/production)
-"dW" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/mine/production)
-"dX" = (
-/obj/machinery/conveyor_switch/oneway{
- id = "mining_internal";
- name = "mining conveyor"
- },
-/obj/effect/turf_decal/tile/purple,
-/obj/effect/turf_decal/tile/purple{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"dY" = (
-/obj/machinery/conveyor{
- id = "mining_internal"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/mine/production)
-"dZ" = (
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"ea" = (
-/obj/effect/turf_decal/tile/purple{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"eb" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"ec" = (
-/obj/effect/turf_decal/tile/purple{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"ee" = (
-/obj/machinery/airalarm{
- pixel_y = 23
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"ef" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"eg" = (
-/obj/machinery/power/apc{
- dir = 1;
- name = "Mining Station Port Wing APC";
- pixel_x = 1;
- pixel_y = 23
- },
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"eh" = (
-/obj/structure/extinguisher_cabinet{
- pixel_x = -5;
- pixel_y = 30
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"ei" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"ej" = (
-/obj/machinery/camera{
- c_tag = "Crew Area Hallway East";
- network = list("mine")
- },
-/obj/effect/turf_decal/tile/purple{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"ek" = (
-/obj/effect/turf_decal/tile/purple,
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"em" = (
-/obj/machinery/light{
- dir = 4
- },
-/obj/effect/turf_decal/tile/brown,
-/obj/effect/turf_decal/tile/brown{
- dir = 4
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"en" = (
-/obj/machinery/mineral/processing_unit_console,
-/turf/closed/wall,
-/area/mine/production)
-"eo" = (
-/obj/machinery/mineral/processing_unit{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/turf/open/floor/plating,
-/area/mine/production)
-"eq" = (
-/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer3,
-/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"er" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"es" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"et" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{
- dir = 1
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"eu" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"ew" = (
-/obj/effect/turf_decal/tile/brown,
-/obj/effect/turf_decal/tile/brown{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"ex" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 4
- },
-/obj/machinery/door/airlock/glass{
- name = "Mining Station Bridge"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"ey" = (
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"ez" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"eA" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 4
- },
-/obj/machinery/door/airlock/glass{
- name = "Mining Station Bridge"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"eB" = (
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"eC" = (
-/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3,
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"eD" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3,
-/turf/open/floor/plasteel,
-/area/mine/production)
-"eE" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"eH" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/purple,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"eI" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
-/obj/effect/turf_decal/tile/brown,
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 9
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"eJ" = (
-/obj/effect/turf_decal/tile/purple,
-/obj/effect/turf_decal/tile/purple{
- dir = 4
- },
-/obj/effect/turf_decal/tile/purple{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"eK" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/tile/brown,
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"eL" = (
-/obj/effect/turf_decal/tile/purple{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"eM" = (
-/obj/machinery/light,
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"eN" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"eO" = (
-/obj/machinery/light/small,
-/obj/effect/turf_decal/tile/purple{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"eP" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"eQ" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
-/obj/machinery/door/airlock/glass,
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"eR" = (
-/obj/machinery/door/airlock/glass{
- name = "Break Room"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"eS" = (
-/obj/machinery/airalarm{
- dir = 1;
- pixel_y = -22
- },
-/obj/machinery/mineral/equipment_vendor,
-/turf/open/floor/plasteel,
-/area/mine/production)
-"eT" = (
-/obj/structure/closet/crate{
- icon_state = "crateopen"
- },
-/obj/machinery/light,
-/obj/effect/turf_decal/tile/brown,
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"eU" = (
-/obj/structure/closet/crate,
-/obj/effect/turf_decal/tile/purple,
-/obj/effect/turf_decal/tile/purple{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"eW" = (
-/obj/effect/turf_decal/loading_area{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"eX" = (
-/obj/machinery/conveyor{
- dir = 8;
- id = "mining_internal"
- },
-/obj/structure/plasticflaps,
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/turf/open/floor/plating,
-/area/mine/production)
-"eY" = (
-/obj/machinery/conveyor{
- dir = 8;
- id = "mining_internal"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/mine/production)
-"eZ" = (
-/obj/machinery/conveyor{
- dir = 10;
- id = "mining_internal"
- },
-/obj/machinery/light/small{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/corner{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/mine/production)
-"fa" = (
-/obj/machinery/newscaster{
- pixel_y = 32
- },
-/obj/structure/chair,
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"fb" = (
-/obj/structure/extinguisher_cabinet{
- pixel_x = -5;
- pixel_y = 30
- },
-/obj/effect/turf_decal/tile/purple{
- dir = 4
- },
-/obj/machinery/light{
- dir = 1
- },
-/obj/structure/chair,
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"fc" = (
-/obj/machinery/airalarm{
- pixel_y = 23
- },
-/obj/effect/turf_decal/tile/purple{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"fd" = (
-/obj/machinery/camera{
- c_tag = "Public Shuttle Lobby";
- network = list("mine")
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/obj/effect/turf_decal/tile/brown,
-/obj/effect/turf_decal/tile/brown{
- dir = 4
- },
-/obj/structure/table,
-/obj/item/gps/mining,
-/obj/item/gps/mining,
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"fe" = (
-/obj/structure/bed,
-/obj/item/bedsheet/brown,
-/obj/machinery/airalarm{
- pixel_y = 23
- },
-/turf/open/floor/carpet,
-/area/mine/living_quarters)
-"ff" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 6
- },
-/turf/open/floor/carpet,
-/area/mine/living_quarters)
-"fg" = (
-/obj/machinery/door/airlock{
- id_tag = "miningdorm1";
- name = "Room 1"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"fh" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"fi" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"fj" = (
-/obj/machinery/vending/snack,
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"fk" = (
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"fm" = (
-/obj/machinery/vending/cigarette,
-/obj/machinery/newscaster{
- pixel_y = 32
- },
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"fn" = (
-/obj/structure/table,
-/obj/machinery/microwave{
- pixel_y = 6
- },
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"fp" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"fq" = (
-/obj/item/radio/intercom{
- dir = 8;
- name = "Station Intercom (General)";
- pixel_x = 28
- },
-/obj/effect/turf_decal/tile/purple{
- dir = 4
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"fr" = (
-/obj/structure/table,
-/turf/open/floor/carpet,
-/area/mine/living_quarters)
-"fs" = (
-/obj/machinery/light/small{
- dir = 4
- },
-/obj/machinery/button/door{
- id = "miningdorm1";
- name = "Door Bolt Control";
- normaldoorcontrol = 1;
- pixel_x = 25;
- specialfunctions = 4
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{
- dir = 1
- },
-/turf/open/floor/carpet,
-/area/mine/living_quarters)
-"ft" = (
-/obj/machinery/camera{
- c_tag = "Dormitories";
- dir = 4;
- network = list("mine")
- },
-/obj/effect/turf_decal/tile/purple{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"fu" = (
-/obj/structure/chair,
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"fv" = (
-/obj/structure/table,
-/obj/machinery/reagentgrinder,
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"fy" = (
-/obj/structure/table,
-/obj/item/clothing/glasses/meson,
-/obj/item/storage/bag/ore,
-/obj/item/pickaxe,
-/obj/item/mining_scanner,
-/obj/item/flashlight,
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"fB" = (
-/obj/structure/displaycase,
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"fC" = (
-/obj/structure/chair{
- dir = 4
- },
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"fD" = (
-/obj/structure/table,
-/obj/item/reagent_containers/food/drinks/beer{
- pixel_x = 7;
- pixel_y = 5
- },
-/obj/item/reagent_containers/food/drinks/beer{
- pixel_x = -1;
- pixel_y = 9
- },
-/obj/item/reagent_containers/food/drinks/beer{
- pixel_x = -8
- },
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 5
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"fE" = (
-/obj/structure/chair{
- dir = 8
- },
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"fF" = (
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"fG" = (
-/obj/structure/table,
-/obj/item/storage/box/donkpockets,
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"fH" = (
-/obj/machinery/door/airlock{
- id_tag = "miningdorm2";
- name = "Room 2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"fI" = (
-/obj/item/radio/intercom{
- dir = 8;
- name = "Station Intercom (General)";
- pixel_x = -28
- },
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"fJ" = (
-/obj/machinery/camera{
- c_tag = "Crew Area";
- dir = 1;
- network = list("mine")
- },
-/obj/machinery/computer/security/telescreen/entertainment{
- pixel_y = -32
- },
-/obj/machinery/light,
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"fK" = (
-/obj/machinery/airalarm{
- dir = 1;
- pixel_y = -22
- },
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"fM" = (
-/obj/machinery/light/small{
- dir = 4
- },
-/obj/machinery/button/door{
- id = "miningdorm2";
- name = "Door Bolt Control";
- normaldoorcontrol = 1;
- pixel_x = 25;
- specialfunctions = 4
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{
- dir = 1
- },
-/turf/open/floor/carpet,
-/area/mine/living_quarters)
-"fN" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/light{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"fO" = (
-/obj/machinery/door/airlock{
- id_tag = "miningdorm3";
- name = "Room 3"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"fP" = (
-/obj/machinery/light/small{
- dir = 4
- },
-/obj/machinery/button/door{
- id = "miningdorm3";
- name = "Door Bolt Control";
- normaldoorcontrol = 1;
- pixel_x = 25;
- specialfunctions = 4
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{
- dir = 1
- },
-/turf/open/floor/carpet,
-/area/mine/living_quarters)
-"ga" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
-/obj/machinery/light{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"gd" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3,
-/obj/effect/turf_decal/tile/purple{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"gn" = (
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"gp" = (
-/obj/structure/table,
-/obj/item/storage/firstaid/regular,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/mine/laborcamp)
-"gS" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/obj/machinery/door/airlock/security/glass{
- name = "Labor Camp Shuttle Security Airlock";
- req_access_txt = "2"
- },
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"gW" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"hv" = (
-/obj/machinery/conveyor_switch/oneway{
- id = "gulag";
- name = "labor camp conveyor"
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"hz" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 4
- },
-/turf/open/floor/plasteel/freezer,
-/area/mine/living_quarters)
-"hY" = (
-/obj/machinery/door/airlock/public/glass{
- id_tag = "gulag3";
- name = "Cell 3"
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"ia" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/turf/open/floor/plating,
-/area/mine/production)
-"ie" = (
-/obj/machinery/vending/sustenance,
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/light{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"ip" = (
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"ix" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/camera{
- c_tag = "Labor Camp Operations";
- dir = 8;
- network = list("labor")
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"iG" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 9
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"iM" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 10
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp/security)
-"iZ" = (
-/obj/machinery/camera{
- c_tag = "Labor Camp External South";
- dir = 4;
- network = list("labor")
- },
-/turf/closed/mineral/random/snow,
-/area/mine/laborcamp)
-"je" = (
-/obj/structure/bed,
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"jk" = (
-/obj/machinery/computer/prisoner,
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red,
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp/security)
-"jo" = (
-/obj/effect/turf_decal/delivery,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"jr" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"ju" = (
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/obj/effect/turf_decal/tile/brown,
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"jy" = (
-/obj/structure/table,
-/obj/item/toy/cards/deck,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"jL" = (
-/turf/closed/wall/r_wall,
-/area/icemoon/underground/unexplored/rivers)
-"jU" = (
-/obj/structure/ore_box,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"jV" = (
-/obj/machinery/light/small{
- dir = 4
- },
-/obj/effect/turf_decal/tile/purple{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"kb" = (
-/obj/machinery/conveyor{
- dir = 10;
- id = "gulag"
- },
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plating,
-/area/mine/laborcamp)
-"ks" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"ku" = (
-/obj/effect/turf_decal/tile/brown,
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 4
- },
-/obj/structure/displaycase,
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"kv" = (
-/obj/effect/turf_decal/tile/brown,
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"kI" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
-/obj/structure/cable,
-/obj/machinery/door/airlock/mining/glass{
- name = "Processing Area";
- req_access_txt = "48"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"kL" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"kO" = (
-/obj/structure/chair{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"lO" = (
-/obj/effect/turf_decal/tile/brown{
- dir = 4
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"mi" = (
-/obj/effect/turf_decal/bot,
-/obj/structure/ore_box,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"mL" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/item/twohanded/required/kirbyplants/random,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"mS" = (
-/obj/structure/sink/kitchen{
- desc = "A sink used for washing one's hands and face. It looks rusty and home-made";
- dir = 8;
- name = "old sink";
- pixel_x = 12
- },
-/turf/open/floor/plasteel/freezer,
-/area/mine/laborcamp)
-"nd" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/obj/machinery/light/small{
- brightness = 3;
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"nm" = (
-/obj/structure/sink{
- dir = 8;
- pixel_x = 11
- },
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"nq" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/loading_area{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"nE" = (
-/obj/structure/sign/poster/official/do_not_question{
- pixel_y = 32
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"nI" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable,
-/turf/open/floor/plating,
-/area/mine/living_quarters)
-"nL" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"nN" = (
-/obj/machinery/light/small{
- dir = 1
- },
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"nV" = (
-/obj/structure/table,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/mine/laborcamp)
-"op" = (
-/obj/machinery/door/airlock/external{
- glass = 1;
- name = "Mining External Airlock";
- opacity = 0;
- req_access_txt = "54"
- },
-/turf/open/floor/plasteel,
-/area/mine/eva)
-"oB" = (
-/obj/structure/table,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/machinery/light/small,
-/turf/open/floor/plasteel/white,
-/area/mine/laborcamp)
-"oL" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/obj/machinery/door/airlock/external{
- name = "Lavaland Shuttle Airlock"
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"oO" = (
-/obj/structure/table,
-/obj/item/gps/mining,
-/obj/item/gps/mining,
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"oQ" = (
-/obj/structure/toilet{
- dir = 4
- },
-/obj/machinery/light/small{
- dir = 1
- },
-/turf/open/floor/plasteel/freezer,
-/area/mine/laborcamp)
-"oU" = (
-/obj/structure/chair/comfy/brown{
- dir = 8
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp/security)
-"oW" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp/security)
-"pf" = (
-/obj/machinery/hydroponics/constructable,
-/obj/effect/turf_decal/tile/green{
- dir = 1
- },
-/obj/effect/turf_decal/tile/green{
- dir = 8
- },
-/obj/structure/window/reinforced{
- dir = 8
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/item/seeds/carrot,
-/turf/open/floor/plasteel/dark,
-/area/mine/laborcamp)
-"pi" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/camera{
- c_tag = "Labor Camp Cellblock";
- dir = 4;
- network = list("labor")
- },
-/obj/item/twohanded/required/kirbyplants/random,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"pu" = (
-/obj/structure/sign/poster/official/obey{
- pixel_y = 32
- },
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"pJ" = (
-/obj/effect/turf_decal/bot,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"pV" = (
-/obj/machinery/door/airlock{
- name = "Restroom"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp/security)
-"qa" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"qb" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 5
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"qt" = (
-/obj/structure/table,
-/obj/item/cigbutt,
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"qN" = (
-/obj/structure/chair/stool,
-/obj/machinery/flasher{
- id = "GulagCell 3";
- pixel_x = -28
- },
-/obj/structure/sign/poster/official/obey{
- pixel_y = 32
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"rj" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/turf/open/floor/plating,
-/area/mine/eva)
-"rv" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{
- dir = 1
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"ry" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/mine/laborcamp/security)
-"rz" = (
-/obj/structure/chair/stool,
-/obj/machinery/flasher{
- id = "GulagCell 2";
- pixel_x = -28
- },
-/obj/structure/sign/poster/official/work_for_a_future{
- pixel_y = 32
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"sa" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp/security)
-"sj" = (
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/obj/effect/turf_decal/tile/brown,
-/turf/open/floor/plasteel,
-/area/mine/production)
-"so" = (
-/obj/structure/ladder,
-/turf/open/floor/plasteel,
-/area/mine/eva)
-"sp" = (
-/obj/effect/turf_decal/tile/green{
- dir = 8
- },
-/obj/effect/turf_decal/tile/green,
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/sink/kitchen{
- desc = "A sink used for washing one's hands and face. It looks rusty and home-made";
- dir = 1;
- name = "old sink";
- pixel_y = -5
- },
-/turf/open/floor/plasteel/dark,
-/area/mine/laborcamp)
-"ss" = (
-/obj/machinery/button/door{
- id = "miningbathroom";
- name = "Door Bolt Control";
- normaldoorcontrol = 1;
- pixel_y = -25;
- specialfunctions = 4
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 4
- },
-/turf/open/floor/plasteel/freezer,
-/area/mine/living_quarters)
-"st" = (
-/obj/machinery/biogenerator,
-/obj/effect/turf_decal/tile/green{
- dir = 1
- },
-/obj/effect/turf_decal/tile/green{
- dir = 4
- },
-/obj/effect/turf_decal/tile/green,
-/obj/structure/window/reinforced{
- dir = 1
- },
-/turf/open/floor/plasteel/dark,
-/area/mine/laborcamp)
-"su" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"sA" = (
-/obj/structure/table,
-/obj/item/paper,
-/obj/item/pen,
-/obj/machinery/light/small{
- dir = 8
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/camera{
- c_tag = "Labor Camp Cell 1";
- dir = 4;
- network = list("labor")
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"sH" = (
-/obj/machinery/door/airlock/external{
- glass = 1;
- name = "Mining External Airlock";
- opacity = 0
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/turf/open/floor/plasteel,
-/area/mine/production)
-"sM" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/turf/open/floor/plating,
-/area/mine/laborcamp/security)
-"sY" = (
-/obj/structure/fence{
- dir = 4
- },
-/obj/structure/sign/mining,
-/turf/closed/mineral/random/snow,
-/area/icemoon/underground/unexplored/rivers)
-"tn" = (
-/obj/effect/turf_decal/bot,
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"tI" = (
-/obj/machinery/light/small{
- dir = 4
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{
- dir = 8
- },
-/turf/open/floor/plasteel/freezer,
-/area/mine/living_quarters)
-"tL" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/mine/laborcamp)
-"uG" = (
-/obj/machinery/light,
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/effect/turf_decal/tile/red,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp/security)
-"uJ" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 4
- },
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable,
-/turf/open/floor/plating,
-/area/mine/living_quarters)
-"vb" = (
-/obj/machinery/door/window/southleft,
-/obj/machinery/shower{
- pixel_y = 22
- },
-/turf/open/floor/plasteel/freezer,
-/area/mine/living_quarters)
-"vq" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3,
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"vw" = (
-/obj/machinery/door/airlock/external{
- glass = 1;
- name = "Labor Camp External Airlock";
- opacity = 0
- },
-/turf/open/floor/plating,
-/area/mine/laborcamp)
-"vG" = (
-/obj/structure/sign/poster/official/work_for_a_future{
- pixel_y = 32
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"vH" = (
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/machinery/light{
- dir = 1
- },
-/obj/machinery/power/apc{
- dir = 1;
- name = "Labor Camp Security APC";
- pixel_y = 23
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp/security)
-"vW" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"we" = (
-/obj/structure/table,
-/obj/effect/decal/cleanable/dirt,
-/obj/item/storage/box/donkpockets,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"wj" = (
-/obj/structure/closet/emcloset,
-/obj/effect/turf_decal/tile/purple{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"wq" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"wN" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 4
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"wX" = (
-/obj/machinery/door/airlock{
- name = "Labor Camp Library"
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"wZ" = (
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plasteel/dark,
-/area/mine/laborcamp)
-"xi" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/closed/wall,
-/area/mine/living_quarters)
-"xU" = (
-/obj/machinery/hydroponics/constructable,
-/obj/effect/turf_decal/tile/green{
- dir = 8
- },
-/obj/effect/turf_decal/tile/green,
-/obj/effect/turf_decal/tile/green{
- dir = 4
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/item/seeds/onion,
-/turf/open/floor/plasteel/dark,
-/area/mine/laborcamp)
-"yf" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/turf/open/floor/plating,
-/area/mine/laborcamp/security)
-"yk" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/turf/open/floor/plating,
-/area/mine/laborcamp/security)
-"yq" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"yr" = (
-/turf/closed/wall/r_wall,
-/area/mine/laborcamp)
-"yy" = (
-/obj/structure/rack,
-/obj/item/storage/bag/ore,
-/obj/item/pickaxe,
-/obj/item/flashlight,
-/obj/item/clothing/glasses/meson,
-/obj/item/mining_scanner,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"yD" = (
-/obj/machinery/mineral/unloading_machine{
- dir = 1;
- icon_state = "unloader-corner";
- input_dir = 1;
- output_dir = 2
- },
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plating,
-/area/mine/laborcamp)
-"yX" = (
-/obj/machinery/light/small{
- dir = 1
- },
-/turf/closed/mineral/random/snow,
-/area/icemoon/underground/unexplored/rivers)
-"zk" = (
-/obj/effect/turf_decal/bot,
-/obj/structure/ore_box,
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"zn" = (
-/obj/machinery/door/airlock/external{
- glass = 1;
- name = "Mining External Airlock";
- opacity = 0
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"zQ" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"zU" = (
-/obj/structure/table,
-/obj/structure/bedsheetbin,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/mine/laborcamp)
-"zX" = (
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/effect/turf_decal/tile/red,
-/obj/structure/closet/secure_closet/labor_camp_security,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp/security)
-"Ac" = (
-/obj/structure/chair/stool,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"Al" = (
-/obj/structure/ore_box,
-/turf/open/floor/plasteel,
-/area/mine/eva)
-"Aw" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 5
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"AB" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 6
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"AW" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp/security)
-"Bd" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 6
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/mine/laborcamp)
-"Be" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
-/obj/effect/turf_decal/tile/brown{
- dir = 4
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"Bl" = (
-/obj/structure/table,
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/microwave{
- pixel_y = 6
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"Bz" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 6
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"BL" = (
-/obj/machinery/light/small,
-/obj/machinery/camera{
- c_tag = "Labor Camp Showers";
- dir = 1;
- network = list("labor")
- },
-/turf/open/floor/plasteel/freezer,
-/area/mine/laborcamp)
-"Cd" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 9
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"Cf" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/door/airlock/public/glass{
- id_tag = "cellblock1";
- name = "Labor Camp Cellblock"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"Cr" = (
-/obj/machinery/door/airlock/public/glass{
- id_tag = "gulag1";
- name = "Cell 1"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"CK" = (
-/obj/structure/closet/secure_closet/brig,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"Dh" = (
-/obj/machinery/light{
- dir = 4
- },
-/obj/effect/turf_decal/tile/brown,
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"Dn" = (
-/obj/structure/rack,
-/obj/item/storage/bag/ore,
-/obj/item/flashlight,
-/obj/item/pickaxe,
-/obj/item/clothing/glasses/meson,
-/obj/item/mining_scanner,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"Du" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/mine/laborcamp)
-"DB" = (
-/obj/machinery/airalarm{
- pixel_y = 23
- },
-/obj/effect/turf_decal/tile/purple{
- dir = 1
- },
-/obj/effect/turf_decal/tile/purple{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"DR" = (
-/obj/structure/chair/stool,
-/obj/structure/sign/poster/official/report_crimes{
- pixel_x = -32
- },
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"Ee" = (
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"El" = (
-/turf/open/floor/plasteel/freezer,
-/area/mine/laborcamp)
-"Es" = (
-/obj/machinery/door/window/southright,
-/obj/machinery/shower{
- pixel_y = 22
- },
-/turf/open/floor/plasteel/freezer,
-/area/mine/living_quarters)
-"Ez" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"EB" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/closet/crate,
-/obj/item/seeds/wheat,
-/obj/item/seeds/wheat,
-/obj/item/seeds/tomato,
-/obj/item/seeds/onion,
-/obj/item/seeds/garlic,
-/obj/item/seeds/carrot,
-/obj/item/seeds/ambrosia,
-/obj/item/seeds/apple,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"EG" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"EL" = (
-/obj/machinery/shower{
- pixel_y = 22
- },
-/turf/open/floor/plasteel/freezer,
-/area/mine/laborcamp)
-"ET" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/newscaster{
- pixel_y = 32
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"Fd" = (
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/machinery/camera{
- c_tag = "Labor Camp Security Office";
- dir = 1;
- network = list("labor")
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp/security)
-"Fy" = (
-/obj/structure/chair/stool,
-/obj/machinery/flasher{
- id = "GulagCell 1";
- pixel_x = -28
- },
-/obj/structure/sign/poster/official/obey{
- pixel_y = 32
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"FB" = (
-/obj/effect/turf_decal/bot,
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"FF" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable,
-/turf/open/floor/plating,
-/area/mine/laborcamp/security)
-"FQ" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 6
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"FU" = (
-/obj/machinery/seed_extractor,
-/obj/effect/turf_decal/tile/green{
- dir = 1
- },
-/obj/effect/turf_decal/tile/green{
- dir = 8
- },
-/obj/effect/turf_decal/tile/green{
- dir = 4
- },
-/obj/structure/window/reinforced{
- dir = 8
- },
-/obj/structure/window/reinforced{
- dir = 1
- },
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plasteel/dark,
-/area/mine/laborcamp)
-"Gn" = (
-/obj/item/clothing/under/color/jumpskirt/random,
-/obj/structure/table,
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"Gp" = (
-/obj/effect/turf_decal/bot,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"Gv" = (
-/obj/structure/table,
-/obj/item/paper_bin{
- pixel_x = -3;
- pixel_y = 7
- },
-/obj/item/pen,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"Gw" = (
-/obj/machinery/camera{
- c_tag = "Labor Camp External West";
- dir = 4;
- network = list("labor")
- },
-/turf/closed/mineral/random/snow,
-/area/mine/laborcamp)
-"GI" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp/security)
-"GN" = (
-/obj/structure/table,
-/obj/item/tank/internals/emergency_oxygen{
- pixel_x = 5;
- pixel_y = 3
- },
-/obj/item/tank/internals/emergency_oxygen,
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"GY" = (
-/obj/machinery/portable_atmospherics/canister/oxygen,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"Hd" = (
-/turf/closed/wall/r_wall,
-/area/mine/laborcamp/security)
-"Ho" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/mine/living_quarters)
-"Hx" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 5
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 5
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp/security)
-"HF" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3,
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"HM" = (
-/obj/machinery/camera{
- c_tag = "Labor Camp External North";
- dir = 1;
- network = list("labor")
- },
-/turf/closed/mineral/random/snow,
-/area/mine/laborcamp)
-"HO" = (
-/obj/machinery/atmospherics/pipe/manifold4w/supply,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3,
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"HW" = (
-/obj/structure/table,
-/obj/item/paper,
-/obj/item/pen,
-/obj/machinery/light/small{
- dir = 8
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/camera{
- c_tag = "Labor Camp Cell 3";
- dir = 4;
- network = list("labor")
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"HX" = (
-/obj/machinery/door/airlock{
- name = "Unisex Restroom"
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"HY" = (
-/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/atmos_waste{
- dir = 4;
- piping_layer = 3
- },
-/obj/structure/lattice/catwalk,
-/turf/closed/mineral/random/snow,
-/area/mine/living_quarters)
-"Iq" = (
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
-/obj/machinery/door/airlock/security/glass{
- name = "Labor Camp Monitoring";
- req_access_txt = "2"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp/security)
-"Iv" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"IB" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"IF" = (
-/obj/machinery/mineral/mint,
-/turf/open/floor/plasteel,
-/area/mine/production)
-"IK" = (
-/obj/structure/toilet{
- dir = 8
- },
-/turf/open/floor/plasteel/freezer,
-/area/mine/living_quarters)
-"IM" = (
-/obj/item/radio/intercom{
- desc = "Talk through this. It looks like it has been modified to not broadcast.";
- name = "Prison Intercom (General)";
- pixel_y = 24;
- prison_radio = 1
- },
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"Jo" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"JM" = (
-/obj/structure/closet/crate/internals,
-/obj/item/tank/internals/emergency_oxygen,
-/obj/item/tank/internals/emergency_oxygen,
-/obj/item/tank/internals/emergency_oxygen,
-/obj/item/tank/internals/emergency_oxygen,
-/obj/item/clothing/mask/breath,
-/obj/item/clothing/mask/breath,
-/obj/item/clothing/mask/breath,
-/obj/item/clothing/mask/breath,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"JU" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"Kb" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"Kk" = (
-/obj/machinery/light/small{
- dir = 8
- },
-/turf/closed/mineral/random/snow,
-/area/icemoon/underground/unexplored/rivers)
-"KE" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"KJ" = (
-/obj/structure/closet/crate,
-/turf/closed/mineral/random/snow,
-/area/icemoon/underground/unexplored/rivers)
-"Lg" = (
-/obj/item/clothing/under/color/jumpskirt/random,
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 4
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/obj/structure/table,
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"Lu" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"LE" = (
-/obj/machinery/camera{
- c_tag = "Crew Area Hallway";
- network = list("mine")
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3,
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"LI" = (
-/obj/structure/sink/kitchen{
- desc = "A sink used for washing one's hands and face. It looks rusty and home-made";
- name = "old sink";
- pixel_y = 28
- },
-/turf/open/floor/plasteel/freezer,
-/area/mine/laborcamp)
-"LL" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
-/turf/open/floor/plasteel,
-/area/mine/eva)
-"LU" = (
-/obj/structure/table,
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/computer/libraryconsole/bookmanagement,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"Mt" = (
-/obj/machinery/hydroponics/constructable,
-/obj/effect/turf_decal/tile/green{
- dir = 4
- },
-/obj/effect/turf_decal/tile/green,
-/obj/effect/decal/cleanable/dirt,
-/obj/item/seeds/redbeet,
-/obj/machinery/light{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/mine/laborcamp)
-"MG" = (
-/obj/machinery/computer/secure_data,
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp/security)
-"MH" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/turf/open/floor/plating,
-/area/mine/production)
-"Nj" = (
-/obj/machinery/door/airlock{
- name = "Restroom"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 4
- },
-/turf/open/floor/plasteel/freezer,
-/area/mine/living_quarters)
-"Nt" = (
-/obj/effect/turf_decal/tile/brown{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"Ny" = (
-/obj/structure/bed,
-/obj/item/bedsheet/medical,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/machinery/camera{
- c_tag = "Labor Camp Infirmary";
- dir = 8;
- network = list("labor")
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{
- dir = 1
- },
-/turf/open/floor/plasteel/white,
-/area/mine/laborcamp)
-"NI" = (
-/obj/structure/table,
-/obj/item/reagent_containers/food/condiment/saltshaker{
- pixel_x = -3;
- pixel_y = 5
- },
-/obj/item/reagent_containers/food/condiment/peppermill{
- pixel_x = 3
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"NK" = (
-/obj/machinery/light/small{
- dir = 1
- },
-/obj/machinery/button/door{
- id = "labor";
- name = "Labor Camp Lockdown";
- pixel_y = 28;
- req_access_txt = "2"
- },
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"NP" = (
-/obj/structure/chair/stool,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"NY" = (
-/obj/machinery/conveyor{
- dir = 8;
- id = "gulag"
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/plasticflaps,
-/turf/open/floor/plating,
-/area/mine/laborcamp)
-"Of" = (
-/obj/machinery/light/small,
-/turf/closed/mineral/random/snow,
-/area/mine/laborcamp)
-"Ol" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/door/airlock/public/glass{
- id_tag = "cellblock1";
- name = "Labor Camp Operations"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"Ou" = (
-/obj/machinery/light/small{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/mine/laborcamp)
-"Ow" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/item/reagent_containers/glass/bucket,
-/turf/open/floor/plasteel/dark,
-/area/mine/laborcamp)
-"Pa" = (
-/obj/structure/table,
-/obj/effect/turf_decal/tile/red,
-/obj/machinery/recharger,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp/security)
-"Pl" = (
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"Pp" = (
-/obj/machinery/mineral/processing_unit{
- dir = 1
- },
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plating,
-/area/mine/laborcamp)
-"Ps" = (
-/obj/effect/turf_decal/loading_area{
- dir = 4
- },
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"Pt" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"PE" = (
-/obj/effect/turf_decal/tile/green{
- dir = 1
- },
-/obj/effect/turf_decal/tile/green{
- dir = 4
- },
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plasteel/dark,
-/area/mine/laborcamp)
-"PL" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3,
-/turf/open/floor/plasteel,
-/area/mine/eva)
-"PY" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/light/small{
- dir = 1
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/mine/laborcamp)
-"Qx" = (
-/obj/machinery/hydroponics/constructable,
-/obj/effect/turf_decal/tile/green{
- dir = 1
- },
-/obj/effect/turf_decal/tile/green{
- dir = 8
- },
-/obj/effect/turf_decal/tile/green,
-/obj/structure/window/reinforced{
- dir = 8
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/item/plant_analyzer,
-/turf/open/floor/plasteel/dark,
-/area/mine/laborcamp)
-"QN" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp/security)
-"QQ" = (
-/obj/structure/table,
-/obj/item/storage/fancy/donut_box,
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp/security)
-"QW" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"QX" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/camera{
- c_tag = "Labor Camp Library";
- dir = 8;
- network = list("labor")
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"Rb" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"Rf" = (
-/obj/effect/turf_decal/tile/brown{
- dir = 8
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/obj/machinery/light/small,
-/turf/open/floor/plasteel,
-/area/mine/eva)
-"Rx" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"RE" = (
-/obj/machinery/shower{
- dir = 8
- },
-/obj/structure/extinguisher_cabinet{
- pixel_x = 30
- },
-/obj/effect/turf_decal/tile/purple{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"RO" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 5
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3,
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"SE" = (
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/structure/sign/poster/official/twelve_gauge{
- pixel_y = 32
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp/security)
-"SJ" = (
-/obj/structure/statue{
- desc = "A lifelike statue of a horrifying monster.";
- dir = 8;
- icon = 'icons/mob/lavaland/lavaland_monsters.dmi';
- icon_state = "goliath";
- name = "goliath"
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"SV" = (
-/obj/machinery/computer/security/labor,
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp/security)
-"SX" = (
-/obj/machinery/conveyor{
- id = "gulag"
- },
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plating,
-/area/mine/laborcamp)
-"Ti" = (
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"Tk" = (
-/obj/machinery/hydroponics/constructable,
-/obj/effect/turf_decal/tile/green{
- dir = 4
- },
-/obj/effect/turf_decal/tile/green,
-/obj/item/seeds/soya,
-/turf/open/floor/plasteel/dark,
-/area/mine/laborcamp)
-"Tn" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/light/small,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 4
- },
-/turf/open/floor/plasteel/freezer,
-/area/mine/living_quarters)
-"To" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plating,
-/area/mine/production)
-"Tv" = (
-/obj/machinery/camera{
- c_tag = "Crew Area Hallway West";
- dir = 1;
- network = list("mine")
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"TA" = (
-/obj/structure/sign/departments/medbay/alt{
- pixel_x = -32
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3,
-/obj/machinery/light{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"TC" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/turf/open/floor/plating,
-/area/mine/laborcamp/security)
-"TP" = (
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"TT" = (
-/obj/machinery/washing_machine,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plasteel/cafeteria,
-/area/mine/laborcamp)
-"Uh" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"Ur" = (
-/obj/structure/closet/emcloset,
-/turf/open/floor/plasteel,
-/area/mine/eva)
-"UE" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"UH" = (
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp/security)
-"UJ" = (
-/obj/machinery/vending/security{
- onstation_override = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp/security)
-"UM" = (
-/obj/structure/table,
-/obj/item/paper,
-/obj/item/pen,
-/obj/machinery/light/small{
- dir = 8
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/camera{
- c_tag = "Labor Camp Cell 2";
- dir = 4;
- network = list("labor")
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"UP" = (
-/obj/structure/sink{
- dir = 4;
- pixel_x = -12
- },
-/obj/structure/mirror{
- pixel_x = -28
- },
-/turf/open/floor/plasteel/freezer,
-/area/mine/living_quarters)
-"UQ" = (
-/obj/effect/turf_decal/tile/brown,
-/obj/effect/turf_decal/tile/brown{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"US" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/obj/machinery/door/airlock/external{
- name = "Lavaland Shuttle Airlock"
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"UW" = (
-/obj/structure/fence{
- dir = 4
- },
-/turf/closed/mineral/random/snow,
-/area/icemoon/underground/unexplored/rivers)
-"Vo" = (
-/obj/item/bikehorn{
- color = "#000";
- desc = "A horn off of a bicycle. This one has been charred to hell and back, yet somehow it still honks.";
- name = "charred bike horn"
- },
-/turf/closed/mineral/random/snow,
-/area/icemoon/underground/unexplored/rivers)
-"VC" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/light{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"VP" = (
-/obj/effect/turf_decal/tile/purple{
- dir = 1
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"VX" = (
-/obj/machinery/door/airlock/medical/glass{
- name = "Infirmary"
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/mine/laborcamp)
-"Wi" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/mine/laborcamp/security)
-"WA" = (
-/obj/machinery/hydroponics/constructable,
-/obj/effect/turf_decal/tile/green{
- dir = 1
- },
-/obj/effect/turf_decal/tile/green{
- dir = 8
- },
-/obj/structure/window/reinforced{
- dir = 8
- },
-/obj/item/cultivator,
-/obj/item/seeds/potato,
-/turf/open/floor/plasteel/dark,
-/area/mine/laborcamp)
-"WD" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/obj/machinery/door/airlock/external{
- glass = 1;
- name = "Mining External Airlock";
- opacity = 0;
- req_access_txt = "54"
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/turf/open/floor/plasteel,
-/area/mine/eva)
-"WE" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/obj/machinery/door/airlock/external{
- glass = 1;
- name = "Mining Shuttle Airlock";
- opacity = 0
- },
-/turf/open/floor/plasteel,
-/area/mine/production)
-"WM" = (
-/obj/machinery/shower{
- pixel_y = 22
- },
-/obj/item/soap/nanotrasen,
-/obj/item/bikehorn/rubberducky,
-/turf/open/floor/plasteel/freezer,
-/area/mine/laborcamp)
-"WO" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 1
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 10
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
- },
-/obj/structure/sign/warning/xeno_mining{
- pixel_y = 32
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"Xf" = (
-/obj/structure/ore_box,
-/turf/closed/mineral/random/snow,
-/area/icemoon/underground/unexplored/rivers)
-"Xl" = (
-/obj/structure/bookcase,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"Xx" = (
-/obj/structure/sign/poster/official/random{
- pixel_y = 32
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"XU" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 10
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"Ym" = (
-/obj/structure/chair{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"Yv" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/light,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"Yy" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
-/obj/machinery/mineral/labor_points_checker{
- pixel_y = 25
- },
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"YA" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/mine/living_quarters)
-"YB" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 4
- },
-/obj/structure/lattice/catwalk,
-/turf/closed/mineral/random/snow,
-/area/mine/living_quarters)
-"YP" = (
-/obj/machinery/door/airlock/public/glass{
- name = "Showers"
- },
-/turf/open/floor/plasteel/freezer,
-/area/mine/laborcamp)
-"YW" = (
-/obj/effect/turf_decal/bot,
-/obj/structure/ore_box,
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"Zd" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/obj/machinery/door/airlock/security/glass{
- name = "Labor Camp Shuttle Prisoner Airlock"
- },
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"Zf" = (
-/obj/machinery/door/airlock{
- id_tag = "miningbathroom";
- name = "Restroom"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 4
- },
-/turf/open/floor/plasteel/freezer,
-/area/mine/living_quarters)
-"Zk" = (
-/obj/machinery/door/airlock/public/glass{
- id_tag = "gulag2";
- name = "Cell 2"
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/mine/laborcamp)
-"Zm" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plasteel/cafeteria,
-/area/mine/laborcamp)
-
-(1,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(2,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(3,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(4,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(5,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(6,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(7,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(8,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(9,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(10,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(11,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(12,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(13,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(14,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ak
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(15,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(16,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(17,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(18,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(19,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(20,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(21,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(22,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(23,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(24,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(25,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(26,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(27,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ak
-ak
-ak
-ak
-ak
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(28,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ak
-ak
-ak
-ak
-ak
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(29,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ak
-ak
-ak
-ak
-ak
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-aa
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(30,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ak
-ak
-ak
-ak
-ak
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-yr
-ap
-ap
-ap
-ap
-yr
-aY
-yr
-yr
-yr
-bx
-yr
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(31,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-yr
-Ee
-Ac
-Ac
-Ee
-aq
-NK
-aq
-ao
-aq
-nN
-yr
-ah
-ah
-ah
-ah
-Vo
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(32,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-yr
-pu
-NI
-au
-Yv
-aq
-gS
-aq
-bi
-aq
-Zd
-yr
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(33,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ap
-ap
-ap
-yr
-Ee
-jy
-aG
-Ee
-aq
-aF
-aq
-aN
-aS
-Ee
-yr
-Hd
-Hd
-Hd
-ry
-Hd
-cR
-cR
-cR
-cM
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(34,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ap
-El
-BL
-aq
-Ee
-Ee
-NP
-Ee
-aC
-az
-Ee
-su
-Ee
-Yv
-yr
-cb
-UJ
-cG
-QQ
-Hd
-qt
-dZ
-Gn
-cM
-HY
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(35,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-HM
-yr
-EL
-El
-YP
-Ee
-Ee
-FQ
-Jo
-Jo
-Jo
-ks
-JU
-Iv
-jr
-bL
-cc
-bw
-Hx
-oU
-Hd
-Ym
-dZ
-eM
-cM
-YB
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(36,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-KJ
-yr
-WM
-mS
-aq
-ie
-Ee
-wq
-Ee
-Bl
-we
-aJ
-mL
-CK
-CK
-yr
-SE
-bh
-GI
-Fd
-Hd
-Xx
-dZ
-dZ
-cM
-uJ
-nI
-cM
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(37,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ap
-ap
-ap
-yr
-aq
-aq
-aq
-aq
-vG
-zQ
-Ee
-FU
-pf
-WA
-Qx
-yr
-yr
-yr
-vH
-bh
-QN
-oW
-sM
-eL
-gn
-ec
-dZ
-gW
-ju
-cM
-ah
-ah
-ah
-ah
-cR
-US
-cR
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(38,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ap
-gp
-nV
-aq
-LU
-DR
-nd
-aq
-IM
-wq
-Ee
-PE
-wZ
-Ow
-sp
-yr
-by
-pV
-UH
-ch
-iM
-sa
-Iq
-QW
-vW
-QW
-QW
-RO
-Tv
-cM
-ah
-ah
-ah
-ah
-cR
-dZ
-cR
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(39,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ap
-tL
-oB
-aq
-Gv
-Bz
-KE
-wX
-Iv
-HF
-EB
-st
-Tk
-Mt
-xU
-yr
-bB
-ca
-MG
-bh
-AW
-bM
-yf
-dZ
-dZ
-Dh
-Nt
-YA
-dZ
-cM
-cM
-cM
-xi
-cM
-cR
-oL
-cR
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(40,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ap
-Bd
-Ny
-aq
-Xl
-QX
-aq
-aq
-aq
-Cf
-aq
-aq
-aq
-aq
-aq
-yr
-yr
-Hd
-SV
-cB
-bh
-uG
-cQ
-cQ
-cQ
-cQ
-ip
-YA
-dZ
-cM
-Lg
-kO
-dZ
-kO
-eL
-Pl
-cR
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(41,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-yr
-Du
-aq
-aq
-aq
-aq
-aq
-oQ
-aq
-ET
-pi
-aq
-Fy
-sA
-ap
-iZ
-ah
-yk
-jk
-cC
-Pa
-zX
-cQ
-dg
-dg
-cQ
-dZ
-YA
-dZ
-cM
-fa
-dZ
-dZ
-dZ
-dZ
-dZ
-cR
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(42,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-Xf
-yr
-Du
-aq
-yy
-yy
-yy
-aq
-LI
-HX
-kL
-Jo
-Cr
-Cd
-je
-ap
-ah
-ah
-TC
-Wi
-Wi
-Wi
-FF
-cQ
-dh
-dx
-cQ
-ea
-YA
-ek
-cM
-fb
-dZ
-fy
-fy
-dZ
-SJ
-cR
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(43,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-Xf
-yr
-VX
-aq
-Dn
-Ee
-Ee
-aq
-aq
-aq
-Rb
-IB
-aq
-aq
-aq
-yr
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-cQ
-di
-dy
-dP
-eb
-eq
-eK
-eQ
-ef
-Aw
-fy
-fy
-dZ
-dZ
-cR
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(44,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-Of
-yr
-yr
-yr
-wN
-TA
-qb
-Ee
-Ee
-Ee
-JM
-aq
-nE
-Ee
-aq
-rz
-UM
-ap
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-cQ
-dj
-dz
-cQ
-ec
-er
-eL
-cM
-fc
-gW
-dZ
-dZ
-dZ
-eM
-cM
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(45,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-vw
-Ou
-vw
-UE
-Ti
-tn
-pJ
-mi
-Ee
-Ee
-aq
-ga
-Jo
-Zk
-iG
-je
-ap
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-cQ
-dk
-dA
-cQ
-LE
-Kb
-eM
-cM
-fd
-fq
-oO
-GN
-fB
-ku
-cM
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(46,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-Of
-yr
-yr
-yr
-WO
-YW
-zk
-FB
-Gp
-Jo
-Jo
-Ol
-HF
-Ee
-aq
-aq
-aq
-yr
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-cQ
-cQ
-cQ
-cQ
-ee
-er
-dZ
-cM
-cM
-cM
-cM
-cM
-cM
-cM
-cM
-cM
-cM
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(47,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-KJ
-ap
-GY
-Ee
-az
-Ee
-qa
-Ee
-Ee
-Ee
-aq
-Yy
-Ez
-aq
-qN
-HW
-ap
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-cM
-dl
-dB
-cM
-dZ
-EG
-fp
-cM
-fe
-fr
-cM
-fe
-fr
-cM
-fe
-fr
-cM
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(48,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ap
-Ee
-Ee
-ix
-Ee
-hv
-VC
-az
-nq
-aq
-XU
-Jo
-hY
-Cd
-je
-ap
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-cR
-dm
-dC
-dQ
-ea
-er
-dZ
-cM
-ff
-fs
-cM
-ff
-fM
-cM
-ff
-fP
-cM
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(49,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ap
-jU
-Ps
-aq
-aq
-bd
-aq
-aq
-NY
-yr
-PY
-Zm
-yr
-yr
-yr
-yr
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-cR
-Ho
-dD
-dR
-ef
-es
-dZ
-cM
-fg
-cM
-cM
-fH
-cM
-cM
-fO
-cM
-cM
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(50,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ap
-jU
-jo
-yD
-SX
-Pp
-SX
-SX
-kb
-yr
-zU
-TT
-ap
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-cM
-dn
-dE
-dQ
-ec
-er
-dZ
-eL
-fh
-ft
-eL
-fh
-VP
-eL
-fh
-ec
-cR
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(51,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ap
-ap
-ap
-yr
-yr
-yr
-yr
-yr
-yr
-yr
-ap
-ap
-ap
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-cM
-cM
-cM
-cM
-cM
-eg
-et
-eN
-eN
-fi
-eN
-eN
-fi
-fN
-eN
-HO
-fp
-cR
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(52,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-Gw
-ah
-ah
-UW
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-cM
-cS
-do
-dF
-cM
-eh
-EG
-fp
-cM
-cM
-dQ
-dQ
-cM
-cM
-cM
-Nj
-cM
-cM
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(53,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-sY
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-cM
-cT
-cV
-cV
-cM
-ea
-er
-eM
-cM
-fj
-fk
-Pt
-fI
-cM
-vb
-hz
-cM
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(54,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-UW
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-cM
-cU
-dp
-dH
-dS
-ei
-eu
-ek
-dQ
-fk
-fk
-fC
-fk
-cM
-Es
-Tn
-cM
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(55,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-UW
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-cM
-cV
-dq
-dI
-cM
-ej
-rv
-kv
-eR
-TP
-fu
-fD
-fJ
-cM
-cM
-Zf
-cM
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(56,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-jL
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-cM
-cW
-dr
-dr
-cM
-vq
-Kb
-eL
-dQ
-fk
-fk
-fE
-fK
-cM
-UP
-ss
-cM
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(57,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-cM
-cM
-cM
-cM
-cM
-dZ
-er
-dZ
-cM
-fm
-fk
-fF
-fk
-cM
-IK
-tI
-cM
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(58,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-cR
-dZ
-er
-dZ
-cM
-fn
-fv
-fG
-nm
-cM
-cM
-cM
-cM
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(59,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-cR
-ek
-ew
-eO
-cM
-cR
-cR
-cR
-cR
-cM
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(60,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-cR
-cR
-ex
-cR
-cR
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(61,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-cR
-ey
-cR
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(62,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-cR
-er
-cR
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(63,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-cR
-er
-cR
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(64,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-cR
-er
-cR
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(65,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-br
-ez
-br
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(66,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-br
-ez
-br
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(67,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-bN
-cj
-br
-ah
-ah
-ah
-ah
-ah
-ah
-br
-ez
-br
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(68,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-br
-bP
-br
-ah
-ah
-ah
-ah
-ah
-ah
-br
-UQ
-br
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(69,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-br
-br
-WE
-br
-br
-ah
-ah
-ah
-ah
-MH
-br
-eA
-br
-br
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(70,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-bq
-br
-bO
-ck
-cD
-br
-bq
-bq
-bq
-bq
-cy
-cH
-eB
-cD
-br
-bq
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ak
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(71,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-bq
-DB
-Lu
-bP
-cl
-cH
-cO
-cX
-ck
-dJ
-cy
-cn
-ez
-bP
-eS
-bq
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(72,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-br
-bD
-bQ
-cm
-cE
-Uh
-Uh
-yq
-nL
-Uh
-kI
-Be
-eC
-eP
-eT
-bq
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(73,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-br
-bE
-bR
-cn
-cF
-cI
-cP
-cn
-Rx
-bP
-To
-gd
-eD
-bP
-eU
-bq
-bq
-bq
-bq
-yX
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(74,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-bf
-bf
-bf
-bF
-bS
-bF
-bf
-cJ
-bq
-cZ
-ds
-dK
-To
-bP
-eE
-bP
-dU
-br
-wj
-dU
-br
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(75,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-bf
-bn
-bs
-bG
-bT
-co
-bf
-cK
-bq
-bq
-ia
-bq
-ia
-bP
-eE
-bP
-sj
-sH
-lO
-sj
-zn
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(76,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-bg
-bo
-PL
-LL
-bU
-cp
-bf
-cL
-bq
-IF
-du
-dL
-cH
-dT
-eE
-bP
-cH
-br
-jV
-RE
-br
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(77,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-bg
-bo
-bt
-bH
-bV
-cq
-bf
-bq
-bq
-db
-bP
-bP
-bP
-bP
-eH
-cF
-eW
-bq
-bq
-bq
-bq
-yX
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(78,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-bf
-bp
-bu
-bI
-bW
-aV
-bf
-so
-bq
-dc
-bP
-dM
-dW
-AB
-eI
-bq
-eX
-bq
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(79,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-bf
-bf
-bf
-rj
-bX
-aM
-bf
-op
-bq
-dd
-bP
-dN
-dX
-em
-eJ
-dV
-eY
-bq
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(80,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-bf
-bJ
-bY
-cs
-bt
-Rf
-bq
-de
-dv
-bq
-dV
-en
-dV
-dV
-eY
-bq
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(81,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-bf
-bK
-bW
-bt
-Ur
-Al
-bq
-df
-dw
-dO
-dY
-eo
-dY
-dY
-eZ
-bq
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(82,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-bf
-rj
-WD
-aM
-bf
-bf
-bq
-bq
-bq
-bq
-bq
-bq
-bq
-bq
-bq
-bq
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(83,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-Kk
-ah
-ah
-ah
-Kk
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(84,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(85,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(86,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(87,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(88,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(89,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(90,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(91,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(92,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(93,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(94,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(95,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(96,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(97,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(98,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(99,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(100,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(101,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(102,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(103,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(104,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(105,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(106,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(107,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(108,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(109,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ak
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(110,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(111,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(112,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(113,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(114,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(115,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(116,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(117,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(118,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(119,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(120,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(121,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(122,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(123,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(124,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(125,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(126,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(127,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(128,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(129,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ak
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ak
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(130,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ak
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(131,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(132,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(133,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(134,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(135,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(136,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(137,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(138,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ak
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(139,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(140,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(141,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(142,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(143,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(144,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(145,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(146,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(147,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(148,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(149,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(150,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ak
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(151,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(152,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(153,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(154,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(155,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(156,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(157,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ak
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(158,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(159,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(160,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(161,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(162,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(163,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(164,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(165,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(166,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(167,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(168,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(169,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(170,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ak
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(171,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(172,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(173,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(174,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(175,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(176,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(177,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(178,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(179,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(180,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(181,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(182,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(183,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(184,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(185,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(186,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(187,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(188,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(189,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(190,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(191,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(192,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(193,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(194,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(195,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ak
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(196,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(197,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(198,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(199,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ak
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(200,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(201,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(202,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(203,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(204,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ak
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(205,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(206,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(207,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(208,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(209,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(210,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(211,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(212,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(213,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(214,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(215,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(216,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(217,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(218,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(219,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(220,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ak
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(221,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ak
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(222,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(223,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(224,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ak
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(225,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(226,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(227,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(228,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(229,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(230,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(231,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(232,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(233,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(234,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(235,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(236,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(237,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(238,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(239,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(240,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(241,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(242,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(243,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(244,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(245,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(246,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(247,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(248,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(249,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(250,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(251,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(252,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(253,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(254,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
-(255,1,1) = {"
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-"}
diff --git a/_maps/map_files/IceBoxStation/IcemoonUnderground_Below.dmm b/_maps/map_files/IceBoxStation/IcemoonUnderground_Below.dmm
deleted file mode 100644
index d4b416cd89..0000000000
--- a/_maps/map_files/IceBoxStation/IcemoonUnderground_Below.dmm
+++ /dev/null
@@ -1,65567 +0,0 @@
-//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
-"a" = (
-/turf/closed/mineral/random/snow/underground,
-/area/icemoon/underground/unexplored/rivers)
-"b" = (
-/turf/closed/mineral/random/high_chance/snow,
-/area/icemoon/underground/unexplored/rivers)
-"d" = (
-/obj/structure/ladder,
-/turf/open/floor/plating/asteroid/snow/icemoon,
-/area/icemoon/underground/explored)
-"e" = (
-/obj/structure/grille,
-/turf/open/floor/plating/asteroid/snow/icemoon,
-/area/icemoon/underground/explored)
-"h" = (
-/turf/closed/wall,
-/area/icemoon/underground/explored)
-"N" = (
-/obj/structure/grille/broken,
-/turf/open/floor/plating/asteroid/snow/icemoon,
-/area/icemoon/underground/explored)
-"O" = (
-/turf/open/floor/plating/asteroid/snow/icemoon,
-/area/icemoon/underground/explored)
-"T" = (
-/obj/item/flashlight/lantern{
- on = 1
- },
-/turf/open/floor/plating/asteroid/snow/icemoon,
-/area/icemoon/underground/explored)
-
-(1,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(2,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(3,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(4,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(5,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(6,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(7,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(8,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(9,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(10,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(11,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(12,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(13,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(14,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(15,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(16,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(17,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(18,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(19,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(20,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(21,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(22,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(23,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(24,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(25,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(26,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(27,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(28,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(29,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(30,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(31,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(32,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(33,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(34,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(35,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(36,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(37,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(38,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(39,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(40,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(41,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(42,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(43,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(44,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(45,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(46,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(47,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(48,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(49,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(50,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(51,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(52,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(53,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(54,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(55,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(56,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(57,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(58,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(59,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(60,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(61,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(62,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(63,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(64,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(65,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-b
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-b
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-b
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-b
-a
-a
-a
-a
-a
-a
-"}
-(66,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(67,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(68,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(69,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(70,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(71,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(72,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(73,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(74,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(75,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(76,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-h
-e
-O
-e
-h
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(77,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-e
-O
-O
-O
-e
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(78,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-O
-O
-d
-O
-O
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(79,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-e
-T
-O
-O
-e
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(80,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-h
-N
-O
-e
-h
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(81,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(82,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(83,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(84,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(85,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(86,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(87,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(88,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(89,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(90,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(91,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(92,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(93,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(94,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(95,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(96,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(97,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-b
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(98,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-b
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(99,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(100,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(101,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(102,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(103,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(104,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(105,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(106,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(107,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(108,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(109,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(110,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(111,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(112,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(113,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(114,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(115,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(116,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(117,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(118,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(119,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(120,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(121,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(122,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(123,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(124,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(125,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-b
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(126,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(127,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(128,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(129,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-b
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(130,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-b
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(131,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(132,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(133,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-b
-a
-a
-a
-a
-a
-a
-"}
-(134,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(135,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(136,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(137,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(138,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-b
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(139,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(140,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(141,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(142,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(143,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(144,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(145,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(146,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(147,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(148,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(149,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(150,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-b
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(151,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(152,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(153,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(154,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(155,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(156,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(157,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-b
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(158,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(159,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(160,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(161,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(162,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(163,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(164,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(165,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(166,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(167,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(168,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(169,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(170,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(171,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(172,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(173,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(174,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(175,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(176,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(177,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(178,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(179,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(180,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-b
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(181,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(182,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(183,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(184,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(185,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(186,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(187,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(188,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(189,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(190,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(191,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(192,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(193,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(194,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(195,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(196,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(197,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(198,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(199,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(200,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(201,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(202,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(203,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(204,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(205,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(206,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(207,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(208,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(209,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(210,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(211,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(212,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(213,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(214,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(215,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(216,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(217,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(218,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(219,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(220,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(221,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(222,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(223,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(224,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(225,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(226,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(227,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(228,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(229,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(230,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-b
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-b
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-b
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-b
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-b
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-b
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-b
-a
-a
-a
-a
-a
-a
-"}
-(231,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(232,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(233,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(234,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(235,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(236,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(237,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(238,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(239,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(240,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(241,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(242,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(243,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(244,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(245,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(246,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(247,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(248,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(249,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(250,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(251,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(252,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(253,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(254,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(255,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm
index b205e7c324..fbe5b954ff 100644
--- a/_maps/map_files/KiloStation/KiloStation.dmm
+++ b/_maps/map_files/KiloStation/KiloStation.dmm
@@ -3429,7 +3429,7 @@
/obj/structure/cable{
icon_state = "0-8"
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-10"
},
/turf/open/floor/plasteel/showroomfloor,
@@ -7205,9 +7205,6 @@
/turf/open/floor/plasteel/dark,
/area/tcommsat/computer)
"amk" = (
-/obj/machinery/gateway{
- dir = 1
- },
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -8802,7 +8799,7 @@
/turf/open/floor/plating,
/area/medical/virology)
"aoR" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-10"
},
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer1{
@@ -8959,7 +8956,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants,
+/obj/item/kirbyplants,
/turf/open/floor/plasteel/dark,
/area/security/courtroom)
"apj" = (
@@ -9122,7 +9119,7 @@
/turf/open/floor/plasteel/dark,
/area/teleporter)
"apw" = (
-/obj/item/twohanded/required/kirbyplants,
+/obj/item/kirbyplants,
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
@@ -10947,7 +10944,7 @@
/turf/open/floor/engine,
/area/space)
"asg" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/turf/open/floor/plasteel/dark,
@@ -11992,7 +11989,7 @@
/turf/open/floor/circuit/green/telecomms/mainframe,
/area/tcommsat/server)
"atV" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-05"
},
/obj/effect/turf_decal/tile/neutral,
@@ -13179,6 +13176,9 @@
dir = 8
},
/obj/effect/decal/cleanable/blood/old,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/turf/open/floor/plasteel,
/area/security/courtroom)
"avX" = (
@@ -13604,9 +13604,6 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/obj/machinery/gateway{
- dir = 10
- },
/obj/effect/decal/cleanable/dirt,
/obj/machinery/airalarm{
dir = 4;
@@ -13851,7 +13848,6 @@
/obj/item/lighter,
/obj/item/clothing/mask/cigarette/cigar/cohiba,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/suit_storage_unit/ce,
/turf/open/floor/plasteel,
/area/crew_quarters/heads/chief)
"axi" = (
@@ -14194,7 +14190,7 @@
/obj/machinery/cell_charger,
/obj/item/stock_parts/cell/hyper,
/obj/item/stack/cable_coil,
-/obj/item/twohanded/rcl/pre_loaded,
+/obj/item/rcl/pre_loaded,
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
@@ -14307,8 +14303,8 @@
/obj/item/stack/cable_coil,
/obj/item/electronics/apc,
/obj/item/electronics/apc,
-/obj/item/twohanded/rcl/pre_loaded,
-/obj/item/twohanded/rcl/pre_loaded,
+/obj/item/rcl/pre_loaded,
+/obj/item/rcl/pre_loaded,
/turf/open/floor/plasteel/dark,
/area/engine/engineering)
"axR" = (
@@ -17393,7 +17389,7 @@
dir = 4
},
/obj/effect/turf_decal/tile/blue,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-10"
},
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer1{
@@ -19751,7 +19747,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-16"
},
/turf/open/floor/plasteel,
@@ -19770,7 +19766,7 @@
dir = 8
},
/obj/effect/turf_decal/tile/neutral,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
desc = "After his promotion, he was transferred to Kilo Station to serve as the gateway's protector.";
icon_state = "plant-21";
name = "rodger"
@@ -20601,7 +20597,7 @@
dir = 8
},
/obj/effect/turf_decal/tile/blue,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-10"
},
/turf/open/floor/plasteel/showroomfloor,
@@ -20638,7 +20634,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/turf/open/floor/plasteel/dark,
@@ -21015,7 +21011,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/machinery/light{
@@ -22183,7 +22179,7 @@
/area/hallway/primary/aft)
"aKO" = (
/obj/effect/decal/cleanable/cobweb,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-03"
},
/obj/effect/decal/cleanable/blood/old,
@@ -22217,7 +22213,7 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"aKR" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-05"
},
/turf/open/floor/wood,
@@ -22678,7 +22674,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/machinery/airalarm{
@@ -24453,7 +24449,7 @@
/obj/effect/turf_decal/tile/blue{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-10"
},
/turf/open/floor/plasteel/showroomfloor,
@@ -24742,7 +24738,7 @@
/obj/effect/turf_decal/tile/red{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/turf/open/floor/plasteel,
@@ -24875,7 +24871,7 @@
dir = 1
},
/obj/effect/turf_decal/tile/purple,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-10"
},
/obj/machinery/button/door{
@@ -28508,7 +28504,7 @@
dir = 1
},
/obj/effect/turf_decal/tile/blue,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-18"
},
/obj/machinery/camera{
@@ -28850,7 +28846,7 @@
/obj/structure/cable{
icon_state = "2-8"
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-10"
},
/obj/structure/disposalpipe/segment{
@@ -28949,7 +28945,7 @@
dir = 1
},
/obj/effect/decal/cleanable/cobweb,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-05"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -30057,7 +30053,7 @@
dir = 1
},
/obj/effect/turf_decal/tile/yellow,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-18"
},
/turf/open/floor/plasteel/showroomfloor,
@@ -30479,6 +30475,7 @@
/obj/machinery/light{
dir = 1
},
+/obj/machinery/airalarm/directional/north,
/turf/open/floor/plasteel/dark,
/area/science/research)
"aXx" = (
@@ -33869,7 +33866,7 @@
},
/obj/effect/turf_decal/tile/yellow,
/obj/effect/turf_decal/tile/neutral,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-10"
},
/turf/open/floor/plasteel,
@@ -38992,7 +38989,7 @@
dir = 4
},
/obj/effect/decal/cleanable/dirt,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-05"
},
/turf/open/floor/plasteel,
@@ -39326,7 +39323,7 @@
/obj/effect/turf_decal/tile/green{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-14"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
@@ -39567,7 +39564,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/obj/item/twohanded/required/kirbyplants,
+/obj/item/kirbyplants,
/obj/structure/cable{
icon_state = "4-8"
},
@@ -39606,7 +39603,7 @@
/area/quartermaster/sorting)
"blR" = (
/obj/effect/turf_decal/tile/neutral,
-/obj/item/twohanded/required/kirbyplants,
+/obj/item/kirbyplants,
/obj/structure/cable{
icon_state = "4-8"
},
@@ -39923,7 +39920,7 @@
/turf/open/floor/plasteel/dark,
/area/quartermaster/storage)
"bmo" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-05"
},
/obj/machinery/firealarm{
@@ -40109,7 +40106,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/turf/open/floor/plasteel/dark,
@@ -40960,7 +40957,7 @@
dir = 4
},
/obj/effect/turf_decal/tile/yellow,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-05"
},
/turf/open/floor/plasteel,
@@ -40992,7 +40989,7 @@
/turf/open/floor/plasteel/dark,
/area/quartermaster/office)
"bnZ" = (
-/obj/item/twohanded/required/kirbyplants,
+/obj/item/kirbyplants,
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
@@ -42301,7 +42298,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/obj/item/twohanded/required/kirbyplants,
+/obj/item/kirbyplants,
/obj/machinery/power/apc/highcap/ten_k{
areastring = "/area/bridge";
dir = 8;
@@ -42952,7 +42949,7 @@
/obj/effect/turf_decal/tile/yellow{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-03"
},
/obj/machinery/light{
@@ -43018,7 +43015,7 @@
dir = 1
},
/obj/effect/turf_decal/tile/neutral,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-16"
},
/turf/open/floor/plasteel/dark,
@@ -43216,7 +43213,7 @@
/obj/machinery/light/small{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/structure/spider/stickyweb,
@@ -43680,10 +43677,6 @@
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/maintenance/central/secondary)
-"bsm" = (
-/obj/machinery/status_display/evac,
-/turf/open/floor/plasteel,
-/area/engine/supermatter)
"bsn" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -43856,7 +43849,7 @@
/turf/open/floor/plasteel/dark,
/area/quartermaster/office)
"bsA" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/neutral{
@@ -44007,7 +44000,7 @@
/turf/open/floor/plasteel,
/area/hydroponics)
"bsM" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/machinery/light_switch{
@@ -44136,7 +44129,7 @@
dir = 1
},
/obj/effect/decal/cleanable/dirt,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-05"
},
/turf/open/floor/plasteel,
@@ -44744,7 +44737,7 @@
/turf/open/floor/plasteel/dark,
/area/crew_quarters/bar)
"btZ" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/effect/turf_decal/tile/neutral{
@@ -45146,7 +45139,7 @@
/obj/effect/turf_decal/tile/blue{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -45872,7 +45865,7 @@
/turf/open/floor/plasteel/showroomfloor,
/area/crew_quarters/toilet/restrooms)
"bvP" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-14"
},
/turf/open/floor/plasteel/showroomfloor,
@@ -45926,7 +45919,7 @@
/turf/open/floor/plasteel/dark,
/area/library)
"bvV" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-16"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
@@ -45969,7 +45962,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "applebush"
},
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
@@ -46000,7 +45993,7 @@
/obj/structure/noticeboard{
pixel_y = 30
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-17";
pixel_x = -8;
pixel_y = 3
@@ -46124,7 +46117,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants,
+/obj/item/kirbyplants,
/obj/structure/extinguisher_cabinet{
pixel_x = 24
},
@@ -46864,7 +46857,7 @@
/turf/open/floor/plasteel/dark,
/area/crew_quarters/fitness/recreation)
"bxF" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/neutral{
@@ -46970,14 +46963,14 @@
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-03"
},
/obj/structure/disposalpipe/segment,
/turf/open/floor/plasteel,
/area/crew_quarters/fitness/recreation)
"bxO" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-16"
},
/turf/open/floor/plasteel/showroomfloor,
@@ -47265,7 +47258,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/turf/open/floor/plasteel,
@@ -48696,7 +48689,7 @@
dir = 4
},
/obj/effect/turf_decal/tile/blue,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/structure/disposalpipe/segment,
@@ -49042,7 +49035,7 @@
/obj/effect/turf_decal/tile/blue{
dir = 8
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-10"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -49723,7 +49716,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{
dir = 6
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/turf/open/floor/plasteel,
@@ -51809,7 +51802,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/turf/open/floor/plasteel/dark,
@@ -51937,7 +51930,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{
dir = 9
},
-/obj/item/twohanded/required/kirbyplants,
+/obj/item/kirbyplants,
/obj/structure/cable{
icon_state = "1-8"
},
@@ -52034,7 +52027,7 @@
/obj/effect/turf_decal/tile/red{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-05"
},
/obj/machinery/airalarm{
@@ -53281,7 +53274,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{
dir = 10
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-16"
},
/turf/open/floor/plasteel,
@@ -53305,7 +53298,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{
dir = 6
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-16"
},
/turf/open/floor/plasteel/dark/corner{
@@ -54405,7 +54398,7 @@
},
/obj/effect/turf_decal/tile/neutral,
/obj/effect/decal/cleanable/cobweb/cobweb2,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/structure/extinguisher_cabinet{
@@ -54428,7 +54421,7 @@
dir = 4
},
/obj/effect/turf_decal/tile/neutral,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-05"
},
/obj/structure/extinguisher_cabinet{
@@ -54780,7 +54773,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/item/radio/intercom{
@@ -55592,7 +55585,7 @@
dir = 8
},
/obj/effect/turf_decal/tile/neutral,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-03"
},
/obj/structure/cable{
@@ -55782,7 +55775,7 @@
/obj/effect/turf_decal/tile/blue{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-05"
},
/obj/machinery/firealarm{
@@ -56179,7 +56172,7 @@
/obj/item/radio/intercom{
pixel_x = -28
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-02";
pixel_y = 3
},
@@ -57353,9 +57346,7 @@
name = "landing marker";
picked_color = "Burgundy"
},
-/turf/open/floor/plating/airless{
- initial_gas_mix = "o2=14;n2=23;TEMP=300"
- },
+/turf/open/floor/plating/airless,
/area/hallway/secondary/entry)
"bOe" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer1{
@@ -57850,7 +57841,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-05"
},
/obj/machinery/power/apc/highcap/five_k{
@@ -58148,7 +58139,7 @@
dir = 1
},
/obj/effect/decal/cleanable/dirt,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-02";
pixel_y = 3
},
@@ -58242,7 +58233,7 @@
},
/obj/effect/turf_decal/tile/neutral,
/obj/effect/decal/cleanable/dirt,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-11"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -58401,7 +58392,7 @@
/obj/machinery/status_display/ai{
pixel_x = 32
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/turf/open/floor/plasteel,
@@ -58484,7 +58475,7 @@
/area/hallway/primary/central)
"bPT" = (
/obj/effect/decal/cleanable/dirt,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-02";
pixel_y = 3
},
@@ -58573,9 +58564,7 @@
dir = 4
},
/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plating/airless{
- initial_gas_mix = "o2=14;n2=23;TEMP=300"
- },
+/turf/open/floor/plating/airless,
/area/hallway/secondary/entry)
"bQb" = (
/obj/structure/flora/rock,
@@ -58625,7 +58614,7 @@
dir = 4
},
/obj/effect/turf_decal/tile/red,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -58938,7 +58927,7 @@
dir = 8
},
/obj/machinery/power/apc{
- areastring = "/area/janitor";
+ areastring = "/area/vacant_room/commissary";
dir = 4;
name = "Vacant Commissary APC";
pixel_x = 27;
@@ -59282,7 +59271,7 @@
/obj/effect/turf_decal/tile/blue{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/effect/decal/cleanable/dirt,
@@ -60372,7 +60361,7 @@
/obj/effect/turf_decal/tile/blue{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-05"
},
/turf/open/floor/plasteel,
@@ -60727,7 +60716,7 @@
/obj/effect/turf_decal/tile/blue{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-16"
},
/turf/open/floor/plasteel,
@@ -60975,7 +60964,7 @@
dir = 1
},
/obj/effect/decal/cleanable/dirt,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-02";
pixel_y = 3
},
@@ -61293,9 +61282,7 @@
name = "landing marker";
picked_color = "Burgundy"
},
-/turf/open/floor/plating/airless{
- initial_gas_mix = "o2=14;n2=23;TEMP=300"
- },
+/turf/open/floor/plating/airless,
/area/hallway/secondary/entry)
"bUk" = (
/obj/effect/turf_decal/tile/red,
@@ -61575,9 +61562,7 @@
/turf/closed/wall,
/area/engine/atmos)
"bUN" = (
-/turf/open/floor/plating/airless{
- initial_gas_mix = "o2=14;n2=23;TEMP=300"
- },
+/turf/open/floor/plating/airless,
/area/hallway/secondary/entry)
"bUP" = (
/obj/machinery/door/airlock/external{
@@ -62452,7 +62437,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/turf/open/floor/plasteel/dark,
@@ -62896,9 +62881,9 @@
pixel_x = 24
},
/obj/machinery/button/electrochromatic{
+ id = "!interrogation_room";
pixel_x = 38;
- pixel_y = -5;
- id = "!interrogation_room"
+ pixel_y = -5
},
/turf/open/floor/plasteel,
/area/security/warden)
@@ -63053,7 +63038,7 @@
dir = 8
},
/obj/effect/turf_decal/tile/neutral,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-03"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -63294,7 +63279,7 @@
dir = 8
},
/obj/effect/turf_decal/tile/yellow,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-05"
},
/obj/machinery/light,
@@ -63575,7 +63560,7 @@
/obj/structure/cable{
icon_state = "1-2"
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-02";
pixel_y = 3
},
@@ -64071,7 +64056,7 @@
dir = 1
},
/obj/effect/turf_decal/tile/red,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-05"
},
/obj/structure/noticeboard{
@@ -64685,7 +64670,7 @@
/turf/open/floor/plasteel,
/area/hallway/secondary/exit/departure_lounge)
"bZx" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/neutral,
@@ -64968,7 +64953,7 @@
/obj/effect/turf_decal/tile/red{
dir = 8
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/machinery/light_switch{
@@ -65990,7 +65975,7 @@
dir = 8
},
/obj/effect/turf_decal/tile/yellow,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/decal/cleanable/dirt,
@@ -66540,7 +66525,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-05"
},
/obj/structure/cable{
@@ -67260,7 +67245,7 @@
dir = 8
},
/obj/effect/turf_decal/tile/neutral,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/turf/open/floor/plasteel/showroomfloor,
@@ -67358,7 +67343,7 @@
dir = 8
},
/obj/effect/turf_decal/tile/neutral,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-02";
pixel_y = 3
},
@@ -67609,7 +67594,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-03"
},
/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer1{
@@ -68002,9 +67987,7 @@
name = "landing marker";
picked_color = "Burgundy"
},
-/turf/open/floor/plating/airless{
- initial_gas_mix = "o2=14;n2=23;TEMP=300"
- },
+/turf/open/floor/plating/airless,
/area/hallway/secondary/entry)
"ceV" = (
/obj/effect/turf_decal/tile/yellow{
@@ -68029,18 +68012,14 @@
dir = 1
},
/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plating/airless{
- initial_gas_mix = "o2=14;n2=23;TEMP=300"
- },
+/turf/open/floor/plating/airless,
/area/hallway/secondary/entry)
"ceX" = (
/obj/machinery/light{
dir = 8
},
/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plating/airless{
- initial_gas_mix = "o2=14;n2=23;TEMP=300"
- },
+/turf/open/floor/plating/airless,
/area/hallway/secondary/entry)
"ceY" = (
/obj/machinery/airalarm{
@@ -68128,7 +68107,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/turf/open/floor/plasteel/showroomfloor,
@@ -68157,7 +68136,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{
dir = 9
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-02";
pixel_y = 3
},
@@ -68226,7 +68205,7 @@
dir = 4
},
/obj/effect/turf_decal/tile/neutral,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/turf/open/floor/plasteel,
@@ -68250,7 +68229,7 @@
/obj/machinery/light{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-05"
},
/obj/effect/turf_decal/tile/neutral{
@@ -68888,9 +68867,7 @@
/area/engine/engineering)
"cgI" = (
/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plating/airless{
- initial_gas_mix = "o2=14;n2=23;TEMP=300"
- },
+/turf/open/floor/plating/airless,
/area/hallway/secondary/entry)
"cgJ" = (
/obj/machinery/door/poddoor/preopen,
@@ -71550,7 +71527,7 @@
/turf/open/floor/plasteel,
/area/security/processing)
"cld" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-02";
pixel_y = 3
},
@@ -72402,7 +72379,7 @@
/obj/structure/noticeboard{
pixel_y = 28
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-05"
},
/turf/open/floor/plasteel,
@@ -72422,7 +72399,7 @@
/obj/machinery/atmospherics/pipe/simple/cyan/visible{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-03"
},
/turf/open/floor/plasteel,
@@ -76334,9 +76311,6 @@
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
-/obj/machinery/gateway{
- dir = 9
- },
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/box/corners{
dir = 4
@@ -76403,9 +76377,6 @@
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
-/obj/machinery/gateway{
- dir = 5
- },
/obj/effect/decal/cleanable/dirt,
/obj/machinery/camera{
c_tag = "Gateway";
@@ -77551,9 +77522,6 @@
dir = 8
},
/obj/effect/decal/cleanable/greenglow,
-/obj/machinery/gateway{
- dir = 8
- },
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel/dark,
/area/gateway)
@@ -77573,9 +77541,6 @@
dir = 4
},
/obj/effect/decal/cleanable/greenglow,
-/obj/machinery/gateway{
- dir = 4
- },
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel/dark,
/area/gateway)
@@ -77588,8 +77553,6 @@
/turf/open/floor/plasteel/dark,
/area/maintenance/disposal)
"cvQ" = (
-/obj/effect/turf_decal/bot,
-/obj/structure/closet/cardboard,
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt,
/obj/machinery/light/small{
@@ -77599,6 +77562,9 @@
dir = 8;
pixel_x = 32
},
+/obj/machinery/computer/gateway_control{
+ dir = 8
+ },
/turf/open/floor/plasteel/dark,
/area/gateway)
"cvR" = (
@@ -77635,7 +77601,6 @@
dir = 8
},
/obj/effect/decal/cleanable/greenglow,
-/obj/machinery/gateway,
/obj/effect/decal/cleanable/dirt,
/obj/structure/cable{
icon_state = "0-2"
@@ -77652,9 +77617,6 @@
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
-/obj/machinery/gateway{
- dir = 6
- },
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel/dark,
/area/gateway)
@@ -80529,9 +80491,7 @@
/area/maintenance/fore)
"cDp" = (
/obj/structure/lattice/catwalk,
-/turf/open/floor/plating/airless{
- initial_gas_mix = "o2=14;n2=23;TEMP=300"
- },
+/turf/open/floor/plating/airless,
/area/hallway/secondary/entry)
"cDq" = (
/obj/machinery/door/airlock/maintenance{
@@ -80543,7 +80503,7 @@
/turf/open/floor/plasteel/dark,
/area/maintenance/fore)
"cDr" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-02";
pixel_y = 3
},
@@ -80825,7 +80785,7 @@
/turf/open/floor/plasteel/dark,
/area/ai_monitored/security/armory)
"cDT" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-05"
},
/obj/effect/turf_decal/tile/neutral,
@@ -80919,9 +80879,6 @@
pixel_x = 4;
pixel_y = 4
},
-/obj/item/storage/pill_bottle/dice{
- pixel_x = -4
- },
/obj/item/pen/red{
pixel_x = 4;
pixel_y = 4
@@ -84616,7 +84573,7 @@
icon_state = "1-4"
},
/obj/machinery/airalarm/directional/west,
-/obj/item/twohanded/required/kirbyplants/dead,
+/obj/item/kirbyplants/dead,
/turf/open/floor/wood,
/area/security/vacantoffice)
"esR" = (
@@ -84701,9 +84658,6 @@
},
/area/security/vacantoffice)
"fyr" = (
-/obj/machinery/light{
- dir = 4
- },
/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/closed/mineral/random/labormineral,
/area/space/nearstation)
@@ -84946,9 +84900,7 @@
"jAT" = (
/obj/structure/lattice/catwalk,
/obj/machinery/light,
-/turf/open/floor/plating/airless{
- initial_gas_mix = "o2=14;n2=23;TEMP=300"
- },
+/turf/open/floor/plating/airless,
/area/hallway/secondary/entry)
"jHJ" = (
/obj/machinery/atmospherics/pipe/simple/general/visible{
@@ -84960,10 +84912,6 @@
/obj/structure/sign/warning/electricshock,
/turf/closed/wall/r_wall/rust,
/area/ai_monitored/turret_protected/ai_upload)
-"jPE" = (
-/obj/structure/cable,
-/turf/closed/mineral/random/labormineral,
-/area/space/nearstation)
"jQY" = (
/obj/structure/table/wood,
/obj/item/paper_bin,
@@ -85287,7 +85235,6 @@
icon_state = "1-2"
},
/obj/structure/table/wood,
-/obj/item/folder/paperwork,
/turf/open/floor/wood,
/area/security/vacantoffice)
"ppP" = (
@@ -85401,9 +85348,7 @@
"rNm" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/lattice/catwalk,
-/turf/open/floor/plating/airless{
- initial_gas_mix = "o2=14;n2=23;TEMP=300"
- },
+/turf/open/floor/plating/airless,
/area/hallway/secondary/entry)
"swG" = (
/obj/item/reagent_containers/food/drinks/drinkingglass{
@@ -85463,7 +85408,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21";
pixel_x = -3;
pixel_y = 3
@@ -119989,7 +119934,7 @@ ckw
cmw
xON
axa
-jPE
+aeu
aeu
aeU
dQe
@@ -121773,7 +121718,7 @@ clM
axW
cnk
coo
-ayn
+axU
aLH
aLx
aLz
@@ -122293,7 +122238,7 @@ aLF
aag
aag
aag
-bsm
+aLF
cuA
cuW
bYI
diff --git a/_maps/map_files/LambdaStation/lambda.dmm b/_maps/map_files/LambdaStation/lambda.dmm
index 825bc3c2aa..4d2d8cb624 100644
--- a/_maps/map_files/LambdaStation/lambda.dmm
+++ b/_maps/map_files/LambdaStation/lambda.dmm
@@ -15609,7 +15609,7 @@
/obj/effect/turf_decal/tile/purple{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/machinery/newscaster{
pixel_x = -30
},
@@ -15985,7 +15985,7 @@
/turf/closed/wall/r_wall,
/area/crew_quarters/heads/hor/private)
"aDh" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/wood,
/area/crew_quarters/heads/hor/private)
"aDi" = (
@@ -16008,7 +16008,7 @@
/obj/effect/turf_decal/tile/purple{
dir = 8
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel/white,
/area/science/explab)
"aDl" = (
@@ -21689,7 +21689,7 @@
/turf/open/floor/plasteel,
/area/security/brig)
"aNv" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/neutral/filled/corner,
/turf/open/floor/plasteel/dark,
/area/security/brig)
@@ -21757,7 +21757,7 @@
/turf/open/floor/plasteel/grimy,
/area/lawoffice)
"aNA" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-08"
},
/obj/structure/disposalpipe/segment{
@@ -23804,7 +23804,7 @@
/turf/open/floor/plasteel,
/area/security/range)
"aRr" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/wood,
/area/crew_quarters/heads/captain/private)
"aRs" = (
@@ -23834,7 +23834,7 @@
dir = 8;
light_color = "#e8eaff"
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/wood,
/area/crew_quarters/heads/hop/private)
"aRw" = (
@@ -25005,7 +25005,7 @@
/turf/open/floor/plasteel,
/area/hallway/secondary/command)
"aTI" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel,
/area/hallway/secondary/command)
"aTJ" = (
@@ -25230,7 +25230,7 @@
/turf/open/floor/plating,
/area/maintenance/fore/secondary)
"aUi" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/machinery/camera/autoname{
dir = 1
},
@@ -27581,7 +27581,7 @@
/turf/open/floor/plating,
/area/crew_quarters/heads/captain)
"aYV" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/wood,
/area/crew_quarters/heads/captain)
"aYX" = (
@@ -33412,6 +33412,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
+/obj/machinery/gateway/centerstation,
/turf/open/floor/plasteel/dark,
/area/gateway)
"bkm" = (
@@ -34830,7 +34831,7 @@
/obj/effect/turf_decal/tile{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel,
/area/hallway/secondary/exit/departure_lounge)
"bmX" = (
@@ -36560,7 +36561,7 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel,
/area/crew_quarters/cafeteria)
"bqv" = (
@@ -38499,7 +38500,7 @@
dir = 8
},
/obj/effect/turf_decal/tile/red,
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel,
/area/hallway/secondary/exit/departure_lounge)
"buh" = (
@@ -42115,7 +42116,7 @@
/turf/open/floor/plasteel/white,
/area/medical/cryo)
"bBv" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/tile/bar,
/obj/effect/turf_decal/tile/bar{
dir = 1
@@ -45627,7 +45628,7 @@
/turf/open/floor/carpet/blue,
/area/crew_quarters/heads/cmo/private)
"bHP" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/wood,
/area/crew_quarters/heads/cmo/private)
"bHQ" = (
@@ -48277,7 +48278,7 @@
/obj/structure/cable{
icon_state = "1-4"
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/blue/filled/line,
/obj/structure/cable{
icon_state = "0-4"
@@ -50299,7 +50300,7 @@
/turf/open/floor/wood,
/area/maintenance/bar)
"bPX" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel,
/area/crew_quarters/cafeteria)
"bPY" = (
@@ -50976,7 +50977,7 @@
/turf/open/floor/plasteel/dark,
/area/bridge/showroom/corporate)
"bRs" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel,
/area/crew_quarters/fitness/recreation)
"bRu" = (
@@ -51416,7 +51417,7 @@
/turf/open/floor/plasteel,
/area/crew_quarters/fitness/recreation)
"bSx" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/neutral/filled/line{
dir = 8
},
@@ -52110,7 +52111,7 @@
/turf/open/floor/plasteel,
/area/hallway/primary/starboard)
"bTR" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/turf/open/floor/plasteel/grimy,
@@ -55491,7 +55492,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/structure/cable{
icon_state = "1-2"
},
@@ -56279,7 +56280,7 @@
/turf/open/floor/plasteel/dark,
/area/crew_quarters/heads/chief)
"cbt" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/machinery/light_switch{
pixel_x = 26;
pixel_y = -26
@@ -60349,8 +60350,8 @@
},
/obj/item/stack/cable_coil,
/obj/item/stack/cable_coil,
-/obj/item/twohanded/rcl/pre_loaded,
-/obj/item/twohanded/rcl/pre_loaded,
+/obj/item/rcl/pre_loaded,
+/obj/item/rcl/pre_loaded,
/turf/open/floor/plasteel,
/area/engine/break_room)
"ckz" = (
@@ -61189,7 +61190,7 @@
/turf/open/floor/plasteel/dark,
/area/storage/tcom)
"cml" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/structure/cable{
icon_state = "1-8"
},
@@ -63310,7 +63311,7 @@
/area/engine/break_room)
"cqz" = (
/obj/machinery/light,
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/structure/cable{
icon_state = "1-4"
},
@@ -64537,7 +64538,7 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"ctc" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/tile{
dir = 1
},
@@ -64547,7 +64548,7 @@
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"ctd" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/tile{
dir = 4
},
@@ -64808,7 +64809,7 @@
/obj/structure/cable{
icon_state = "1-8"
},
-/obj/item/twohanded/required/kirbyplants/photosynthetic,
+/obj/item/kirbyplants/photosynthetic,
/obj/structure/disposalpipe/segment{
dir = 9
},
@@ -66739,7 +66740,7 @@
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"cyc" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/yellow/filled/line{
dir = 6
},
@@ -66842,8 +66843,8 @@
},
/obj/item/electronics/airlock,
/obj/item/electronics/airlock,
-/obj/item/twohanded/rcl/pre_loaded,
-/obj/item/twohanded/rcl/pre_loaded,
+/obj/item/rcl/pre_loaded,
+/obj/item/rcl/pre_loaded,
/turf/open/floor/plasteel,
/area/engine/storage_shared)
"cyq" = (
@@ -67734,7 +67735,7 @@
/turf/open/floor/plasteel/dark,
/area/bridge)
"cAd" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/neutral/filled/corner{
dir = 4
},
@@ -70414,7 +70415,7 @@
/area/crew_quarters/locker)
"cFb" = (
/obj/machinery/light,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-18"
},
/obj/item/radio/intercom{
@@ -75050,7 +75051,7 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"cNx" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/machinery/camera{
c_tag = "Atmospherics - Control Room";
dir = 4
@@ -78128,7 +78129,7 @@
/turf/open/floor/plasteel,
/area/crew_quarters/fitness/recreation)
"cUc" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/neutral/filled/line{
dir = 4
},
@@ -78138,7 +78139,7 @@
/turf/open/floor/plasteel,
/area/crew_quarters/fitness/recreation)
"cUd" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/structure/sign/departments/holy{
pixel_x = -32
},
@@ -78405,7 +78406,7 @@
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
"cUN" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/wood,
/area/crew_quarters/heads/chief/private)
"cUO" = (
@@ -80604,7 +80605,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel/dark,
/area/science/circuit)
"gIA" = (
@@ -80945,7 +80946,7 @@
/obj/effect/turf_decal/tile/red{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel,
/area/hallway/secondary/exit/departure_lounge)
"kNb" = (
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index c08670c2c0..fbd4c1bf39 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -226,7 +226,7 @@
/obj/structure/cable/yellow{
icon_state = "1-2"
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-03"
},
/turf/open/floor/plasteel,
@@ -245,7 +245,7 @@
/obj/structure/cable/yellow{
icon_state = "1-2"
},
-/obj/item/twohanded/required/kirbyplants,
+/obj/item/kirbyplants,
/turf/open/floor/plasteel,
/area/security/prison)
"aaE" = (
@@ -922,7 +922,7 @@
/area/security/prison)
"acb" = (
/obj/structure/table,
-/obj/item/storage/pill_bottle/dice,
+/obj/item/storage/box/dice,
/turf/open/floor/plasteel,
/area/security/prison)
"acc" = (
@@ -1224,7 +1224,7 @@
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-13"
},
/turf/open/floor/plasteel,
@@ -2292,8 +2292,7 @@
/turf/open/floor/plating,
/area/crew_quarters/fitness/recreation)
"aeD" = (
-/obj/machinery/door/airlock/external,
-/turf/open/floor/plating,
+/turf/open/floor/plasteel/grimy,
/area/hallway/primary/port)
"aeE" = (
/obj/effect/spawner/structure/window/reinforced,
@@ -2668,7 +2667,7 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 9
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-16"
},
/obj/structure/sign/warning/securearea{
@@ -2992,7 +2991,7 @@
/turf/open/floor/plating,
/area/maintenance/solars/port/fore)
"afF" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "applebush"
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
@@ -3116,9 +3115,6 @@
},
/turf/open/floor/plasteel,
/area/security/prison)
-"afQ" = (
-/turf/open/floor/plating,
-/area/hallway/primary/port)
"afR" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 1
@@ -3188,8 +3184,14 @@
/turf/open/floor/plasteel/dark,
/area/ai_monitored/security/armory)
"afZ" = (
-/obj/structure/girder,
-/turf/open/floor/plating,
+/obj/machinery/camera{
+ c_tag = "Arrivals - Lounge";
+ dir = 4
+ },
+/obj/structure/chair/comfy{
+ dir = 4
+ },
+/turf/open/floor/plasteel/grimy,
/area/hallway/primary/port)
"aga" = (
/obj/effect/turf_decal/tile/neutral{
@@ -3670,8 +3672,10 @@
/turf/open/floor/plasteel/dark,
/area/security/prison)
"agQ" = (
-/obj/item/electronics/airlock,
-/turf/open/floor/plating,
+/obj/machinery/holopad{
+ pixel_y = -15
+ },
+/turf/open/floor/carpet,
/area/hallway/primary/port)
"agR" = (
/obj/machinery/airalarm{
@@ -4281,9 +4285,7 @@
},
/area/maintenance/fore)
"ahT" = (
-/turf/open/floor/plating{
- icon_state = "panelscorched"
- },
+/turf/open/floor/carpet,
/area/hallway/primary/port)
"ahU" = (
/obj/effect/decal/cleanable/cobweb/cobweb2,
@@ -4802,13 +4804,14 @@
/turf/open/floor/plasteel/dark,
/area/crew_quarters/fitness/recreation)
"aiT" = (
-/obj/effect/decal/cleanable/oil{
- icon_state = "floor5"
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
},
-/turf/open/floor/plating{
- icon_state = "panelscorched"
+/obj/machinery/light{
+ dir = 4
},
-/area/hallway/primary/port)
+/turf/open/floor/plasteel/white/corner,
+/area/hallway/secondary/entry)
"aiU" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on,
/obj/effect/turf_decal/tile/neutral{
@@ -4830,9 +4833,13 @@
/turf/open/floor/plasteel/dark,
/area/crew_quarters/fitness/recreation)
"aiW" = (
-/turf/open/floor/plating{
- icon_state = "platingdmg1"
+/obj/structure/chair/comfy{
+ dir = 8
},
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/open/floor/plasteel/grimy,
/area/hallway/primary/port)
"aiX" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
@@ -4936,12 +4943,11 @@
/turf/open/floor/plating,
/area/maintenance/port/fore)
"ajk" = (
-/obj/structure/shuttle/engine/propulsion/right{
- dir = 4
- },
-/turf/open/floor/plating{
- icon_state = "platingdmg3"
+/obj/structure/table/wood,
+/obj/item/flashlight/lamp/green{
+ pixel_y = 3
},
+/turf/open/floor/plasteel/grimy,
/area/hallway/primary/port)
"ajl" = (
/obj/item/soap/deluxe,
@@ -5035,8 +5041,10 @@
/turf/open/floor/plasteel/dark,
/area/security/warden)
"ajs" = (
-/obj/item/stack/sheet/metal/ten,
-/turf/open/floor/plating,
+/obj/item/kirbyplants{
+ icon_state = "plant-08"
+ },
+/turf/open/floor/plasteel/grimy,
/area/hallway/primary/port)
"ajt" = (
/obj/structure/closet{
@@ -5059,8 +5067,20 @@
/turf/open/floor/plasteel/dark,
/area/security/warden)
"aju" = (
-/obj/item/stack/sheet/mineral/wood/twenty,
-/turf/open/floor/plating,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/structure/cable/yellow{
+ icon_state = "2-8"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "2-4"
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
/area/hallway/primary/port)
"ajv" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
@@ -6921,9 +6941,17 @@
/turf/open/floor/plating,
/area/maintenance/fore)
"amv" = (
-/obj/item/stack/sheet/metal/ten,
-/obj/item/wrench,
-/turf/open/floor/plating,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral,
+/turf/open/floor/plasteel,
/area/hallway/primary/port)
"amw" = (
/obj/structure/window/reinforced,
@@ -6961,10 +6989,6 @@
/obj/structure/window/reinforced,
/turf/open/floor/plasteel/dark,
/area/crew_quarters/fitness/recreation)
-"amB" = (
-/obj/effect/decal/cleanable/blood/old,
-/turf/open/floor/plating,
-/area/hallway/primary/port)
"amC" = (
/obj/structure/chair{
dir = 4
@@ -13096,7 +13120,7 @@
/turf/open/space,
/area/space/nearstation)
"aze" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/effect/decal/cleanable/cobweb/cobweb2,
@@ -14391,7 +14415,7 @@
/area/maintenance/starboard/fore)
"aBD" = (
/obj/effect/decal/cleanable/cobweb,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-20";
pixel_y = 3
},
@@ -15603,7 +15627,7 @@
/area/crew_quarters/dorms)
"aDZ" = (
/obj/structure/table,
-/obj/item/storage/pill_bottle/dice,
+/obj/item/storage/box/dice,
/turf/open/floor/plasteel,
/area/crew_quarters/dorms)
"aEa" = (
@@ -17087,8 +17111,8 @@
/obj/effect/turf_decal/bot{
dir = 1
},
-/obj/item/twohanded/rcl/pre_loaded,
-/obj/item/twohanded/rcl/pre_loaded,
+/obj/item/rcl/pre_loaded,
+/obj/item/rcl/pre_loaded,
/turf/open/floor/plasteel{
dir = 1
},
@@ -18152,7 +18176,7 @@
name = "Law Office APC";
pixel_y = 24
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/turf/open/floor/wood,
@@ -19168,7 +19192,7 @@
c_tag = "AI Upload Chamber - Fore";
network = list("aiupload")
},
-/obj/item/twohanded/required/kirbyplants/photosynthetic{
+/obj/item/kirbyplants/photosynthetic{
pixel_y = 10
},
/turf/open/floor/plasteel/dark,
@@ -21182,7 +21206,7 @@
/area/crew_quarters/locker)
"aPI" = (
/obj/structure/table,
-/obj/item/storage/pill_bottle/dice,
+/obj/item/storage/box/dice,
/turf/open/floor/plasteel,
/area/crew_quarters/locker)
"aPJ" = (
@@ -21677,7 +21701,7 @@
/obj/structure/extinguisher_cabinet{
pixel_x = -27
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-03"
},
/obj/effect/turf_decal/tile/neutral{
@@ -23960,7 +23984,7 @@
/turf/open/floor/plating,
/area/hallway/secondary/entry)
"aVt" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-13"
},
/obj/effect/turf_decal/stripes/line{
@@ -24081,9 +24105,10 @@
icon_state = "map-right-MS";
pixel_y = 32
},
-/turf/open/floor/plasteel/white/corner{
+/obj/effect/turf_decal/tile/blue{
dir = 4
},
+/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"aVE" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
@@ -24308,7 +24333,7 @@
/obj/machinery/airalarm{
pixel_y = 23
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "applebush"
},
/obj/effect/turf_decal/tile/neutral{
@@ -24419,7 +24444,7 @@
/obj/structure/extinguisher_cabinet{
pixel_x = 27
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-16"
},
/obj/item/radio/intercom{
@@ -25668,7 +25693,7 @@
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"aYF" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-05"
},
/obj/effect/turf_decal/stripes/line{
@@ -26198,7 +26223,7 @@
charge = 100;
maxcharge = 15000
},
-/obj/item/twohanded/rcl/pre_loaded,
+/obj/item/rcl/pre_loaded,
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
@@ -31733,28 +31758,22 @@
/obj/structure/cable/yellow{
icon_state = "1-2"
},
-/turf/open/floor/plasteel/white/corner,
+/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"bjX" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
},
-/obj/machinery/door/firedoor,
-/turf/open/floor/plasteel,
-/area/hallway/primary/port)
+/turf/open/floor/plasteel/cafeteria,
+/area/hallway/secondary/entry)
"bjY" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/light{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
+/obj/machinery/door/firedoor,
/turf/open/floor/plasteel,
/area/hallway/primary/port)
"bjZ" = (
@@ -31814,6 +31833,12 @@
dir = 1
},
/obj/structure/cable,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/hallway/primary/port)
"bke" = (
@@ -31826,6 +31851,9 @@
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/hallway/primary/port)
"bkf" = (
@@ -31845,6 +31873,9 @@
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/hallway/primary/port)
"bkg" = (
@@ -32823,39 +32854,23 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 8
},
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/corner,
/obj/structure/cable/yellow{
icon_state = "1-2"
},
/obj/structure/cable/yellow{
icon_state = "2-4"
},
-/turf/open/floor/plasteel/white/corner,
+/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"blU" = (
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/door/firedoor,
/obj/structure/cable/yellow{
icon_state = "4-8"
},
-/turf/open/floor/plasteel,
-/area/hallway/primary/port)
-"blV" = (
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
},
-/obj/effect/turf_decal/stripes/line,
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/port)
+/turf/open/floor/plasteel/white/corner,
+/area/hallway/secondary/entry)
"blW" = (
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -32864,7 +32879,6 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/obj/effect/turf_decal/stripes/line,
/obj/structure/cable/yellow{
icon_state = "4-8"
},
@@ -32875,7 +32889,6 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/obj/effect/turf_decal/stripes/line,
/obj/structure/cable/yellow{
icon_state = "4-8"
},
@@ -32890,7 +32903,6 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/obj/effect/turf_decal/stripes/line,
/obj/structure/cable/yellow{
icon_state = "4-8"
},
@@ -32904,7 +32916,6 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/obj/effect/turf_decal/stripes/line,
/obj/structure/cable/yellow{
icon_state = "4-8"
},
@@ -32918,7 +32929,6 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/obj/effect/turf_decal/stripes/line,
/obj/structure/cable/yellow{
icon_state = "4-8"
},
@@ -32931,10 +32941,13 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/obj/effect/turf_decal/stripes/line,
/obj/structure/cable/yellow{
icon_state = "4-8"
},
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
/turf/open/floor/plasteel,
/area/hallway/primary/port)
"bmc" = (
@@ -32944,8 +32957,8 @@
/obj/structure/cable/yellow{
icon_state = "4-8"
},
-/obj/effect/turf_decal/stripes/corner{
- dir = 1
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
},
/turf/open/floor/plasteel,
/area/hallway/primary/port)
@@ -32956,6 +32969,9 @@
/obj/structure/cable/yellow{
icon_state = "2-8"
},
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/hallway/primary/port)
"bme" = (
@@ -33830,30 +33846,9 @@
},
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
-"bnL" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/newscaster{
- pixel_x = 28;
- pixel_y = 1
- },
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel/white/corner,
-/area/hallway/secondary/entry)
"bnR" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/bot,
-/obj/structure/sign/mining,
-/turf/open/floor/plasteel,
+/obj/structure/chair/comfy,
+/turf/open/floor/plasteel/grimy,
/area/hallway/primary/port)
"bnS" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
@@ -33863,7 +33858,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
-/obj/effect/turf_decal/stripes/line{
+/obj/effect/turf_decal/tile/neutral{
dir = 8
},
/turf/open/floor/plasteel,
@@ -33878,6 +33873,9 @@
/obj/structure/cable/yellow{
icon_state = "1-2"
},
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/hallway/primary/port)
"bnU" = (
@@ -34956,29 +34954,19 @@
"bqc" = (
/obj/machinery/holopad,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/machinery/light{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
/obj/structure/cable/yellow{
icon_state = "1-2"
},
-/turf/open/floor/plasteel/white/corner,
+/obj/structure/cable/yellow{
+ icon_state = "2-4"
+ },
+/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"bqd" = (
-/obj/machinery/door/firedoor,
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line,
/obj/structure/cable/yellow{
icon_state = "4-8"
},
+/obj/machinery/door/firedoor,
/turf/open/floor/plasteel,
/area/hallway/primary/port)
"bqj" = (
@@ -34987,7 +34975,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
-/obj/effect/turf_decal/stripes/line{
+/obj/effect/turf_decal/tile/neutral{
dir = 8
},
/turf/open/floor/plasteel,
@@ -36217,16 +36205,10 @@
/area/hallway/secondary/entry)
"bso" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
/obj/structure/cable/yellow{
icon_state = "1-2"
},
-/turf/open/floor/plasteel/white/corner,
+/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"bsu" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
@@ -36236,7 +36218,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
-/obj/effect/turf_decal/stripes/line{
+/obj/effect/turf_decal/tile/neutral{
dir = 8
},
/turf/open/floor/plasteel,
@@ -36248,6 +36230,7 @@
/obj/structure/cable/yellow{
icon_state = "1-2"
},
+/obj/effect/turf_decal/tile/neutral,
/turf/open/floor/plasteel,
/area/hallway/primary/port)
"bsw" = (
@@ -36994,7 +36977,7 @@
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"btR" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-18"
},
/obj/effect/turf_decal/stripes/line{
@@ -37020,29 +37003,25 @@
/area/hallway/secondary/entry)
"btY" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/disposalpipe/segment,
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
-/obj/effect/turf_decal/stripes/line{
- dir = 8
+/obj/structure/disposalpipe/segment{
+ dir = 9
},
-/obj/machinery/camera{
- c_tag = "Port Primary Hallway - Port";
- dir = 4
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
},
/turf/open/floor/plasteel,
/area/hallway/primary/port)
"btZ" = (
-/obj/machinery/light{
- dir = 4
- },
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
/obj/structure/cable/yellow{
icon_state = "1-2"
},
+/obj/effect/turf_decal/tile/neutral,
/turf/open/floor/plasteel,
/area/hallway/primary/port)
"bua" = (
@@ -37778,7 +37757,7 @@
/turf/open/floor/plasteel/grimy,
/area/tcommsat/computer)
"bvB" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-20"
},
/obj/effect/turf_decal/stripes/line{
@@ -37847,26 +37826,23 @@
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"bvK" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"bvL" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
+/obj/structure/cable/yellow{
+ icon_state = "2-4"
},
/obj/structure/cable/yellow{
icon_state = "1-2"
},
-/turf/open/floor/plasteel/white/corner,
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"bvT" = (
/obj/structure/disposalpipe/segment{
@@ -37878,15 +37854,16 @@
/turf/open/floor/plating,
/area/maintenance/department/science/xenobiology)
"bvV" = (
-/obj/structure/extinguisher_cabinet{
- pixel_x = 27
- },
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
+/obj/structure/cable/yellow{
+ icon_state = "1-8"
+ },
/obj/structure/cable/yellow{
icon_state = "1-2"
},
+/obj/effect/turf_decal/tile/neutral,
/turf/open/floor/plasteel,
/area/hallway/primary/port)
"bvW" = (
@@ -38677,28 +38654,36 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/turf/open/floor/plasteel,
+/obj/structure/cable/yellow{
+ icon_state = "2-4"
+ },
+/turf/open/floor/plasteel/white/corner,
/area/hallway/secondary/entry)
"bxC" = (
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 9
},
-/turf/open/floor/plasteel,
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel/white/corner,
/area/hallway/secondary/entry)
"bxD" = (
/obj/effect/turf_decal/tile/blue{
- dir = 4
+ dir = 8
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/light{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 5
},
/obj/structure/cable/yellow{
icon_state = "1-2"
},
+/obj/structure/cable/yellow{
+ icon_state = "2-8"
+ },
/turf/open/floor/plasteel/white/corner,
/area/hallway/secondary/entry)
"bxL" = (
@@ -38718,15 +38703,13 @@
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
/obj/structure/cable/yellow{
icon_state = "1-4"
},
-/obj/structure/cable/yellow{
- icon_state = "2-4"
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
},
+/obj/effect/turf_decal/tile/neutral,
/turf/open/floor/plasteel,
/area/hallway/primary/port)
"bxO" = (
@@ -39242,7 +39225,7 @@
dir = 4
},
/obj/machinery/computer/station_alert,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
dir = 4
},
/turf/open/floor/plasteel/dark/corner{
@@ -39262,7 +39245,7 @@
dir = 4
},
/obj/structure/closet/secure_closet/atmospherics,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
dir = 4
},
/turf/open/floor/plasteel/dark/corner{
@@ -39279,10 +39262,10 @@
dir = 4
},
/obj/structure/closet/secure_closet/atmospherics,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/dark/corner{
dir = 1
},
@@ -39295,9 +39278,6 @@
pixel_y = 24
},
/obj/machinery/computer/atmos_control,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
/turf/open/floor/plasteel/checker,
/area/engine/atmos)
"byW" = (
@@ -39311,7 +39291,7 @@
dir = 4
},
/obj/machinery/computer/atmos_control,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
dir = 4
},
/turf/open/floor/plasteel/checker,
@@ -39330,12 +39310,12 @@
pixel_x = -26
},
/obj/machinery/pipedispenser/disposal/transit_tube,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
/obj/effect/turf_decal/stripes/line{
dir = 6
},
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"byY" = (
@@ -39343,7 +39323,7 @@
/obj/structure/cable/yellow{
icon_state = "1-2"
},
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
dir = 4
},
/turf/open/floor/plasteel,
@@ -39356,14 +39336,14 @@
dir = 8
},
/obj/machinery/pipedispenser,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/camera{
c_tag = "Atmospherics - Entrance";
dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bza" = (
@@ -39609,23 +39589,14 @@
/turf/open/floor/plasteel/dark,
/area/aisat)
"bzw" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/door/firedoor,
-/obj/machinery/newscaster{
- pixel_x = 28;
- pixel_y = 1
+/obj/machinery/door/airlock{
+ name = "Port Emergency Storage"
},
/obj/structure/cable/yellow{
icon_state = "1-2"
},
-/turf/open/floor/plasteel/white/corner,
-/area/hallway/secondary/entry)
+/turf/open/floor/plating,
+/area/maintenance/port)
"bzx" = (
/turf/closed/wall,
/area/security/vacantoffice)
@@ -40285,45 +40256,22 @@
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
-"bBd" = (
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/structure/cable/yellow{
- icon_state = "2-4"
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/entry)
"bBf" = (
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
+/obj/structure/table/wood,
+/obj/machinery/light_switch{
+ pixel_x = -28
},
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/port)
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/item/folder,
+/turf/open/floor/wood,
+/area/security/vacantoffice)
"bBg" = (
/turf/open/floor/wood,
/area/security/vacantoffice)
"bBh" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/structure/cable/yellow{
- icon_state = "2-8"
- },
-/obj/structure/cable/yellow{
- icon_state = "2-4"
- },
-/turf/open/floor/plasteel,
+/obj/structure/table/wood,
+/obj/item/reagent_containers/food/snacks/chips,
+/turf/open/floor/plasteel/grimy,
/area/hallway/primary/port)
"bBi" = (
/obj/structure/table/wood,
@@ -40424,7 +40372,7 @@
/turf/open/floor/wood,
/area/library)
"bBx" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/turf/open/floor/wood,
@@ -41039,33 +40987,29 @@
/obj/structure/cable/yellow{
icon_state = "1-2"
},
-/turf/open/floor/plasteel/white/corner,
-/area/hallway/secondary/entry)
-"bCI" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
/obj/effect/turf_decal/tile/blue{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 5
+/turf/open/floor/plasteel/white/corner,
+/area/hallway/secondary/entry)
+"bCI" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 6
},
/obj/structure/cable/yellow{
icon_state = "1-2"
},
-/turf/open/floor/plasteel/white/corner,
-/area/hallway/secondary/entry)
+/turf/open/floor/plating,
+/area/maintenance/port)
"bCJ" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
+/obj/item/storage/toolbox/emergency,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 10
},
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
+/turf/open/floor/plating{
+ icon_state = "panelscorched"
},
-/obj/machinery/door/firedoor,
-/turf/open/floor/plasteel,
-/area/hallway/primary/port)
+/area/maintenance/port)
"bCK" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -41074,66 +41018,35 @@
/turf/open/floor/plating,
/area/maintenance/starboard)
"bCL" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 1
},
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/machinery/firealarm{
- pixel_y = -24
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/port)
+/turf/open/floor/wood,
+/area/security/vacantoffice)
"bCM" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/item/radio/intercom{
- pixel_y = -28
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/port)
+/obj/structure/table/wood,
+/turf/open/floor/wood,
+/area/security/vacantoffice)
"bCN" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/effect/turf_decal/stripes/line{
dir = 8
},
/obj/machinery/door/firedoor,
-/obj/machinery/power/apc{
- areastring = "/area/hallway/secondary/entry";
- dir = 8;
- name = "Arrivals APC";
- pixel_x = -26
- },
-/obj/structure/cable/yellow{
- icon_state = "0-4"
- },
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"bCP" = (
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/structure/sign/map/right{
- desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown).";
- icon_state = "map-right-MS";
- pixel_y = -32
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/port)
+/turf/open/floor/plating,
+/area/crew_quarters/toilet/auxiliary)
"bCQ" = (
/obj/machinery/door/firedoor,
-/obj/structure/cable/yellow{
- icon_state = "2-8"
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
},
-/turf/open/floor/plasteel,
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel/white/corner,
/area/hallway/secondary/entry)
"bCR" = (
/obj/machinery/power/apc/highcap/five_k{
@@ -41143,7 +41056,7 @@
},
/obj/structure/cable/yellow,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 5
+ dir = 9
},
/turf/open/floor/plasteel,
/area/crew_quarters/toilet/auxiliary)
@@ -41152,9 +41065,6 @@
dir = 8;
pixel_x = 24
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10
- },
/turf/open/floor/plasteel,
/area/crew_quarters/toilet/auxiliary)
"bCV" = (
@@ -41792,44 +41702,43 @@
/turf/open/floor/plasteel/white/corner,
/area/hallway/secondary/entry)
"bEo" = (
-/obj/machinery/door/airlock{
- name = "Port Emergency Storage"
- },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/item/storage/box/lights/mixed,
/obj/structure/cable/yellow{
icon_state = "1-2"
},
/turf/open/floor/plating,
/area/maintenance/port)
"bEp" = (
-/obj/machinery/door/firedoor,
-/turf/open/floor/plasteel,
-/area/hallway/secondary/entry)
+/obj/machinery/vending/coffee,
+/turf/open/floor/plasteel/dark,
+/area/hallway/primary/port)
"bEq" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall,
-/area/security/vacantoffice)
-"bEs" = (
-/obj/structure/table/wood,
-/obj/item/paper_bin{
- pixel_x = -2;
- pixel_y = 6
- },
-/obj/machinery/newscaster{
- pixel_y = 32
+/obj/structure/light_construct{
+ dir = 8
},
/turf/open/floor/wood,
/area/security/vacantoffice)
-"bEt" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/disposalpipe/segment,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
+"bEs" = (
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
},
-/obj/effect/turf_decal/stripes/line{
+/obj/machinery/power/apc{
+ areastring = "/area/hallway/secondary/entry";
+ dir = 4;
+ name = "Arrivals APC";
+ pixel_x = 26
+ },
+/obj/structure/cable/yellow{
+ icon_state = "0-8"
+ },
+/turf/open/floor/plasteel/white/corner,
+/area/hallway/secondary/entry)
+"bEt" = (
+/obj/structure/chair/comfy{
dir = 8
},
-/obj/machinery/door/firedoor,
-/turf/open/floor/plasteel,
+/turf/open/floor/plasteel/grimy,
/area/hallway/primary/port)
"bEu" = (
/obj/machinery/door/airlock{
@@ -42467,7 +42376,7 @@
dir = 10
},
/obj/structure/table/wood/poker,
-/obj/item/storage/pill_bottle/dice,
+/obj/item/storage/box/dice,
/turf/open/floor/wood,
/area/crew_quarters/bar)
"bFt" = (
@@ -42693,7 +42602,7 @@
name = "Distribution Loop";
req_access_txt = "24"
},
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bFQ" = (
@@ -42811,14 +42720,11 @@
/turf/open/floor/plasteel/grimy,
/area/tcommsat/computer)
"bGj" = (
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
+/obj/machinery/vending/cola/random,
+/obj/machinery/newscaster{
+ pixel_x = -30
},
-/obj/machinery/door/firedoor,
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
+/turf/open/floor/plasteel/dark,
/area/hallway/primary/port)
"bGk" = (
/obj/structure/cable/yellow{
@@ -42842,8 +42748,9 @@
/turf/open/floor/plasteel,
/area/crew_quarters/toilet/auxiliary)
"bGm" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/shower{
+ dir = 8
},
/turf/open/floor/plasteel,
/area/crew_quarters/toilet/auxiliary)
@@ -43438,18 +43345,20 @@
/turf/open/floor/plasteel/white/corner,
/area/hallway/secondary/entry)
"bHJ" = (
-/obj/item/tank/internals/oxygen,
-/obj/item/tank/internals/oxygen,
-/obj/item/clothing/mask/breath,
-/obj/item/clothing/mask/breath,
-/obj/machinery/light/small{
+/obj/effect/turf_decal/tile/blue{
dir = 4
},
-/turf/open/floor/plating,
-/area/maintenance/port)
+/obj/machinery/newscaster{
+ pixel_x = 28;
+ pixel_y = 1
+ },
+/turf/open/floor/plasteel/white/corner,
+/area/hallway/secondary/entry)
"bHK" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
+/obj/structure/table/wood,
+/obj/item/book/manual/wiki/security_space_law{
+ pixel_x = -3;
+ pixel_y = 5
},
/turf/open/floor/wood,
/area/security/vacantoffice)
@@ -43463,9 +43372,11 @@
/turf/open/floor/carpet,
/area/security/vacantoffice)
"bHM" = (
-/obj/structure/table/wood,
-/turf/open/floor/wood,
-/area/security/vacantoffice)
+/obj/structure/chair/comfy{
+ dir = 4
+ },
+/turf/open/floor/plasteel/grimy,
+/area/hallway/primary/port)
"bHN" = (
/obj/machinery/shower{
dir = 4
@@ -43960,7 +43871,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/effect/turf_decal/tile/yellow,
@@ -44132,7 +44043,7 @@
/turf/open/floor/circuit/telecomms/mainframe,
/area/tcommsat/server)
"bJh" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/turf/open/floor/plasteel/grimy,
@@ -44151,9 +44062,10 @@
/turf/open/floor/plasteel/grimy,
/area/tcommsat/computer)
"bJj" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
+/obj/machinery/door/airlock/maintenance{
+ req_one_access_txt = "12;27;37"
},
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/structure/cable/yellow{
icon_state = "1-2"
},
@@ -44191,26 +44103,23 @@
/turf/open/floor/plasteel/white/corner,
/area/hallway/secondary/entry)
"bJp" = (
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/entry)
+/obj/machinery/vending/snack/random,
+/turf/open/floor/plasteel/dark,
+/area/hallway/primary/port)
"bJq" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/item/storage/box/lights/mixed,
/obj/structure/cable/yellow{
icon_state = "1-2"
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
/turf/open/floor/plating,
/area/maintenance/port)
"bJr" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 1
- },
-/obj/machinery/portable_atmospherics/canister/air,
-/turf/open/floor/plating,
-/area/maintenance/port)
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel,
+/area/hallway/secondary/entry)
"bJs" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 10
@@ -44224,9 +44133,6 @@
/obj/item/radio/intercom{
pixel_x = -29
},
-/obj/machinery/light/small{
- dir = 8
- },
/turf/open/floor/wood,
/area/security/vacantoffice)
"bJu" = (
@@ -44250,8 +44156,10 @@
/turf/open/floor/carpet,
/area/security/vacantoffice)
"bJw" = (
-/obj/structure/chair/office{
- dir = 8
+/obj/structure/table/wood,
+/obj/item/paper_bin{
+ pixel_x = -2;
+ pixel_y = 6
},
/turf/open/floor/carpet,
/area/security/vacantoffice)
@@ -44260,15 +44168,6 @@
dir = 8;
pixel_x = 24
},
-/obj/structure/table/wood,
-/obj/item/camera_film{
- pixel_x = 6;
- pixel_y = 7
- },
-/obj/item/camera_film{
- pixel_x = -3;
- pixel_y = 5
- },
/turf/open/floor/wood,
/area/security/vacantoffice)
"bJy" = (
@@ -44580,27 +44479,7 @@
},
/turf/open/floor/plating,
/area/gateway)
-"bJY" = (
-/obj/machinery/gateway{
- dir = 9
- },
-/obj/effect/turf_decal/bot_white/right,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/gateway)
"bJZ" = (
-/obj/machinery/gateway{
- dir = 1
- },
/obj/machinery/status_display/evac{
pixel_y = 32
},
@@ -44617,23 +44496,6 @@
},
/turf/open/floor/plasteel/dark,
/area/gateway)
-"bKa" = (
-/obj/machinery/gateway{
- dir = 5
- },
-/obj/effect/turf_decal/bot_white/left,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/gateway)
"bKb" = (
/obj/structure/cable/yellow{
icon_state = "1-2"
@@ -44801,19 +44663,19 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"bKy" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
dir = 4
},
/turf/closed/wall,
/area/engine/atmos)
"bKz" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
dir = 10
},
/turf/closed/wall,
/area/engine/atmos)
"bKA" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
/turf/closed/wall,
/area/engine/atmos)
"bKB" = (
@@ -44940,7 +44802,7 @@
/turf/open/floor/plasteel/dark,
/area/aisat)
"bKS" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-06"
},
/obj/effect/turf_decal/stripes/line{
@@ -44993,15 +44855,11 @@
/turf/open/floor/plasteel/white/corner,
/area/hallway/secondary/entry)
"bKX" = (
-/obj/machinery/door/airlock/maintenance{
- req_one_access_txt = "12;27;37"
+/obj/structure/chair/comfy{
+ dir = 1
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
+/turf/open/floor/plasteel/grimy,
+/area/hallway/primary/port)
"bKY" = (
/obj/machinery/power/apc{
areastring = "/area/security/vacantoffice";
@@ -45306,31 +45164,13 @@
/obj/structure/cable/yellow,
/turf/open/floor/plating,
/area/gateway)
-"bLD" = (
-/obj/machinery/gateway{
- dir = 8
- },
-/obj/effect/turf_decal/bot_white,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/gateway)
"bLE" = (
-/obj/machinery/gateway/centerstation,
+/obj/machinery/gateway/centerstation{
+ dir = 0
+ },
/turf/open/floor/plasteel/dark,
/area/gateway)
"bLF" = (
-/obj/machinery/gateway{
- dir = 4
- },
/obj/effect/turf_decal/bot_white,
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -45558,7 +45398,7 @@
/area/engine/atmos)
"bMe" = (
/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
/turf/open/floor/plating,
/area/engine/atmos)
"bMf" = (
@@ -45770,7 +45610,7 @@
icon_state = "map-right-MS";
pixel_y = -32
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-03"
},
/obj/effect/turf_decal/tile/blue{
@@ -45785,7 +45625,7 @@
/turf/open/floor/plasteel/white/corner,
/area/hallway/secondary/entry)
"bMC" = (
-/obj/structure/chair/office,
+/obj/structure/chair/office/dark,
/turf/open/floor/wood,
/area/security/vacantoffice)
"bMD" = (
@@ -46048,19 +45888,15 @@
/turf/open/floor/carpet,
/area/bridge/showroom/corporate)
"bNd" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+/obj/item/tank/internals/oxygen,
+/obj/item/tank/internals/oxygen,
+/obj/item/clothing/mask/breath,
+/obj/item/clothing/mask/breath,
+/obj/machinery/light/small{
dir = 4
},
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/machinery/camera{
- c_tag = "Port Primary Hallway - Mining Shuttle";
- dir = 1
- },
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/plasteel,
-/area/hallway/primary/port)
+/turf/open/floor/plating,
+/area/maintenance/port)
"bNe" = (
/obj/structure/table/wood,
/obj/item/phone{
@@ -46104,17 +45940,11 @@
/turf/open/floor/wood,
/area/bridge/showroom/corporate)
"bNh" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/structure/disposalpipe/segment{
- dir = 6
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/port)
+/obj/structure/table/wood,
+/obj/item/folder/red,
+/obj/item/pen/red,
+/turf/open/floor/wood,
+/area/security/vacantoffice)
"bNi" = (
/obj/structure/window/reinforced{
dir = 8
@@ -46196,9 +46026,6 @@
},
/area/gateway)
"bNp" = (
-/obj/machinery/gateway{
- dir = 10
- },
/obj/effect/turf_decal/bot_white/left,
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -46213,7 +46040,6 @@
/turf/open/floor/plasteel/dark,
/area/gateway)
"bNq" = (
-/obj/machinery/gateway,
/obj/structure/cable/yellow{
icon_state = "0-2"
},
@@ -46231,9 +46057,6 @@
/turf/open/floor/plasteel/dark,
/area/gateway)
"bNr" = (
-/obj/machinery/gateway{
- dir = 6
- },
/obj/effect/turf_decal/bot_white/right,
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -46384,12 +46207,17 @@
/turf/open/floor/wood,
/area/crew_quarters/theatre)
"bNK" = (
-/obj/machinery/disposal/bin,
-/obj/structure/disposalpipe/trunk{
- dir = 1
+/obj/machinery/airalarm{
+ dir = 8;
+ pixel_x = 24
},
-/turf/open/floor/plasteel,
-/area/hallway/primary/port)
+/obj/structure/table/wood,
+/obj/item/paper_bin{
+ pixel_x = -2;
+ pixel_y = 6
+ },
+/turf/open/floor/wood,
+/area/security/vacantoffice)
"bNL" = (
/obj/structure/table,
/obj/item/stock_parts/subspace/transmitter,
@@ -46829,6 +46657,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 5
},
+/obj/machinery/computer/gateway_control{
+ dir = 8
+ },
/turf/open/floor/plasteel,
/area/gateway)
"bOJ" = (
@@ -47769,9 +47600,6 @@
dir = 8;
pixel_x = 24
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
- },
/turf/open/floor/plating,
/area/crew_quarters/toilet/auxiliary)
"bQQ" = (
@@ -51026,7 +50854,7 @@
/obj/structure/extinguisher_cabinet{
pixel_x = -27
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "applebush"
},
/obj/effect/turf_decal/tile/blue{
@@ -51122,7 +50950,7 @@
dir = 8;
pixel_x = 24
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-10"
},
/obj/effect/turf_decal/tile/purple,
@@ -54628,7 +54456,7 @@
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"ceI" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-11"
},
/obj/effect/turf_decal/tile/yellow,
@@ -54723,7 +54551,7 @@
name = "Station Intercom (General)";
pixel_y = -30
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-08"
},
/obj/effect/turf_decal/tile/purple,
@@ -59526,7 +59354,7 @@
/turf/open/floor/plasteel/white,
/area/science/research)
"coj" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-10"
},
/obj/effect/turf_decal/tile/purple,
@@ -64235,7 +64063,7 @@
/obj/machinery/light_switch{
pixel_x = -23
},
-/obj/item/twohanded/required/kirbyplants/dead,
+/obj/item/kirbyplants/dead,
/turf/open/floor/plasteel/cafeteria{
dir = 5
},
@@ -65072,10 +64900,8 @@
/obj/machinery/light_switch{
pixel_y = 28
},
-/obj/structure/closet/l3closet/scientist{
- pixel_x = -2
- },
/obj/effect/turf_decal/stripes/line,
+/obj/structure/closet/bombcloset,
/turf/open/floor/plasteel,
/area/science/mixing)
"cyA" = (
@@ -65106,7 +64932,6 @@
"cyD" = (
/obj/machinery/atmospherics/components/unary/portables_connector/visible,
/obj/effect/turf_decal/stripes/line,
-/obj/machinery/portable_atmospherics/canister,
/turf/open/floor/plasteel,
/area/science/mixing)
"cyE" = (
@@ -65118,7 +64943,6 @@
network = list("ss13","rd")
},
/obj/machinery/atmospherics/components/unary/portables_connector/visible,
-/obj/machinery/portable_atmospherics/canister,
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plasteel,
/area/science/mixing)
@@ -65151,7 +64975,9 @@
dir = 4
},
/obj/machinery/portable_atmospherics/canister,
-/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
/turf/open/floor/plasteel,
/area/science/mixing)
"cyI" = (
@@ -65167,11 +64993,7 @@
/obj/machinery/light_switch{
pixel_y = 28
},
-/obj/machinery/portable_atmospherics/scrubber,
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/turf/open/floor/plasteel,
+/turf/open/floor/plasteel/white,
/area/science/mixing)
"cyK" = (
/turf/closed/wall/r_wall,
@@ -65582,10 +65404,14 @@
/turf/open/floor/plasteel/white,
/area/science/mixing)
"czB" = (
-/obj/machinery/portable_atmospherics/pump,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
+/obj/machinery/light{
+ dir = 4
},
+/obj/structure/window/reinforced{
+ dir = 1;
+ pixel_y = 2
+ },
+/obj/machinery/portable_atmospherics/pump,
/turf/open/floor/plasteel,
/area/science/mixing)
"czC" = (
@@ -66263,12 +66089,15 @@
/turf/open/floor/plasteel/white,
/area/science/mixing)
"cAG" = (
-/obj/structure/window/reinforced,
-/obj/machinery/portable_atmospherics/scrubber,
-/obj/item/storage/firstaid/toxin,
-/obj/effect/turf_decal/stripes/line{
- dir = 10
+/obj/structure/extinguisher_cabinet{
+ pixel_x = 27
},
+/obj/machinery/camera{
+ c_tag = "Toxins - Mixing Area";
+ dir = 8;
+ network = list("ss13","rd")
+ },
+/obj/machinery/portable_atmospherics/scrubber,
/turf/open/floor/plasteel,
/area/science/mixing)
"cAH" = (
@@ -66983,10 +66812,10 @@
/turf/open/floor/plasteel/white,
/area/science/research)
"cCt" = (
-/obj/structure/closet/bombcloset,
/obj/effect/turf_decal/stripes/line{
dir = 1
},
+/obj/machinery/portable_atmospherics/canister,
/turf/open/floor/plasteel,
/area/science/mixing)
"cCu" = (
@@ -67172,8 +67001,7 @@
layer = 4;
name = "Test Chamber Telescreen";
network = list("toxins");
- pixel_x = -32;
- pixel_y = 0
+ pixel_x = -32
},
/turf/open/floor/plasteel,
/area/science/mixing)
@@ -68144,19 +67972,14 @@
dir = 1;
pixel_y = 2
},
-/obj/machinery/light{
- dir = 4
- },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
/turf/open/floor/plasteel,
/area/science/mixing)
"cEz" = (
-/obj/structure/closet/wardrobe/grey,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
+/obj/machinery/portable_atmospherics/scrubber,
+/obj/item/storage/firstaid/toxin,
+/turf/open/floor/plasteel,
+/area/science/mixing)
"cEA" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
@@ -68541,18 +68364,7 @@
/turf/open/floor/plasteel/white,
/area/science/mixing)
"cFs" = (
-/obj/structure/extinguisher_cabinet{
- pixel_x = 27
- },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/camera{
- c_tag = "Toxins - Mixing Area";
- dir = 8;
- network = list("ss13","rd")
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
/turf/open/floor/plasteel,
/area/science/mixing)
"cFu" = (
@@ -68828,7 +68640,7 @@
/turf/open/floor/plasteel/white,
/area/medical/medbay/aft)
"cFQ" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21";
pixel_x = -3;
pixel_y = 3
@@ -69038,9 +68850,6 @@
dir = 8
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
/obj/machinery/portable_atmospherics/pump,
/turf/open/floor/plasteel,
/area/science/mixing)
@@ -70271,9 +70080,7 @@
/obj/structure/cable/yellow{
icon_state = "1-4"
},
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 4
- },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
"cIm" = (
@@ -71160,7 +70967,7 @@
/turf/open/floor/plasteel/white,
/area/science/research)
"cJQ" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-10"
},
/obj/effect/turf_decal/tile/purple{
@@ -72340,7 +72147,7 @@
/obj/structure/extinguisher_cabinet{
pixel_x = 27
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-14"
},
/obj/effect/turf_decal/stripes/line{
@@ -74181,7 +73988,7 @@
/obj/structure/extinguisher_cabinet{
pixel_x = -27
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-04"
},
/obj/effect/turf_decal/stripes/line{
@@ -74247,7 +74054,7 @@
name = "Station Intercom (General)";
pixel_x = 29
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-16"
},
/obj/effect/turf_decal/stripes/line{
@@ -79185,13 +78992,10 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/door/firedoor,
/obj/structure/sign/poster/official/random{
pixel_y = 32
},
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
+/obj/machinery/door/firedoor,
/turf/open/floor/plasteel,
/area/hallway/primary/port)
"dhQ" = (
@@ -79269,14 +79073,11 @@
/turf/open/floor/wood,
/area/crew_quarters/theatre)
"dhZ" = (
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
+/obj/structure/urinal{
+ pixel_y = 29
},
-/obj/structure/cable/yellow{
- icon_state = "1-8"
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/port)
+/turf/open/floor/plating,
+/area/crew_quarters/toilet/auxiliary)
"dib" = (
/obj/structure/table/wood,
/obj/item/lipstick{
@@ -79312,10 +79113,6 @@
/area/hallway/secondary/entry)
"did" = (
/obj/structure/table/wood,
-/obj/machinery/light_switch{
- pixel_x = -28
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/item/folder,
/turf/open/floor/wood,
/area/security/vacantoffice)
@@ -79331,13 +79128,11 @@
/turf/open/floor/wood,
/area/crew_quarters/theatre)
"dig" = (
-/obj/machinery/airalarm{
- dir = 8;
- pixel_x = 24
+/obj/item/kirbyplants{
+ icon_state = "plant-03"
},
-/obj/structure/table/wood,
-/turf/open/floor/wood,
-/area/security/vacantoffice)
+/turf/open/floor/plasteel/grimy,
+/area/hallway/primary/port)
"dih" = (
/obj/machinery/light/small,
/obj/structure/sign/poster/official/random{
@@ -79726,15 +79521,15 @@
},
/area/medical/medbay/aft)
"diP" = (
-/obj/structure/cable/yellow{
- icon_state = "1-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
/obj/structure/sign/poster/contraband/random{
pixel_y = -32
},
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
"diQ" = (
@@ -79798,7 +79593,7 @@
c_tag = "Departure Lounge - Port Fore";
dir = 4
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-24"
},
/obj/effect/turf_decal/stripes/line{
@@ -79910,20 +79705,10 @@
/turf/open/space/basic,
/area/space)
"djW" = (
-/obj/machinery/light{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
+/obj/effect/decal/cleanable/cobweb/cobweb2,
+/obj/structure/reagent_dispensers/fueltank,
/turf/open/floor/plasteel,
-/area/hallway/primary/port)
+/area/maintenance/port)
"djX" = (
/obj/structure/closet/crate/coffin,
/obj/machinery/door/window/eastleft{
@@ -80458,9 +80243,7 @@
pixel_y = -24
},
/obj/structure/cable/yellow,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 5
- },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
"dAh" = (
@@ -81324,6 +81107,12 @@
},
/turf/closed/wall,
/area/maintenance/starboard)
+"dQg" = (
+/obj/machinery/door/airlock/maintenance{
+ req_one_access_txt = "12;27;37"
+ },
+/turf/open/floor/plating,
+/area/maintenance/port)
"dYu" = (
/obj/machinery/door/airlock/external{
name = "Auxiliary Airlock"
@@ -81334,9 +81123,16 @@
/turf/open/floor/plating,
/area/hallway/secondary/entry)
"eiS" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/crew_quarters/toilet/auxiliary)
+/obj/machinery/disposal/bin,
+/obj/structure/disposalpipe/trunk{
+ dir = 4
+ },
+/obj/machinery/camera{
+ c_tag = "Port Primary Hallway - True Port";
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/hallway/primary/port)
"eoK" = (
/obj/structure/disposalpipe/segment{
dir = 9
@@ -81440,6 +81236,12 @@
},
/turf/open/floor/plasteel/white,
/area/science/circuit)
+"fDG" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 6
+ },
+/turf/open/floor/plasteel,
+/area/crew_quarters/toilet/auxiliary)
"fFM" = (
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -81516,6 +81318,13 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
+"gGH" = (
+/obj/structure/cable/yellow{
+ icon_state = "2-4"
+ },
+/obj/effect/spawner/lootdrop/maintenance,
+/turf/open/floor/plating,
+/area/maintenance/starboard/aft)
"gGT" = (
/obj/effect/landmark/start/scientist,
/obj/structure/chair/office/light{
@@ -81649,12 +81458,25 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"iSt" = (
-/obj/machinery/door/airlock/grunge,
-/obj/structure/cable/yellow{
- icon_state = "1-2"
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
},
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white/corner,
+/area/hallway/secondary/entry)
+"jdf" = (
+/obj/machinery/door/airlock{
+ id_tag = "AuxShower";
+ name = "Shower"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel,
-/area/security/vacantoffice)
+/area/crew_quarters/toilet/auxiliary)
"jeV" = (
/obj/machinery/conveyor/inverted{
dir = 10;
@@ -81722,15 +81544,18 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"jBe" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/tile/neutral{
dir = 4
},
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/obj/structure/sign/poster/official/random{
- pixel_y = -32
- },
/turf/open/floor/plasteel,
/area/hallway/primary/port)
"jKK" = (
@@ -81762,15 +81587,23 @@
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/door/firedoor,
/obj/structure/cable/yellow{
icon_state = "4-8"
},
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/hallway/primary/port)
+"jRo" = (
+/obj/structure/table/wood,
+/obj/machinery/newscaster{
+ pixel_y = 32
+ },
+/obj/item/clipboard,
+/obj/item/paper,
+/turf/open/floor/wood,
+/area/security/vacantoffice)
"kfu" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/white,
@@ -81849,15 +81682,18 @@
/turf/open/floor/plasteel/white,
/area/science/circuit)
"kQP" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/machinery/navbeacon{
+ codes_txt = "patrol;next_patrol=6-Port-Central";
+ location = "5-Customs"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
},
/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/machinery/airalarm{
- dir = 1;
- pixel_y = -22
+ dir = 4
},
/turf/open/floor/plasteel,
/area/hallway/primary/port)
@@ -81903,6 +81739,9 @@
/turf/open/floor/plasteel/white,
/area/science/circuit)
"lws" = (
+/obj/structure/chair/office/dark{
+ dir = 8
+ },
/turf/open/floor/carpet,
/area/security/vacantoffice)
"lzk" = (
@@ -81980,31 +81819,34 @@
/turf/open/floor/plasteel/dark,
/area/crew_quarters/cryopod)
"maP" = (
-/obj/item/storage/toolbox/emergency,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
},
-/turf/open/floor/plating{
- icon_state = "panelscorched"
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
},
-/area/maintenance/port)
+/turf/open/floor/plasteel,
+/area/hallway/primary/port)
"mcS" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
- },
-/obj/structure/disposalpipe/segment{
- dir = 9
+ dir = 4
},
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/obj/structure/sign/map/left{
- desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown).";
- icon_state = "map-left-MS";
- pixel_y = -32
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
},
-/turf/open/floor/plasteel,
-/area/hallway/primary/port)
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/item/radio/intercom{
+ name = "Station Intercom (General)";
+ pixel_y = -28
+ },
+/turf/open/floor/plasteel/white/corner,
+/area/hallway/secondary/entry)
"mjJ" = (
/obj/machinery/nuclearbomb/beer{
pixel_x = 2;
@@ -82016,6 +81858,12 @@
/obj/structure/lattice,
/turf/closed/wall,
/area/crew_quarters/cryopod)
+"mot" = (
+/obj/structure/chair/office/dark{
+ dir = 8
+ },
+/turf/open/floor/wood,
+/area/security/vacantoffice)
"mvj" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -82057,17 +81905,11 @@
},
/area/maintenance/port/aft)
"nhy" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/disposalpipe/segment,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/corner{
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
+/obj/effect/landmark/event_spawn,
+/obj/machinery/door/firedoor,
/turf/open/floor/plasteel,
/area/hallway/primary/port)
"njd" = (
@@ -82353,9 +82195,22 @@
/turf/open/floor/plasteel/dark,
/area/crew_quarters/cryopod)
"pHS" = (
-/obj/structure/closet/firecloset,
-/turf/open/floor/plating,
-/area/maintenance/port)
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/airalarm{
+ dir = 1;
+ pixel_y = -22
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/port)
"pMX" = (
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -82388,6 +82243,15 @@
},
/turf/open/floor/plating,
/area/maintenance/aft)
+"pVL" = (
+/obj/structure/cable/yellow{
+ icon_state = "1-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/maintenance/starboard/aft)
"pZb" = (
/obj/structure/cable/yellow{
icon_state = "2-4"
@@ -82400,6 +82264,13 @@
},
/turf/open/floor/plating,
/area/maintenance/port)
+"qkY" = (
+/obj/machinery/door/airlock/grunge,
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel,
+/area/security/vacantoffice)
"qqg" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 6
@@ -82479,11 +82350,18 @@
/turf/open/floor/plasteel,
/area/security/prison)
"rbE" = (
-/obj/effect/turf_decal/tile/blue{
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/turf/open/floor/plasteel/white/corner,
-/area/hallway/secondary/entry)
+/obj/machinery/firealarm{
+ pixel_y = -24
+ },
+/obj/effect/turf_decal/tile/neutral,
+/turf/open/floor/plasteel,
+/area/hallway/primary/port)
"roa" = (
/obj/structure/chair/stool,
/obj/machinery/light/small{
@@ -82532,19 +82410,16 @@
/turf/closed/wall,
/area/quartermaster/miningoffice)
"rNX" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
/obj/effect/turf_decal/tile/neutral{
- dir = 1
+ dir = 8
},
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/navbeacon{
- codes_txt = "patrol;next_patrol=6-Port-Central";
- location = "5-Customs"
- },
-/obj/structure/cable/yellow{
- icon_state = "4-8"
+/obj/structure/sign/poster/official/random{
+ pixel_y = -32
},
+/obj/effect/turf_decal/tile/neutral,
/turf/open/floor/plasteel,
/area/hallway/primary/port)
"rQK" = (
@@ -82615,15 +82490,16 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"syk" = (
-/obj/machinery/door/airlock{
- id_tag = "AuxShower";
- name = "Shower"
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
},
+/obj/effect/turf_decal/tile/neutral,
/turf/open/floor/plasteel,
-/area/crew_quarters/toilet/auxiliary)
+/area/hallway/primary/port)
"sFv" = (
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -82675,6 +82551,10 @@
},
/turf/open/floor/plasteel/dark,
/area/crew_quarters/cryopod)
+"sZN" = (
+/obj/structure/closet/firecloset,
+/turf/open/floor/plating,
+/area/maintenance/port)
"tap" = (
/obj/machinery/power/apc/auto_name/east,
/obj/structure/cable/yellow{
@@ -82683,33 +82563,14 @@
/turf/open/floor/plasteel/dark,
/area/crew_quarters/cryopod)
"tre" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/stripes/corner{
- dir = 8
- },
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/obj/structure/cable/yellow{
- icon_state = "2-8"
- },
-/obj/structure/cable/yellow{
- icon_state = "2-4"
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
},
/obj/structure/cable/yellow{
icon_state = "1-2"
},
-/obj/structure/cable/yellow{
- icon_state = "1-4"
- },
-/obj/structure/cable/yellow{
- icon_state = "1-8"
- },
-/turf/open/floor/plasteel/white/corner,
-/area/hallway/secondary/entry)
+/turf/open/floor/plating,
+/area/maintenance/port)
"tsx" = (
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -82742,6 +82603,13 @@
},
/turf/open/floor/plasteel/dark,
/area/medical/morgue)
+"tUa" = (
+/obj/machinery/atmospherics/components/unary/portables_connector/visible{
+ dir = 1
+ },
+/obj/machinery/portable_atmospherics/canister/air,
+/turf/open/floor/plating,
+/area/maintenance/port)
"tVY" = (
/obj/structure/closet/crate,
/obj/item/target/alien,
@@ -82832,7 +82700,7 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-10"
},
/turf/open/floor/plasteel/white,
@@ -82867,6 +82735,18 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/fitness/recreation)
+"vuY" = (
+/obj/structure/table/wood,
+/obj/item/camera_film{
+ pixel_x = 6;
+ pixel_y = 7
+ },
+/obj/item/camera_film{
+ pixel_x = -3;
+ pixel_y = 5
+ },
+/turf/open/floor/wood,
+/area/security/vacantoffice)
"vxG" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -82921,10 +82801,21 @@
/turf/open/floor/plating,
/area/security/prison)
"wlH" = (
-/obj/effect/decal/cleanable/cobweb/cobweb2,
-/obj/structure/reagent_dispensers/fueltank,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/item/radio/intercom{
+ pixel_y = -28
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
/turf/open/floor/plasteel,
-/area/maintenance/port)
+/area/hallway/primary/port)
"wmt" = (
/obj/effect/decal/cleanable/flour,
/turf/open/floor/plating,
@@ -82981,7 +82872,10 @@
/turf/open/floor/plasteel/dark,
/area/crew_quarters/cryopod)
"xfI" = (
-/obj/machinery/vending/cola/random,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/machinery/door/firedoor,
/turf/open/floor/plasteel,
/area/hallway/primary/port)
"xgC" = (
@@ -82996,13 +82890,21 @@
/turf/open/floor/plasteel/white,
/area/science/circuit)
"xmb" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/obj/structure/cable/yellow{
- icon_state = "1-2"
+/obj/structure/sign/map/left{
+ desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown).";
+ icon_state = "map-left-MS";
+ pixel_y = -32
},
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
/turf/open/floor/plasteel,
/area/hallway/primary/port)
"xse" = (
@@ -83081,26 +82983,22 @@
/turf/open/floor/plasteel,
/area/security/prison)
"xLL" = (
-/obj/structure/table/wood,
-/obj/item/folder/white{
- pixel_x = 4;
- pixel_y = -3
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
},
-/obj/item/book/manual/wiki/security_space_law{
- pixel_x = -3;
- pixel_y = 5
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
+/obj/structure/sign/map/right{
+ desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown).";
+ icon_state = "map-right-MS";
+ pixel_y = -32
},
-/turf/open/floor/wood,
-/area/security/vacantoffice)
+/obj/effect/turf_decal/tile/neutral,
+/turf/open/floor/plasteel,
+/area/hallway/primary/port)
"xTV" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
- },
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/closed/wall,
+/area/security/vacantoffice)
"xVl" = (
/turf/closed/wall,
/area/hallway/secondary/service)
@@ -96375,7 +96273,7 @@ bxL
bvJ
bxB
bCQ
-bBd
+bCH
bCH
bEn
dic
@@ -96628,18 +96526,18 @@ bjV
bnK
bqb
bbI
-btT
+bJr
bvK
bxC
-bEp
-bJp
-rbE
alK
alK
alK
alK
alK
alK
+dQg
+alK
+alK
alK
bPF
asa
@@ -96882,7 +96780,7 @@ bgv
biv
bjW
blT
-bnL
+bso
bqc
bso
bso
@@ -96893,9 +96791,9 @@ tre
bCI
bEo
bJj
-xTV
+bbL
bJq
-bKX
+bbL
bbL
bbL
bPG
@@ -97139,20 +97037,20 @@ bbK
biw
bjX
blU
-baE
-baE
-baE
-baE
-baE
-baE
-baE
-jPu
-bCJ
+aiT
+bEs
+bHJ
+aiT
+iSt
+mcS
alK
auF
-maP
-bJr
+bCJ
+tUa
alK
+apz
+aob
+alC
aqK
aqO
alC
@@ -97395,21 +97293,21 @@ beL
bgw
bix
bjY
-blV
+bqd
baE
-afQ
-afQ
-afQ
-afZ
-afQ
baE
+baE
+baE
+bqd
+nhy
+alK
djW
bNd
+sZN
alK
-wlH
-bHJ
-pHS
-alK
+amZ
+aob
+aob
oWR
aob
bPH
@@ -97653,15 +97551,15 @@ bgx
biy
bjZ
blW
-baE
+ajk
afZ
-afQ
+bHM
ajs
-afQ
-afQ
-baE
-bBf
-kQP
+jBe
+pHS
+bzx
+bzx
+bzx
bzx
bzx
bzx
@@ -97910,13 +97808,13 @@ bgy
biz
bka
blX
-baE
-afQ
-afQ
-afQ
-afQ
-afQ
-baE
+bnR
+ahT
+ahT
+bKX
+jPu
+rbE
+xTV
bBf
bCL
bEq
@@ -98165,19 +98063,19 @@ bda
beO
bgz
biA
-bnR
+bka
blY
aeD
agQ
-afQ
-afQ
-afQ
-afQ
-baE
+ahT
+aeD
+kQP
rNX
-jBe
bzx
bBg
+bBg
+bBg
+bBg
pZb
bJu
bKZ
@@ -98424,16 +98322,16 @@ bgA
biz
bkb
blZ
-baE
+bnR
ahT
-afQ
-afQ
+ahT
+bKX
aju
-afQ
-baE
-bBh
-xmb
-iSt
+syk
+qkY
+bGk
+bGk
+bGk
bGk
bKZ
bHL
@@ -98681,18 +98579,18 @@ bpt
bcW
bkc
bma
-baE
-ahT
+bBh
+bEt
aiW
-afQ
+dig
amv
-afQ
-baE
-bBf
+wlH
+bzx
+bBi
bCM
-bzx
-bzx
-bHM
+bBg
+bBg
+bBg
bJv
drp
heE
@@ -98939,21 +98837,21 @@ bcW
dhP
bqd
baE
-aiT
-ajk
-afQ
-amB
-afQ
baE
-djW
-bsx
+baE
+baE
+bqd
xfI
bzx
-bEs
+jRo
+mot
+bBg
+bBg
+bBg
bJw
lws
bMC
-xLL
+bOg
bzx
bRe
xDn
@@ -99195,18 +99093,18 @@ bgC
biB
bkd
bmb
-baE
-baE
-baE
-baE
-baE
-baE
-baE
-bBf
+bEp
+bGj
+bJp
+eiS
+jBe
+xmb
+bzx
+vuY
bNh
bNK
-bzx
-dig
+bBg
+bBg
bJx
bLa
bMD
@@ -99456,12 +99354,12 @@ bnS
bqj
bsu
btY
-bqj
-bsu
-bEt
-nhy
-mcS
-bvW
+maP
+xLL
+bzx
+bzx
+bzx
+bzx
bzx
bzx
bzx
@@ -99715,7 +99613,7 @@ bsv
btZ
bvV
bxN
-bGj
+bvW
dhZ
bCP
bvW
@@ -99973,9 +99871,9 @@ baE
bvW
bxO
bvW
-bvW
-bvW
-bvW
+dhZ
+fDG
+jdf
bGm
bHO
bvW
@@ -100233,7 +100131,7 @@ bzA
bBm
bCR
bvW
-syk
+bvW
bvW
bvW
bLd
@@ -100489,7 +100387,7 @@ bxQ
bzB
bBn
bCS
-eiS
+bBn
bQN
dih
bvW
@@ -113599,8 +113497,8 @@ bDj
bFb
bGQ
bGM
-bJY
-bLD
+bNr
+bLF
bNp
bOK
bQu
@@ -114113,7 +114011,7 @@ bDw
bFd
bGS
bGM
-bKa
+bNp
bLF
bNr
bOM
@@ -117230,16 +117128,16 @@ cvX
cwY
crR
cyJ
-czB
-cAG
+cBs
+cBs
cBB
cCC
cDp
+czB
+cAG
+cEz
cyK
-cyK
-cyK
-cyK
-cPe
+dxQ
dvY
cJY
cKM
@@ -117493,9 +117391,9 @@ cBC
cyK
cyK
cyK
-dvY
-dyc
-cub
+cyK
+cyK
+cyK
diP
dvY
cJZ
@@ -117751,9 +117649,9 @@ cCD
uun
rSL
dvY
-cEz
-dxQ
dyc
+gGH
+pVL
dvY
cKa
cKO
diff --git a/_maps/map_files/Mining/Lavaland.dmm b/_maps/map_files/Mining/Lavaland.dmm
index d3a1012177..a772122491 100644
--- a/_maps/map_files/Mining/Lavaland.dmm
+++ b/_maps/map_files/Mining/Lavaland.dmm
@@ -192,14 +192,14 @@
/area/ruin/unpowered/ash_walkers)
"ft" = (
/obj/structure/stone_tile/block,
-/obj/item/twohanded/bonespear,
+/obj/item/spear/bonespear,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
"fN" = (
/obj/structure/stone_tile{
dir = 4
},
-/obj/item/twohanded/bonespear,
+/obj/item/spear/bonespear,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"fQ" = (
@@ -529,7 +529,7 @@
},
/obj/structure/table/wood,
/obj/item/clothing/head/helmet/roman/legionnaire,
-/obj/item/twohanded/bonespear,
+/obj/item/spear/bonespear,
/turf/open/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
"iK" = (
@@ -1829,8 +1829,8 @@
"An" = (
/obj/structure/stone_tile/slab,
/obj/structure/table/wood,
-/obj/item/twohanded/bonespear,
-/obj/item/twohanded/bonespear,
+/obj/item/spear/bonespear,
+/obj/item/spear/bonespear,
/turf/open/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
"AH" = (
@@ -1840,7 +1840,7 @@
/obj/structure/stone_tile/cracked{
dir = 8
},
-/obj/item/twohanded/bonespear,
+/obj/item/spear/bonespear,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
"AU" = (
@@ -2069,7 +2069,7 @@
},
/obj/structure/table/wood,
/obj/item/scythe,
-/obj/item/twohanded/bonespear,
+/obj/item/spear/bonespear,
/turf/open/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
"HX" = (
@@ -2198,7 +2198,7 @@
},
/obj/structure/table/wood,
/obj/item/storage/belt,
-/obj/item/twohanded/bonespear,
+/obj/item/spear/bonespear,
/turf/open/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
"Qk" = (
@@ -2425,7 +2425,7 @@
/obj/structure/stone_tile/cracked{
dir = 1
},
-/obj/item/twohanded/bonespear,
+/obj/item/spear/bonespear,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
"WT" = (
diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm
index ebdda21c5e..f3b1b2afb6 100644
--- a/_maps/map_files/OmegaStation/OmegaStation.dmm
+++ b/_maps/map_files/OmegaStation/OmegaStation.dmm
@@ -545,7 +545,7 @@
dir = 4
},
/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21";
pixel_x = -3;
pixel_y = 3
@@ -601,7 +601,7 @@
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/effect/turf_decal/tile/neutral{
@@ -1288,17 +1288,31 @@
/turf/open/floor/plating,
/area/engine/gravity_generator)
"abR" = (
-/obj/structure/lattice,
-/turf/open/space,
-/area/asteroid/nearstation)
+/obj/machinery/vr_sleeper{
+ dir = 4
+ },
+/obj/machinery/light/small{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/security/prison)
"abS" = (
/obj/item/stack/ore/glass,
/obj/effect/turf_decal/sand/plating,
/turf/open/floor/plating,
/area/asteroid/nearstation)
"abT" = (
-/turf/closed/wall,
-/area/asteroid/nearstation)
+/obj/machinery/door/airlock{
+ name = "Unisex Restroom"
+ },
+/turf/open/floor/plasteel/freezer,
+/area/security/prison)
"abU" = (
/turf/closed/wall/r_wall,
/area/crew_quarters/heads/hos)
@@ -1716,11 +1730,15 @@
/turf/open/floor/plating/asteroid,
/area/asteroid/nearstation)
"acE" = (
-/obj/effect/decal/cleanable/blood/old,
-/turf/open/floor/plating{
- icon_state = "platingdmg1"
+/obj/structure/sink{
+ dir = 4;
+ pixel_x = 12
},
-/area/asteroid/nearstation)
+/obj/machinery/shower{
+ pixel_y = 26
+ },
+/turf/open/floor/plasteel/freezer,
+/area/security/prison)
"acF" = (
/turf/open/floor/plating,
/area/asteroid/nearstation)
@@ -1735,9 +1753,8 @@
/turf/open/floor/wood,
/area/crew_quarters/heads/hos)
"acH" = (
-/obj/effect/decal/cleanable/cobweb/cobweb2,
-/turf/open/floor/plating,
-/area/asteroid/nearstation)
+/turf/closed/wall/r_wall,
+/area/security/prison)
"acI" = (
/obj/structure/window/reinforced{
dir = 8
@@ -1754,18 +1771,9 @@
/turf/open/floor/plasteel/white,
/area/crew_quarters/heads/hos)
"acJ" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/door/airlock/maintenance_hatch{
- name = "Maintenance Hatch";
- req_access_txt = "12"
- },
-/turf/open/floor/plasteel,
-/area/asteroid/nearstation)
+/obj/structure/girder,
+/turf/open/floor/plating,
+/area/security/prison)
"acK" = (
/obj/structure/dresser,
/obj/structure/sign/warning/vacuum{
@@ -2220,21 +2228,21 @@
/turf/open/floor/plating,
/area/asteroid/nearstation)
"adw" = (
-/turf/open/floor/plating{
- icon_state = "panelscorched"
+/obj/machinery/camera{
+ c_tag = "Prison - VR Sleepers"
},
-/area/asteroid/nearstation)
+/turf/open/floor/plasteel,
+/area/security/prison)
"adx" = (
-/obj/item/clothing/suit/space/orange,
-/obj/item/clothing/head/helmet/space/orange,
-/turf/open/floor/plating,
+/obj/structure/sign/warning/securearea,
+/turf/closed/wall/r_wall,
/area/asteroid/nearstation)
"ady" = (
/turf/closed/wall/rust,
/area/quartermaster/qm)
"adz" = (
-/obj/structure/sign/warning/vacuum,
-/turf/closed/wall,
+/obj/structure/lattice/catwalk,
+/turf/open/floor/plating/asteroid/airless,
/area/asteroid/nearstation)
"adA" = (
/obj/machinery/status_display,
@@ -2351,7 +2359,7 @@
/obj/structure/cable/white{
icon_state = "4-8"
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/machinery/atmospherics/components/unary/vent_pump/on{
@@ -2666,9 +2674,11 @@
/turf/open/floor/plating,
/area/asteroid/nearstation)
"aem" = (
-/turf/open/floor/plating{
- icon_state = "platingdmg3"
+/obj/structure/lattice/catwalk,
+/obj/structure/sign/warning/securearea{
+ pixel_x = 32
},
+/turf/open/floor/plating/asteroid/airless,
/area/asteroid/nearstation)
"aen" = (
/obj/structure/cable/white{
@@ -2691,10 +2701,8 @@
/turf/open/floor/wood,
/area/crew_quarters/heads/hos)
"aep" = (
-/turf/open/floor/plating{
- icon_state = "platingdmg2"
- },
-/area/asteroid/nearstation)
+/turf/open/floor/plasteel,
+/area/security/prison)
"aeq" = (
/obj/machinery/door/airlock/silver{
name = "Bathroom"
@@ -3225,36 +3233,39 @@
/turf/open/floor/wood,
/area/crew_quarters/heads/hos)
"afe" = (
-/obj/machinery/door/airlock/maintenance_hatch{
- name = "Security Maintenance";
- req_access_txt = "63"
- },
/obj/effect/turf_decal/stripes/line{
dir = 8
},
/obj/effect/turf_decal/stripes/line{
dir = 4
},
+/obj/machinery/door/firedoor,
+/obj/machinery/turnstile{
+ name = "Genpop Exit Turnstile";
+ req_access_txt = "70";
+ dir = 8
+ },
/turf/open/floor/plasteel,
-/area/security/brig)
+/area/security/prison)
"aff" = (
/turf/closed/wall,
/area/crew_quarters/heads/hos)
"afg" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/effect/turf_decal/stripes/line{
+/obj/item/stack/ore/glass,
+/turf/open/floor/plating/asteroid/airless,
+/area/asteroid/nearstation)
+"afh" = (
+/obj/machinery/vr_sleeper{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red{
dir = 1
},
-/obj/machinery/door/airlock/maintenance_hatch{
- name = "Security Maintenance";
- req_access_txt = "63"
+/obj/effect/turf_decal/tile/red{
+ dir = 8
},
/turf/open/floor/plasteel,
-/area/security/brig)
-"afh" = (
-/obj/structure/barricade/wooden,
-/turf/open/floor/plating,
-/area/asteroid/nearstation)
+/area/security/prison)
"afi" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 8
@@ -3287,7 +3298,7 @@
/turf/open/floor/plasteel/dark,
/area/crew_quarters/heads/captain/private)
"afl" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/wood,
/area/crew_quarters/heads/captain/private)
"afm" = (
@@ -3324,7 +3335,7 @@
/obj/machinery/recharger{
pixel_x = 5
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-15";
pixel_x = -6;
pixel_y = 12
@@ -3691,9 +3702,14 @@
/turf/open/floor/plasteel,
/area/quartermaster/storage)
"afL" = (
-/obj/structure/girder/reinforced,
-/turf/open/floor/plating,
-/area/asteroid/nearstation)
+/obj/machinery/hydroponics/soil,
+/obj/item/seeds/carrot,
+/obj/machinery/camera{
+ c_tag = "Prison - Main Room";
+ dir = 4
+ },
+/turf/open/floor/plating/asteroid,
+/area/security/prison)
"afM" = (
/obj/item/stack/ore/iron,
/obj/structure/barricade/wooden,
@@ -3719,20 +3735,10 @@
/turf/open/floor/plasteel,
/area/quartermaster/storage)
"afP" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/obj/item/poster/random_contraband{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/item/poster/random_contraband{
- pixel_x = -3;
- pixel_y = -3
- },
-/obj/item/poster/random_contraband,
-/turf/open/floor/plasteel,
-/area/asteroid/nearstation)
+/obj/machinery/hydroponics/soil,
+/obj/item/seeds/grass,
+/turf/open/floor/plating/asteroid,
+/area/security/prison)
"afQ" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -4251,22 +4257,20 @@
/turf/closed/wall/r_wall,
/area/security/brig)
"agG" = (
-/obj/structure/reagent_dispensers/peppertank{
+/obj/machinery/newscaster{
pixel_y = 32
},
-/turf/open/floor/plasteel/dark,
-/area/security/brig)
+/turf/open/floor/plasteel,
+/area/security/prison)
"agH" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6
+/obj/machinery/light/small{
+ dir = 1
},
-/obj/effect/turf_decal/delivery,
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
+/obj/effect/turf_decal/loading_area{
+ dir = 4
},
-/turf/open/floor/plasteel/dark,
-/area/security/brig)
+/turf/open/floor/plasteel,
+/area/security/prison)
"agI" = (
/obj/structure/table/wood,
/obj/item/paper_bin,
@@ -4290,8 +4294,7 @@
department = "Head of Security's Desk";
departmentType = 5;
name = "Head of Security RC";
- pixel_x = 30;
- pixel_y = 0
+ pixel_x = 30
},
/obj/machinery/computer/security/hos{
icon_state = "computer";
@@ -4794,27 +4797,23 @@
/turf/open/floor/plasteel,
/area/quartermaster/storage)
"ahu" = (
-/turf/closed/wall/r_wall,
-/area/asteroid/nearstation)
-"ahv" = (
-/obj/machinery/door/firedoor,
-/obj/structure/cable/white{
- icon_state = "2-8"
- },
-/obj/structure/cable/white{
- icon_state = "2-4"
- },
-/obj/machinery/door/airlock/security/glass{
- name = "Security E.V.A. Storage";
- req_access_txt = "63"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/effect/turf_decal/stripes/line,
/obj/effect/turf_decal/stripes/line{
dir = 1
},
+/obj/machinery/door/airlock/maintenance_hatch{
+ name = "Security Maintenance";
+ req_access_txt = "63"
+ },
+/obj/machinery/door/firedoor,
/turf/open/floor/plasteel,
-/area/security/brig)
+/area/security/prison)
+"ahv" = (
+/obj/effect/turf_decal/loading_area{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/security/prison)
"ahw" = (
/turf/open/floor/plasteel/grimy,
/area/crew_quarters/heads/hos)
@@ -4853,24 +4852,23 @@
/turf/open/floor/plasteel,
/area/crew_quarters/heads/hos)
"ahz" = (
-/obj/structure/sign/nanotrasen{
- pixel_x = -32
+/obj/structure/reagent_dispensers/peppertank{
+ pixel_y = 32
},
-/obj/machinery/light{
- dir = 8
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 6
},
/turf/open/floor/plasteel/dark,
/area/security/brig)
"ahA" = (
-/obj/structure/rack,
-/obj/item/clothing/suit/fire/firefighter,
-/obj/item/clothing/mask/gas,
-/obj/item/clothing/head/hardhat/red,
-/obj/effect/turf_decal/stripes/line{
- dir = 6
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/structure/chair{
+ dir = 8
},
/turf/open/floor/plasteel,
-/area/asteroid/nearstation)
+/area/security/prison)
"ahB" = (
/obj/effect/turf_decal/sand/plating,
/obj/item/stack/ore/silver,
@@ -4878,17 +4876,34 @@
/turf/open/floor/plating,
/area/asteroid/nearstation)
"ahC" = (
-/obj/machinery/status_display/ai{
- pixel_x = 32
+/obj/structure/sign/nanotrasen{
+ pixel_x = -32
},
+/obj/machinery/light{
+ dir = 8
+ },
+/obj/structure/closet{
+ name = "Evidence Closet"
+ },
+/obj/item/poster/random_contraband{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/item/poster/random_contraband{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/poster/random_contraband,
/turf/open/floor/plasteel/dark,
/area/security/brig)
"ahD" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 9
+/obj/machinery/light/small{
+ brightness = 3;
+ dir = 8
},
-/turf/open/floor/plasteel,
-/area/asteroid/nearstation)
+/obj/item/reagent_containers/glass/bucket,
+/turf/open/floor/plating/asteroid,
+/area/security/prison)
"ahE" = (
/obj/structure/table/wood,
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
@@ -5266,16 +5281,8 @@
/turf/open/floor/plating,
/area/asteroid/nearstation)
"ail" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/effect/landmark/start/chief_medical_officer,
-/turf/open/floor/plasteel/dark,
-/area/medical/morgue)
+/turf/closed/wall,
+/area/medical/genetics)
"aim" = (
/obj/structure/chair/office/dark{
dir = 8
@@ -5387,16 +5394,9 @@
/turf/open/floor/plasteel/dark,
/area/security/brig)
"aiv" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
- },
-/obj/effect/turf_decal/delivery,
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/security/brig)
+/obj/item/cultivator,
+/turf/open/floor/plating/asteroid,
+/area/security/prison)
"aiw" = (
/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden,
/obj/item/stack/cable_coil/white,
@@ -5551,21 +5551,28 @@
/turf/open/floor/plasteel,
/area/quartermaster/storage)
"aiJ" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/tile/yellow{
+/obj/machinery/light{
dir = 1
},
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
+/obj/machinery/power/apc/highcap/five_k{
+ areastring = "/area/medical/chemistry";
+ dir = 1;
+ name = "Chemistry Lab APC";
+ pixel_y = 25
+ },
+/obj/structure/cable/white{
+ icon_state = "0-2"
+ },
+/obj/item/kirbyplants{
+ icon_state = "plant-21"
+ },
+/obj/machinery/camera{
+ c_tag = "Chemistry"
},
/obj/effect/turf_decal/tile/yellow{
dir = 8
},
-/obj/effect/landmark/start/chemist,
-/turf/open/floor/plasteel,
+/turf/open/floor/plasteel/white,
/area/medical/chemistry)
"aiK" = (
/obj/structure/closet/crate/bin,
@@ -5651,23 +5658,20 @@
/turf/open/floor/plasteel/white,
/area/science/research)
"aiQ" = (
-/obj/structure/cable/white{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/tile/blue{
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 1
},
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
+/obj/structure/cable/white{
+ icon_state = "2-4"
},
-/obj/effect/turf_decal/tile/blue{
- dir = 8
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/tile/purple{
+ dir = 1
},
-/obj/effect/landmark/start/paramedic,
/turf/open/floor/plasteel,
-/area/medical/medbay/zone3)
+/area/hallway/primary/port/aft)
"aiR" = (
/obj/machinery/suit_storage_unit/security,
/obj/machinery/firealarm{
@@ -5687,15 +5691,14 @@
/turf/open/floor/plasteel/dark,
/area/security/brig)
"aiS" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 10
+/obj/structure/sign/poster/official/do_not_question{
+ pixel_y = -32
+ },
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 4
},
-/obj/structure/table,
-/obj/item/extinguisher/mini,
-/obj/item/tank/internals/emergency_oxygen/engi,
-/obj/item/clothing/mask/breath,
/turf/open/floor/plasteel,
-/area/asteroid/nearstation)
+/area/security/prison)
"aiT" = (
/obj/structure/rack,
/obj/item/gun/energy/ionrifle,
@@ -5775,51 +5778,24 @@
/turf/open/floor/plating,
/area/security/brig)
"aja" = (
-/obj/structure/closet/secure_closet/brig{
- id = "brig1";
- name = "Cell 1 Locker"
+/obj/machinery/status_display/ai{
+ pixel_x = 32
},
-/obj/machinery/light/small{
- dir = 1
+/obj/structure/closet{
+ name = "Evidence Closet"
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel,
+/turf/open/floor/plasteel/dark,
/area/security/brig)
"ajb" = (
-/obj/machinery/flasher{
- id = "brig1";
- pixel_y = 26
+/obj/item/radio/intercom{
+ name = "Station Intercom";
+ pixel_y = -26
},
-/obj/structure/chair,
-/obj/structure/cable/white{
- icon_state = "2-4"
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 8
- },
-/obj/machinery/camera{
- c_tag = "Security - Cell 1"
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/turf/open/floor/plasteel,
-/area/security/brig)
+/area/security/prison)
"ajc" = (
/obj/structure/cable/white{
icon_state = "0-8"
@@ -5832,7 +5808,7 @@
/turf/open/floor/plating,
/area/security/brig)
"ajd" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
@@ -6176,7 +6152,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 10
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/machinery/camera{
@@ -6188,21 +6164,8 @@
/turf/open/floor/plasteel,
/area/hallway/primary/starboard/fore)
"ajG" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/effect/landmark/start/chief_medical_officer,
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/zone3)
+/turf/closed/wall/r_wall,
+/area/crew_quarters/heads/cmo)
"ajH" = (
/obj/structure/plasticflaps/opaque,
/obj/effect/turf_decal/delivery,
@@ -6314,10 +6277,14 @@
/turf/open/floor/plasteel,
/area/science/mixing)
"ajQ" = (
-/obj/item/stack/ore/iron,
-/obj/effect/turf_decal/sand/plating,
-/turf/open/floor/plating,
-/area/asteroid/nearstation)
+/obj/effect/turf_decal/loading_area{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/security/prison)
"ajR" = (
/obj/machinery/photocopier,
/obj/machinery/firealarm{
@@ -6425,27 +6392,23 @@
/turf/open/floor/plasteel,
/area/security/brig)
"ajZ" = (
-/obj/structure/cable/white{
- icon_state = "1-4"
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
},
-/obj/structure/cable/white{
- icon_state = "4-8"
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
},
-/obj/machinery/door/window/brigdoor/security/cell/westright{
- id = "brig1";
- name = "Cell 1"
+/obj/machinery/door/firedoor,
+/obj/machinery/turnstile{
+ name = "Genpop Entrance Turnstile";
+ req_access_txt = "69";
+ dir = 4
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
/turf/open/floor/plasteel,
-/area/security/brig)
+/area/security/prison)
"aka" = (
/obj/structure/cable/white{
icon_state = "4-8"
@@ -6457,21 +6420,15 @@
/turf/open/floor/plasteel,
/area/security/brig)
"akb" = (
-/obj/structure/cable/white{
- icon_state = "1-4"
- },
-/obj/structure/cable/white{
- icon_state = "1-8"
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
},
+/obj/structure/rack,
+/obj/item/clothing/suit/fire/firefighter,
+/obj/item/clothing/mask/gas,
+/obj/item/clothing/head/hardhat/red,
/turf/open/floor/plasteel,
-/area/security/brig)
+/area/maintenance/port/fore)
"akc" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/effect/turf_decal/tile/red{
@@ -7158,11 +7115,6 @@
/turf/open/floor/plasteel,
/area/security/brig)
"akZ" = (
-/obj/machinery/door_timer{
- id = "brig1";
- name = "Cell 1";
- pixel_x = 32
- },
/obj/structure/chair{
dir = 8
},
@@ -7170,6 +7122,9 @@
dir = 4
},
/obj/effect/turf_decal/tile/red,
+/obj/machinery/status_display{
+ pixel_x = 32
+ },
/turf/open/floor/plasteel,
/area/security/brig)
"ala" = (
@@ -7273,7 +7228,7 @@
/turf/closed/wall,
/area/hallway/primary/central)
"alm" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/machinery/light{
@@ -7329,7 +7284,7 @@
/turf/open/floor/plasteel,
/area/hallway/primary/fore)
"als" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/machinery/light{
@@ -8019,7 +7974,7 @@
pixel_y = -24
},
/obj/machinery/light,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/brown,
@@ -8681,7 +8636,7 @@
/turf/open/floor/plasteel,
/area/security/brig)
"anF" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/machinery/door_timer{
@@ -8752,7 +8707,7 @@
name = "Station Intercom";
pixel_x = -26
},
-/obj/item/twohanded/rcl/pre_loaded,
+/obj/item/rcl/pre_loaded,
/turf/open/floor/plasteel/dark,
/area/crew_quarters/heads/chief)
"anL" = (
@@ -9097,7 +9052,7 @@
/turf/open/floor/plasteel,
/area/quartermaster/miningdock)
"aon" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/structure/cable/white{
@@ -10513,21 +10468,8 @@
/turf/open/floor/plasteel,
/area/hallway/primary/starboard/fore)
"aqo" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/door/airlock/external{
- name = "External Airlock";
- req_access_txt = "13"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/maintenance/port)
+/turf/closed/wall/r_wall,
+/area/maintenance/port/aft)
"aqp" = (
/obj/machinery/autolathe,
/obj/structure/extinguisher_cabinet{
@@ -10615,17 +10557,15 @@
/turf/open/floor/plating,
/area/crew_quarters/heads/hos)
"aqx" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
+/obj/structure/cable/white{
+ icon_state = "2-4"
},
-/obj/effect/landmark/xeno_spawn,
-/obj/structure/sign/warning/vacuum{
- pixel_x = -32;
- pixel_y = 32
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 6
},
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
-/area/maintenance/port)
+/obj/effect/decal/cleanable/cobweb,
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
"aqy" = (
/obj/structure/cable/white,
/obj/effect/spawner/structure/window/reinforced,
@@ -10813,7 +10753,7 @@
/turf/open/floor/plasteel,
/area/security/brig)
"aqP" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/machinery/firealarm{
@@ -11151,11 +11091,18 @@
/turf/open/floor/plating,
/area/maintenance/port/fore)
"art" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 10
+/obj/machinery/firealarm{
+ dir = 1;
+ pixel_y = -26
+ },
+/obj/effect/turf_decal/loading_area{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
},
/turf/open/floor/plasteel,
-/area/maintenance/port/fore)
+/area/security/prison)
"aru" = (
/obj/machinery/newscaster/security_unit{
pixel_x = -32
@@ -11740,7 +11687,7 @@
/turf/open/floor/plasteel/dark,
/area/crew_quarters/bar/atrium)
"ase" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/red{
@@ -11800,7 +11747,7 @@
/turf/open/floor/plasteel,
/area/crew_quarters/bar/atrium)
"asi" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/effect/turf_decal/tile/red{
@@ -12723,24 +12670,14 @@
/turf/open/floor/wood,
/area/security/detectives_office)
"atE" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
+/obj/structure/cable/white{
+ icon_state = "4-8"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/door/airlock/external{
- name = "External Airlock";
- req_access_txt = "13"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/maintenance/port)
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
"atF" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
@@ -13073,7 +13010,7 @@
/obj/structure/window/reinforced{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21";
pixel_x = -3;
pixel_y = 3
@@ -13317,7 +13254,6 @@
dir = 9
},
/obj/machinery/computer/security/wooden_tv{
- pixel_x = 0;
pixel_y = 4
},
/turf/open/floor/wood,
@@ -13712,7 +13648,7 @@
/obj/structure/window/reinforced{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
@@ -14025,15 +13961,16 @@
/turf/open/floor/wood,
/area/security/detectives_office)
"avB" = (
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/structure/sign/warning/vacuum{
- pixel_x = -32;
- pixel_y = 32
+/turf/open/floor/plating{
+ icon_state = "panelscorched"
},
-/turf/open/floor/plating,
-/area/maintenance/port)
+/area/maintenance/port/aft)
"avC" = (
/obj/structure/sign/poster/ripped,
/turf/closed/wall/rust,
@@ -14297,7 +14234,7 @@
dir = 8;
pixel_x = 24
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/neutral,
@@ -14690,11 +14627,16 @@
/turf/open/floor/engine/o2,
/area/engine/atmos)
"awB" = (
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/turf/open/floor/plating,
-/area/maintenance/port)
+/turf/open/floor/plating{
+ icon_state = "platingdmg1"
+ },
+/area/maintenance/port/aft)
"awC" = (
/obj/machinery/atmospherics/pipe/simple/green/visible{
dir = 4
@@ -14730,27 +14672,46 @@
/area/maintenance/starboard/aft)
"awE" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
+ dir = 4
+ },
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
},
/turf/open/floor/plating,
-/area/maintenance/port)
+/area/maintenance/port/aft)
"awF" = (
/obj/machinery/atmospherics/pipe/simple/cyan/visible,
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plasteel,
/area/engine/atmos)
"awG" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/maintenance/port)
-"awH" = (
+/obj/machinery/door/airlock/maintenance_hatch{
+ name = "Maintenance Hatch";
+ req_access_txt = "12"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/maintenance/port/aft)
+"awH" = (
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 1
},
-/obj/machinery/light/small,
-/obj/structure/closet/emcloset/anchored,
-/turf/open/floor/plasteel,
-/area/maintenance/port)
+/turf/closed/wall/r_wall,
+/area/maintenance/port/aft)
"awI" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
dir = 5
@@ -14778,11 +14739,15 @@
/turf/open/floor/plasteel/dark/corner,
/area/engine/atmos)
"awL" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 5
+/obj/structure/cable/white{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
},
/turf/open/floor/plating,
-/area/maintenance/port)
+/area/maintenance/port/aft)
"awM" = (
/obj/structure/cable/white{
icon_state = "1-2"
@@ -15045,69 +15010,72 @@
/turf/open/floor/plasteel,
/area/maintenance/starboard)
"axh" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+/obj/structure/closet,
+/obj/effect/spawner/lootdrop/maintenance{
+ lootcount = 3;
+ name = "3maintenance loot spawner"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/turf/open/floor/plating/airless,
-/area/maintenance/port)
+/obj/effect/turf_decal/delivery,
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
+ },
+/turf/open/floor/plasteel,
+/area/maintenance/port/aft)
"axi" = (
/obj/machinery/air_sensor/atmos/oxygen_tank,
/turf/open/floor/engine/o2,
/area/engine/atmos)
"axj" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
},
-/turf/open/floor/plasteel,
-/area/maintenance/port)
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/obj/structure/cable/white{
+ icon_state = "2-4"
+ },
+/turf/open/floor/wood,
+/area/library)
"axk" = (
+/obj/structure/girder,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
+"axl" = (
+/obj/structure/closet/firecloset,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/delivery,
/obj/effect/turf_decal/stripes/line{
dir = 1
},
-/obj/structure/closet/crate,
-/obj/item/stack/ore/silver,
-/obj/item/stack/ore/iron,
-/obj/item/stack/ore/iron,
-/obj/item/stack/ore/iron,
-/obj/item/pickaxe/emergency,
/turf/open/floor/plasteel,
-/area/maintenance/port)
-"axl" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/machinery/door/airlock/maintenance_hatch{
- name = "Maintenance Hatch";
- req_access_txt = "12"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/maintenance/port)
+/area/maintenance/port/aft)
"axm" = (
/obj/machinery/atmospherics/components/unary/thermomachine/freezer,
/turf/open/floor/plasteel,
/area/engine/atmos)
"axn" = (
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
+/obj/structure/rack,
+/obj/item/reagent_containers/food/drinks/bottle/whiskey,
+/obj/effect/spawner/lootdrop/maintenance,
+/obj/machinery/light/small,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+/obj/effect/turf_decal/delivery,
+/obj/effect/turf_decal/stripes/line{
dir = 1
},
-/turf/open/floor/plasteel/dark,
-/area/maintenance/port)
+/turf/open/floor/plasteel,
+/area/maintenance/port/aft)
"axo" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
/obj/effect/turf_decal/stripes/line{
@@ -15132,7 +15100,7 @@
/obj/machinery/status_display/ai{
pixel_y = 32
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/bot,
@@ -15384,22 +15352,20 @@
/turf/open/floor/carpet,
/area/crew_quarters/dorms)
"axL" = (
-/obj/machinery/door/airlock/maintenance_hatch{
- name = "Maintenance Hatch";
- req_access_txt = "12"
+/obj/structure/rack,
+/obj/effect/spawner/lootdrop/maintenance{
+ lootcount = 2;
+ name = "2maintenance loot spawner"
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
+/obj/effect/turf_decal/delivery,
/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
+ dir = 1
},
/turf/open/floor/plasteel,
-/area/maintenance/port)
+/area/maintenance/port/aft)
"axM" = (
/obj/structure/table/wood,
/obj/item/lipstick/random{
@@ -15549,12 +15515,11 @@
/turf/open/floor/plasteel/dark,
/area/crew_quarters/bar/atrium)
"axU" = (
-/obj/structure/table/wood,
-/obj/item/paper_bin,
-/obj/item/pen,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/dark,
-/area/maintenance/port)
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/closed/wall,
+/area/maintenance/port/aft)
"axV" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/newscaster{
@@ -15571,19 +15536,82 @@
/turf/closed/wall,
/area/hallway/secondary/exit)
"axX" = (
-/obj/effect/landmark/xeno_spawn,
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/closed/wall/r_wall/rust,
+/area/maintenance/port/aft)
+"axY" = (
+/obj/structure/cable/white{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/landmark/event_spawn,
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
+"axZ" = (
+/turf/closed/wall/r_wall/rust,
+/area/security/prison)
+"aya" = (
+/obj/machinery/door/firedoor,
+/obj/structure/cable/white{
+ icon_state = "2-8"
+ },
+/obj/structure/cable/white{
+ icon_state = "2-4"
+ },
+/obj/machinery/door/airlock/security/glass{
+ name = "Security E.V.A. Storage";
+ req_access_txt = "63"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/stripes/line{
dir = 1
},
-/turf/open/floor/wood,
-/area/maintenance/port)
-"axY" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+/obj/structure/cable/white{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel,
+/area/security/brig)
+"ayb" = (
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/security/prison)
+"ayc" = (
+/obj/effect/turf_decal/tile/red{
dir = 4
},
-/obj/item/cigbutt,
-/turf/open/floor/plating,
-/area/maintenance/port)
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/security/prison)
+"ayd" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/structure/closet/crate,
+/obj/effect/spawner/lootdrop/maintenance{
+ lootcount = 2;
+ name = "2maintenance loot spawner"
+ },
+/turf/open/floor/plasteel,
+/area/maintenance/port/fore)
+"aye" = (
+/obj/machinery/hydroponics/soil,
+/obj/item/seeds/ambrosia,
+/turf/open/floor/plating/asteroid,
+/area/security/prison)
+"ayf" = (
+/obj/machinery/hydroponics/soil,
+/obj/item/seeds/potato,
+/turf/open/floor/plating/asteroid,
+/area/security/prison)
+"ayg" = (
+/obj/item/stack/ore/glass,
+/turf/open/floor/plating/asteroid,
+/area/asteroid/nearstation)
"ayh" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{
dir = 8
@@ -15746,6 +15774,16 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/dorms)
+"ayy" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/structure/closet/crate{
+ icon_state = "crateopen"
+ },
+/obj/effect/spawner/lootdrop/maintenance,
+/turf/open/floor/plasteel,
+/area/maintenance/port/fore)
"ayz" = (
/turf/open/floor/plasteel/grimy,
/area/crew_quarters/dorms)
@@ -15768,6 +15806,30 @@
/obj/item/bedsheet/red,
/turf/open/floor/carpet,
/area/crew_quarters/dorms)
+"ayD" = (
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/security/glass{
+ id_tag = "secinterior";
+ name = "Brig";
+ req_access_txt = "63"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/structure/cable/white{
+ icon_state = "1-8"
+ },
+/turf/open/floor/plasteel,
+/area/security/brig)
"ayE" = (
/obj/structure/table/wood,
/obj/item/instrument/violin,
@@ -16095,6 +16157,95 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/hallway/secondary/exit)
+"azc" = (
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/obj/machinery/light/small,
+/turf/open/floor/plasteel,
+/area/security/brig)
+"azd" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/obj/structure/cable/white{
+ icon_state = "1-8"
+ },
+/turf/open/floor/plasteel,
+/area/security/brig)
+"aze" = (
+/obj/machinery/door/poddoor/preopen{
+ id = "brigfront";
+ name = "Brig Blast door"
+ },
+/obj/machinery/turnstile{
+ name = "Genpop Exit Turnstile";
+ req_access_txt = "70";
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/security/brig)
+"azf" = (
+/obj/item/clothing/suit/space/orange,
+/obj/item/clothing/head/helmet/space/orange,
+/turf/open/floor/plating/asteroid,
+/area/asteroid/nearstation)
+"azg" = (
+/obj/machinery/door/airlock/maintenance_hatch{
+ name = "Maintenance Hatch";
+ req_access_txt = "12"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/maintenance/port/fore)
+"azh" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/obj/structure/table,
+/obj/item/extinguisher/mini,
+/obj/item/tank/internals/emergency_oxygen/engi,
+/obj/item/clothing/mask/breath,
+/obj/machinery/light/small{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/maintenance/port/fore)
+"azi" = (
+/turf/closed/wall,
+/area/security/prison)
+"azj" = (
+/obj/machinery/light/small{
+ brightness = 3;
+ dir = 8
+ },
+/obj/structure/toilet{
+ dir = 8
+ },
+/turf/open/floor/plasteel/freezer,
+/area/security/prison)
+"azk" = (
+/obj/item/stack/ore/silver,
+/obj/item/stack/ore/iron,
+/turf/open/floor/plating/asteroid/airless,
+/area/asteroid/nearstation)
"azl" = (
/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/n2{
dir = 4
@@ -16123,6 +16274,15 @@
dir = 1
},
/area/engine/atmos)
+"azn" = (
+/obj/machinery/door/airlock/public/glass,
+/turf/open/floor/plasteel,
+/area/security/prison)
+"azo" = (
+/obj/machinery/holopad,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/plasteel,
+/area/security/prison)
"azp" = (
/obj/structure/cable/white{
icon_state = "1-2"
@@ -16446,6 +16606,13 @@
icon_state = "platingdmg1"
},
/area/maintenance/starboard/central)
+"azQ" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/machinery/vending/sustenance,
+/turf/open/floor/plasteel,
+/area/security/prison)
"azR" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -16558,6 +16725,43 @@
},
/turf/open/floor/plasteel,
/area/hallway/secondary/exit)
+"aAa" = (
+/obj/machinery/cryopod,
+/obj/machinery/computer/cryopod{
+ pixel_y = 26
+ },
+/turf/open/floor/plasteel,
+/area/security/prison)
+"aAb" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel,
+/area/security/prison)
+"aAc" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/security/prison)
+"aAd" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/security/prison)
+"aAe" = (
+/obj/machinery/firealarm{
+ dir = 8;
+ pixel_x = 24
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/security/prison)
+"aAf" = (
+/obj/machinery/biogenerator,
+/turf/open/floor/plasteel,
+/area/security/prison)
"aAg" = (
/turf/open/floor/engine/air,
/area/engine/atmos)
@@ -16582,6 +16786,31 @@
/obj/structure/grille,
/turf/closed/wall/r_wall,
/area/engine/atmos)
+"aAk" = (
+/obj/machinery/seed_extractor,
+/turf/open/floor/plasteel,
+/area/security/prison)
+"aAl" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/structure/sink{
+ dir = 8;
+ pixel_x = -12;
+ pixel_y = 2
+ },
+/turf/open/floor/plasteel,
+/area/security/prison)
+"aAm" = (
+/obj/effect/turf_decal/stripes/corner{
+ dir = 4
+ },
+/obj/item/plant_analyzer,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/security/prison)
"aAn" = (
/obj/machinery/atmospherics/pipe/simple/cyan/visible{
dir = 6
@@ -16589,6 +16818,12 @@
/obj/machinery/meter,
/turf/open/floor/plasteel,
/area/engine/atmos)
+"aAo" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/security/prison)
"aAp" = (
/obj/machinery/atmospherics/pipe/simple/cyan/visible{
dir = 4
@@ -16676,6 +16911,23 @@
},
/turf/open/floor/plasteel,
/area/engine/atmos)
+"aAw" = (
+/obj/machinery/door/firedoor,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/machinery/door/airlock/maintenance_hatch{
+ name = "Security Maintenance";
+ req_access_txt = "63"
+ },
+/turf/open/floor/plasteel,
+/area/security/prison)
"aAx" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
/obj/effect/turf_decal/tile/neutral{
@@ -17017,6 +17269,12 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/central)
+"aAU" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/security/prison)
"aAV" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -17166,29 +17424,151 @@
},
/turf/open/floor/plasteel,
/area/hallway/secondary/exit)
+"aBi" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 10
+ },
+/turf/open/floor/plating,
+/area/security/prison)
+"aBj" = (
+/obj/machinery/light/small{
+ dir = 8
+ },
+/obj/structure/cable/white{
+ icon_state = "0-4"
+ },
+/obj/machinery/power/apc{
+ areastring = "/area/security/prison";
+ dir = 8;
+ name = "Prison Wing APC";
+ pixel_x = -26
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel,
+/area/security/prison)
+"aBk" = (
+/obj/structure/closet/secure_closet/genpop,
+/obj/structure/cable/white{
+ icon_state = "2-8"
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/security/prison)
+"aBl" = (
+/obj/machinery/airalarm/unlocked{
+ dir = 4;
+ pixel_x = -23
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel,
+/area/security/prison)
+"aBm" = (
+/obj/structure/closet/secure_closet/genpop,
+/obj/structure/cable/white{
+ icon_state = "1-2"
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/security/prison)
+"aBn" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/cable/white{
+ icon_state = "1-8"
+ },
+/turf/open/floor/wood,
+/area/library)
+"aBo" = (
+/obj/structure/cable/white{
+ icon_state = "2-4"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/brig)
"aBp" = (
/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/oxygen_output{
dir = 1
},
/turf/open/floor/engine/o2,
/area/engine/atmos)
+"aBq" = (
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/brig)
"aBr" = (
/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/nitrogen_output{
dir = 1
},
/turf/open/floor/engine/n2,
/area/engine/atmos)
+"aBs" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/cable/white{
+ icon_state = "0-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/security/prison)
"aBt" = (
/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/nitrogen_input{
dir = 1
},
/turf/open/floor/engine/n2,
/area/engine/atmos)
+"aBu" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 9
+ },
+/turf/open/floor/plasteel,
+/area/security/prison)
+"aBv" = (
+/obj/structure/closet/secure_closet/genpop,
+/obj/machinery/camera{
+ c_tag = "Prison - Entryway";
+ dir = 8
+ },
+/obj/structure/cable/white{
+ icon_state = "1-2"
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/security/prison)
+"aBw" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel/dark,
+/area/security/brig)
+"aBx" = (
+/obj/structure/cable/white{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plasteel/dark,
+/area/security/brig)
"aBy" = (
/obj/effect/turf_decal/stripes/line,
/obj/machinery/atmospherics/pipe/simple/cyan/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
+"aBz" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plasteel,
+/area/security/prison)
"aBA" = (
/obj/structure/cable/white{
icon_state = "1-2"
@@ -17548,7 +17928,7 @@
/obj/machinery/light{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/effect/turf_decal/tile/red{
@@ -17692,18 +18072,114 @@
/obj/structure/sign/warning/vacuum,
/turf/open/floor/plating,
/area/hallway/secondary/exit)
+"aCo" = (
+/obj/structure/cable/white{
+ icon_state = "1-2"
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/security/prison)
+"aCp" = (
+/obj/effect/turf_decal/delivery,
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/brig)
+"aCq" = (
+/obj/effect/turf_decal/delivery,
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/structure/cable/white{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/brig)
+"aCr" = (
+/obj/machinery/door/firedoor,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/door/airlock/security/glass{
+ name = "Gen-Pop Access";
+ req_access_txt = "2"
+ },
+/turf/open/floor/plasteel{
+ heat_capacity = 1e+006
+ },
+/area/security/prison)
"aCs" = (
/obj/machinery/portable_atmospherics/canister/oxygen,
/obj/machinery/light/small,
/obj/machinery/atmospherics/miner/oxygen,
/turf/open/floor/engine/o2,
/area/engine/atmos)
+"aCt" = (
+/obj/machinery/door/firedoor,
+/obj/machinery/turnstile{
+ name = "Genpop Exit Turnstile";
+ icon_state = "turnstile_map";
+ dir = 1;
+ req_access_txt = "70"
+ },
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/structure/cable/white{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel{
+ heat_capacity = 1e+006
+ },
+/area/security/prison)
+"aCu" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
+ },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
+/turf/open/floor/plasteel,
+/area/security/brig)
+"aCv" = (
+/obj/structure/cable/white{
+ icon_state = "2-4"
+ },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/obj/structure/cable/white{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel,
+/area/security/brig)
"aCw" = (
/obj/machinery/portable_atmospherics/canister/nitrogen,
/obj/machinery/light/small,
/obj/machinery/atmospherics/miner/nitrogen,
/turf/open/floor/engine/n2,
/area/engine/atmos)
+"aCx" = (
+/turf/open/floor/wood,
+/area/library)
+"aCy" = (
+/turf/closed/wall,
+/area/crew_quarters/heads/cmo)
"aCz" = (
/obj/machinery/atmospherics/components/unary/portables_connector/visible{
dir = 1
@@ -17727,6 +18203,15 @@
},
/turf/open/floor/plasteel/white/corner,
/area/engine/atmos)
+"aCB" = (
+/obj/structure/cable/white{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 1
+ },
+/turf/open/floor/wood,
+/area/library)
"aCC" = (
/obj/machinery/firealarm{
dir = 1;
@@ -18128,6 +18613,13 @@
dir = 1
},
/area/hallway/secondary/exit)
+"aDf" = (
+/obj/effect/landmark/barthpot,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 9
+ },
+/turf/open/floor/wood,
+/area/library)
"aDg" = (
/obj/structure/cable/white{
icon_state = "1-8"
@@ -18170,12 +18662,90 @@
},
/turf/open/space/basic,
/area/space)
+"aDk" = (
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 1
+ },
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/tile/green{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/port/aft)
"aDl" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
},
/turf/open/floor/plasteel,
/area/engine/atmos)
+"aDm" = (
+/obj/structure/bookcase/random/fiction,
+/obj/structure/cable/white{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel/dark,
+/area/library)
+"aDn" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/structure/cable/white{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel/dark,
+/area/library)
+"aDo" = (
+/obj/structure/cable/white{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel/dark,
+/area/library)
+"aDp" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable/white{
+ icon_state = "1-8"
+ },
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/tile/purple{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/port/aft)
+"aDq" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/structure/closet/crate/bin,
+/obj/machinery/airalarm{
+ dir = 1;
+ pixel_y = -22
+ },
+/turf/open/floor/plasteel/dark,
+/area/library)
"aDr" = (
/obj/structure/sign/warning/nosmoking,
/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
@@ -18278,7 +18848,7 @@
},
/area/engine/break_room)
"aDB" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/yellow{
@@ -18651,6 +19221,106 @@
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
/area/hallway/secondary/exit)
+"aEg" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/closed/wall/r_wall,
+/area/maintenance/port/aft)
+"aEh" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/extinguisher_cabinet{
+ pixel_y = 26
+ },
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/obj/machinery/camera{
+ c_tag = "Aft Primary Hallway 4"
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/port/aft)
+"aEi" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 1
+ },
+/obj/item/radio/intercom{
+ name = "Station Intercom";
+ pixel_y = 24
+ },
+/obj/structure/cable/white{
+ icon_state = "2-8"
+ },
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/port/aft)
+"aEj" = (
+/obj/structure/cable/white{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plating{
+ icon_state = "platingdmg2"
+ },
+/area/maintenance/port/aft)
+"aEk" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/power/apc{
+ areastring = "/area/hallway/primary/port/aft";
+ dir = 1;
+ name = "Port Quarter Hallway APC";
+ pixel_y = 24
+ },
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/obj/structure/cable/white{
+ icon_state = "0-8"
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/port/aft)
+"aEl" = (
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/obj/structure/cable/white{
+ icon_state = "1-8"
+ },
+/obj/effect/turf_decal/tile/green{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/port/aft)
+"aEm" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/port/aft)
"aEn" = (
/obj/machinery/shieldgen,
/obj/structure/sign/warning/nosmoking{
@@ -18965,7 +19635,7 @@
/turf/open/floor/plasteel/dark,
/area/crew_quarters/dorms)
"aEL" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/machinery/status_display{
@@ -19308,6 +19978,17 @@
/obj/effect/landmark/blobstart,
/turf/open/floor/plating,
/area/maintenance/starboard/central)
+"aFh" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/turf/open/floor/plasteel{
+ heat_capacity = 1e+006
+ },
+/area/hallway/primary/port/aft)
"aFi" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -19318,6 +19999,21 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/starboard)
+"aFj" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/cable/white{
+ icon_state = "1-2"
+ },
+/obj/effect/turf_decal/tile/purple{
+ dir = 8
+ },
+/turf/open/floor/plasteel{
+ heat_capacity = 1e+006
+ },
+/area/hallway/primary/port/aft)
"aFk" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -19341,6 +20037,10 @@
},
/turf/open/floor/plasteel,
/area/hallway/secondary/exit)
+"aFm" = (
+/obj/machinery/status_display,
+/turf/closed/wall,
+/area/medical/genetics)
"aFn" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 4
@@ -19360,6 +20060,25 @@
},
/turf/open/floor/plasteel,
/area/hallway/secondary/exit)
+"aFo" = (
+/turf/closed/wall/rust,
+/area/medical/genetics)
+"aFp" = (
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/components/unary/vent_pump/on,
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/zone3)
"aFq" = (
/obj/machinery/power/emitter,
/obj/machinery/light/small,
@@ -19714,11 +20433,18 @@
/obj/effect/turf_decal/tile/neutral,
/turf/open/floor/plasteel,
/area/hallway/primary/port)
+"aFM" = (
+/obj/structure/cable/white{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
"aFN" = (
/obj/structure/extinguisher_cabinet{
pixel_x = -26
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/machinery/camera{
@@ -19869,6 +20595,10 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/starboard)
+"aFZ" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/closed/wall,
+/area/crew_quarters/heads/cmo)
"aGa" = (
/obj/effect/landmark/event_spawn,
/obj/item/beacon,
@@ -19902,9 +20632,28 @@
},
/turf/open/floor/plating,
/area/hallway/secondary/exit)
+"aGd" = (
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/turf/open/floor/plasteel{
+ heat_capacity = 1e+006
+ },
+/area/hallway/primary/port/aft)
"aGe" = (
/turf/closed/wall/r_wall,
/area/engine/gravity_generator)
+"aGf" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "geneticsbot";
+ name = "Genetics Privacy Shutters"
+ },
+/turf/open/floor/plating,
+/area/medical/genetics)
"aGg" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -19961,6 +20710,29 @@
},
/turf/open/floor/plasteel,
/area/engine/engineering)
+"aGl" = (
+/obj/machinery/door/firedoor,
+/obj/structure/cable/white{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/structure/table/reinforced,
+/obj/machinery/door/window/southleft{
+ name = "Genetics Desk";
+ req_access_txt = "5; 9; 68"
+ },
+/obj/item/folder/yellow,
+/obj/item/pen,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "geneticsbot";
+ name = "Genetics Privacy Shutters"
+ },
+/turf/open/floor/plasteel,
+/area/medical/genetics)
"aGm" = (
/obj/structure/sign/warning/radiation,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
@@ -20051,7 +20823,7 @@
/turf/open/floor/plasteel,
/area/engine/break_room)
"aGu" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/effect/turf_decal/tile/yellow,
@@ -20126,6 +20898,19 @@
},
/turf/open/floor/plasteel,
/area/maintenance/port/central)
+"aGC" = (
+/obj/structure/cable/white{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/zone3)
"aGD" = (
/obj/machinery/power/apc/highcap/five_k{
areastring = "/area/maintenance/port/central";
@@ -20153,6 +20938,24 @@
},
/turf/open/floor/plating,
/area/maintenance/port/central)
+"aGF" = (
+/obj/structure/mirror{
+ pixel_x = -28
+ },
+/obj/machinery/shower{
+ dir = 4;
+ name = "emergency shower"
+ },
+/obj/machinery/newscaster{
+ pixel_y = 32
+ },
+/obj/machinery/door/window/southleft,
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/medical/genetics)
"aGG" = (
/obj/structure/cable/white{
icon_state = "4-8"
@@ -20431,6 +21234,97 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/starboard)
+"aGY" = (
+/obj/structure/bed/dogbed/runtime,
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/delivery,
+/obj/structure/sign/poster/official/medical_green_cross{
+ pixel_x = -32
+ },
+/obj/machinery/camera{
+ c_tag = "CMO's Office";
+ dir = 4
+ },
+/mob/living/simple_animal/pet/cat/Runtime,
+/turf/open/floor/plasteel/dark,
+/area/crew_quarters/heads/cmo)
+"aGZ" = (
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/effect/turf_decal/loading_area,
+/obj/effect/turf_decal/stripes/corner{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/corner{
+ dir = 4
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 9
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/zone3)
+"aHa" = (
+/obj/machinery/firealarm{
+ dir = 1;
+ pixel_y = -24
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/delivery,
+/obj/structure/table/glass,
+/obj/item/storage/firstaid/brute{
+ pixel_x = 6;
+ pixel_y = 6
+ },
+/obj/item/storage/firstaid/brute{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/item/storage/firstaid/regular,
+/obj/item/storage/firstaid/brute{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/structure/window/reinforced/spawner/east,
+/obj/structure/window/reinforced/spawner/north,
+/turf/open/floor/plasteel,
+/area/medical/medbay/zone3)
+"aHb" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/closed/wall,
+/area/medical/morgue)
+"aHc" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/machinery/door/window/southright,
+/obj/item/radio/intercom{
+ name = "Station Intercom";
+ pixel_y = 26
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/medical/genetics)
+"aHd" = (
+/obj/structure/window/reinforced,
+/obj/machinery/clonepod,
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/medical/genetics)
"aHe" = (
/obj/effect/turf_decal/bot_white/right,
/obj/effect/turf_decal/tile/neutral{
@@ -20445,6 +21339,15 @@
},
/turf/open/floor/plasteel/dark,
/area/engine/gravity_generator)
+"aHf" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "geneticsbot";
+ name = "Genetics Privacy Shutters"
+ },
+/turf/open/floor/plating,
+/area/medical/genetics)
"aHg" = (
/obj/machinery/camera{
c_tag = "Gravity Generator Room";
@@ -20467,6 +21370,17 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/closed/wall/r_wall,
/area/engine/engineering)
+"aHi" = (
+/obj/structure/cable/white{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/door/airlock/grunge{
+ name = "Morgue";
+ req_access_txt = "5"
+ },
+/turf/open/floor/plasteel/dark,
+/area/medical/morgue)
"aHj" = (
/obj/structure/cable/white{
icon_state = "4-8"
@@ -20600,6 +21514,11 @@
},
/turf/open/floor/engine,
/area/engine/engineering)
+"aHs" = (
+/obj/effect/turf_decal/tile/blue,
+/obj/machinery/vending/medical,
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/zone3)
"aHt" = (
/obj/structure/cable/white{
icon_state = "4-8"
@@ -20619,7 +21538,7 @@
/obj/structure/cable/white{
icon_state = "2-8"
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
@@ -20803,6 +21722,37 @@
},
/turf/open/floor/plating,
/area/maintenance/port/central)
+"aHG" = (
+/obj/machinery/power/apc{
+ areastring = "/area/medical/genetics";
+ dir = 8;
+ name = "Genetics Lab APC";
+ pixel_x = -26;
+ pixel_y = 3
+ },
+/obj/structure/cable/white{
+ icon_state = "0-4"
+ },
+/obj/structure/table,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/machinery/button/door{
+ id = "geneticsbot";
+ name = "Genetics Shutter Control";
+ pixel_x = -24;
+ pixel_y = -8;
+ req_access_txt = "5; 9; 68"
+ },
+/obj/item/clothing/gloves/color/latex,
+/obj/item/storage/box/disks{
+ pixel_x = -2;
+ pixel_y = 4
+ },
+/obj/item/storage/box/rxglasses,
+/turf/open/floor/plasteel/dark,
+/area/medical/genetics)
"aHH" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -20830,6 +21780,25 @@
},
/turf/open/floor/plating,
/area/maintenance/port/central)
+"aHJ" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/cable/white{
+ icon_state = "1-8"
+ },
+/obj/structure/chair/office/light{
+ dir = 4
+ },
+/obj/effect/landmark/start/geneticist,
+/turf/open/floor/plasteel{
+ heat_capacity = 1e+006
+ },
+/area/medical/genetics)
+"aHK" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/closed/wall,
+/area/medical/morgue)
"aHL" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/closed/wall,
@@ -20927,7 +21896,7 @@
/turf/open/floor/plasteel,
/area/crew_quarters/bar/atrium)
"aHU" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/structure/sign/poster/random{
@@ -20966,6 +21935,23 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/kitchen)
+"aHX" = (
+/obj/structure/sign/warning/nosmoking{
+ pixel_x = 32
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/computer/scan_consolenew{
+ dir = 8
+ },
+/obj/effect/turf_decal/bot,
+/turf/open/floor/plasteel/dark,
+/area/medical/genetics)
"aHY" = (
/obj/structure/table,
/obj/item/paper_bin,
@@ -20980,7 +21966,7 @@
/turf/open/floor/plasteel/dark,
/area/hallway/primary/starboard)
"aHZ" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/bot,
@@ -21581,7 +22567,7 @@
/area/hallway/primary/starboard)
"aJa" = (
/obj/structure/table,
-/obj/item/storage/pill_bottle/dice,
+/obj/item/storage/box/dice,
/obj/machinery/firealarm{
dir = 4;
pixel_x = -24
@@ -21605,6 +22591,66 @@
},
/turf/open/floor/plasteel/white/corner,
/area/hallway/secondary/exit)
+"aJd" = (
+/obj/machinery/computer/cloning{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/genetics)
+"aJe" = (
+/obj/structure/table,
+/obj/machinery/airalarm/unlocked{
+ dir = 4;
+ pixel_x = -23
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/item/clipboard,
+/obj/item/folder/white,
+/obj/item/storage/pill_bottle/mutadone{
+ pixel_x = -8;
+ pixel_y = 8
+ },
+/obj/item/storage/pill_bottle/mannitol{
+ pixel_x = -8;
+ pixel_y = 2
+ },
+/obj/item/radio/headset/headset_medsci,
+/turf/open/floor/plasteel/dark,
+/area/medical/genetics)
+"aJf" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 4
+ },
+/turf/open/floor/plasteel{
+ heat_capacity = 1e+006
+ },
+/area/medical/genetics)
+"aJg" = (
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/dna_scannernew,
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/delivery,
+/obj/machinery/firealarm{
+ dir = 8;
+ pixel_x = 24
+ },
+/turf/open/floor/plasteel/dark,
+/area/medical/genetics)
"aJh" = (
/obj/machinery/light{
dir = 8
@@ -21712,6 +22758,20 @@
},
/turf/open/floor/plasteel,
/area/engine/gravity_generator)
+"aJo" = (
+/obj/item/radio/intercom{
+ name = "Station Intercom";
+ pixel_x = -26
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/vending/wardrobe/gene_wardrobe,
+/obj/effect/turf_decal/tile/purple{
+ dir = 1
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/genetics)
"aJp" = (
/obj/structure/cable/white{
icon_state = "1-2"
@@ -21758,6 +22818,20 @@
/obj/machinery/atmospherics/pipe/simple/green/visible,
/turf/closed/wall/r_wall,
/area/engine/supermatter)
+"aJv" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/effect/landmark/start/geneticist,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/purple{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/genetics)
"aJw" = (
/obj/machinery/atmospherics/components/binary/pump{
dir = 1;
@@ -21766,6 +22840,17 @@
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel/dark,
/area/engine/engineering)
+"aJx" = (
+/obj/structure/cable/white{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral,
+/turf/open/floor/plasteel/dark,
+/area/medical/morgue)
"aJy" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -21788,6 +22873,22 @@
},
/turf/open/floor/engine,
/area/engine/engineering)
+"aJA" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/machinery/requests_console{
+ department = "Genetics";
+ name = "Genetics RC";
+ pixel_x = 28;
+ pixel_y = 0
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/genetics)
"aJB" = (
/obj/structure/table/reinforced,
/obj/item/stack/sheet/metal/fifty,
@@ -22004,6 +23105,28 @@
},
/turf/open/floor/plasteel,
/area/hydroponics)
+"aJN" = (
+/obj/structure/cable/white{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/landmark/blobstart,
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
+"aJO" = (
+/obj/machinery/camera{
+ c_tag = "Genetics Cloning";
+ dir = 4
+ },
+/obj/machinery/airalarm{
+ dir = 4;
+ pixel_x = -22
+ },
+/obj/effect/turf_decal/tile/purple{
+ dir = 1
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/genetics)
"aJP" = (
/obj/effect/turf_decal/tile/blue{
dir = 1
@@ -22241,6 +23364,59 @@
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
/area/hallway/secondary/exit)
+"aKk" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on,
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/purple{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/genetics)
+"aKl" = (
+/obj/structure/cable/white{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plating{
+ icon_state = "panelscorched"
+ },
+/area/maintenance/port/aft)
+"aKm" = (
+/turf/closed/wall,
+/area/maintenance/port/aft)
+"aKn" = (
+/obj/machinery/door/airlock/maintenance_hatch{
+ name = "Maintenance Hatch";
+ req_access_txt = "12"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line,
+/obj/structure/cable/white{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/closed/wall,
+/area/maintenance/port/aft)
+"aKo" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/machinery/door/airlock/external{
+ name = "External Airlock";
+ req_access_txt = "13"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/maintenance/port/aft)
"aKp" = (
/obj/machinery/airalarm{
dir = 4;
@@ -22277,6 +23453,18 @@
},
/turf/open/floor/plasteel/dark,
/area/engine/gravity_generator)
+"aKr" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 4
+ },
+/obj/effect/landmark/xeno_spawn,
+/obj/structure/sign/warning/vacuum{
+ pixel_x = -32;
+ pixel_y = 32
+ },
+/obj/effect/turf_decal/delivery,
+/turf/open/floor/plasteel,
+/area/maintenance/port/aft)
"aKs" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/command/glass{
@@ -22419,6 +23607,25 @@
},
/turf/open/floor/engine,
/area/engine/supermatter)
+"aKB" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/door/airlock/external{
+ name = "External Airlock";
+ req_access_txt = "13"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/maintenance/port/aft)
"aKC" = (
/obj/machinery/atmospherics/components/binary/pump{
name = "Gas to Chamber"
@@ -22437,6 +23644,16 @@
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel/dark,
/area/engine/engineering)
+"aKF" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/sign/warning/vacuum{
+ pixel_x = -32;
+ pixel_y = 32
+ },
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
"aKG" = (
/obj/structure/cable/white{
icon_state = "1-2"
@@ -22484,6 +23701,12 @@
},
/turf/open/floor/plasteel,
/area/engine/engineering)
+"aKJ" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
"aKK" = (
/obj/structure/table/reinforced,
/obj/structure/cable/white{
@@ -22524,8 +23747,8 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/obj/item/twohanded/rcl/pre_loaded,
-/obj/item/twohanded/rcl/pre_loaded,
+/obj/item/rcl/pre_loaded,
+/obj/item/rcl/pre_loaded,
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
@@ -22699,6 +23922,9 @@
},
/turf/open/floor/plasteel,
/area/hydroponics)
+"aKV" = (
+/turf/closed/wall/r_wall,
+/area/medical/virology)
"aKW" = (
/obj/machinery/seed_extractor,
/obj/effect/turf_decal/bot,
@@ -22953,6 +24179,56 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/starboard)
+"aLn" = (
+/obj/machinery/smartfridge/chemistry/virology/preloaded,
+/turf/open/floor/plasteel/white,
+/area/medical/virology)
+"aLo" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/obj/structure/extinguisher_cabinet{
+ pixel_x = -26
+ },
+/obj/structure/disposalpipe/trunk,
+/obj/effect/turf_decal/stripes/red/full,
+/obj/effect/turf_decal/tile/purple{
+ dir = 8
+ },
+/obj/machinery/disposal/bin{
+ name = "corpse disposal unit"
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/genetics)
+"aLp" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 10
+ },
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
+"aLq" = (
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 8
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/genetics)
+"aLr" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/turf_decal/tile/blue,
+/obj/effect/turf_decal/tile/purple{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/genetics)
+"aLs" = (
+/turf/closed/wall/r_wall/rust,
+/area/maintenance/port/aft)
"aLt" = (
/obj/effect/turf_decal/tile/brown{
dir = 1
@@ -22963,6 +24239,77 @@
},
/turf/open/floor/plasteel,
/area/hallway/secondary/exit)
+"aLu" = (
+/obj/structure/disposalpipe/segment,
+/obj/structure/window/reinforced/spawner/north,
+/obj/machinery/door/window/eastright{
+ name = "Monkey Pen";
+ req_access_txt = "5; 9; 68"
+ },
+/turf/open/floor/plasteel/freezer,
+/area/medical/genetics)
+"aLv" = (
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
+"aLw" = (
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/medical/virology)
+"aLx" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/tile/purple{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/blue,
+/turf/open/floor/plasteel/white,
+/area/medical/genetics)
+"aLy" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/structure/cable/white{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plating{
+ icon_state = "platingdmg3"
+ },
+/area/maintenance/port/aft)
+"aLz" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/light/small,
+/obj/structure/closet/emcloset/anchored,
+/turf/open/floor/plasteel,
+/area/maintenance/port/aft)
+"aLA" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 5
+ },
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/tile/purple,
+/obj/structure/chair/office/light,
+/obj/effect/landmark/start/geneticist,
+/turf/open/floor/plasteel/white,
+/area/medical/genetics)
+"aLB" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 5
+ },
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
+"aLC" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/item/cigbutt,
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
"aLD" = (
/obj/machinery/power/port_gen/pacman,
/obj/effect/turf_decal/stripes/line{
@@ -23060,6 +24407,12 @@
/obj/item/clothing/glasses/meson/engine,
/turf/open/floor/plasteel,
/area/engine/gravity_generator)
+"aLL" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plating/airless,
+/area/maintenance/port/aft)
"aLM" = (
/obj/structure/cable/white{
icon_state = "1-2"
@@ -23154,6 +24507,11 @@
},
/turf/open/floor/engine,
/area/engine/engineering)
+"aLX" = (
+/obj/structure/table/wood,
+/obj/item/gun/ballistic/automatic/toy/pistol/unrestricted,
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
"aLY" = (
/obj/effect/turf_decal/tile/yellow{
dir = 1
@@ -23334,6 +24692,12 @@
},
/turf/open/floor/plasteel,
/area/hydroponics)
+"aMl" = (
+/obj/structure/disposalpipe/segment,
+/obj/structure/window/reinforced/spawner/east,
+/obj/item/storage/box/monkeycubes,
+/turf/open/floor/plasteel/freezer,
+/area/medical/genetics)
"aMm" = (
/obj/structure/cable/white{
icon_state = "2-4"
@@ -23415,7 +24779,7 @@
/turf/open/floor/grass,
/area/hydroponics)
"aMt" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/machinery/light{
@@ -23453,6 +24817,48 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/bar/atrium)
+"aMv" = (
+/obj/structure/table/wood,
+/obj/item/clothing/gloves/color/black,
+/obj/item/taperecorder,
+/obj/machinery/light/small{
+ dir = 1
+ },
+/obj/structure/sign/poster/contraband/random{
+ pixel_y = 32
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/maintenance/port/aft)
+"aMw" = (
+/obj/structure/rack,
+/obj/item/storage/briefcase{
+ pixel_x = -3;
+ pixel_y = 3
+ },
+/obj/item/storage/secure/briefcase,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/maintenance/port/aft)
"aMx" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 10
@@ -23463,7 +24869,7 @@
/turf/open/floor/plating,
/area/maintenance/starboard/central)
"aMy" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/effect/turf_decal/bot,
@@ -23476,7 +24882,7 @@
/turf/open/floor/plasteel/dark,
/area/hallway/primary/starboard)
"aMz" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/brown{
@@ -23515,6 +24921,56 @@
},
/turf/open/floor/plasteel,
/area/hallway/secondary/exit)
+"aMD" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/sign/poster/contraband/random,
+/turf/closed/wall,
+/area/maintenance/port/aft)
+"aME" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/structure/reagent_dispensers/fueltank,
+/turf/open/floor/plasteel,
+/area/maintenance/port/aft)
+"aMF" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/structure/closet/crate,
+/obj/item/stack/ore/silver,
+/obj/item/stack/ore/iron,
+/obj/item/stack/ore/iron,
+/obj/item/stack/ore/iron,
+/obj/item/pickaxe/emergency,
+/turf/open/floor/plasteel,
+/area/maintenance/port/aft)
+"aMG" = (
+/obj/structure/girder,
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
+"aMH" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/machinery/door/airlock/maintenance_hatch{
+ name = "Maintenance Hatch";
+ req_access_txt = "12"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/maintenance/port/aft)
+"aMI" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/maintenance/port/aft)
"aMJ" = (
/turf/closed/wall/r_wall,
/area/tcommsat/server)
@@ -23579,6 +25035,22 @@
},
/turf/open/floor/engine,
/area/engine/engineering)
+"aMQ" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/maintenance/port/aft)
"aMR" = (
/obj/machinery/camera{
c_tag = "Supermatter Chamber";
@@ -23637,6 +25109,17 @@
},
/turf/open/floor/engine,
/area/engine/supermatter)
+"aMY" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/machinery/dna_scannernew,
+/obj/effect/turf_decal/delivery,
+/turf/open/floor/plasteel/dark,
+/area/medical/genetics)
"aMZ" = (
/obj/structure/cable{
icon_state = "1-8"
@@ -23819,6 +25302,43 @@
},
/turf/open/floor/plasteel/dark,
/area/hydroponics)
+"aNo" = (
+/obj/machinery/light_switch{
+ pixel_x = -24;
+ pixel_y = -38
+ },
+/obj/machinery/button/door{
+ desc = "A remote control switch for the medbay foyer.";
+ id = "cloningfoyer";
+ name = "Cloning Doors Control";
+ normaldoorcontrol = 1;
+ pixel_x = -24;
+ pixel_y = -24
+ },
+/obj/structure/closet/crate/freezer/surplus_limbs,
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/genetics)
+"aNp" = (
+/obj/machinery/door/firedoor,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/machinery/door/airlock/medical/glass{
+ name = "Genetics";
+ req_access_txt = "5; 9; 68"
+ },
+/turf/open/floor/plasteel,
+/area/medical/genetics)
"aNq" = (
/obj/machinery/hydroponics/constructable,
/obj/structure/cable/white,
@@ -24036,6 +25556,94 @@
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
/area/hallway/secondary/exit)
+"aNL" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/purple{
+ dir = 8
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/genetics)
+"aNM" = (
+/obj/machinery/holopad,
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/bot,
+/obj/effect/landmark/start/geneticist,
+/turf/open/floor/plasteel,
+/area/medical/genetics)
+"aNN" = (
+/obj/machinery/dna_scannernew,
+/obj/effect/turf_decal/tile/blue,
+/obj/effect/turf_decal/tile/purple{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/genetics)
+"aNO" = (
+/obj/machinery/camera{
+ c_tag = "Genetics Lab";
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/machinery/computer/scan_consolenew{
+ icon_state = "computer";
+ dir = 1
+ },
+/obj/effect/turf_decal/bot,
+/turf/open/floor/plasteel/dark,
+/area/medical/genetics)
+"aNP" = (
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/medical/genetics)
+"aNQ" = (
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/medical/glass{
+ id_tag = "cloningfoyer";
+ name = "Cloning Lab";
+ req_access_txt = "5"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/effect/mapping_helpers/airlock/unres{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/medical/genetics)
+"aNR" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plating,
+/area/medical/genetics)
+"aNS" = (
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 4
+ },
+/obj/structure/disposalpipe/segment,
+/obj/effect/landmark/start/paramedic,
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/zone3)
"aNT" = (
/obj/machinery/announcement_system,
/obj/machinery/status_display/ai{
@@ -24128,6 +25736,42 @@
/obj/machinery/power/supermatter_crystal/shard/engine,
/turf/open/floor/engine,
/area/engine/supermatter)
+"aOb" = (
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 4
+ },
+/obj/machinery/requests_console{
+ announcementConsole = 1;
+ department = "Chief Medical Officer's Desk";
+ departmentType = 5;
+ name = "Chief Medical Officer RC";
+ pixel_y = 28
+ },
+/turf/open/floor/plasteel/cafeteria,
+/area/crew_quarters/heads/cmo)
+"aOc" = (
+/obj/machinery/door/airlock/maintenance_hatch{
+ name = "Maintenance Hatch";
+ req_access_txt = "12"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/maintenance/port/aft)
"aOd" = (
/obj/machinery/power/apc{
areastring = "/area/engine/engineering";
@@ -24141,6 +25785,29 @@
},
/turf/open/floor/engine,
/area/engine/engineering)
+"aOe" = (
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/door/airlock/command{
+ name = "Chief Medical Officer's Office";
+ req_access_txt = "40"
+ },
+/obj/machinery/door/firedoor,
+/obj/structure/cable/white{
+ icon_state = "2-8"
+ },
+/turf/open/floor/plasteel,
+/area/crew_quarters/heads/cmo)
"aOf" = (
/obj/machinery/door/airlock{
name = "Custodial Closet";
@@ -24156,6 +25823,24 @@
},
/turf/open/floor/plasteel,
/area/janitor)
+"aOg" = (
+/obj/structure/cable/white{
+ icon_state = "2-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 10
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/machinery/newscaster{
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/zone3)
"aOh" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
@@ -24182,8 +25867,21 @@
/obj/structure/sign/departments/botany,
/turf/closed/wall,
/area/hydroponics)
+"aOl" = (
+/obj/structure/closet/secure_closet/CMO,
+/obj/machinery/airalarm{
+ dir = 4;
+ pixel_x = -22
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/plasteel/dark,
+/area/crew_quarters/heads/cmo)
"aOm" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/red{
@@ -24230,7 +25928,7 @@
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"aOq" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/effect/turf_decal/tile/red{
@@ -24255,6 +25953,13 @@
},
/turf/closed/wall,
/area/hallway/primary/central)
+"aOs" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/structure/rack,
+/turf/open/floor/plasteel,
+/area/maintenance/port/aft)
"aOt" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/closed/wall,
@@ -24345,6 +26050,24 @@
},
/turf/open/floor/engine,
/area/engine/engineering)
+"aOA" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/medical/genetics)
+"aOB" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue,
+/obj/effect/turf_decal/tile/purple{
+ dir = 8
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/genetics)
"aOC" = (
/obj/machinery/atmospherics/pipe/simple/general/visible{
dir = 5
@@ -24371,6 +26094,22 @@
},
/turf/open/floor/circuit/green,
/area/engine/supermatter)
+"aOE" = (
+/obj/structure/cable/white{
+ icon_state = "2-4"
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/landmark/event_spawn,
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/zone3)
"aOF" = (
/obj/structure/cable{
icon_state = "1-8"
@@ -24392,60 +26131,101 @@
/turf/open/floor/engine,
/area/engine/engineering)
"aOH" = (
-/turf/closed/wall/r_wall,
-/area/maintenance/port)
-"aOI" = (
/obj/structure/cable/white{
- icon_state = "2-4"
+ icon_state = "1-2"
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
- },
-/obj/effect/decal/cleanable/cobweb,
-/turf/open/floor/plating,
-/area/maintenance/port)
-"aOL" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 4
},
-/turf/open/floor/plating{
- icon_state = "panelscorched"
- },
-/area/maintenance/port)
-"aOM" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"aON" = (
-/obj/machinery/door/airlock/maintenance_hatch{
- name = "Maintenance Hatch";
- req_access_txt = "12"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
/obj/effect/turf_decal/stripes/line{
dir = 8
},
-/obj/effect/turf_decal/stripes/line{
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
+"aOI" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 6
+ },
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
+"aOJ" = (
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/tile/blue{
dir = 4
},
-/turf/open/floor/plasteel,
-/area/maintenance/port)
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/zone3)
+"aOK" = (
+/obj/machinery/light/small{
+ dir = 4
+ },
+/obj/machinery/computer/card/minor/cmo{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/machinery/keycard_auth{
+ pixel_x = 24;
+ pixel_y = -24
+ },
+/obj/machinery/firealarm{
+ dir = 8;
+ pixel_x = 24;
+ pixel_y = -6
+ },
+/obj/machinery/computer/security/telescreen/cmo{
+ dir = 1;
+ icon_state = "telescreen";
+ pixel_y = -32
+ },
+/turf/open/floor/plasteel/cafeteria,
+/area/crew_quarters/heads/cmo)
+"aOL" = (
+/obj/structure/table/wood,
+/obj/item/flashlight/lamp,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
+"aOM" = (
+/obj/structure/table/wood,
+/obj/item/paper_bin,
+/obj/item/pen,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/maintenance/port/aft)
+"aON" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/maintenance/port/aft)
"aOO" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -24484,49 +26264,49 @@
heat_capacity = 1e+006
},
/area/hallway/primary/port/aft)
-"aOR" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
-/obj/structure/cable/white{
- icon_state = "2-4"
- },
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
+"aOQ" = (
+/obj/machinery/suit_storage_unit/cmo,
/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/port/aft)
-"aOS" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/port/aft)
-"aOT" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/delivery,
+/turf/open/floor/plasteel/dark,
+/area/crew_quarters/heads/cmo)
+"aOR" = (
+/obj/structure/table/glass,
+/obj/item/storage/box/bodybags{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/item/storage/box/bodybags,
+/obj/item/pen,
+/obj/machinery/firealarm{
+ dir = 8;
+ pixel_x = 24
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 10
+ },
+/obj/effect/turf_decal/tile/purple,
+/turf/open/floor/plasteel/white,
+/area/medical/genetics)
+"aOS" = (
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 4
+ },
+/turf/closed/wall,
+/area/maintenance/port/aft)
+"aOT" = (
/obj/structure/cable/white{
- icon_state = "1-8"
+ icon_state = "1-4"
},
-/obj/structure/cable/white{
- icon_state = "4-8"
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 5
},
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/port/aft)
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
"aOU" = (
/obj/machinery/door/firedoor,
/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
@@ -24545,92 +26325,77 @@
/turf/open/floor/plasteel,
/area/hallway/primary/port/aft)
"aOV" = (
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/structure/extinguisher_cabinet{
- pixel_y = 26
+/obj/effect/landmark/blobstart,
+/turf/open/floor/plating{
+ icon_state = "panelscorched"
},
-/obj/structure/cable/white{
- icon_state = "4-8"
+/area/maintenance/port/aft)
+"aOW" = (
+/obj/structure/disposalpipe/segment,
+/turf/closed/wall,
+/area/medical/genetics)
+"aOX" = (
+/obj/machinery/requests_console{
+ department = "Medbay";
+ departmentType = 1;
+ name = "Medbay RC";
+ pixel_x = -30
},
/obj/machinery/camera{
- c_tag = "Aft Primary Hallway 4"
- },
-/obj/effect/turf_decal/tile/green{
- dir = 1
+ c_tag = "Medbay Storage"
},
+/obj/machinery/rnd/production/techfab/department/medical,
+/obj/effect/turf_decal/bot,
+/obj/effect/turf_decal/stripes/box,
+/obj/structure/disposalpipe/segment,
/turf/open/floor/plasteel,
-/area/hallway/primary/port/aft)
-"aOW" = (
-/obj/machinery/light{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
-/obj/item/radio/intercom{
- name = "Station Intercom";
- pixel_y = 24
- },
+/area/medical/medbay/zone3)
+"aOY" = (
/obj/structure/cable/white{
- icon_state = "2-8"
+ icon_state = "1-2"
},
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/tile/purple{
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/turf_decal/tile/blue{
dir = 1
},
+/obj/effect/turf_decal/tile/blue,
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/effect/landmark/start/medical_doctor,
/turf/open/floor/plasteel,
-/area/hallway/primary/port/aft)
-"aOX" = (
+/area/medical/medbay/zone3)
+"aOZ" = (
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
+/obj/structure/cable/white{
+ icon_state = "0-4"
+ },
/obj/machinery/power/apc{
- areastring = "/area/hallway/primary/port/aft";
+ areastring = "/area/crew_quarters/heads/cmo";
dir = 1;
- name = "Port Quarter Hallway APC";
- pixel_y = 24
+ name = "CMO's Office APC";
+ pixel_y = 26
},
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/structure/cable/white{
- icon_state = "0-8"
- },
-/obj/effect/turf_decal/tile/green{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/port/aft)
-"aOY" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/structure/cable/white{
- icon_state = "1-8"
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/port/aft)
-"aOZ" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/port/aft)
+/obj/effect/landmark/start/chief_medical_officer,
+/turf/open/floor/plasteel/cafeteria,
+/area/crew_quarters/heads/cmo)
"aPa" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -24713,6 +26478,21 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/central)
+"aPg" = (
+/obj/item/kirbyplants{
+ icon_state = "plant-22"
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 6
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/zone3)
"aPh" = (
/obj/machinery/light{
dir = 1
@@ -24916,6 +26696,34 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/starboard)
+"aPv" = (
+/obj/structure/table/glass,
+/obj/item/storage/firstaid/o2{
+ pixel_x = 6;
+ pixel_y = 6
+ },
+/obj/item/storage/firstaid/o2{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/item/storage/firstaid/regular,
+/obj/item/storage/firstaid/o2{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/structure/cable/white,
+/obj/effect/turf_decal/delivery,
+/obj/machinery/power/apc{
+ areastring = "/area/medical/medbay/zone3";
+ name = "Medbay APC";
+ pixel_y = -26
+ },
+/obj/machinery/door/window/northleft{
+ name = "First-Aid Supplies";
+ req_access_txt = "5"
+ },
+/turf/open/floor/plasteel,
+/area/medical/medbay/zone3)
"aPw" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -24954,10 +26762,141 @@
},
/turf/open/floor/plasteel/dark,
/area/hallway/primary/starboard)
+"aPz" = (
+/obj/effect/turf_decal/delivery,
+/obj/structure/window/reinforced/spawner/west,
+/obj/structure/window/reinforced/spawner/north,
+/obj/structure/table/glass,
+/obj/item/storage/firstaid/toxin{
+ pixel_x = 6;
+ pixel_y = 6
+ },
+/obj/item/storage/firstaid/toxin{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/item/storage/firstaid/regular,
+/obj/item/storage/firstaid/toxin{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/machinery/airalarm{
+ dir = 1;
+ pixel_y = -22
+ },
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/plasteel,
+/area/medical/medbay/zone3)
+"aPA" = (
+/obj/structure/cable/white{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/door/airlock/grunge{
+ name = "Morgue";
+ req_access_txt = "5"
+ },
+/obj/machinery/door/firedoor,
+/turf/open/floor/plasteel/dark,
+/area/medical/morgue)
+"aPB" = (
+/obj/structure/disposalpipe/segment,
+/turf/closed/wall,
+/area/medical/morgue)
+"aPC" = (
+/obj/machinery/computer/security/telescreen/entertainment,
+/obj/structure/bodycontainer/morgue{
+ icon_state = "morgue1";
+ dir = 2
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral,
+/turf/open/floor/plasteel/dark,
+/area/medical/morgue)
+"aPD" = (
+/obj/machinery/light,
+/obj/structure/noticeboard{
+ dir = 1;
+ pixel_y = -32
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 5
+ },
+/obj/effect/turf_decal/delivery,
+/obj/structure/table/glass,
+/obj/item/storage/firstaid/fire{
+ pixel_x = 6;
+ pixel_y = 6
+ },
+/obj/item/storage/firstaid/fire{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/item/storage/firstaid/regular,
+/obj/item/storage/firstaid/fire{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/machinery/door/window/northright{
+ name = "First-Aid Supplies";
+ req_access_txt = "5"
+ },
+/turf/open/floor/plasteel,
+/area/medical/medbay/zone3)
+"aPE" = (
+/obj/structure/bodycontainer/morgue{
+ icon_state = "morgue1";
+ dir = 2
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral,
+/turf/open/floor/plasteel/dark,
+/area/medical/morgue)
+"aPF" = (
+/obj/structure/chair/office/light{
+ dir = 4
+ },
+/obj/effect/landmark/start/chief_medical_officer,
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
+/turf/open/floor/plasteel/cafeteria,
+/area/crew_quarters/heads/cmo)
"aPG" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/tcommsat/server)
+"aPH" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/structure/disposalpipe/trunk{
+ dir = 1
+ },
+/obj/machinery/firealarm{
+ dir = 8;
+ pixel_x = 24
+ },
+/obj/structure/disposaloutlet{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/medical/morgue)
"aPI" = (
/obj/structure/cable/white{
icon_state = "1-2"
@@ -25019,89 +26958,69 @@
/turf/open/floor/engine,
/area/engine/engineering)
"aPO" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 1
},
-/turf/closed/wall/r_wall,
-/area/maintenance/port)
+/obj/effect/turf_decal/stripes/line,
+/obj/structure/cable/white{
+ icon_state = "2-4"
+ },
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
"aPP" = (
/obj/structure/cable/white{
- icon_state = "1-2"
+ icon_state = "1-8"
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"aPQ" = (
-/obj/structure/closet,
-/obj/effect/spawner/lootdrop/maintenance{
- lootcount = 3;
- name = "3maintenance loot spawner"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/delivery,
-/obj/effect/turf_decal/stripes/line{
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 9
},
-/turf/open/floor/plasteel,
-/area/maintenance/port)
-"aPR" = (
-/obj/structure/girder,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
/turf/open/floor/plating,
-/area/maintenance/port)
+/area/maintenance/port/aft)
+"aPQ" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
+"aPR" = (
+/turf/open/floor/wood{
+ icon_state = "wood-broken5"
+ },
+/area/maintenance/port/aft)
"aPS" = (
-/obj/structure/closet/firecloset,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/delivery,
-/obj/effect/turf_decal/stripes/line{
+/obj/effect/landmark/xeno_spawn,
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 1
},
-/turf/open/floor/plasteel,
-/area/maintenance/port)
+/turf/open/floor/wood,
+/area/maintenance/port/aft)
"aPT" = (
-/obj/structure/rack,
-/obj/item/reagent_containers/food/drinks/bottle/whiskey,
-/obj/effect/spawner/lootdrop/maintenance,
-/obj/machinery/light/small,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
+/turf/open/floor/wood{
+ icon_state = "wood-broken6"
},
-/obj/effect/turf_decal/delivery,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/maintenance/port)
+/area/maintenance/port/aft)
"aPU" = (
-/obj/structure/rack,
-/obj/effect/spawner/lootdrop/maintenance{
- lootcount = 2;
- name = "2maintenance loot spawner"
- },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/delivery,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/maintenance/port)
-"aPV" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
+ dir = 5
},
/turf/closed/wall,
-/area/maintenance/port)
+/area/maintenance/port/aft)
+"aPV" = (
+/obj/structure/barricade/wooden,
+/obj/machinery/door/airlock/maintenance_hatch{
+ name = "Maintenance Hatch";
+ req_access_txt = "12"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/maintenance/port/aft)
"aPW" = (
/obj/machinery/vending/snack/random,
/obj/machinery/firealarm{
@@ -25125,7 +27044,7 @@
/turf/open/floor/plasteel/dark,
/area/hallway/primary/port/aft)
"aPX" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
@@ -25218,16 +27137,18 @@
},
/area/hallway/primary/port/aft)
"aQe" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
+/obj/structure/table/glass,
+/obj/effect/turf_decal/tile/blue{
dir = 8
},
-/turf/open/floor/plasteel{
- heat_capacity = 1e+006
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
},
-/area/hallway/primary/port/aft)
+/obj/item/paper_bin,
+/obj/item/pen,
+/obj/item/stamp/cmo,
+/turf/open/floor/plasteel/cafeteria,
+/area/crew_quarters/heads/cmo)
"aQf" = (
/obj/machinery/firealarm{
dir = 1;
@@ -25252,6 +27173,39 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/central)
+"aQh" = (
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/machinery/airalarm{
+ dir = 4;
+ pixel_x = -22
+ },
+/turf/open/floor/plasteel/dark,
+/area/medical/morgue)
+"aQi" = (
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/medical/morgue)
"aQj" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
/obj/effect/turf_decal/tile/yellow{
@@ -25415,7 +27369,7 @@
/turf/open/floor/plasteel,
/area/hallway/primary/starboard)
"aQA" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/machinery/newscaster{
@@ -25434,6 +27388,94 @@
},
/turf/open/floor/plasteel/dark,
/area/hallway/primary/starboard)
+"aQB" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/sign/poster/contraband/random,
+/turf/closed/wall,
+/area/maintenance/port/aft)
+"aQC" = (
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plasteel/dark,
+/area/medical/morgue)
+"aQD" = (
+/obj/structure/cable/white{
+ icon_state = "1-2"
+ },
+/obj/structure/cable/white{
+ icon_state = "2-4"
+ },
+/obj/effect/landmark/blobstart,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/medical/morgue)
+"aQE" = (
+/obj/machinery/light/small{
+ dir = 4
+ },
+/obj/structure/cable/white{
+ icon_state = "0-8"
+ },
+/obj/structure/table/wood,
+/obj/item/storage/box/bodybags{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/item/storage/box/bodybags,
+/obj/machinery/power/apc{
+ areastring = "/area/medical/morgue";
+ dir = 4;
+ name = "Morgue APC";
+ pixel_x = 26
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/machinery/camera{
+ c_tag = "Morgue";
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/medical/morgue)
+"aQF" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/closed/wall/rust,
+/area/maintenance/port/aft)
"aQG" = (
/obj/machinery/atmospherics/pipe/simple/general/visible{
dir = 6
@@ -25472,6 +27514,19 @@
},
/turf/open/floor/plasteel/grimy,
/area/tcommsat/server)
+"aQI" = (
+/obj/structure/cable/white{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/medical/morgue)
"aQJ" = (
/obj/machinery/meter,
/obj/effect/turf_decal/stripes/corner{
@@ -25491,6 +27546,17 @@
},
/turf/open/floor/engine,
/area/engine/engineering)
+"aQL" = (
+/obj/structure/table/wood,
+/obj/item/clothing/gloves/color/latex,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/medical/morgue)
"aQM" = (
/obj/effect/turf_decal/stripes/line{
dir = 1
@@ -25532,6 +27598,14 @@
},
/turf/open/floor/engine,
/area/engine/engineering)
+"aQQ" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/barricade/wooden,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
"aQR" = (
/obj/effect/turf_decal/stripes/line{
dir = 1
@@ -25560,9 +27634,39 @@
/turf/open/floor/engine,
/area/engine/engineering)
"aQU" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall/r_wall,
-/area/maintenance/port)
+/obj/machinery/door/airlock/maintenance_hatch{
+ name = "Maintenance Hatch";
+ req_access_txt = "12"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/structure/cable/white{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel,
+/area/maintenance/port/aft)
+"aQV" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/computer/arcade{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/maintenance/port/aft)
"aQW" = (
/turf/closed/wall,
/area/library)
@@ -25605,30 +27709,17 @@
/turf/closed/wall,
/area/medical/morgue)
"aRc" = (
-/obj/effect/spawner/structure/window/reinforced/tinted,
-/turf/open/floor/plating,
-/area/medical/morgue)
+/obj/structure/chair/stool/bar,
+/turf/open/floor/wood,
+/area/maintenance/port/aft)
"aRd" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/grunge{
- name = "Morgue";
- req_access_txt = "5"
- },
-/obj/structure/cable/white{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/stripes/line,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/medical/morgue)
+/obj/effect/decal/cleanable/blood/splatter,
+/turf/open/floor/wood,
+/area/maintenance/port/aft)
"aRe" = (
-/obj/effect/spawner/structure/window/reinforced/tinted,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/medical/morgue)
+/turf/closed/wall/r_wall,
+/area/medical/virology)
"aRf" = (
/turf/closed/wall,
/area/medical/chemistry)
@@ -25660,6 +27751,11 @@
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
/area/medical/chemistry)
+"aRj" = (
+/turf/open/floor/wood{
+ icon_state = "wood-broken2"
+ },
+/area/maintenance/port/aft)
"aRk" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/camera{
@@ -25675,6 +27771,44 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/central)
+"aRl" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/cable/white,
+/turf/open/floor/plating,
+/area/crew_quarters/heads/cmo)
+"aRm" = (
+/turf/open/floor/wood,
+/area/maintenance/port/aft)
+"aRn" = (
+/obj/structure/chair/stool/bar,
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
+"aRo" = (
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/machinery/newscaster{
+ pixel_y = -32
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/holopad,
+/turf/open/floor/plasteel/cafeteria,
+/area/crew_quarters/heads/cmo)
+"aRp" = (
+/obj/structure/bodycontainer/morgue{
+ icon_state = "morgue1";
+ dir = 2
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden,
+/turf/open/floor/plasteel/dark,
+/area/medical/morgue)
"aRq" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/effect/turf_decal/tile/purple,
@@ -25736,6 +27870,20 @@
},
/turf/open/floor/plasteel,
/area/science/research)
+"aRw" = (
+/obj/structure/bodycontainer/morgue{
+ icon_state = "morgue1";
+ dir = 2
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 10
+ },
+/turf/open/floor/plasteel/dark,
+/area/medical/morgue)
"aRx" = (
/obj/machinery/door/airlock/maintenance_hatch{
name = "Maintenance Hatch";
@@ -25758,6 +27906,38 @@
"aRz" = (
/turf/closed/wall,
/area/maintenance/starboard)
+"aRA" = (
+/obj/structure/table/glass,
+/obj/effect/turf_decal/tile/green{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/green{
+ dir = 1
+ },
+/obj/structure/reagent_dispensers/virusfood{
+ pixel_x = -32
+ },
+/obj/item/storage/box/beakers{
+ pixel_x = -6;
+ pixel_y = 8
+ },
+/obj/item/storage/box/monkeycubes{
+ pixel_x = 4;
+ pixel_y = 6
+ },
+/obj/item/storage/box/syringes{
+ pixel_x = -3;
+ pixel_y = 2
+ },
+/obj/item/reagent_containers/dropper{
+ pixel_y = -8
+ },
+/obj/item/reagent_containers/syringe/antiviral{
+ pixel_x = 2;
+ pixel_y = -10
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/virology)
"aRB" = (
/obj/effect/turf_decal/bot,
/obj/structure/table,
@@ -25770,6 +27950,10 @@
},
/turf/open/floor/plasteel/dark,
/area/tcommsat/server)
+"aRC" = (
+/obj/machinery/computer/slot_machine,
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
"aRD" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -25913,14 +28097,12 @@
/turf/open/floor/engine,
/area/engine/engineering)
"aRS" = (
-/obj/structure/cable/white{
- icon_state = "1-2"
+/obj/machinery/vending/cigarette,
+/obj/machinery/newscaster{
+ pixel_x = -32
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating{
- icon_state = "platingdmg2"
- },
-/area/maintenance/port)
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
"aRT" = (
/obj/structure/table/wood,
/obj/item/flashlight/lamp,
@@ -25949,6 +28131,23 @@
},
/turf/open/floor/plasteel/dark,
/area/library)
+"aRV" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/structure/cable/white{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel/dark,
+/area/maintenance/port/aft)
"aRW" = (
/obj/structure/chair/office/dark{
dir = 4
@@ -26040,44 +28239,31 @@
/turf/open/floor/plasteel/dark,
/area/library)
"aSe" = (
-/obj/structure/bodycontainer/morgue,
-/obj/effect/decal/cleanable/cobweb,
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
+/obj/machinery/vending/wallmed{
+ pixel_y = 32
+ },
+/obj/effect/turf_decal/tile/green{
dir = 4
},
-/turf/open/floor/plasteel/dark,
-/area/medical/morgue)
+/obj/effect/turf_decal/tile/green{
+ dir = 1
+ },
+/obj/machinery/holopad,
+/turf/open/floor/plasteel/white,
+/area/medical/virology)
"aSf" = (
-/obj/structure/cable/white{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
+/obj/effect/turf_decal/stripes/line{
dir = 4
},
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/medical/morgue)
+/turf/open/floor/plasteel,
+/area/maintenance/port/aft)
"aSg" = (
-/obj/structure/sign/warning/nosmoking{
- pixel_x = 32
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/medical/morgue)
+/obj/item/cigbutt,
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
"aSh" = (
/turf/closed/wall,
/area/medical/medbay/zone3)
@@ -26104,26 +28290,11 @@
/turf/open/floor/plasteel,
/area/medical/chemistry)
"aSk" = (
-/obj/machinery/light{
- dir = 1
- },
-/obj/machinery/power/apc/highcap/five_k{
- areastring = "/area/medical/chemistry";
- dir = 1;
- name = "Chemistry Lab APC";
- pixel_y = 25
- },
/obj/structure/cable/white{
- icon_state = "0-2"
- },
-/obj/item/twohanded/required/kirbyplants{
- icon_state = "plant-21"
- },
-/obj/machinery/camera{
- c_tag = "Chemistry"
+ icon_state = "1-2"
},
/obj/effect/turf_decal/tile/yellow{
- dir = 1
+ dir = 8
},
/turf/open/floor/plasteel/white,
/area/medical/chemistry)
@@ -26137,6 +28308,19 @@
/obj/item/storage/pill_bottle/mutadone,
/turf/open/floor/plasteel,
/area/medical/chemistry)
+"aSm" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/maintenance/port/aft)
"aSn" = (
/obj/machinery/chem_dispenser,
/obj/machinery/button/door{
@@ -26151,6 +28335,54 @@
},
/turf/open/floor/plasteel,
/area/medical/chemistry)
+"aSo" = (
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/landmark/event_spawn,
+/turf/open/floor/plasteel/dark,
+/area/medical/morgue)
+"aSp" = (
+/obj/structure/table/glass,
+/obj/machinery/reagentgrinder{
+ pixel_y = 5
+ },
+/obj/effect/turf_decal/tile/green{
+ dir = 8
+ },
+/obj/item/reagent_containers/spray/cleaner{
+ pixel_x = -8;
+ pixel_y = 2
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/virology)
+"aSq" = (
+/obj/structure/table/wood,
+/obj/item/storage/briefcase,
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
+"aSr" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
+"aSs" = (
+/obj/structure/chair/stool/bar,
+/turf/open/floor/wood{
+ icon_state = "wood-broken"
+ },
+/area/maintenance/port/aft)
"aSt" = (
/obj/machinery/door/firedoor,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
@@ -26283,10 +28515,43 @@
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plasteel,
/area/maintenance/starboard/aft)
+"aSG" = (
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
"aSH" = (
/obj/structure/sign/poster/contraband/random,
/turf/closed/wall,
/area/maintenance/starboard)
+"aSI" = (
+/obj/structure/chair/stool/bar,
+/turf/open/floor/wood{
+ icon_state = "wood-broken5"
+ },
+/area/maintenance/port/aft)
+"aSJ" = (
+/obj/structure/chair/office/light,
+/obj/effect/landmark/start/virologist,
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/virology)
+"aSK" = (
+/obj/effect/turf_decal/tile/green{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/green,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/virology)
+"aSL" = (
+/obj/structure/chair/stool/bar,
+/turf/open/floor/wood{
+ icon_state = "wood-broken2"
+ },
+/area/maintenance/port/aft)
"aSM" = (
/obj/machinery/door/airlock/command{
name = "Telecomms Server Room";
@@ -26332,6 +28597,22 @@
/obj/machinery/vending/wardrobe/engi_wardrobe,
/turf/open/floor/engine,
/area/engine/engineering)
+"aSQ" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/machinery/door/airlock/maintenance_hatch{
+ name = "Maintenance Hatch";
+ req_access_txt = "12"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
"aSR" = (
/obj/structure/table/reinforced,
/obj/item/tank/internals/plasma,
@@ -26431,12 +28712,15 @@
/turf/open/floor/engine,
/area/engine/engineering)
"aTb" = (
-/obj/structure/cable/white{
- icon_state = "1-2"
+/obj/structure/table/wood,
+/obj/item/toy/cards/deck/syndicate{
+ pixel_y = 6
+ },
+/obj/machinery/light/small{
+ dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plating,
-/area/maintenance/port)
+/area/maintenance/port/aft)
"aTc" = (
/obj/structure/chair/office/dark{
dir = 8
@@ -26467,7 +28751,7 @@
"aTf" = (
/obj/structure/table/wood,
/obj/item/clipboard,
-/obj/item/storage/pill_bottle/dice,
+/obj/item/storage/box/dice,
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
@@ -26510,96 +28794,90 @@
/turf/open/floor/plasteel/dark,
/area/library)
"aTj" = (
-/obj/structure/table,
-/obj/item/storage/box/bodybags{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/item/storage/box/bodybags,
-/obj/machinery/airalarm/unlocked{
- dir = 4;
- pixel_x = -23
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/turf/open/floor/plasteel/dark,
-/area/medical/morgue)
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
"aTk" = (
-/obj/structure/cable/white{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+/obj/effect/turf_decal/tile/green{
dir = 4
},
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/medical/morgue)
-"aTl" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/medical/morgue)
-"aTm" = (
-/obj/structure/mirror{
- pixel_x = -28
- },
-/obj/machinery/shower{
- dir = 4;
- name = "emergency shower"
- },
-/obj/machinery/newscaster{
- pixel_y = 32
- },
-/obj/machinery/door/window/southleft,
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/medical/medbay/zone3)
-"aTn" = (
/obj/machinery/light{
dir = 1
},
-/obj/machinery/door/window/southright,
-/obj/item/radio/intercom{
- name = "Station Intercom";
+/obj/structure/closet/secure_closet/medical1,
+/obj/item/radio/headset/headset_med,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 4
+ },
+/obj/machinery/airalarm{
+ pixel_y = 23
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/virology)
+"aTl" = (
+/obj/machinery/vending/wardrobe/viro_wardrobe,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/structure/extinguisher_cabinet{
pixel_y = 26
},
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/medical/virology)
+"aTm" = (
+/obj/structure/table/glass,
+/obj/effect/turf_decal/tile/green{
dir = 8
},
-/turf/open/floor/plasteel/dark,
-/area/medical/medbay/zone3)
+/obj/effect/turf_decal/tile/green,
+/obj/item/paper_bin,
+/obj/item/pen,
+/obj/item/book/manual/wiki/infections{
+ pixel_x = -15;
+ pixel_y = 2
+ },
+/obj/item/stack/sheet/mineral/plasma{
+ pixel_x = -12
+ },
+/obj/item/stack/sheet/mineral/plasma{
+ pixel_x = -14;
+ pixel_y = 3
+ },
+/obj/item/hand_labeler,
+/obj/item/clothing/gloves/color/latex,
+/turf/open/floor/plasteel/white,
+/area/medical/virology)
+"aTn" = (
+/obj/effect/landmark/start/virologist,
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 4
+ },
+/obj/machinery/power/apc/highcap/five_k{
+ areastring = "/area/medical/virology";
+ dir = 1;
+ name = "Virology APC";
+ pixel_y = 24
+ },
+/obj/structure/cable/white{
+ icon_state = "0-4"
+ },
+/obj/machinery/camera{
+ c_tag = "Virology"
+ },
+/turf/open/floor/plasteel,
+/area/medical/virology)
"aTo" = (
-/obj/structure/window/reinforced,
-/obj/machinery/clonepod,
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/medical/medbay/zone3)
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/closed/wall/r_wall,
+/area/medical/virology)
"aTp" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
@@ -26614,11 +28892,12 @@
/area/medical/chemistry)
"aTr" = (
/obj/structure/cable/white{
- icon_state = "1-2"
+ icon_state = "1-4"
},
/obj/effect/turf_decal/tile/yellow{
- dir = 1
+ dir = 8
},
+/obj/effect/landmark/start/chemist,
/turf/open/floor/plasteel/white,
/area/medical/chemistry)
"aTs" = (
@@ -26639,6 +28918,19 @@
/obj/machinery/chem_master,
/turf/open/floor/plasteel,
/area/medical/chemistry)
+"aTv" = (
+/obj/machinery/airalarm{
+ dir = 4;
+ pixel_x = -22
+ },
+/obj/machinery/light/small{
+ dir = 4
+ },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 1
+ },
+/turf/open/floor/plasteel/freezer,
+/area/medical/virology)
"aTw" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/effect/turf_decal/tile/blue{
@@ -26673,7 +28965,7 @@
/turf/open/floor/plasteel/grimy,
/area/crew_quarters/lounge)
"aTA" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-18"
},
/obj/machinery/camera{
@@ -26847,6 +29139,12 @@
icon_state = "platingdmg1"
},
/area/maintenance/starboard/aft)
+"aTQ" = (
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 8
+ },
+/turf/closed/wall/r_wall,
+/area/medical/virology)
"aTR" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -26881,6 +29179,40 @@
icon_state = "panelscorched"
},
/area/maintenance/starboard/aft)
+"aTU" = (
+/obj/structure/sign/poster/contraband/random,
+/turf/closed/wall/rust,
+/area/maintenance/port/aft)
+"aTV" = (
+/obj/structure/table/wood,
+/obj/item/wrench,
+/obj/item/storage/secure/briefcase{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/item/storage/briefcase,
+/obj/machinery/light/small{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/maintenance/port/aft)
+"aTW" = (
+/obj/structure/bed,
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 4
+ },
+/turf/open/floor/plasteel/freezer,
+/area/medical/virology)
"aTX" = (
/obj/machinery/light{
dir = 8
@@ -26943,13 +29275,23 @@
/turf/closed/wall/r_wall/rust,
/area/engine/engineering)
"aUb" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/landmark/event_spawn,
/obj/structure/cable/white{
icon_state = "1-2"
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/landmark/blobstart,
-/turf/open/floor/plating,
-/area/maintenance/port)
+/turf/open/floor/plasteel/dark,
+/area/maintenance/port/aft)
"aUc" = (
/obj/machinery/power/apc{
areastring = "/area/library";
@@ -27000,74 +29342,114 @@
/turf/open/floor/wood,
/area/library)
"aUh" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/structure/cable/white{
- icon_state = "1-8"
- },
-/turf/open/floor/wood,
-/area/library)
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
+/turf/closed/wall/r_wall,
+/area/medical/virology)
"aUi" = (
-/obj/structure/cable/white{
- icon_state = "2-8"
- },
-/turf/open/floor/wood,
-/area/library)
+/turf/closed/wall/rust,
+/area/maintenance/port/aft)
"aUj" = (
/obj/machinery/photocopier,
/turf/open/floor/plasteel/dark,
/area/library)
"aUk" = (
-/obj/structure/bodycontainer/morgue,
-/obj/item/radio/intercom{
- name = "Station Intercom";
- pixel_x = -26
+/obj/structure/table/wood,
+/obj/item/storage/pill_bottle,
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
+"aUl" = (
+/obj/machinery/computer/slot_machine,
+/obj/machinery/light/small,
+/obj/structure/sign/poster/contraband/random{
+ pixel_y = -32
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
},
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
/turf/open/floor/plasteel/dark,
-/area/medical/morgue)
+/area/maintenance/port/aft)
+"aUm" = (
+/obj/machinery/computer/slot_machine,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/maintenance/port/aft)
"aUn" = (
/obj/effect/spawner/structure/window/reinforced/tinted,
/turf/open/floor/plating,
/area/medical/medbay/zone3)
"aUo" = (
-/obj/machinery/camera{
- c_tag = "Genetics Cloning";
- dir = 4
+/obj/structure/table/wood,
+/obj/item/coin/iron{
+ icon_state = "coin_bananium_heads";
+ name = "arcade coin";
+ pixel_x = 6
},
-/obj/machinery/airalarm{
- dir = 4;
- pixel_x = -22
+/obj/item/coin/iron{
+ icon_state = "coin_bananium_heads";
+ name = "arcade coin";
+ pixel_x = -6
},
-/obj/effect/turf_decal/tile/blue{
- dir = 1
+/obj/item/coin/iron{
+ icon_state = "coin_bananium_heads";
+ name = "arcade coin";
+ pixel_y = 6
},
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/zone3)
+/obj/item/instrument/guitar,
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
"aUp" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/obj/effect/turf_decal/tile/blue{
+/obj/structure/table/wood,
+/obj/item/reagent_containers/blood/random,
+/obj/item/reagent_containers/syringe{
+ pixel_y = 5
+ },
+/obj/item/reagent_containers/syringe,
+/obj/effect/turf_decal/tile/neutral{
dir = 1
},
-/obj/effect/turf_decal/tile/blue{
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
dir = 4
},
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/zone3)
-"aUq" = (
-/obj/machinery/computer/cloning{
+/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/obj/effect/turf_decal/tile/blue{
- dir = 4
+/turf/open/floor/plasteel/dark,
+/area/maintenance/port/aft)
+"aUq" = (
+/obj/structure/table/wood,
+/obj/item/clipboard,
+/obj/item/toy/syndicateballoon,
+/obj/item/newspaper,
+/obj/item/clothing/head/bowler,
+/obj/machinery/power/apc{
+ areastring = "/area/maintenance/port/aft";
+ dir = 8;
+ name = "Port Quarter Maintenance APC";
+ pixel_x = -26;
+ pixel_y = 3
},
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/zone3)
+/obj/structure/cable/white{
+ icon_state = "0-4"
+ },
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
"aUr" = (
/obj/machinery/status_display,
/turf/closed/wall,
@@ -27085,27 +29467,41 @@
/turf/open/floor/plasteel/dark,
/area/medical/chemistry)
"aUt" = (
+/obj/effect/turf_decal/bot,
+/obj/machinery/holopad,
/obj/structure/cable/white{
- icon_state = "1-4"
+ icon_state = "4-8"
},
-/obj/effect/turf_decal/tile/yellow{
+/turf/open/floor/plasteel,
+/area/medical/chemistry)
+"aUu" = (
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 8
},
-/turf/open/floor/plasteel/white,
-/area/medical/chemistry)
+/obj/structure/cable/white{
+ icon_state = "1-2"
+ },
+/obj/structure/cable/white{
+ icon_state = "1-8"
+ },
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
"aUv" = (
-/obj/machinery/holopad,
/obj/structure/cable/white{
icon_state = "2-8"
},
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plasteel,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/obj/effect/landmark/start/chemist,
+/turf/open/floor/plasteel/white,
/area/medical/chemistry)
"aUw" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
+/obj/structure/closet/crate/bin,
/turf/open/floor/plasteel/white,
/area/medical/chemistry)
"aUx" = (
@@ -27244,6 +29640,73 @@
},
/turf/closed/wall/r_wall,
/area/science/research)
+"aUJ" = (
+/obj/machinery/computer/security/telescreen/entertainment{
+ pixel_y = -32
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/maintenance/port/aft)
+"aUK" = (
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/machinery/door/airlock/virology{
+ name = "Virology Access";
+ req_access_txt = "39"
+ },
+/obj/machinery/door/firedoor,
+/turf/open/floor/plasteel,
+/area/medical/virology)
+"aUL" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
+"aUM" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/door/airlock/maintenance_hatch{
+ name = "Medbay Maintenance";
+ req_access_txt = "5"
+ },
+/obj/structure/cable/white{
+ icon_state = "1-2"
+ },
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/maintenance/port/aft)
+"aUN" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/cable/white{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
"aUO" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -27346,18 +29809,22 @@
/turf/open/floor/wood,
/area/library)
"aUZ" = (
-/obj/effect/landmark/barthpot,
-/turf/open/floor/wood,
-/area/library)
-"aVa" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
+ dir = 4
},
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
+"aVa" = (
/obj/structure/cable/white{
- icon_state = "1-2"
+ icon_state = "1-4"
},
-/turf/open/floor/wood,
-/area/library)
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
"aVb" = (
/obj/structure/table/wood,
/obj/item/storage/crayons,
@@ -27382,117 +29849,109 @@
/turf/open/floor/plasteel/dark,
/area/library)
"aVc" = (
-/obj/structure/bodycontainer/morgue,
-/obj/machinery/light{
- dir = 8
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/medical/morgue)
-"aVd" = (
/obj/structure/cable/white{
- icon_state = "1-2"
+ icon_state = "2-8"
+ },
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/obj/structure/cable/white{
+ icon_state = "2-4"
},
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 8
- },
-/obj/effect/turf_decal/tile/neutral{
dir = 1
},
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plating{
+ icon_state = "panelscorched"
},
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
+/area/maintenance/port/aft)
+"aVd" = (
+/obj/structure/cable/white{
+ icon_state = "4-8"
},
-/turf/open/floor/plasteel/dark,
-/area/medical/morgue)
+/obj/structure/cable/white{
+ icon_state = "2-4"
+ },
+/obj/structure/cable/white{
+ icon_state = "2-8"
+ },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
"aVe" = (
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/medical/morgue)
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
"aVf" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/grunge{
- name = "Morgue";
- req_access_txt = "5"
+/obj/structure/cable/white{
+ icon_state = "4-8"
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
+/obj/structure/cable/white{
+ icon_state = "1-8"
},
+/obj/structure/cable/white{
+ icon_state = "1-4"
+ },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/medical/medbay/zone3)
-"aVg" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/obj/effect/turf_decal/tile/blue{
dir = 1
},
-/obj/effect/turf_decal/tile/blue{
- dir = 8
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
+"aVg" = (
+/obj/structure/cable/white{
+ icon_state = "4-8"
},
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/zone3)
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plating{
+ icon_state = "platingdmg3"
+ },
+/area/maintenance/port/aft)
"aVh" = (
-/obj/machinery/holopad,
-/obj/effect/landmark/start/medical_doctor,
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 4
+/obj/structure/cable/white{
+ icon_state = "2-8"
},
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plasteel,
-/area/medical/medbay/zone3)
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 10
+ },
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
"aVi" = (
-/obj/machinery/dna_scannernew,
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
+/turf/open/floor/plating{
+ icon_state = "panelscorched"
},
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/zone3)
+/area/maintenance/port/aft)
"aVj" = (
-/obj/structure/table/glass,
-/obj/item/stack/sheet/mineral/plasma,
-/obj/item/stack/sheet/mineral/plasma,
-/obj/item/stack/sheet/mineral/plasma,
-/obj/item/reagent_containers/glass/bottle/charcoal{
- pixel_x = 6
+/obj/machinery/chem_master,
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
},
-/obj/item/reagent_containers/glass/bottle/epinephrine,
-/obj/item/reagent_containers/dropper,
-/obj/effect/turf_decal/bot,
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
+/turf/open/floor/plasteel,
/area/medical/chemistry)
-"aVl" = (
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
+"aVk" = (
+/obj/structure/closet/emcloset,
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
},
-/turf/open/floor/plasteel/white,
+/turf/open/floor/plasteel,
+/area/maintenance/port/aft)
+"aVl" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
/area/medical/chemistry)
"aVm" = (
/obj/structure/cable/white{
@@ -27503,16 +29962,11 @@
/turf/open/floor/plasteel/white,
/area/medical/chemistry)
"aVn" = (
-/obj/structure/closet/crate/bin,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/requests_console{
- department = "Chemistry Lab";
- name = "Chemistry RC";
- pixel_x = 32;
- receive_ore_updates = 1
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
},
-/obj/effect/turf_decal/tile/yellow,
-/turf/open/floor/plasteel/white,
+/obj/machinery/chem_heater,
+/turf/open/floor/plasteel,
/area/medical/chemistry)
"aVo" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
@@ -27701,6 +30155,39 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/closed/wall/r_wall,
/area/science/research)
+"aVF" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 5
+ },
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
+"aVG" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
+"aVH" = (
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
+"aVI" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 10
+ },
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
+"aVJ" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 6
+ },
+/obj/structure/cable/white{
+ icon_state = "2-4"
+ },
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
"aVK" = (
/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
dir = 6
@@ -27716,14 +30203,14 @@
/turf/open/space,
/area/asteroid/nearstation)
"aVM" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 9
+ },
/obj/structure/cable/white{
- icon_state = "1-2"
+ icon_state = "1-8"
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating{
- icon_state = "panelscorched"
- },
-/area/maintenance/port)
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
"aVN" = (
/obj/structure/table/wood,
/obj/item/storage/bag/books,
@@ -27767,9 +30254,15 @@
/turf/open/floor/plasteel/dark,
/area/library)
"aVR" = (
-/obj/structure/bookcase/random/fiction,
-/turf/open/floor/plasteel/dark,
-/area/library)
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/structure/reagent_dispensers/watertank,
+/obj/machinery/light/small{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/maintenance/port/aft)
"aVS" = (
/obj/structure/bookcase/random/fiction,
/obj/effect/turf_decal/tile/neutral{
@@ -27809,22 +30302,15 @@
/turf/open/floor/plasteel/dark,
/area/library)
"aVW" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/cable/white{
- icon_state = "1-2"
- },
-/obj/effect/turf_decal/tile/neutral{
+/obj/structure/rack,
+/obj/item/storage/toolbox/mechanical,
+/obj/item/clothing/head/welding,
+/obj/machinery/light/small,
+/obj/effect/turf_decal/stripes/line{
dir = 1
},
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/library)
+/turf/open/floor/plasteel,
+/area/maintenance/port/aft)
"aVX" = (
/obj/structure/easel,
/obj/item/canvas/twentythreeXnineteen,
@@ -27836,24 +30322,18 @@
/turf/open/floor/plasteel/dark,
/area/library)
"aVY" = (
-/obj/structure/table,
-/obj/item/clothing/gloves/color/latex,
-/obj/structure/extinguisher_cabinet{
- pixel_x = -26
+/obj/machinery/door/airlock/grunge{
+ name = "Crematorium";
+ req_access_txt = "27"
},
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/medical/morgue)
-"aVZ" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/structure/cable/white{
icon_state = "1-2"
},
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
},
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
@@ -27865,19 +30345,39 @@
dir = 8
},
/turf/open/floor/plasteel/dark,
-/area/medical/morgue)
-"aWa" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 5
+/area/maintenance/port/aft)
+"aVZ" = (
+/obj/machinery/door/airlock/maintenance_hatch{
+ name = "Maintenance Hatch";
+ req_access_txt = "12"
},
-/obj/effect/turf_decal/tile/neutral{
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/cable/white{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/stripes/line{
dir = 1
},
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
+"aWa" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 10
},
-/turf/open/floor/plasteel/dark,
-/area/medical/morgue)
+/obj/effect/turf_decal/bot,
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/obj/item/storage/backpack,
+/obj/item/crowbar,
+/obj/item/wrench,
+/obj/structure/rack,
+/turf/open/floor/plasteel,
+/area/maintenance/port/aft)
"aWb" = (
/obj/effect/spawner/structure/window/reinforced/tinted,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
@@ -27886,123 +30386,78 @@
/turf/open/floor/plating,
/area/medical/medbay/zone3)
"aWc" = (
-/obj/machinery/light_switch{
- pixel_x = -24;
- pixel_y = -38
+/obj/structure/cable/white{
+ icon_state = "1-4"
},
-/obj/machinery/button/door{
- desc = "A remote control switch for the medbay foyer.";
- id = "cloningfoyer";
- name = "Cloning Doors Control";
- normaldoorcontrol = 1;
- pixel_x = -24;
- pixel_y = -24
+/obj/structure/cable/white{
+ icon_state = "1-2"
},
-/obj/structure/closet/crate/freezer/surplus_limbs,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/zone3)
-"aWd" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+/obj/effect/landmark/blobstart,
+/turf/open/floor/plating{
+ icon_state = "platingdmg1"
+ },
+/area/maintenance/port/aft)
+"aWd" = (
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/obj/effect/landmark/event_spawn,
+/obj/item/tank/internals/oxygen/red,
+/obj/item/clothing/mask/gas,
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
+"aWe" = (
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/stripes/line{
dir = 4
},
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
+/turf/open/floor/plating{
+ icon_state = "panelscorched"
},
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/zone3)
-"aWe" = (
-/obj/structure/table/glass,
-/obj/item/storage/box/bodybags{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/item/storage/box/bodybags,
-/obj/item/pen,
-/obj/machinery/firealarm{
- dir = 8;
- pixel_x = 24
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10
- },
-/obj/effect/turf_decal/tile/blue,
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/zone3)
+/area/maintenance/port/aft)
"aWf" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/requests_console{
+ department = "Chemistry Lab";
+ name = "Chemistry RC";
+ pixel_x = 32;
+ receive_ore_updates = 1
+ },
+/obj/effect/turf_decal/tile/yellow,
/obj/structure/table/glass,
-/obj/item/folder/white,
-/obj/item/reagent_containers/glass/beaker/large{
- pixel_x = -3
- },
-/obj/item/reagent_containers/glass/beaker{
- pixel_x = 3
+/obj/item/stack/sheet/mineral/plasma,
+/obj/item/stack/sheet/mineral/plasma,
+/obj/item/stack/sheet/mineral/plasma,
+/obj/item/reagent_containers/glass/bottle/charcoal{
+ pixel_x = 6
},
+/obj/item/reagent_containers/glass/bottle/epinephrine,
/obj/item/reagent_containers/dropper,
-/obj/effect/turf_decal/bot,
-/obj/effect/turf_decal/tile/neutral,
-/turf/open/floor/plasteel/dark,
+/obj/item/reagent_containers/dropper,
+/turf/open/floor/plasteel/white,
/area/medical/chemistry)
"aWg" = (
-/obj/structure/table/glass,
-/obj/item/assembly/igniter,
-/obj/item/assembly/igniter,
-/obj/item/assembly/igniter,
-/obj/item/assembly/timer{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/item/assembly/timer{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/item/assembly/timer{
- pixel_x = 3;
- pixel_y = 3
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
},
+/obj/machinery/chem_dispenser,
+/turf/open/floor/plasteel,
+/area/medical/chemistry)
+"aWh" = (
/obj/machinery/firealarm{
dir = 1;
pixel_y = -24
},
/obj/machinery/light,
+/obj/structure/chair/office/light{
+ dir = 8
+ },
+/obj/effect/landmark/start/chemist,
/obj/effect/turf_decal/bot,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/medical/chemistry)
-"aWh" = (
-/obj/structure/table/glass,
-/obj/item/clothing/glasses/science{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/item/clothing/glasses/science,
-/obj/item/stack/cable_coil/white{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/item/stack/cable_coil/white,
-/obj/item/grenade/chem_grenade,
-/obj/item/grenade/chem_grenade,
-/obj/item/grenade/chem_grenade,
-/obj/item/grenade/chem_grenade,
-/obj/effect/turf_decal/bot,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
+/turf/open/floor/plasteel,
/area/medical/chemistry)
"aWi" = (
/obj/structure/cable/white{
@@ -28020,21 +30475,39 @@
/area/medical/chemistry)
"aWj" = (
/obj/structure/table/glass,
-/obj/item/clipboard,
-/obj/item/toy/figure/chemist,
-/obj/machinery/light_switch{
- pixel_x = 24;
- pixel_y = -24
+/obj/item/clothing/glasses/science{
+ pixel_x = 3;
+ pixel_y = 3
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/bot,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
+/obj/item/clothing/glasses/science,
+/obj/item/stack/cable_coil/white{
+ pixel_x = 3;
+ pixel_y = 3
},
-/obj/effect/turf_decal/tile/neutral{
+/obj/item/stack/cable_coil/white,
+/obj/item/grenade/chem_grenade,
+/obj/item/grenade/chem_grenade,
+/obj/item/grenade/chem_grenade,
+/obj/item/grenade/chem_grenade,
+/obj/item/assembly/igniter,
+/obj/item/assembly/igniter,
+/obj/item/assembly/igniter,
+/obj/item/assembly/timer{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/item/assembly/timer{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/item/assembly/timer{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/effect/turf_decal/stripes/line{
dir = 4
},
-/turf/open/floor/plasteel/dark,
+/turf/open/floor/plasteel,
/area/medical/chemistry)
"aWk" = (
/obj/structure/table,
@@ -28149,6 +30622,46 @@
},
/turf/open/floor/circuit/green/telecomms/mainframe,
/area/science/research)
+"aWv" = (
+/obj/machinery/door/airlock/maintenance_hatch{
+ name = "Maintenance Hatch";
+ req_access_txt = "12"
+ },
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
+"aWw" = (
+/obj/structure/sign/warning/biohazard{
+ pixel_x = -32
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
+"aWx" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/landmark/blobstart,
+/obj/structure/cable/white{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
+"aWy" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/turf_decal/bot,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/machinery/portable_atmospherics/canister/oxygen,
+/turf/open/floor/plasteel,
+/area/maintenance/port/aft)
"aWz" = (
/obj/machinery/atmospherics/pipe/heat_exchanging/simple,
/obj/structure/lattice,
@@ -28211,12 +30724,13 @@
/turf/open/floor/plasteel/dark,
/area/library)
"aWF" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/structure/cable/white{
icon_state = "1-2"
},
-/turf/open/floor/plasteel/dark,
-/area/library)
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
"aWG" = (
/obj/machinery/bookbinder,
/obj/machinery/status_display{
@@ -28235,68 +30749,72 @@
/turf/open/floor/plasteel/dark,
/area/library)
"aWH" = (
-/obj/structure/bodycontainer/morgue,
-/obj/machinery/power/apc{
- areastring = "/area/medical/morgue";
- name = "Morgue APC";
- pixel_y = -26
- },
-/obj/structure/cable/white{
- icon_state = "0-4"
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/medical/morgue)
-"aWI" = (
-/obj/effect/decal/cleanable/blood/old,
-/obj/structure/cable/white{
- icon_state = "1-8"
- },
-/turf/open/floor/plating,
-/area/medical/morgue)
-"aWJ" = (
-/obj/structure/closet/crate/bin,
-/obj/machinery/camera{
- c_tag = "Medbay Morgue";
- dir = 8
- },
-/obj/effect/turf_decal/tile/neutral{
+/obj/structure/closet/firecloset,
+/obj/effect/turf_decal/stripes/line{
dir = 1
},
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
+/turf/open/floor/plasteel,
+/area/maintenance/port/aft)
+"aWI" = (
+/obj/structure/cable/white{
+ icon_state = "4-8"
},
-/turf/open/floor/plasteel/dark,
-/area/medical/morgue)
+/obj/effect/turf_decal/delivery,
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/virology)
+"aWJ" = (
+/obj/machinery/light/small{
+ dir = 1
+ },
+/obj/effect/turf_decal/delivery,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 4
+ },
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/virology)
"aWK" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/medical/medbay/zone3)
"aWL" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/medical/glass{
- id_tag = "cloningfoyer";
- name = "Cloning Lab";
- req_access_txt = "5"
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/stripes/line,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/effect/mapping_helpers/airlock/unres{
- dir = 1
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/newscaster{
+ pixel_x = 32
},
/turf/open/floor/plasteel,
-/area/medical/medbay/zone3)
+/area/medical/virology)
"aWM" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/medical/medbay/zone3)
+/obj/machinery/door/airlock/virology{
+ name = "Virology Access";
+ req_access_txt = "39"
+ },
+/obj/machinery/door/firedoor,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/virology)
"aWN" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/medical/glass{
@@ -28339,7 +30857,7 @@
/turf/open/floor/plasteel/grimy,
/area/crew_quarters/lounge)
"aWR" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21";
pixel_x = -3;
pixel_y = 3
@@ -28464,6 +30982,27 @@
/obj/structure/lattice/catwalk,
/turf/open/space,
/area/asteroid/nearstation)
+"aXd" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/machinery/light/small,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 9
+ },
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
+"aXe" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/turf_decal/stripes/line,
+/obj/structure/cable/white{
+ icon_state = "1-8"
+ },
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
"aXf" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/closed/wall,
@@ -28488,13 +31027,19 @@
/turf/open/floor/plasteel/dark,
/area/library)
"aXi" = (
-/obj/machinery/airalarm{
- dir = 1;
- pixel_y = -22
+/obj/structure/bonfire,
+/obj/item/reagent_containers/food/drinks/bottle/orangejuice{
+ desc = "For the weary spacemen on their quest to rekindle the first plasma fire.";
+ name = "Carton of Estus"
},
-/obj/structure/closet/crate/bin,
-/turf/open/floor/plasteel/dark,
-/area/library)
+/obj/item/nullrod/claymore/glowing{
+ desc = "Don't tell anyone you put any points into dex, though.";
+ force = 10;
+ name = "moonlight greatsword"
+ },
+/obj/effect/decal/remains/human,
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
"aXj" = (
/obj/structure/bookcase/random/reference,
/obj/effect/turf_decal/tile/neutral{
@@ -28602,7 +31147,7 @@
/turf/open/floor/plasteel/white,
/area/medical/medbay/zone3)
"aXu" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/machinery/button/door{
@@ -28625,6 +31170,21 @@
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/zone3)
+"aXv" = (
+/obj/machinery/door/airlock/maintenance_hatch{
+ name = "Maintenance Hatch";
+ req_access_txt = "12"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/cable/white{
+ icon_state = "1-2"
+ },
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/maintenance/port/aft)
"aXw" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 8
@@ -28709,6 +31269,19 @@
},
/turf/open/floor/plasteel/white,
/area/science/research)
+"aXD" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/firealarm{
+ dir = 1;
+ pixel_y = -26
+ },
+/turf/open/floor/plasteel,
+/area/medical/virology)
"aXE" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -28835,53 +31408,21 @@
/turf/open/floor/wood,
/area/library)
"aXN" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/machinery/door/airlock/maintenance_hatch{
name = "Maintenance Hatch";
req_access_txt = "12"
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/cable/white{
- icon_state = "1-2"
- },
/obj/effect/turf_decal/stripes/line,
/obj/effect/turf_decal/stripes/line{
dir = 1
},
-/turf/open/floor/plating,
-/area/maintenance/port)
-"aXO" = (
-/obj/structure/table/glass,
-/obj/item/storage/firstaid/toxin{
- pixel_x = 6;
- pixel_y = 6
- },
-/obj/item/storage/firstaid/toxin{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/item/storage/firstaid/regular,
-/obj/item/storage/firstaid/toxin{
- pixel_x = -3;
- pixel_y = -3
- },
-/obj/machinery/requests_console{
- department = "Medbay";
- departmentType = 1;
- name = "Medbay RC";
- pixel_x = -30
- },
-/obj/machinery/camera{
- c_tag = "Medbay Storage"
- },
-/obj/effect/turf_decal/delivery,
-/obj/structure/window/reinforced{
- dir = 4
- },
-/obj/structure/window/reinforced{
- dir = 1
- },
/turf/open/floor/plasteel,
-/area/medical/medbay/zone3)
+/area/maintenance/port/aft)
+"aXO" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/wood,
+/area/maintenance/port/aft)
"aXP" = (
/obj/structure/extinguisher_cabinet{
pixel_y = 32
@@ -28978,6 +31519,12 @@
},
/turf/open/floor/plasteel,
/area/medical/medbay/zone3)
+"aXY" = (
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 1
+ },
+/turf/closed/wall/r_wall,
+/area/medical/virology)
"aXZ" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/structure/closet/crate/bin,
@@ -29324,85 +31871,77 @@
/turf/open/floor/wood,
/area/library)
"aYz" = (
-/obj/structure/cable/white{
- icon_state = "2-4"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
- },
-/turf/open/floor/plating{
- icon_state = "platingdmg3"
- },
-/area/maintenance/port)
-"aYA" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating{
- icon_state = "platingdmg1"
- },
-/area/maintenance/port)
-"aYC" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plating,
-/area/maintenance/port)
-"aYE" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/structure/cable/white{
- icon_state = "1-8"
+/obj/structure/closet/l3closet/virology,
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 8
},
/obj/effect/turf_decal/stripes/line{
- dir = 1
+ dir = 10
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/virology)
+"aYA" = (
+/obj/machinery/atmospherics/pipe/simple/general/visible{
+ dir = 10
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/obj/machinery/airalarm{
+ pixel_y = 23
},
/turf/open/floor/plating,
-/area/maintenance/port)
-"aYF" = (
-/obj/structure/cable/white{
- icon_state = "2-8"
+/area/maintenance/port/aft)
+"aYB" = (
+/obj/machinery/shower{
+ desc = "From what you understand it was put in rather recently, but the design looks right out of the 2510's. Weird.";
+ dir = 1;
+ icon_state = "shower";
+ name = "Emergency Shower"
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/obj/machinery/camera{
+ c_tag = "Virology Access";
+ dir = 1
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/virology)
+"aYC" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/landmark/event_spawn,
+/turf/open/floor/wood,
+/area/maintenance/port/aft)
+"aYD" = (
+/obj/machinery/atmospherics/components/unary/tank/air,
+/obj/effect/turf_decal/stripes/line{
dir = 10
},
/turf/open/floor/plating,
-/area/maintenance/port)
+/area/maintenance/port/aft)
+"aYE" = (
+/obj/machinery/computer/pandemic,
+/obj/effect/turf_decal/tile/green,
+/obj/item/healthanalyzer,
+/obj/machinery/requests_console{
+ department = "Virology";
+ name = "Virology RC";
+ pixel_x = 0;
+ pixel_y = -32;
+ receive_ore_updates = 1
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/virology)
+"aYF" = (
+/obj/structure/chair/comfy/black,
+/turf/open/floor/wood,
+/area/maintenance/port/aft)
"aYG" = (
-/obj/structure/table/glass,
-/obj/item/storage/firstaid/fire{
- pixel_x = 6;
- pixel_y = 6
- },
-/obj/item/storage/firstaid/fire{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/item/storage/firstaid/regular,
-/obj/item/storage/firstaid/fire{
- pixel_x = -3;
- pixel_y = -3
- },
-/obj/machinery/airalarm{
- dir = 4;
- pixel_x = -22
- },
-/obj/effect/turf_decal/delivery,
-/obj/machinery/door/window/eastleft{
- name = "First-Aid Supplies";
- req_access_txt = "5"
- },
-/turf/open/floor/plasteel,
-/area/medical/medbay/zone3)
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/chair/comfy/black,
+/turf/open/floor/wood,
+/area/maintenance/port/aft)
"aYH" = (
/obj/effect/landmark/start/medical_doctor,
/obj/effect/turf_decal/tile/blue{
@@ -29611,6 +32150,14 @@
heat_capacity = 1e+006
},
/area/hallway/primary/aft)
+"aYX" = (
+/obj/effect/turf_decal/tile/bar,
+/obj/effect/turf_decal/tile/bar{
+ dir = 1
+ },
+/obj/structure/window/reinforced/spawner/north,
+/turf/open/floor/plasteel,
+/area/maintenance/port/aft)
"aYY" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -29710,62 +32257,80 @@
},
/turf/closed/wall/r_wall/rust,
/area/science/robotics/lab)
+"aZn" = (
+/obj/effect/turf_decal/tile/bar,
+/obj/effect/turf_decal/tile/bar{
+ dir = 1
+ },
+/obj/structure/window/reinforced/spawner/north,
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 1
+ },
+/obj/effect/landmark/xeno_spawn,
+/turf/open/floor/plasteel,
+/area/maintenance/port/aft)
"aZo" = (
-/obj/structure/girder,
-/turf/open/floor/plating,
-/area/maintenance/port)
+/obj/effect/turf_decal/tile/bar,
+/obj/effect/turf_decal/tile/bar{
+ dir = 1
+ },
+/obj/machinery/door/window/northright{
+ name = "Theatre Stage"
+ },
+/turf/open/floor/plasteel,
+/area/maintenance/port/aft)
"aZp" = (
-/obj/structure/table/wood,
-/obj/item/gun/ballistic/automatic/toy/pistol/unrestricted,
-/turf/open/floor/plating,
-/area/maintenance/port)
+/obj/effect/turf_decal/tile/bar,
+/obj/effect/turf_decal/tile/bar{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/maintenance/port/aft)
"aZq" = (
-/obj/structure/table/wood,
-/obj/item/clothing/gloves/color/black,
-/obj/item/taperecorder,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/machinery/door/airlock/maintenance_hatch{
+ name = "Maintenance Hatch";
+ req_access_txt = "12"
+ },
+/turf/open/floor/plasteel,
+/area/maintenance/port/aft)
+"aZr" = (
+/obj/effect/turf_decal/tile/bar,
+/obj/effect/turf_decal/tile/bar{
+ dir = 1
+ },
/obj/machinery/light/small{
dir = 1
},
-/obj/structure/sign/poster/contraband/random{
- pixel_y = 32
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/maintenance/port)
-"aZr" = (
-/obj/structure/rack,
-/obj/item/storage/briefcase{
- pixel_x = -3;
- pixel_y = 3
- },
-/obj/item/storage/secure/briefcase,
-/obj/effect/decal/cleanable/cobweb/cobweb2,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/maintenance/port)
+/turf/open/floor/plasteel,
+/area/maintenance/port/aft)
"aZs" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/sign/poster/contraband/random,
-/turf/closed/wall,
-/area/maintenance/port)
+/obj/machinery/vending/autodrobe,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/maintenance/port/aft)
+"aZt" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/structure/table/wood,
+/obj/item/clothing/suit/syndicatefake,
+/obj/item/clothing/head/syndicatefake,
+/turf/open/floor/plasteel/dark,
+/area/maintenance/port/aft)
"aZu" = (
/obj/machinery/status_display{
pixel_y = -32
@@ -29806,88 +32371,119 @@
},
/turf/open/floor/wood,
/area/library)
-"aZy" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6
- },
-/turf/closed/wall/rust,
-/area/maintenance/port)
-"aZz" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+"aZx" = (
+/obj/effect/turf_decal/tile/neutral{
dir = 4
},
-/obj/structure/sign/poster/contraband/random,
-/turf/closed/wall,
-/area/maintenance/port)
-"aZA" = (
-/obj/structure/barricade/wooden,
-/obj/machinery/door/airlock/maintenance_hatch{
- name = "Maintenance Hatch";
- req_access_txt = "12"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line,
-/obj/effect/turf_decal/stripes/line{
+/obj/effect/turf_decal/tile/neutral{
dir = 1
},
-/turf/open/floor/plasteel,
-/area/maintenance/port)
-"aZB" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10
- },
-/turf/closed/wall,
-/area/maintenance/port)
-"aZC" = (
-/obj/structure/table/glass,
-/obj/item/storage/firstaid/brute{
- pixel_x = 6;
- pixel_y = 6
- },
-/obj/item/storage/firstaid/brute{
+/obj/machinery/light/small,
+/obj/structure/table/wood,
+/obj/item/lipstick/random{
pixel_x = 3;
pixel_y = 3
},
-/obj/item/storage/firstaid/regular,
-/obj/item/storage/firstaid/brute{
+/obj/item/lipstick/random{
pixel_x = -3;
pixel_y = -3
},
-/obj/machinery/newscaster{
- pixel_x = -32
- },
-/obj/structure/cable/white{
- icon_state = "2-4"
- },
-/obj/effect/turf_decal/delivery,
-/obj/machinery/door/window/eastright{
- name = "First-Aid Supplies";
- req_access_txt = "5"
- },
-/turf/open/floor/plasteel,
-/area/medical/medbay/zone3)
-"aZD" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/obj/effect/turf_decal/loading_area{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/corner,
-/obj/effect/turf_decal/stripes/corner{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue{
+/obj/item/lipstick/random,
+/turf/open/floor/plasteel/dark,
+/area/maintenance/port/aft)
+"aZy" = (
+/obj/effect/turf_decal/tile/neutral{
dir = 4
},
-/obj/effect/turf_decal/tile/blue{
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/structure/table/wood,
+/obj/item/clothing/suit/justice,
+/obj/item/clothing/head/helmet/justice/escape{
+ name = "justice helmet"
+ },
+/turf/open/floor/plasteel/dark,
+/area/maintenance/port/aft)
+"aZz" = (
+/obj/structure/dresser,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/zone3)
+/turf/open/floor/plasteel/dark,
+/area/maintenance/port/aft)
+"aZA" = (
+/obj/structure/table/glass,
+/obj/item/clipboard,
+/obj/machinery/light_switch{
+ pixel_x = 24;
+ pixel_y = -24
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/turf_decal/bot,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/item/folder/white,
+/obj/item/toy/figure/chemist,
+/obj/item/reagent_containers/glass/beaker/large{
+ pixel_x = -3;
+ pixel_y = 6
+ },
+/obj/item/reagent_containers/glass/beaker{
+ pixel_x = 3;
+ pixel_y = 6
+ },
+/turf/open/floor/plasteel/dark,
+/area/medical/chemistry)
+"aZB" = (
+/obj/machinery/door/firedoor,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/door/airlock/virology/glass{
+ name = "Isolation Room";
+ req_access_txt = "39"
+ },
+/turf/open/floor/plasteel/freezer,
+/area/medical/virology)
+"aZC" = (
+/obj/structure/table/wood,
+/obj/structure/sign/poster/random{
+ pixel_x = 32
+ },
+/turf/open/floor/wood,
+/area/maintenance/port/aft)
+"aZD" = (
+/obj/machinery/atmospherics/components/binary/valve/on{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
+ },
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
+"aZE" = (
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/atmos/abandoned{
+ name = "Atmospherics Maintenance";
+ req_access_txt = "12;24"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/maintenance/port/aft)
"aZF" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/medical/glass{
@@ -29948,6 +32544,21 @@
},
/turf/open/floor/plasteel,
/area/medical/medbay/zone3)
+"aZJ" = (
+/obj/machinery/atmospherics/components/unary/portables_connector/visible{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/obj/structure/sign/warning/nosmoking{
+ pixel_y = -32
+ },
+/obj/structure/sign/warning/fire{
+ pixel_x = 32
+ },
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
"aZK" = (
/obj/machinery/holopad,
/obj/structure/cable/white{
@@ -30296,113 +32907,6 @@
icon_state = "platingdmg1"
},
/area/maintenance/starboard)
-"baj" = (
-/turf/closed/wall,
-/area/maintenance/port)
-"bam" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/maintenance/port)
-"bao" = (
-/obj/structure/cable/white{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bap" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall,
-/area/maintenance/port)
-"baq" = (
-/obj/structure/table/wood,
-/obj/item/clothing/suit/syndicatefake,
-/obj/item/clothing/head/syndicatefake,
-/obj/effect/decal/cleanable/cobweb,
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/maintenance/port)
-"bar" = (
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bas" = (
-/obj/structure/dresser,
-/obj/machinery/light/small{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/maintenance/port)
-"bat" = (
-/obj/structure/table/glass,
-/obj/item/storage/firstaid/o2{
- pixel_x = 6;
- pixel_y = 6
- },
-/obj/item/storage/firstaid/o2{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/item/storage/firstaid/regular,
-/obj/item/storage/firstaid/o2{
- pixel_x = -3;
- pixel_y = -3
- },
-/obj/machinery/power/apc{
- areastring = "/area/medical/medbay/zone3";
- dir = 8;
- name = "Medbay APC";
- pixel_x = -26
- },
-/obj/structure/cable/white,
-/obj/effect/turf_decal/delivery,
-/obj/structure/window/reinforced,
-/obj/structure/window/reinforced{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/medical/medbay/zone3)
-"bau" = (
-/obj/machinery/light,
-/obj/structure/noticeboard{
- dir = 1;
- pixel_y = -32
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 5
- },
-/obj/effect/turf_decal/bot,
-/obj/effect/turf_decal/stripes/box,
-/obj/machinery/rnd/production/techfab/department/medical,
-/turf/open/floor/plasteel,
-/area/medical/medbay/zone3)
-"bav" = (
-/obj/machinery/vending/medical,
-/obj/machinery/firealarm{
- dir = 1;
- pixel_y = -24
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plasteel,
-/area/medical/medbay/zone3)
"baw" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/sign/departments/medbay/alt,
@@ -30800,101 +33304,6 @@
},
/turf/open/floor/plasteel/dark,
/area/science/robotics/lab)
-"bbc" = (
-/obj/structure/table/wood,
-/obj/item/flashlight/lamp,
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bbe" = (
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/maintenance/port)
-"bbf" = (
-/obj/structure/cable/white{
- icon_state = "1-4"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 5
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bbg" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bbh" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/landmark/blobstart,
-/turf/open/floor/plating{
- icon_state = "panelscorched"
- },
-/area/maintenance/port)
-"bbj" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bbk" = (
-/obj/structure/cable/white{
- icon_state = "1-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bbl" = (
-/obj/structure/table/wood,
-/obj/item/clipboard,
-/obj/item/toy/syndicateballoon,
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/maintenance/port)
-"bbm" = (
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/maintenance/port)
-"bbn" = (
-/obj/machinery/vending/autodrobe,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/maintenance/port)
"bbp" = (
/obj/machinery/light{
dir = 8
@@ -30914,7 +33323,7 @@
/turf/open/floor/plasteel/white,
/area/medical/medbay/zone3)
"bbr" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/effect/turf_decal/tile/blue,
@@ -31208,92 +33617,6 @@
},
/turf/open/floor/plasteel/dark,
/area/science/robotics/lab)
-"bbQ" = (
-/turf/open/floor/wood{
- icon_state = "wood-broken5"
- },
-/area/maintenance/port)
-"bbR" = (
-/turf/open/floor/wood,
-/area/maintenance/port)
-"bbS" = (
-/turf/open/floor/wood{
- icon_state = "wood-broken6"
- },
-/area/maintenance/port)
-"bbT" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 5
- },
-/turf/closed/wall,
-/area/maintenance/port)
-"bbV" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/barricade/wooden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bbW" = (
-/obj/structure/barricade/wooden,
-/obj/machinery/door/airlock/maintenance_hatch{
- name = "Maintenance Hatch";
- req_access_txt = "12"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/maintenance/port)
-"bbX" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
- },
-/turf/closed/wall,
-/area/maintenance/port)
-"bbY" = (
-/obj/machinery/computer/security/telescreen/entertainment,
-/turf/closed/wall,
-/area/maintenance/port)
-"bbZ" = (
-/obj/structure/barricade/wooden,
-/obj/machinery/door/airlock/maintenance_hatch{
- name = "Maintenance Hatch";
- req_access_txt = "12"
- },
-/obj/effect/turf_decal/stripes/line,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/maintenance/port)
-"bca" = (
-/obj/structure/sign/poster/contraband/random,
-/turf/closed/wall,
-/area/maintenance/port)
-"bcb" = (
-/obj/structure/cable/white{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating{
- icon_state = "platingdmg1"
- },
-/area/maintenance/port)
-"bcc" = (
-/obj/structure/reagent_dispensers/watertank,
-/obj/effect/decal/cleanable/cobweb/cobweb2,
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/turf/open/floor/plasteel,
-/area/maintenance/port)
"bcd" = (
/obj/item/retractor,
/obj/item/hemostat,
@@ -31618,129 +33941,6 @@
},
/turf/open/floor/plasteel,
/area/science/mixing)
-"bcF" = (
-/obj/machinery/computer/slot_machine,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/maintenance/port)
-"bcG" = (
-/obj/structure/chair/stool/bar,
-/turf/open/floor/wood,
-/area/maintenance/port)
-"bcH" = (
-/obj/effect/decal/cleanable/blood/splatter,
-/turf/open/floor/wood,
-/area/maintenance/port)
-"bcI" = (
-/turf/open/floor/wood{
- icon_state = "wood-broken2"
- },
-/area/maintenance/port)
-"bcJ" = (
-/obj/structure/chair/stool/bar,
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bcK" = (
-/obj/machinery/computer/slot_machine,
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bcL" = (
-/obj/machinery/vending/cigarette,
-/obj/machinery/newscaster{
- pixel_x = -32
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bcM" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/maintenance/port)
-"bcN" = (
-/obj/structure/chair/comfy/black{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/maintenance/port)
-"bcO" = (
-/obj/structure/window/reinforced{
- dir = 8
- },
-/obj/structure/sign/warning/nosmoking{
- pixel_y = 32
- },
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/maintenance/port)
-"bcR" = (
-/obj/structure/table/wood,
-/obj/item/instrument/guitar,
-/obj/effect/decal/cleanable/cobweb/cobweb2,
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bcS" = (
-/obj/structure/cable/white{
- icon_state = "1-2"
- },
-/obj/structure/cable/white{
- icon_state = "2-4"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/landmark/blobstart,
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bcT" = (
-/obj/structure/rack,
-/obj/item/storage/toolbox/mechanical,
-/obj/item/clothing/head/welding,
-/obj/machinery/light/small{
- dir = 4
- },
-/obj/structure/cable/white{
- icon_state = "0-8"
- },
-/obj/machinery/power/apc{
- areastring = "/area/maintenance/port";
- dir = 4;
- name = "Port Maintenance APC";
- pixel_x = 26
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/maintenance/port)
"bcU" = (
/obj/item/circular_saw,
/obj/item/surgicaldrill{
@@ -32192,160 +34392,6 @@
/obj/structure/sign/warning/fire,
/turf/closed/wall,
/area/science/mixing)
-"bdD" = (
-/obj/structure/table/wood,
-/obj/item/storage/briefcase,
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bdE" = (
-/obj/structure/chair/stool/bar,
-/turf/open/floor/wood{
- icon_state = "wood-broken"
- },
-/area/maintenance/port)
-"bdF" = (
-/obj/structure/chair/stool/bar,
-/turf/open/floor/wood{
- icon_state = "wood-broken5"
- },
-/area/maintenance/port)
-"bdG" = (
-/obj/structure/chair/stool/bar,
-/turf/open/floor/wood{
- icon_state = "wood-broken2"
- },
-/area/maintenance/port)
-"bdH" = (
-/obj/structure/table/wood,
-/obj/item/toy/cards/deck/syndicate{
- pixel_y = 6
- },
-/obj/machinery/light/small{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bdI" = (
-/obj/structure/table/wood,
-/obj/item/wrench,
-/obj/item/storage/secure/briefcase{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/item/storage/briefcase,
-/obj/machinery/light/small{
- dir = 8
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/maintenance/port)
-"bdJ" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 5
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/maintenance/port)
-"bdK" = (
-/obj/structure/chair/comfy/black{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/maintenance/port)
-"bdL" = (
-/obj/structure/window/reinforced{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/maintenance/port)
-"bdM" = (
-/obj/effect/landmark/xeno_spawn,
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
- },
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/maintenance/port)
-"bdN" = (
-/obj/structure/table/wood,
-/obj/item/clothing/suit/justice,
-/obj/item/clothing/head/helmet/justice/escape{
- name = "justice helmet"
- },
-/obj/machinery/light/small{
- dir = 4
- },
-/obj/structure/sign/poster/contraband/random{
- pixel_x = 32
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/maintenance/port)
-"bdO" = (
-/obj/structure/cable/white{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bdP" = (
-/obj/structure/reagent_dispensers/fueltank,
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/turf/open/floor/plasteel,
-/area/maintenance/port)
"bdQ" = (
/obj/structure/closet/secure_closet/medical2,
/obj/machinery/airalarm{
@@ -32756,148 +34802,10 @@
/obj/machinery/door/poddoor/incinerator_toxmix,
/turf/open/floor/engine/vacuum,
/area/science/mixing)
-"beu" = (
-/obj/structure/table/wood,
-/obj/item/storage/pill_bottle,
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bev" = (
-/obj/machinery/computer/slot_machine,
-/obj/machinery/light/small,
-/obj/structure/sign/poster/contraband/random{
- pixel_y = -32
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/maintenance/port)
-"bew" = (
-/obj/structure/table/wood,
-/obj/item/coin/iron{
- icon_state = "coin_bananium_heads";
- name = "arcade coin";
- pixel_x = 6
- },
-/obj/item/coin/iron{
- icon_state = "coin_bananium_heads";
- name = "arcade coin";
- pixel_x = -6
- },
-/obj/item/coin/iron{
- icon_state = "coin_bananium_heads";
- name = "arcade coin";
- pixel_y = 6
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bex" = (
-/obj/structure/table/wood,
-/obj/item/reagent_containers/blood/random,
-/obj/item/reagent_containers/syringe{
- pixel_y = 5
- },
-/obj/item/reagent_containers/syringe,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/maintenance/port)
-"bey" = (
-/obj/structure/table/wood,
-/obj/item/newspaper,
-/obj/item/clothing/head/bowler,
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bez" = (
-/obj/structure/sign/poster/contraband/random{
- pixel_y = -32
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"beA" = (
-/obj/machinery/computer/security/telescreen/entertainment{
- pixel_y = -32
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/maintenance/port)
-"beB" = (
-/obj/machinery/door/window{
- dir = 8;
- name = "Theatre Stage"
- },
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/maintenance/port)
-"beC" = (
-/obj/structure/table/wood,
-/obj/item/lipstick/random{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/item/lipstick/random{
- pixel_x = -3;
- pixel_y = -3
- },
-/obj/item/lipstick/random,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/maintenance/port)
"beE" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/closed/wall,
/area/medical/medbay/zone3)
-"beF" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/door/airlock/maintenance_hatch{
- name = "Medbay Maintenance";
- req_access_txt = "5"
- },
-/obj/structure/cable/white{
- icon_state = "1-2"
- },
-/obj/effect/turf_decal/stripes/line,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/maintenance/port)
"beG" = (
/obj/structure/sign/departments/medbay/alt,
/turf/closed/wall,
@@ -33034,93 +34942,6 @@
},
/turf/closed/wall/r_wall,
/area/science/robotics/lab)
-"beR" = (
-/obj/structure/cable/white{
- icon_state = "1-4"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 5
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"beS" = (
-/obj/structure/cable/white{
- icon_state = "2-8"
- },
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/structure/cable/white{
- icon_state = "2-4"
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plating{
- icon_state = "panelscorched"
- },
-/area/maintenance/port)
-"beV" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/structure/cable/white{
- icon_state = "2-4"
- },
-/obj/structure/cable/white{
- icon_state = "2-8"
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plating,
-/area/maintenance/port)
-"beZ" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bfa" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/structure/cable/white{
- icon_state = "1-8"
- },
-/obj/structure/cable/white{
- icon_state = "1-4"
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bfb" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating{
- icon_state = "platingdmg3"
- },
-/area/maintenance/port)
-"bfd" = (
-/obj/structure/closet/emcloset,
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/turf/open/floor/plasteel,
-/area/maintenance/port)
"bfe" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/airalarm/unlocked{
@@ -33254,22 +35075,6 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on,
/turf/open/floor/plasteel/white,
/area/chapel/main)
-"bfw" = (
-/obj/structure/bonfire,
-/obj/item/reagent_containers/food/drinks/bottle/orangejuice{
- desc = "For the weary spacemen on their quest to rekindle the first plasma fire.";
- name = "Carton of Estus"
- },
-/obj/item/nullrod/claymore/glowing{
- desc = "Don't tell anyone you put any points into dex, though.";
- force = 10;
- name = "moonlight greatsword"
- },
-/obj/effect/decal/remains/human,
-/turf/open/floor/plating{
- icon_state = "panelscorched"
- },
-/area/chapel/main)
"bfx" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 5
@@ -33282,122 +35087,16 @@
},
/turf/closed/wall,
/area/chapel/main)
-"bfz" = (
-/obj/machinery/door/airlock/grunge{
- name = "Crematorium";
- req_access_txt = "27"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/cable/white{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/maintenance/port)
"bfA" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/turf/closed/wall,
/area/chapel/main)
-"bfB" = (
-/obj/machinery/door/airlock/maintenance_hatch{
- name = "Maintenance Hatch";
- req_access_txt = "12"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/cable/white{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
"bfC" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
/turf/closed/wall/rust,
/area/chapel/main)
-"bfD" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10
- },
-/obj/effect/turf_decal/bot,
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/obj/item/storage/backpack,
-/obj/item/crowbar,
-/obj/item/wrench,
-/obj/structure/rack,
-/turf/open/floor/plasteel,
-/area/maintenance/port)
-"bfE" = (
-/obj/structure/cable/white{
- icon_state = "1-4"
- },
-/obj/structure/cable/white{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/landmark/blobstart,
-/turf/open/floor/plating{
- icon_state = "platingdmg1"
- },
-/area/maintenance/port)
-"bfF" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/effect/landmark/event_spawn,
-/obj/item/tank/internals/oxygen/red,
-/obj/item/clothing/mask/gas,
-/turf/open/floor/plating,
-/area/maintenance/port)
-"bfG" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/plating{
- icon_state = "panelscorched"
- },
-/area/maintenance/port)
-"bfH" = (
-/obj/machinery/door/airlock/maintenance_hatch{
- name = "Maintenance Hatch";
- req_access_txt = "12"
- },
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/port)
"bfI" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/structure/cable/white{
@@ -33680,22 +35379,6 @@
},
/turf/open/floor/plasteel/dark,
/area/chapel/main)
-"bgc" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/bot,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/portable_atmospherics/canister/oxygen,
-/turf/open/floor/plasteel,
-/area/maintenance/port)
-"bgd" = (
-/obj/structure/closet/firecloset,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/maintenance/port)
"bge" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 8
@@ -33813,7 +35496,7 @@
/turf/open/floor/plasteel/dark,
/area/maintenance/starboard/aft)
"bgw" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/machinery/airalarm{
@@ -33836,7 +35519,7 @@
/turf/open/floor/plasteel/dark,
/area/maintenance/starboard/aft)
"bgy" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21";
pixel_x = -3;
pixel_y = 3
@@ -34022,21 +35705,6 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/closed/wall,
/area/hallway/secondary/entry)
-"bgO" = (
-/obj/machinery/door/airlock/maintenance_hatch{
- name = "Maintenance Hatch";
- req_access_txt = "12"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/cable/white{
- icon_state = "1-2"
- },
-/obj/effect/turf_decal/stripes/line,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/maintenance/port)
"bgP" = (
/turf/closed/wall,
/area/hallway/secondary/entry)
@@ -34532,7 +36200,7 @@
/turf/open/floor/plasteel/white/corner,
/area/hallway/secondary/entry)
"bhL" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21";
pixel_x = -3;
pixel_y = 3
@@ -34643,7 +36311,7 @@
/turf/open/floor/plasteel/dark,
/area/maintenance/starboard/aft)
"bhU" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21";
pixel_x = -3;
pixel_y = 3
@@ -35939,7 +37607,7 @@
/turf/closed/wall/r_wall,
/area/engine/atmos)
"bkt" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/machinery/light{
@@ -35982,7 +37650,7 @@
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"bkE" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21";
pixel_x = -3;
pixel_y = 3
@@ -37437,14 +39105,6 @@
heat_capacity = 1e+006
},
/area/hallway/primary/port/aft)
-"bxR" = (
-/obj/structure/cable/white{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/plating,
-/area/maintenance/port)
"bxS" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -37868,22 +39528,6 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/starboard)
-"dEa" = (
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/machinery/computer/arcade{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/maintenance/port)
"dFV" = (
/obj/machinery/atmospherics/pipe/simple/green/visible{
dir = 4
@@ -39607,9 +41251,6 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/hallway/primary/starboard/fore)
-"nxA" = (
-/turf/closed/wall,
-/area/hallway/primary/port/aft)
"nFG" = (
/obj/machinery/atmospherics/pipe/manifold/yellow/visible{
dir = 8
@@ -40456,10 +42097,6 @@
"swC" = (
/turf/closed/wall/r_wall/rust,
/area/crew_quarters/heads/captain/private)
-"swF" = (
-/obj/structure/sign/warning/securearea,
-/turf/closed/wall/rust,
-/area/asteroid/nearstation)
"swG" = (
/turf/closed/wall/rust,
/area/security/detectives_office)
@@ -40498,9 +42135,6 @@
/obj/machinery/status_display/supply,
/turf/closed/wall/rust,
/area/quartermaster/storage)
-"swN" = (
-/turf/closed/wall/rust,
-/area/asteroid/nearstation)
"swZ" = (
/turf/closed/wall/r_wall/rust,
/area/security/brig)
@@ -40592,12 +42226,6 @@
/obj/structure/sign/warning/vacuum,
/turf/closed/wall/rust,
/area/maintenance/starboard)
-"sCb" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/closed/wall,
-/area/medical/medbay/zone3)
"sCr" = (
/obj/structure/cable/white{
icon_state = "1-2"
@@ -41431,10 +43059,6 @@
"sJG" = (
/turf/closed/wall/r_wall/rust,
/area/engine/supermatter)
-"sJH" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall/r_wall/rust,
-/area/maintenance/port)
"sJI" = (
/turf/closed/wall/rust,
/area/library)
@@ -41495,9 +43119,6 @@
icon_state = "wood-broken7"
},
/area/library)
-"sJT" = (
-/turf/closed/wall/rust,
-/area/medical/morgue)
"sJV" = (
/turf/closed/wall/r_wall/rust,
/area/tcommsat/server)
@@ -41575,33 +43196,13 @@
"sKp" = (
/turf/closed/wall/rust,
/area/medical/medbay/zone3)
-"sKx" = (
-/turf/closed/wall/r_wall/rust,
-/area/maintenance/port)
"sKB" = (
/turf/closed/wall/rust,
/area/security/checkpoint)
-"sKE" = (
-/turf/closed/wall/rust,
-/area/maintenance/port)
-"sKH" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/closed/wall/rust,
-/area/maintenance/port)
-"sKI" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall/rust,
-/area/maintenance/port)
"sKJ" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/closed/wall/r_wall/rust,
/area/science/robotics/lab)
-"sKL" = (
-/obj/structure/sign/poster/contraband/random,
-/turf/closed/wall/rust,
-/area/maintenance/port)
"sKP" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -41614,11 +43215,6 @@
},
/turf/closed/wall/r_wall/rust,
/area/science/robotics/lab)
-"sKW" = (
-/turf/open/floor/plating{
- icon_state = "panelscorched"
- },
-/area/maintenance/port)
"sKZ" = (
/turf/closed/wall/r_wall/rust,
/area/science/xenobiology)
@@ -41626,7 +43222,7 @@
/turf/closed/wall/rust,
/area/chapel/main)
"sLg" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/effect/turf_decal/delivery,
@@ -72190,10 +73786,10 @@ aad
aad
aad
aad
-baj
-aqo
-baj
-baj
+aKm
+aKo
+aKm
+aKm
aaa
aaa
aaa
@@ -72448,9 +74044,9 @@ aMJ
aMJ
sJV
aMJ
-aqx
-awH
-baj
+aKr
+aLz
+aKm
aaa
aaa
aaa
@@ -72705,9 +74301,9 @@ buJ
buO
sKn
aMJ
-atE
-sKx
-baj
+aKB
+aLs
+aKm
aac
aaa
aaa
@@ -72962,8 +74558,8 @@ buK
sKj
buR
aMJ
-avB
-aOH
+aKF
+aqo
aad
aac
aaa
@@ -73219,8 +74815,8 @@ buL
buP
buS
aMJ
-awB
-baj
+aKJ
+aKm
aad
aad
aaa
@@ -73476,8 +75072,8 @@ buK
sKj
buR
aMJ
-awB
-baj
+aKJ
+aKm
aad
aad
aaa
@@ -73733,8 +75329,8 @@ buN
buQ
buU
sJV
-awB
-aOH
+aKJ
+aqo
aad
aaa
aaa
@@ -73990,9 +75586,9 @@ sJV
aMJ
aMJ
sJV
-awB
-aOH
-sKx
+aKJ
+aqo
+aLs
aac
aaa
aaa
@@ -74246,10 +75842,10 @@ bvo
aad
bvo
aad
-baj
-awE
-awL
-baj
+aKm
+aLp
+aLB
+aKm
aac
aac
aac
@@ -74464,7 +76060,7 @@ aik
aaW
abj
abj
-abu
+ahB
abu
pNE
gap
@@ -74503,10 +76099,10 @@ aUQ
aVK
aUQ
aXc
-baj
-aOH
-axY
-awG
+aKm
+aqo
+aLC
+aLv
aac
aac
aac
@@ -74761,9 +76357,9 @@ aVL
aUR
aUQ
bvo
-sKx
-awB
-baj
+aLs
+aKJ
+aKm
aac
aad
aac
@@ -74966,7 +76562,7 @@ aaa
aac
aac
aad
-aah
+adx
aad
aac
aac
@@ -75018,9 +76614,9 @@ aUU
aWz
aVL
bvo
-aOH
-axh
-baj
+aqo
+aLL
+aKm
aad
aad
aad
@@ -75223,7 +76819,7 @@ aaa
aaa
aaa
aac
-aac
+adz
aad
aad
aad
@@ -75235,7 +76831,7 @@ agK
abu
aad
aad
-abj
+azf
abi
pNE
aoq
@@ -75275,10 +76871,10 @@ aUU
aWz
aUQ
bvg
-baj
-awB
-baj
-baj
+aKm
+aKJ
+aKm
+aKm
aad
aad
aad
@@ -75480,7 +77076,7 @@ aaa
aaa
aaa
aac
-aac
+adz
aac
aac
aad
@@ -75532,10 +77128,10 @@ aUU
aWz
aVL
bvg
-awG
-awB
-axj
-baj
+aLv
+aKJ
+aME
+aKm
aad
aad
aad
@@ -75737,7 +77333,7 @@ aaa
aaa
aaa
aaa
-aac
+adz
aac
aac
aac
@@ -75747,7 +77343,7 @@ aad
aad
adv
aaW
-abj
+ayg
ahB
abu
acF
@@ -75789,17 +77385,17 @@ aUU
aUU
aUQ
bvg
-baj
-awB
-axk
-baj
-aad
-aad
-aad
-aad
-aad
-aad
+aKm
+aKJ
+aMF
+aKm
+aac
+aac
aad
+aKm
+aKm
+aKm
+aKm
aad
aad
aaa
@@ -75994,7 +77590,7 @@ aaa
aaa
aaa
aaa
-abR
+aXc
aac
aac
aad
@@ -76003,7 +77599,7 @@ aad
aad
abi
ael
-abj
+abu
abu
abu
alG
@@ -76046,21 +77642,21 @@ aUU
aWz
aVL
bvg
-baj
-awB
-aZo
-baj
-aad
-aad
-aad
-aad
-aad
-aad
-aad
-aad
-aac
-aac
-aaa
+aKm
+aKJ
+aMG
+aKm
+aKm
+aKm
+aKm
+aKm
+aOs
+aSf
+aKV
+aKV
+aKV
+aLw
+aLw
aaa
aaa
aaa
@@ -76251,17 +77847,17 @@ aaa
aaa
aaa
aaa
-abR
+aXc
aac
aac
aad
aad
-aad
-aad
-abT
-abi
-aaV
-ajQ
+aro
+aro
+aro
+aro
+azg
+aro
aro
aro
asm
@@ -76303,21 +77899,21 @@ aUU
aWz
aUQ
bvo
-baj
-awE
-awL
-baj
-aad
-aad
-aad
-aad
-aad
-aad
-aad
-aad
-aad
-aac
-aac
+aKm
+aLp
+aLB
+aOI
+aPQ
+aPQ
+aPQ
+aPQ
+aPQ
+aVF
+aKV
+aLn
+aRA
+aSp
+aLw
aaa
aaa
aaa
@@ -76508,17 +78104,17 @@ aaa
aaa
aac
aac
-aac
+adz
aac
aac
aad
aad
-aad
-aad
-aaW
-abj
-abj
-abu
+aro
+ars
+ars
+ars
+ars
+ars
arp
ars
ars
@@ -76560,21 +78156,21 @@ aUU
aWz
aVL
bvo
-aOH
-baj
-axl
-sKE
-baj
-aZo
-aZo
-sKE
-baj
-aad
-aad
-aad
-aad
-aad
-aac
+aqo
+aKm
+aMH
+axU
+aKm
+aMG
+aMG
+aUi
+aKm
+aVG
+aKV
+aSe
+aSJ
+aTm
+aLw
aaa
aaa
aaa
@@ -76765,19 +78361,19 @@ aac
aac
aad
aac
-aac
+aem
aad
aad
aad
aad
-abi
-agE
-abj
-abi
-aad
-aad
+aro
+ars
+akb
+asu
+ayd
+ayy
arq
-art
+azh
ars
asy
ars
@@ -76817,21 +78413,21 @@ aUU
aWz
aUQ
aad
-sKx
-aZp
-bam
-bbc
-bbQ
-dEa
-bdD
-beu
-sKE
-aad
-aad
-aad
-aad
-aad
-aac
+aLs
+aLX
+aMI
+aOL
+aPR
+aQV
+aSq
+aUk
+aUi
+aVG
+aKV
+aTk
+aSK
+aYE
+aKV
aad
aaa
aaa
@@ -77021,14 +78617,14 @@ aaa
aac
aad
aad
-aad
-swF
-aad
-aad
-aad
-aad
-aad
-abj
+acH
+acH
+acH
+acH
+acH
+acH
+acH
+ars
agF
agF
agF
@@ -77074,23 +78670,23 @@ aUU
aUU
aVL
aad
-aOH
-aZq
-axn
-axU
-axX
-bcG
-bdE
-bev
-baj
-aad
-aad
-aad
-aad
-aad
-aad
-aad
-aad
+aqo
+aMv
+aMQ
+aOM
+aPS
+aRc
+aSs
+aUl
+aKm
+aVG
+aKV
+aTl
+aXD
+aKV
+aKV
+aKV
+aKV
aaa
aaa
aaa
@@ -77278,14 +78874,14 @@ aac
aac
aad
aad
-aad
-aad
-aad
-aad
-aad
-aad
-aad
-abu
+acH
+afL
+ahD
+aye
+aAl
+aAf
+acH
+ars
agF
apw
aqB
@@ -77331,23 +78927,23 @@ bvg
bvg
bvo
bvo
-aOH
-aZr
-bam
-bbe
-bbS
-bcH
-bcG
-bcF
-baj
-aad
-aad
-aad
-aad
-aad
-aad
-aad
-aad
+aqo
+aMw
+aMI
+aON
+aPT
+aRd
+aRc
+aUm
+aKm
+aVH
+aRe
+aTn
+aWL
+aZB
+aTv
+aTW
+aLw
aac
aaa
aaa
@@ -77535,14 +79131,14 @@ aac
aac
aad
aad
-aad
-aad
-aad
-aad
-aad
-aad
-abT
-agE
+acH
+afP
+aiv
+ayf
+aAd
+aAk
+acH
+ars
swZ
apR
aqD
@@ -77577,34 +79173,34 @@ aKH
acB
aEt
aEt
-aOH
-aPO
-sJH
-aQU
-aQU
-sJH
-sJH
-aQU
-aQU
-sJH
-aQU
-aQU
-aZs
-axL
-bap
-bbT
-bcI
-bar
-bew
-aZo
-aad
-aad
-aad
-aad
-aad
-aad
-aad
-aad
+aqo
+awH
+axX
+aEg
+aEg
+axX
+axX
+aEg
+aEg
+axX
+aEg
+aEg
+aMD
+aOc
+aOS
+aPU
+aRj
+aSG
+aUo
+aMG
+aSg
+aKV
+aUK
+aXY
+aTo
+aTQ
+aUh
+aKV
aac
aac
aaa
@@ -77792,14 +79388,14 @@ aad
aad
aad
aad
-aad
-aad
-aad
-aad
-aad
-ahu
-afL
-aaW
+acH
+azQ
+aAc
+aAc
+aAm
+acH
+acH
+ars
swZ
ain
aqG
@@ -77834,34 +79430,34 @@ aKI
aLY
aNa
aEt
-aOI
-aPP
-bxR
-aRS
-aTb
-aUb
-aVM
-aVM
-aTb
-aTb
-aTb
-aVM
-aTb
-bao
-bbf
-aZA
-bbR
-bdF
-bcK
-baj
-aad
-aad
-aad
-aad
-aad
-aad
-aad
-aad
+aqx
+awL
+axY
+aEj
+aFM
+aJN
+aKl
+aKl
+aFM
+aFM
+aFM
+aKl
+aFM
+aOH
+aOT
+aPV
+aRm
+aSI
+aRC
+aKm
+aSr
+aKV
+aWI
+aYz
+aKV
+aZD
+aYD
+aKm
aad
aac
aac
@@ -78046,17 +79642,17 @@ aaa
aad
aad
aad
-aad
-aad
-aad
-aad
-aad
-aad
-aad
-aad
-ahu
-abu
-abj
+acH
+acH
+acH
+acH
+aAa
+aep
+azo
+aAo
+acH
+ars
+ars
agF
aio
aiT
@@ -78091,8 +79687,8 @@ apt
aLZ
aNb
aEt
-bbg
-aPQ
+atE
+axh
aQW
aQW
aQW
@@ -78105,20 +79701,20 @@ sJI
aQW
sJI
aQW
-bbg
-aZz
-bcJ
-bdG
-bev
-baj
-aad
-aad
-aad
-aad
-aad
-aad
-aad
-aad
+atE
+aQB
+aRn
+aSL
+aUl
+aKm
+aSQ
+aKV
+aWJ
+aYB
+aKV
+aYA
+aZJ
+aKm
aad
aad
aac
@@ -78303,15 +79899,15 @@ aac
aad
aad
aad
-aad
-aad
-aad
-aad
-abi
-abi
-swN
-abi
-agF
+acH
+abR
+afh
+azi
+agG
+aiS
+acH
+aAw
+acH
afT
agF
agF
@@ -78348,8 +79944,8 @@ aKK
aMa
aNc
aEt
-bbg
-aPR
+atE
+axk
aQW
aRT
aRU
@@ -78362,23 +79958,23 @@ jnK
aYw
aZu
aQW
-aYA
-sKH
-bcK
-bdH
-bex
-sKE
-aad
-aad
-aad
-aad
-aad
-aad
-aad
-aad
-aad
-aad
-aad
+awB
+aQF
+aRC
+aTb
+aUp
+aUi
+aTj
+aKV
+aWM
+aKV
+aKV
+aZE
+aKm
+aKm
+aKm
+aKm
+aKm
aad
aad
aad
@@ -78560,17 +80156,17 @@ aac
aad
aad
aad
-aad
-aad
-aad
-aaV
-aaW
-abj
-adv
-ael
-agF
+acH
+adw
+aep
+azn
+aep
+ajb
+acH
+aAU
+acH
afU
-ahz
+ahC
aiu
aiq
aiV
@@ -78605,8 +80201,8 @@ aKL
aMb
aNd
sHV
-aOL
-aPS
+avB
+axl
sJI
aSc
aTc
@@ -78619,23 +80215,23 @@ aXL
aYx
aZv
aQW
-bbh
-aPV
-baj
-sKL
-baj
-aZo
-aad
-aad
-aad
-aad
-aad
-aad
-aad
-aad
-aad
-aad
-aad
+aOV
+axU
+aKm
+aTU
+aKm
+aMG
+aVI
+aWw
+aXd
+aKm
+aRm
+aRm
+aYF
+aYX
+aZp
+aZt
+aKm
aad
aad
aad
@@ -78817,18 +80413,18 @@ aad
aad
aad
aad
-aad
-aaV
-abi
-abj
-abj
-abS
-abu
-acF
-agF
-agG
-afU
-aiv
+acH
+abT
+azi
+azi
+aep
+ajQ
+acH
+aAU
+acH
+ahz
+aBw
+aCp
air
aiW
ajW
@@ -78862,8 +80458,8 @@ aKM
aMa
aNe
aEt
-aYA
-aPT
+awB
+axn
aQW
amH
aTd
@@ -78876,23 +80472,23 @@ aXM
aYy
aZw
aQW
-bbg
-bbV
-bcL
-bdI
-bey
-aZo
-aad
-aad
-aad
-aad
-aad
-aad
-aad
-aad
-aad
-aad
-aad
+atE
+aQQ
+aRS
+aTV
+aUq
+aMG
+aVJ
+aWx
+aXe
+aXN
+aXO
+aYC
+aYG
+aZn
+aZp
+aZx
+aKm
aad
aad
aad
@@ -79074,19 +80670,19 @@ aad
aad
aad
aad
-aad
-aaW
-abj
-abj
-abS
-acD
-acF
-aem
-afg
-afU
-afU
-agH
-ahv
+acH
+acE
+azj
+acH
+afe
+ajZ
+acH
+aBi
+ahu
+aBo
+aBx
+aCq
+aya
aiX
agm
akY
@@ -79119,8 +80715,8 @@ aKN
aMc
aNf
aEt
-aOM
-aPU
+awE
+axL
aQW
aRW
aTe
@@ -79133,23 +80729,23 @@ aQW
aQW
aQW
sJI
-bbj
-bbW
-bcM
-bdJ
-bez
-baj
-aad
-aad
-aad
-aad
-aad
-aad
-aad
-aad
-aad
-aad
-aad
+aPO
+aQU
+aRV
+aUb
+aUu
+aUN
+aVM
+aKm
+aKm
+aKm
+aZC
+aRm
+aRm
+aZo
+aZp
+aZy
+aKm
aad
aad
aac
@@ -79331,17 +80927,17 @@ aad
aad
aad
aad
-aad
-aad
-abi
-abj
-abu
-acE
-adx
-acF
-agF
-afU
-ahC
+acH
+acH
+acH
+acH
+agH
+art
+acH
+acJ
+acH
+aBq
+aja
aiR
ait
aiY
@@ -79376,37 +80972,37 @@ aKO
aMd
aNg
aEt
-aON
-aPV
+awG
+axU
aQW
aRX
aTf
-sJX
-aUX
+axj
+aCB
+aDm
+aDn
+aDo
+aKn
+aLy
+aFM
+aFM
+aPP
+aQQ
+aSm
+aSm
+aUJ
+aKm
aVR
-aVQ
-aXg
-aQW
-aYz
-aTb
-aTb
-bbk
-bbV
-bcN
-bdK
-beA
-baj
-aad
-aad
-aad
+aKm
+aXi
bfu
bfu
sLf
bfu
bfu
-aad
-aad
-aad
+aZq
+aKm
+aKm
aac
aac
aaa
@@ -79589,20 +81185,20 @@ aad
aad
aad
aad
-aad
-aad
-aaW
-abu
-acF
-acF
-acF
-agF
+aac
+azk
+acH
afe
-agF
-swZ
-agF
-aiZ
ajZ
+acH
+acH
+acH
+aBs
+acH
+axZ
+acH
+aiZ
+ayD
ala
aiZ
amN
@@ -79643,16 +81239,16 @@ bxS
aVS
aWE
aXh
-aQW
-bbg
-aZy
-bap
-bap
-bbX
-bcO
-bdL
-beB
-sKE
+ajG
+ajG
+ajG
+ajG
+ajG
+aHK
+aRb
+aRb
+aUL
+sLf
bfu
bfu
sLf
@@ -79661,9 +81257,9 @@ bhZ
biF
bjf
bfu
-aad
-aad
-aac
+aZr
+aZp
+aLv
aac
aaa
aaa
@@ -79846,20 +81442,20 @@ aad
aad
aad
aad
-aad
-aad
-abi
-abi
-acJ
-adz
-swN
-abT
-acF
-ahD
-aiS
-agF
-aja
-aka
+afg
+aac
+acH
+ahv
+ayb
+aAb
+aBj
+aBl
+aBu
+aBz
+aBz
+aCr
+aCu
+azc
ala
alP
aka
@@ -79899,17 +81495,17 @@ sJX
aUY
aVT
aVQ
-aXi
-aQW
-bbg
-aZz
-baq
-bbl
-bbY
-bbm
-bdM
-bbm
-sKE
+aXg
+ajG
+aGY
+aOl
+aOQ
+aCy
+aPC
+aQh
+aRb
+aKJ
+sLf
bfv
bfS
bgB
@@ -79918,9 +81514,9 @@ bia
biG
bjg
bfu
-aad
-aad
-aac
+aZs
+aZz
+aKm
aaa
aaa
aaa
@@ -80104,19 +81700,19 @@ aad
aad
aad
aad
-aad
-aad
-abT
+bvI
acH
-adw
-aep
-afh
-aem
-afP
ahA
-swZ
-ajb
-akb
+ayc
+aAe
+aBk
+aBm
+aBv
+aCo
+aCo
+aCt
+aCv
+azd
ala
alQ
bxA
@@ -80157,16 +81753,16 @@ sKe
aVU
aWE
aXj
-sJI
-aYC
-aZA
-bar
-bbm
-bbZ
-bbm
-bbm
-bbm
-baj
+ajG
+aOb
+aPF
+aRo
+aFZ
+aRp
+aQi
+aRb
+aKJ
+bfu
bfu
bfu
bfu
@@ -80177,7 +81773,7 @@ bjh
bfu
sLf
bfu
-aac
+aKm
aaa
aaa
aaa
@@ -80362,7 +81958,7 @@ aad
aad
aad
aad
-aad
+acH
abU
abU
abU
@@ -80373,7 +81969,7 @@ abU
abU
abU
ajc
-ajc
+aze
aip
ajc
ajc
@@ -80404,27 +82000,27 @@ aIB
aIB
aIB
aIB
-aOR
+aiQ
aPZ
aQZ
aSb
sJS
-aUh
-aUZ
+aBn
+aDf
aVV
aVQ
aXk
-aQW
-bbg
-aPV
-bas
-bbn
-bca
-bcR
-bdN
-beC
-baj
-bfw
+ajG
+aOZ
+aQe
+aOK
+aCy
+aPE
+aSo
+aRb
+aLp
+aLB
+aVW
bfu
bgC
bhp
@@ -80661,26 +82257,26 @@ aKP
aMe
aNj
aIB
-aOS
+aDk
aQa
aQX
aSc
aTi
-aUi
-aVa
-aVW
-aWF
-aVW
-aXN
-aYE
-aZB
-bap
-bap
-sKI
-bap
-bap
-bap
-bap
+aCx
+aCx
+aVQ
+aWE
+aDq
+ajG
+aOe
+aRl
+aCy
+aCy
+aRw
+aQC
+aHb
+aHb
+aUZ
bfx
bfu
bfu
@@ -80918,7 +82514,7 @@ aKQ
aMf
aNk
aOf
-aOT
+aDp
aQb
aRa
aSd
@@ -80928,16 +82524,16 @@ aVb
aVX
aWG
aXl
-aQW
-aYF
-bxR
-aRS
-aTb
-bcb
-bcS
-aTb
-aVM
-beR
+aSh
+aOg
+aGC
+aGC
+aPA
+aJx
+aQD
+aQI
+aHi
+aVa
bfy
bfT
bgD
@@ -81177,25 +82773,25 @@ aNl
aID
aOU
aQc
-aRb
-aRb
-sJT
-aRb
-aRb
-aRb
-aRb
+ail
+ail
+aFo
+ail
+ail
+ail
+ail
+ail
aSh
-aSh
-aSh
-aSh
-aSh
-sKp
-bcc
-bcT
-bdP
-aZo
-beS
-bfz
+aPg
+aNS
+aPz
+aPB
+aPH
+aQE
+aQL
+aRb
+aVc
+aVY
bfU
bgE
bhr
@@ -81432,26 +83028,26 @@ aKS
aMh
aNm
aIB
-aOV
-aQd
-aRc
-aSe
-aTj
-aUk
-aVc
-aVY
-aWH
-sKp
-aXO
-aYG
-aZC
-bat
+aEh
+aFh
+aGf
+aHG
+aJe
+aJo
+aLo
+aLu
+aMl
+aOW
+aOX
+aGZ
+aOE
+aPv
aSh
aSh
aSh
aSh
aSh
-bbg
+atE
bfA
bfu
bgF
@@ -81689,26 +83285,26 @@ aIB
sIK
aIB
aIB
-aOW
-aPZ
-aRd
-aSf
-aTk
-aSf
-aVd
-aVZ
-aWI
-aSh
+aEi
+aFj
+aGl
+aHJ
+aJf
+aJv
+aLq
+aLx
+aMY
+ail
aXP
aYH
-aZD
-bau
+aFp
+aPD
aSh
bcd
bcU
bdQ
aSh
-bbg
+atE
bfA
bfV
bgG
@@ -81946,27 +83542,27 @@ aKT
aMi
aNn
aHM
-aOX
-aQe
-aRe
-aSg
-aTl
+aEk
+aGd
+aHf
+aHX
+aJg
+aJA
+aLr
+aLA
+aNO
ail
-aVe
-aWa
-aWJ
-aSh
aXQ
aYI
-ajG
-bav
+aOJ
+aHa
aSh
bce
bcV
bdR
sKp
-beV
-bfB
+aVd
+aVZ
bfW
bgH
bht
@@ -82203,16 +83799,16 @@ aKU
aMj
aNt
csX
-aOY
+aEl
aQf
-nxA
-aSh
-aSh
-aSh
-aVf
-sCb
-aSh
-aSh
+ail
+ail
+ail
+ail
+aNp
+aOA
+ail
+ail
aXR
aYJ
aZF
@@ -82222,7 +83818,7 @@ bcf
bcW
blt
ooX
-aOL
+avB
bfA
bfX
bgI
@@ -82460,15 +84056,15 @@ aKX
lyp
bIJ
aOj
-aOZ
+aEm
bxQ
sJJ
-aSh
-aTm
-aUo
-aVg
-aWc
-aWK
+ail
+aGF
+aJO
+aNL
+aNo
+aNP
aXm
aXS
aYK
@@ -82479,7 +84075,7 @@ bcg
bcX
bdS
aSh
-aOL
+avB
bfy
bfY
bgJ
@@ -82720,12 +84316,12 @@ aHM
aPa
aQb
aKg
-aSh
-aTn
-aUp
-aVh
-aWd
-aWL
+ail
+aHc
+aKk
+aNM
+aOB
+aNQ
aXn
bxT
aYL
@@ -82736,7 +84332,7 @@ aUn
aWb
bdT
aSh
-bbg
+atE
bfA
bfZ
bgK
@@ -82977,12 +84573,12 @@ aOh
vsL
aQd
sJK
-aSi
-aTo
-aUq
-aVi
-aWe
-aWM
+aFm
+aHd
+aJd
+aNN
+aOR
+aNR
aXo
aXT
aYM
@@ -82993,7 +84589,7 @@ bch
bcY
bdU
beE
-beZ
+aVe
bfC
bga
bgL
@@ -83249,8 +84845,8 @@ bbq
bbq
bbq
bdV
-beF
-bfa
+aUM
+aVf
bfA
bgb
bgM
@@ -83495,7 +85091,7 @@ aSj
aTq
aUs
aVj
-aWf
+aWg
aTp
aXq
aXV
@@ -83507,7 +85103,7 @@ bci
bcZ
bdW
aSh
-bbg
+atE
bfA
bfu
bfu
@@ -83748,25 +85344,25 @@ aHM
aPd
aQc
aRf
+aiJ
aSk
aTr
-aUt
aVl
-aWg
+aWh
aRf
aXr
aXW
aYP
aZL
baC
-bbs
+aHs
aSi
aWK
aWK
aSh
-bfb
-bfD
-bgc
+aVg
+aWa
+aWy
bgN
bhz
bip
@@ -84007,24 +85603,24 @@ aQg
aRh
aSl
aTs
-aiJ
-aVl
-aWh
+aUt
+aVn
+aWj
aRh
aXs
aXX
aYQ
aZM
baD
-bbr
+bbs
aWK
bda
bdX
aSh
-aYF
-bfE
-bdO
-bgO
+aVh
+aWc
+aWF
+aXv
bhA
biq
biV
@@ -84269,7 +85865,7 @@ aVm
aWi
aWN
aXt
-aiQ
+aOY
aYR
aZN
ajO
@@ -84278,9 +85874,9 @@ bcj
bdb
bdY
aSh
-sKW
-bfF
-aZo
+aVi
+aWd
+aMG
bgP
bhB
bir
@@ -84522,8 +86118,8 @@ aRg
aSn
aTu
aUw
-aVn
-aWj
+aWf
+aZA
aWO
aXu
aXZ
@@ -84535,9 +86131,9 @@ bck
bdc
bdZ
aSh
-bfd
-bfG
-bgd
+aVk
+aWe
+aWH
bgP
bhC
bis
@@ -84792,9 +86388,9 @@ aSh
aWK
bea
beG
-sKE
-bfH
-baj
+aUi
+aWv
+aKm
bgQ
bhD
bit
diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm
index 18d1b115a4..f11815b537 100644
--- a/_maps/map_files/PubbyStation/PubbyStation.dmm
+++ b/_maps/map_files/PubbyStation/PubbyStation.dmm
@@ -263,15 +263,484 @@
},
/turf/open/floor/plasteel,
/area/maintenance/department/engine)
+"aaD" = (
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 10
+ },
+/obj/structure/closet/crate{
+ icon_state = "crateopen"
+ },
+/obj/effect/spawner/lootdrop/maintenance{
+ lootcount = 2;
+ name = "2maintenance loot spawner"
+ },
+/obj/item/clothing/mask/balaclava,
+/turf/open/floor/plating,
+/area/maintenance/department/crew_quarters/dorms)
+"aaE" = (
+/obj/machinery/light/small,
+/obj/machinery/space_heater,
+/turf/open/floor/plating,
+/area/maintenance/department/crew_quarters/dorms)
+"aaF" = (
+/turf/closed/wall,
+/area/crew_quarters/fitness/pool)
+"aaG" = (
+/obj/structure/closet,
+/obj/item/weldingtool,
+/obj/item/crowbar,
+/obj/effect/spawner/lootdrop/maintenance,
+/turf/open/floor/plating,
+/area/maintenance/department/crew_quarters/dorms)
+"aaH" = (
+/obj/machinery/door/airlock/maintenance{
+ req_access_txt = "12"
+ },
+/turf/open/floor/plating,
+/area/maintenance/department/crew_quarters/dorms)
+"aaI" = (
+/obj/structure/closet/secure_closet/personal,
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/turf/open/floor/plasteel/cafeteria,
+/area/crew_quarters/fitness/pool)
+"aaJ" = (
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/crew_quarters/fitness/pool)
+"aaK" = (
+/obj/machinery/light{
+ dir = 1;
+ light_color = "#706891"
+ },
+/obj/structure/closet/secure_closet/personal,
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/turf/open/floor/plasteel/cafeteria,
+/area/crew_quarters/fitness/pool)
+"aaL" = (
+/turf/open/floor/plasteel/yellowsiding,
+/area/crew_quarters/fitness/pool)
+"aaM" = (
+/turf/open/floor/plasteel/yellowsiding/corner{
+ icon_state = "yellowcornersiding";
+ dir = 8
+ },
+/area/crew_quarters/fitness/pool)
+"aaN" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 6
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white/corner{
+ dir = 1
+ },
+/area/crew_quarters/fitness/pool)
+"aaO" = (
+/turf/open/pool,
+/area/crew_quarters/fitness/pool)
+"aaP" = (
+/turf/open/floor/plasteel/yellowsiding{
+ icon_state = "yellowsiding";
+ dir = 8
+ },
+/area/crew_quarters/fitness/pool)
+"aaQ" = (
+/obj/structure/table,
+/obj/effect/spawner/lootdrop/maintenance,
+/obj/item/storage/box/lights/mixed,
+/turf/open/floor/plating,
+/area/maintenance/department/crew_quarters/dorms)
+"aaR" = (
+/obj/machinery/airalarm{
+ pixel_y = 22
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white/corner{
+ dir = 1
+ },
+/area/crew_quarters/fitness/pool)
+"aaS" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white/corner{
+ dir = 1
+ },
+/area/crew_quarters/fitness/pool)
+"aaT" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/machinery/camera{
+ c_tag = "Pool"
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white/corner{
+ dir = 1
+ },
+/area/crew_quarters/fitness/pool)
+"aaU" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/sign/poster/official/walk{
+ pixel_y = 32
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white/corner{
+ dir = 1
+ },
+/area/crew_quarters/fitness/pool)
+"aaV" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/structure/extinguisher_cabinet{
+ pixel_y = 30
+ },
+/turf/open/floor/plasteel/white/corner{
+ dir = 1
+ },
+/area/crew_quarters/fitness/pool)
+"aaW" = (
+/turf/open/floor/plasteel/yellowsiding{
+ icon_state = "yellowsiding";
+ dir = 1
+ },
+/area/crew_quarters/fitness/pool)
+"aaX" = (
+/obj/structure/bed,
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/turf/open/floor/plasteel/cafeteria,
+/area/crew_quarters/fitness/pool)
+"aaY" = (
+/obj/effect/spawner/structure/window,
+/turf/open/floor/plating,
+/area/crew_quarters/fitness/pool)
+"aaZ" = (
+/obj/structure/bed,
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white/corner,
+/area/crew_quarters/fitness/pool)
+"aba" = (
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white/corner{
+ dir = 1
+ },
+/area/crew_quarters/fitness/recreation)
+"abb" = (
+/obj/machinery/camera{
+ c_tag = "Fitness Room"
+ },
+/obj/machinery/computer/security/telescreen/entertainment{
+ pixel_y = 32
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white/corner{
+ dir = 1
+ },
+/area/crew_quarters/fitness/recreation)
+"abc" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plasteel/yellowsiding/corner,
+/area/crew_quarters/fitness/pool)
+"abd" = (
+/obj/structure/closet/lasertag/red,
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness/recreation)
+"abe" = (
+/obj/machinery/vending/kink,
+/obj/machinery/status_display/evac{
+ pixel_x = 32;
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness/recreation)
"abf" = (
/obj/structure/bed,
/turf/open/floor/plating,
/area/maintenance/department/science)
+"abg" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness/recreation)
+"abh" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/structure/closet/lasertag/blue,
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness/recreation)
+"abi" = (
+/obj/machinery/disposal/bin,
+/obj/structure/disposalpipe/trunk{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness/recreation)
+"abj" = (
+/obj/machinery/pool/controller,
+/turf/open/floor/plasteel/yellowsiding,
+/area/crew_quarters/fitness/pool)
+"abk" = (
+/obj/machinery/light{
+ dir = 4;
+ light_color = "#e8eaff"
+ },
+/obj/structure/bed,
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white/corner,
+/area/crew_quarters/fitness/pool)
+"abl" = (
+/obj/machinery/airalarm{
+ dir = 4;
+ pixel_x = -23
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white/corner{
+ dir = 1
+ },
+/area/crew_quarters/fitness/recreation)
+"abm" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plasteel/yellowsiding{
+ icon_state = "yellowsiding";
+ dir = 4
+ },
+/area/crew_quarters/fitness/pool)
+"abn" = (
+/obj/machinery/pool/filter{
+ pixel_y = 24
+ },
+/turf/open/pool,
+/area/crew_quarters/fitness/pool)
+"abo" = (
+/obj/structure/pool/ladder{
+ dir = 2;
+ pixel_y = 24
+ },
+/turf/open/pool,
+/area/crew_quarters/fitness/pool)
+"abp" = (
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white/corner,
+/area/crew_quarters/fitness/pool)
+"abq" = (
+/obj/machinery/light{
+ dir = 8;
+ light_color = "#e8eaff"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plasteel/yellowsiding{
+ icon_state = "yellowsiding";
+ dir = 4
+ },
+/area/crew_quarters/fitness/pool)
+"abr" = (
+/obj/machinery/pool/drain,
+/turf/open/pool,
+/area/crew_quarters/fitness/pool)
+"abs" = (
+/obj/structure/pool/Lboard,
+/turf/open/pool,
+/area/crew_quarters/fitness/pool)
+"abt" = (
+/obj/structure/pool/Rboard,
+/turf/open/floor/plasteel/yellowsiding{
+ icon_state = "yellowsiding";
+ dir = 8
+ },
+/area/crew_quarters/fitness/pool)
+"abu" = (
+/obj/item/radio/intercom{
+ name = "Station Intercom (General)";
+ pixel_x = 28
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white/corner,
+/area/crew_quarters/fitness/pool)
+"abv" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/item/cigbutt,
+/turf/open/floor/plating,
+/area/maintenance/department/crew_quarters/dorms)
+"abw" = (
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/structure/table/glass,
+/obj/item/storage/firstaid/regular,
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness/pool)
+"abx" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on,
+/obj/structure/closet/athletic_mixed,
+/obj/item/toy/poolnoodle/blue,
+/obj/item/toy/poolnoodle/red,
+/obj/item/toy/poolnoodle/yellow,
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white/corner,
+/area/crew_quarters/fitness/pool)
"aby" = (
/obj/structure/lattice,
/obj/structure/grille,
/turf/open/space,
/area/space/nearstation)
+"abz" = (
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/structure/extinguisher_cabinet{
+ pixel_x = -24
+ },
+/turf/open/floor/plasteel/cafeteria,
+/area/crew_quarters/fitness/pool)
+"abA" = (
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plasteel/yellowsiding/corner{
+ icon_state = "yellowcornersiding";
+ dir = 4
+ },
+/area/crew_quarters/fitness/pool)
+"abB" = (
+/obj/machinery/firealarm{
+ dir = 1;
+ pixel_x = -2;
+ pixel_y = -27
+ },
+/turf/open/floor/plasteel/yellowsiding{
+ icon_state = "yellowsiding";
+ dir = 1
+ },
+/area/crew_quarters/fitness/pool)
+"abC" = (
+/obj/machinery/light,
+/turf/open/floor/plasteel/yellowsiding{
+ icon_state = "yellowsiding";
+ dir = 1
+ },
+/area/crew_quarters/fitness/pool)
+"abD" = (
+/turf/open/floor/plasteel/yellowsiding/corner{
+ icon_state = "yellowcornersiding";
+ dir = 1
+ },
+/area/crew_quarters/fitness/pool)
+"abE" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 5
+ },
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
+/obj/machinery/power/apc{
+ areastring = "/area/crew_quarters/fitness/pool";
+ name = "Pool APC";
+ pixel_y = -24
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white/corner,
+/area/crew_quarters/fitness/pool)
+"abF" = (
+/obj/machinery/door/airlock/maintenance{
+ req_access_txt = "12"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plating,
+/area/crew_quarters/fitness/pool)
+"abG" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/turf/open/floor/plating,
+/area/maintenance/department/crew_quarters/dorms)
+"abH" = (
+/obj/machinery/door/firedoor,
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/machinery/door/airlock/public/glass{
+ name = "Pool"
+ },
+/turf/open/floor/plasteel/cafeteria,
+/area/crew_quarters/fitness/pool)
"abI" = (
/obj/structure/lattice,
/turf/open/space,
@@ -285,6 +754,26 @@
},
/turf/open/space,
/area/space/nearstation)
+"abK" = (
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plasteel/white/corner{
+ dir = 1
+ },
+/area/crew_quarters/fitness/recreation)
+"abL" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness/recreation)
+"abM" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness/recreation)
"abN" = (
/obj/effect/landmark/carpspawn,
/turf/open/space,
@@ -292,6 +781,42 @@
"abO" = (
/turf/closed/wall/r_wall,
/area/ai_monitored/turret_protected/ai)
+"abP" = (
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness/recreation)
+"abQ" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness/recreation)
+"abR" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 9
+ },
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness/recreation)
+"abS" = (
+/obj/structure/weightmachine/stacklifter,
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness/recreation)
+"abT" = (
+/obj/machinery/door/firedoor,
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/door/airlock/public/glass{
+ name = "Pool"
+ },
+/turf/open/floor/plasteel/cafeteria,
+/area/crew_quarters/fitness/pool)
"abV" = (
/obj/effect/turf_decal/stripes/corner,
/turf/open/floor/plasteel/white,
@@ -1537,7 +2062,7 @@
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/aisat_interior)
"afe" = (
-/obj/item/twohanded/required/kirbyplants/photosynthetic{
+/obj/item/kirbyplants/photosynthetic{
pixel_y = 10
},
/obj/structure/cable/yellow{
@@ -1567,7 +2092,7 @@
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/aisat_interior)
"afg" = (
-/obj/item/twohanded/required/kirbyplants/photosynthetic{
+/obj/item/kirbyplants/photosynthetic{
pixel_y = 10
},
/obj/structure/cable/yellow{
@@ -1665,7 +2190,7 @@
/turf/open/floor/plasteel/dark,
/area/security/prison)
"afp" = (
-/obj/item/storage/pill_bottle/dice,
+/obj/item/storage/box/dice,
/obj/structure/table,
/turf/open/floor/plasteel/dark,
/area/security/prison)
@@ -3820,18 +4345,6 @@
},
/turf/open/floor/plating,
/area/maintenance/department/crew_quarters/dorms)
-"akq" = (
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/machinery/light/small{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
- },
-/turf/open/floor/plating,
-/area/maintenance/department/crew_quarters/dorms)
"akr" = (
/obj/machinery/washing_machine,
/obj/item/radio/intercom{
@@ -5230,16 +5743,6 @@
},
/turf/open/floor/plating,
/area/maintenance/department/crew_quarters/dorms)
-"anp" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/effect/decal/cleanable/robot_debris{
- icon_state = "gib6"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/department/crew_quarters/dorms)
"anq" = (
/obj/structure/grille/broken,
/turf/open/floor/plating,
@@ -5479,7 +5982,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/turf/open/floor/plasteel/dark,
@@ -6932,10 +7435,6 @@
},
/turf/open/space/basic,
/area/space)
-"aqZ" = (
-/obj/machinery/space_heater,
-/turf/open/floor/plating,
-/area/maintenance/department/crew_quarters/dorms)
"ara" = (
/obj/structure/lattice/catwalk,
/obj/structure/cable{
@@ -7525,35 +8024,6 @@
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plating,
/area/crew_quarters/dorms)
-"asl" = (
-/obj/structure/grille/broken,
-/turf/open/floor/plating,
-/area/maintenance/department/crew_quarters/dorms)
-"asm" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/light{
- dir = 1
- },
-/obj/item/cigbutt,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/department/crew_quarters/dorms)
-"asn" = (
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
- },
-/obj/effect/decal/cleanable/cobweb{
- icon_state = "cobweb2"
- },
-/turf/open/floor/plating,
-/area/maintenance/department/crew_quarters/dorms)
"aso" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -8021,26 +8491,9 @@
/obj/structure/closet/emcloset/anchored,
/turf/open/floor/plating,
/area/crew_quarters/dorms)
-"atm" = (
-/obj/structure/closet,
-/obj/item/weldingtool,
-/obj/item/crowbar,
-/turf/open/floor/plating,
-/area/maintenance/department/crew_quarters/dorms)
"atn" = (
/turf/closed/wall,
/area/crew_quarters/fitness/recreation)
-"ato" = (
-/obj/structure/closet/crate{
- icon_state = "crateopen"
- },
-/obj/effect/spawner/lootdrop/maintenance{
- lootcount = 2;
- name = "2maintenance loot spawner"
- },
-/obj/item/clothing/mask/balaclava,
-/turf/open/floor/plating,
-/area/maintenance/department/crew_quarters/dorms)
"atp" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -8506,41 +8959,6 @@
},
/turf/open/floor/plating,
/area/crew_quarters/dorms)
-"aun" = (
-/obj/structure/table,
-/obj/effect/spawner/lootdrop/maintenance,
-/obj/item/storage/box/lights/mixed,
-/turf/open/floor/plating,
-/area/maintenance/department/crew_quarters/dorms)
-"auo" = (
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 5
- },
-/turf/open/floor/plating,
-/area/maintenance/department/crew_quarters/dorms)
-"aup" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/grille/broken,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/department/crew_quarters/dorms)
-"auq" = (
-/obj/effect/spawner/lootdrop/maintenance,
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
-/turf/open/floor/plating,
-/area/maintenance/department/crew_quarters/dorms)
"aur" = (
/turf/open/floor/engine{
name = "Holodeck Projector Floor"
@@ -9400,7 +9818,7 @@
/area/hallway/primary/central)
"awe" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"awf" = (
@@ -9481,7 +9899,7 @@
/obj/machinery/light{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/stripes/corner{
dir = 4
},
@@ -9564,57 +9982,6 @@
},
/turf/open/floor/plating,
/area/crew_quarters/fitness/recreation)
-"awy" = (
-/obj/structure/closet/lasertag/blue,
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/airalarm{
- pixel_y = 22
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/turf/open/floor/plasteel/white/corner{
- dir = 1
- },
-/area/crew_quarters/fitness/recreation)
-"awz" = (
-/obj/structure/closet/lasertag/red,
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/status_display/evac{
- pixel_y = 32
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/turf/open/floor/plasteel/white/corner{
- dir = 1
- },
-/area/crew_quarters/fitness/recreation)
-"awA" = (
-/obj/machinery/disposal/bin,
-/obj/machinery/light{
- dir = 1
- },
-/obj/structure/disposalpipe/trunk{
- dir = 8
- },
-/obj/machinery/camera{
- c_tag = "Fitness Room"
- },
-/obj/machinery/computer/security/telescreen/entertainment{
- pixel_y = 32
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/turf/open/floor/plasteel/white/corner{
- dir = 1
- },
-/area/crew_quarters/fitness/recreation)
"awB" = (
/obj/machinery/vending/clothing,
/obj/effect/turf_decal/tile/blue{
@@ -9625,7 +9992,7 @@
},
/area/crew_quarters/fitness/recreation)
"awC" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-05"
},
/obj/machinery/power/apc{
@@ -10025,10 +10392,6 @@
"axw" = (
/turf/open/floor/plasteel,
/area/crew_quarters/fitness/recreation)
-"axx" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness/recreation)
"axy" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/public/glass{
@@ -10071,7 +10434,7 @@
/turf/open/floor/plasteel,
/area/hallway/primary/fore)
"axF" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-10"
},
/turf/open/floor/plasteel,
@@ -10163,7 +10526,7 @@
/obj/structure/cable{
icon_state = "0-2"
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/carpet,
/area/crew_quarters/heads/captain)
"axT" = (
@@ -10373,7 +10736,7 @@
/area/crew_quarters/dorms)
"ayo" = (
/obj/structure/table/wood,
-/obj/item/storage/pill_bottle/dice,
+/obj/item/storage/box/dice,
/turf/open/floor/carpet,
/area/crew_quarters/dorms)
"ayq" = (
@@ -10406,13 +10769,6 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/fitness/recreation)
-"ayv" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
- },
-/obj/structure/weightmachine/stacklifter,
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness/recreation)
"ayw" = (
/obj/machinery/computer/holodeck{
dir = 4
@@ -11161,7 +11517,7 @@
/turf/open/floor/plasteel,
/area/hallway/primary/fore)
"aAo" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-14"
},
/obj/effect/turf_decal/tile/red,
@@ -11857,7 +12213,7 @@
/turf/open/floor/plasteel/white/corner,
/area/crew_quarters/fitness/recreation)
"aBY" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-05"
},
/turf/open/floor/plasteel,
@@ -11924,7 +12280,7 @@
/area/maintenance/department/security/brig)
"aCi" = (
/obj/structure/table/wood,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-18";
pixel_y = 12
},
@@ -12011,7 +12367,7 @@
/obj/structure/extinguisher_cabinet{
pixel_y = 30
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
@@ -13234,7 +13590,7 @@
/turf/open/floor/wood,
/area/crew_quarters/heads/hop)
"aEM" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-24"
},
/obj/structure/cable{
@@ -13916,7 +14272,7 @@
/turf/open/floor/plasteel/dark,
/area/crew_quarters/heads/captain)
"aGn" = (
-/obj/item/twohanded/required/kirbyplants/photosynthetic{
+/obj/item/kirbyplants/photosynthetic{
layer = 3.1
},
/obj/structure/window/reinforced/fulltile,
@@ -15468,7 +15824,7 @@
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"aKg" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-04"
},
/turf/open/floor/plasteel/white/corner{
@@ -16031,7 +16387,7 @@
/obj/machinery/airalarm{
pixel_y = 22
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-14"
},
/turf/open/floor/plasteel,
@@ -17480,13 +17836,13 @@
/obj/machinery/light/small{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/turf/open/floor/plating,
/area/maintenance/department/crew_quarters/bar)
"aPy" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/turf/open/floor/plating{
@@ -21277,7 +21633,7 @@
/area/crew_quarters/bar)
"aYe" = (
/obj/structure/table/reinforced,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-18";
pixel_y = 10
},
@@ -21326,7 +21682,7 @@
"aYi" = (
/obj/structure/table/reinforced,
/obj/structure/disposalpipe/segment,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-18";
pixel_y = 10
},
@@ -21777,9 +22133,12 @@
/turf/open/floor/plasteel/dark,
/area/crew_quarters/kitchen)
"aYY" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-05"
},
+/obj/machinery/light/small{
+ dir = 1
+ },
/turf/open/floor/plasteel/dark,
/area/crew_quarters/bar)
"aYZ" = (
@@ -22808,7 +23167,7 @@
/turf/open/floor/plasteel,
/area/hydroponics)
"bbd" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-10"
},
/obj/effect/turf_decal/tile/green,
@@ -24508,7 +24867,7 @@
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"bfp" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/machinery/button/door{
@@ -24949,7 +25308,7 @@
/turf/open/floor/plasteel,
/area/crew_quarters/bar)
"bgv" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-14"
},
/obj/effect/turf_decal/tile/neutral{
@@ -25911,7 +26270,7 @@
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"biP" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-05"
},
/obj/structure/disposalpipe/segment{
@@ -26030,7 +26389,7 @@
/turf/open/floor/plasteel,
/area/medical/medbay/central)
"bji" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-10"
},
/obj/effect/turf_decal/tile/blue,
@@ -26083,7 +26442,7 @@
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"bjn" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-10"
},
/obj/effect/turf_decal/tile/purple,
@@ -27332,7 +27691,7 @@
/turf/open/floor/plasteel,
/area/security/checkpoint/medical)
"bmw" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-05"
},
/obj/effect/turf_decal/tile/blue{
@@ -27711,7 +28070,7 @@
dir = 8;
pixel_x = 28
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-11"
},
/obj/machinery/light/small{
@@ -27962,7 +28321,7 @@
/turf/open/floor/engine,
/area/science/explab)
"bnZ" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-10"
},
/obj/effect/turf_decal/tile/neutral{
@@ -28330,7 +28689,7 @@
/turf/open/floor/plasteel/dark,
/area/hallway/primary/aft)
"boT" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/effect/turf_decal/bot,
@@ -28357,7 +28716,7 @@
dir = 1
},
/obj/machinery/light,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-10"
},
/obj/effect/turf_decal/tile/neutral{
@@ -30326,7 +30685,7 @@
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
"bsW" = (
-/obj/item/twohanded/required/kirbyplants,
+/obj/item/kirbyplants,
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
@@ -30715,7 +31074,7 @@
/turf/open/floor/grass,
/area/medical/genetics)
"btU" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/blue,
@@ -30980,7 +31339,7 @@
/area/science/robotics/lab)
"buw" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/item/twohanded/required/kirbyplants/photosynthetic{
+/obj/item/kirbyplants/photosynthetic{
pixel_y = 10
},
/obj/effect/turf_decal/tile/purple{
@@ -30999,7 +31358,7 @@
/turf/open/floor/plasteel/dark,
/area/science/explab)
"buy" = (
-/obj/item/twohanded/required/kirbyplants/photosynthetic{
+/obj/item/kirbyplants/photosynthetic{
pixel_y = 10
},
/obj/effect/turf_decal/tile/purple,
@@ -31038,7 +31397,7 @@
/turf/open/floor/plasteel,
/area/science/explab)
"buD" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-11"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -32562,15 +32921,10 @@
/obj/machinery/light/small{
dir = 1
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
/turf/open/floor/plasteel/white,
/area/hallway/secondary/entry)
"bxZ" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 4
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/white,
/area/hallway/secondary/entry)
"bya" = (
@@ -33011,7 +33365,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants/photosynthetic{
+/obj/item/kirbyplants/photosynthetic{
pixel_y = 4
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
@@ -33403,7 +33757,7 @@
/turf/open/floor/plasteel/white,
/area/medical/genetics)
"bzM" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-10"
},
/obj/effect/turf_decal/tile/green,
@@ -33843,9 +34197,8 @@
/obj/structure/transit_tube/curved/flipped{
dir = 4
},
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/hallway/secondary/entry)
+/turf/open/space/basic,
+/area/space/nearstation)
"bAJ" = (
/obj/structure/transit_tube/horizontal,
/obj/structure/window/reinforced/fulltile,
@@ -34198,7 +34551,7 @@
/turf/open/floor/plasteel/dark,
/area/crew_quarters/heads/hor)
"bBu" = (
-/obj/item/twohanded/required/kirbyplants/dead,
+/obj/item/kirbyplants/dead,
/obj/structure/disposalpipe/segment{
dir = 10
},
@@ -34295,7 +34648,7 @@
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
"bBB" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-20";
pixel_y = 3
},
@@ -34515,6 +34868,7 @@
/area/science/xenobiology)
"bBV" = (
/obj/structure/transit_tube/curved,
+/obj/structure/lattice/catwalk,
/turf/open/space,
/area/space/nearstation)
"bBW" = (
@@ -35994,7 +36348,7 @@
/turf/open/floor/plasteel/white,
/area/crew_quarters/heads/cmo)
"bEH" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-16"
},
/obj/machinery/light_switch{
@@ -38135,10 +38489,12 @@
/turf/open/floor/plasteel/dark,
/area/chapel/dock)
"bIY" = (
-/turf/open/floor/plasteel/white{
- heat_capacity = 1e+006
+/obj/structure/window/reinforced{
+ dir = 8;
+ layer = 2.9
},
-/area/hallway/secondary/entry)
+/turf/open/space/basic,
+/area/space)
"bIZ" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
@@ -38240,7 +38596,7 @@
/turf/open/floor/plasteel/dark,
/area/maintenance/department/engine)
"bJi" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/turf/open/floor/plating,
@@ -39182,9 +39538,7 @@
/turf/open/floor/plasteel/dark,
/area/chapel/dock)
"bLp" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 8
- },
+/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden,
/turf/open/floor/plasteel/dark,
/area/chapel/dock)
"bLq" = (
@@ -39207,20 +39561,17 @@
/turf/open/floor/plasteel/dark,
/area/chapel/dock)
"bLr" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 9
+ },
/turf/open/floor/plasteel/white{
heat_capacity = 1e+006
},
/area/chapel/dock)
"bLs" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/light,
-/turf/open/floor/plasteel/white{
- heat_capacity = 1e+006
- },
-/area/hallway/secondary/entry)
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel/dark,
+/area/chapel/dock)
"bLt" = (
/obj/effect/decal/cleanable/oil{
icon_state = "floor6"
@@ -39422,7 +39773,7 @@
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
"bLT" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "applebush"
},
/obj/machinery/airalarm{
@@ -39693,6 +40044,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
@@ -39736,13 +40088,19 @@
},
/area/chapel/dock)
"bMy" = (
-/obj/structure/window/reinforced{
- dir = 8;
- layer = 2.9
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
},
-/obj/structure/lattice,
-/turf/open/space,
-/area/space/nearstation)
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel/dark,
+/area/chapel/dock)
"bMA" = (
/obj/effect/landmark/event_spawn,
/turf/open/floor/engine,
@@ -40164,12 +40522,12 @@
/turf/open/floor/plasteel/dark,
/area/chapel/dock)
"bNu" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
- },
/obj/structure/cable{
icon_state = "1-2"
},
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 4
+ },
/turf/open/floor/plasteel/dark,
/area/chapel/dock)
"bNv" = (
@@ -40328,7 +40686,7 @@
/turf/open/floor/plasteel/white,
/area/medical/virology)
"bNR" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/green,
@@ -40589,6 +40947,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/dark,
/area/chapel/dock)
"bOy" = (
@@ -40602,6 +40961,9 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 6
+ },
/turf/open/floor/plasteel/dark,
/area/chapel/dock)
"bOz" = (
@@ -40870,6 +41232,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/dark,
/area/chapel/dock)
"bPo" = (
@@ -40886,6 +41249,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/dark,
/area/chapel/dock)
"bPp" = (
@@ -41182,6 +41546,7 @@
icon_state = "1-2"
},
/obj/effect/turf_decal/sand,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel,
/area/chapel/asteroid/monastery)
"bQg" = (
@@ -42445,7 +42810,7 @@
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
"bSP" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-02"
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
@@ -44378,14 +44743,14 @@
/obj/structure/cable{
icon_state = "1-2"
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/dark,
/area/chapel/main/monastery)
"bWX" = (
-/obj/machinery/door/airlock/grunge{
- name = "Chapel"
- },
-/turf/open/floor/plasteel/dark,
-/area/chapel/main/monastery)
+/obj/effect/turf_decal/sand,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel,
+/area/chapel/asteroid/monastery)
"bWZ" = (
/turf/open/floor/plating{
icon_state = "panelscorched"
@@ -44715,6 +45080,7 @@
/obj/structure/cable{
icon_state = "1-2"
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/dark,
/area/chapel/main/monastery)
"bXJ" = (
@@ -44964,7 +45330,7 @@
/turf/open/floor/plating,
/area/maintenance/department/engine)
"bYI" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21";
pixel_y = 3
},
@@ -45420,6 +45786,7 @@
/obj/structure/cable{
icon_state = "1-2"
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/carpet,
/area/chapel/main/monastery)
"bZo" = (
@@ -45731,7 +46098,7 @@
/area/engine/engineering)
"caw" = (
/obj/structure/table,
-/obj/item/twohanded/rcl/pre_loaded,
+/obj/item/rcl/pre_loaded,
/turf/open/floor/plasteel,
/area/engine/engineering)
"cax" = (
@@ -46174,6 +46541,7 @@
/obj/structure/cable{
icon_state = "1-2"
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/carpet,
/area/chapel/main/monastery)
"cbO" = (
@@ -46181,6 +46549,7 @@
/obj/item/reagent_containers/food/drinks/trophy{
pixel_y = 8
},
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/carpet,
/area/chapel/main/monastery)
"cbP" = (
@@ -46337,15 +46706,15 @@
/obj/structure/cable{
icon_state = "1-8"
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 4
},
/turf/open/floor/carpet,
/area/chapel/main/monastery)
"ccF" = (
/obj/effect/landmark/start/chaplain,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 8
},
/turf/open/floor/carpet,
/area/chapel/main/monastery)
@@ -46864,7 +47233,7 @@
/turf/open/floor/plasteel/dark,
/area/chapel/main/monastery)
"ceK" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-08"
},
/turf/open/floor/plasteel/dark,
@@ -48021,7 +48390,7 @@
/turf/open/floor/plating,
/area/maintenance/department/chapel/monastery)
"cjP" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/item/radio/intercom{
@@ -49777,7 +50146,7 @@
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"cpT" = (
-/obj/item/twohanded/required/kirbyplants,
+/obj/item/kirbyplants,
/obj/effect/turf_decal/tile/blue,
/obj/effect/turf_decal/tile/blue{
dir = 8
@@ -49785,7 +50154,7 @@
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"cpU" = (
-/obj/item/twohanded/required/kirbyplants,
+/obj/item/kirbyplants,
/obj/effect/turf_decal/tile/purple,
/obj/effect/turf_decal/tile/purple{
dir = 8
@@ -49982,7 +50351,7 @@
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
"cqE" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-18";
layer = 3
},
@@ -50634,7 +51003,7 @@
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 8
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-10"
},
/turf/open/floor/plasteel/dark,
@@ -50726,7 +51095,7 @@
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/turf/open/floor/plasteel/dark,
@@ -51277,7 +51646,7 @@
icon_state = "1-4"
},
/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/turf/open/floor/plasteel/dark,
@@ -51536,7 +51905,7 @@
/turf/open/floor/plating,
/area/maintenance/department/chapel/monastery)
"cwr" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/structure/cable{
@@ -51981,7 +52350,7 @@
/turf/open/floor/plasteel/dark,
/area/library)
"cyQ" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/machinery/camera{
@@ -51994,7 +52363,7 @@
/turf/open/floor/plasteel/dark,
/area/library)
"cyR" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/turf/open/floor/plasteel/dark,
@@ -52246,7 +52615,7 @@
/area/library)
"cAs" = (
/obj/structure/table/wood,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-05";
pixel_y = 10
},
@@ -53009,15 +53378,16 @@
},
/area/hallway/secondary/exit/departure_lounge)
"dpb" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21";
pixel_y = 3
},
/turf/open/floor/plasteel/dark,
/area/chapel/office)
"dpc" = (
-/turf/open/floor/plasteel/white,
-/area/hallway/secondary/entry)
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/carpet,
+/area/chapel/main/monastery)
"dps" = (
/obj/machinery/status_display/ai,
/turf/closed/wall,
@@ -53381,13 +53751,6 @@
},
/turf/open/floor/plating,
/area/maintenance/department/engine)
-"eit" = (
-/obj/structure/window/reinforced{
- dir = 4
- },
-/obj/structure/lattice,
-/turf/open/space/basic,
-/area/space/nearstation)
"eiV" = (
/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
dir = 4
@@ -53405,10 +53768,6 @@
/obj/structure/chair/office/dark,
/turf/open/floor/wood,
/area/lawoffice)
-"epg" = (
-/obj/structure/lattice,
-/turf/open/space,
-/area/space)
"epj" = (
/obj/machinery/cryopod{
dir = 8
@@ -53684,12 +54043,6 @@
},
/turf/open/floor/plasteel/dark,
/area/engine/engineering)
-"eVT" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
- },
-/turf/open/floor/plasteel/white,
-/area/hallway/secondary/entry)
"eWi" = (
/obj/structure/cable{
icon_state = "0-4"
@@ -54124,15 +54477,6 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/kitchen)
-"gcj" = (
-/obj/machinery/vending/kink,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/turf/open/floor/plasteel/white/corner{
- dir = 1
- },
-/area/crew_quarters/fitness/recreation)
"gdJ" = (
/obj/structure/table/glass,
/obj/item/folder/blue,
@@ -54230,7 +54574,7 @@
/turf/open/floor/plating,
/area/maintenance/department/security/brig)
"gkR" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/structure/extinguisher_cabinet{
pixel_y = 30
},
@@ -54529,7 +54873,7 @@
/area/science/xenobiology)
"gKz" = (
/obj/structure/table/wood,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22";
pixel_y = 8
},
@@ -54613,14 +54957,6 @@
},
/turf/open/floor/plating,
/area/maintenance/department/cargo)
-"gTy" = (
-/obj/structure/window/reinforced{
- dir = 4
- },
-/obj/structure/lattice,
-/obj/structure/lattice,
-/turf/open/space/basic,
-/area/space/nearstation)
"gUb" = (
/obj/structure/chair/office/dark{
dir = 4
@@ -54871,14 +55207,6 @@
},
/turf/open/floor/plating,
/area/maintenance/solars/port)
-"hCb" = (
-/obj/machinery/door/airlock/public/glass{
- name = "Monastery Transit"
- },
-/turf/open/floor/plasteel/white{
- heat_capacity = 1e+006
- },
-/area/hallway/secondary/entry)
"hDG" = (
/obj/machinery/door/airlock/engineering{
name = "Auxillary Base Construction";
@@ -55667,7 +55995,7 @@
/obj/structure/sign/plaques/deempisi{
pixel_y = 28
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21";
pixel_y = 3
},
@@ -56067,10 +56395,6 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
-"koE" = (
-/obj/structure/lattice,
-/turf/open/space/basic,
-/area/space)
"kpK" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 5
@@ -56125,7 +56449,7 @@
/turf/open/floor/carpet,
/area/lawoffice)
"kxs" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/turf/open/floor/plating,
@@ -56255,12 +56579,7 @@
/turf/open/floor/plating,
/area/hallway/secondary/entry)
"kIc" = (
-/obj/machinery/door/airlock/public/glass{
- name = "Monastery Transit"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
+/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plasteel/white{
heat_capacity = 1e+006
},
@@ -56405,12 +56724,6 @@
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel/dark,
/area/engine/engineering)
-"kVy" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
-/turf/open/floor/plasteel/white,
-/area/hallway/secondary/entry)
"kWQ" = (
/obj/machinery/atmospherics/pipe/simple/orange/visible,
/obj/structure/cable/yellow{
@@ -56436,7 +56749,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-10"
},
/turf/open/floor/plasteel/dark,
@@ -56878,11 +57191,6 @@
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plasteel,
/area/engine/engineering)
-"mgU" = (
-/obj/effect/landmark/carpspawn,
-/obj/structure/lattice,
-/turf/open/space/basic,
-/area/space)
"mhl" = (
/obj/machinery/power/emitter,
/obj/machinery/light{
@@ -57185,14 +57493,6 @@
/obj/machinery/space_heater,
/turf/open/floor/plating,
/area/maintenance/department/science)
-"mSY" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white{
- heat_capacity = 1e+006
- },
-/area/chapel/dock)
"mTS" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -57202,12 +57502,6 @@
},
/turf/open/floor/plasteel/dark,
/area/science/xenobiology)
-"mVD" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/hallway/secondary/entry)
"mVM" = (
/turf/open/floor/plating/airless,
/area/space/nearstation)
@@ -57289,12 +57583,6 @@
/obj/item/chair/stool,
/turf/open/floor/carpet,
/area/maintenance/department/crew_quarters/dorms)
-"nho" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/hallway/secondary/entry)
"nih" = (
/obj/structure/closet,
/obj/effect/spawner/lootdrop/costume,
@@ -57438,7 +57726,7 @@
/turf/open/floor/plasteel/white/corner,
/area/hallway/primary/central)
"nyO" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/machinery/light/small{
@@ -57678,7 +57966,7 @@
/turf/open/floor/engine,
/area/engine/supermatter)
"nVU" = (
-/obj/item/twohanded/spear,
+/obj/item/spear,
/turf/open/floor/plating,
/area/maintenance/department/engine)
"nWP" = (
@@ -58380,17 +58668,6 @@
},
/turf/open/floor/plasteel/white/corner,
/area/hallway/secondary/exit/departure_lounge)
-"ppY" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/door/airlock/public/glass{
- name = "Monastery Transit"
- },
-/turf/open/floor/plasteel/white{
- heat_capacity = 1e+006
- },
-/area/chapel/dock)
"prQ" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 4
@@ -58663,7 +58940,7 @@
/turf/open/floor/plasteel/white,
/area/science/xenobiology)
"pXT" = (
-/obj/item/twohanded/required/kirbyplants,
+/obj/item/kirbyplants,
/obj/machinery/power/apc{
areastring = "/area/lawoffice";
dir = 8;
@@ -58678,7 +58955,7 @@
/turf/closed/wall/r_wall,
/area/engine/engineering)
"pYw" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-03"
},
/obj/structure/extinguisher_cabinet{
@@ -59875,22 +60152,6 @@
},
/turf/open/floor/plasteel,
/area/science/xenobiology)
-"tbF" = (
-/obj/structure/window/reinforced,
-/obj/structure/window/reinforced{
- dir = 4
- },
-/obj/structure/lattice,
-/obj/structure/lattice,
-/turf/open/space/basic,
-/area/space/nearstation)
-"tbY" = (
-/obj/structure/closet/emcloset,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6
- },
-/turf/open/floor/plasteel/white,
-/area/hallway/secondary/entry)
"tcY" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -60509,10 +60770,6 @@
/obj/machinery/field/generator,
/turf/open/floor/plating,
/area/maintenance/department/engine)
-"uxI" = (
-/obj/machinery/light,
-/turf/open/floor/plasteel/white,
-/area/hallway/secondary/entry)
"uxP" = (
/obj/structure/disposalpipe/segment{
dir = 9
@@ -60717,10 +60974,6 @@
},
/turf/open/floor/plating,
/area/maintenance/department/engine)
-"vaB" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/white,
-/area/hallway/secondary/entry)
"vco" = (
/obj/machinery/light/small{
dir = 8
@@ -60931,12 +61184,6 @@
},
/turf/open/floor/plasteel,
/area/engine/engineering)
-"vxZ" = (
-/obj/machinery/light{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/hallway/secondary/entry)
"vzz" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/public/glass{
@@ -61374,9 +61621,7 @@
/turf/open/floor/plating,
/area/maintenance/department/crew_quarters/bar)
"wDe" = (
-/obj/machinery/door/airlock/public/glass{
- name = "Monastery Transit"
- },
+/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plasteel/white{
heat_capacity = 1e+006
},
@@ -61563,10 +61808,6 @@
icon_state = "platingdmg3"
},
/area/maintenance/department/science)
-"wUc" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/turf/open/floor/plasteel/white,
-/area/hallway/secondary/entry)
"wUf" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plating,
@@ -61601,25 +61842,10 @@
},
/turf/open/floor/plating,
/area/maintenance/department/security/brig)
-"wYJ" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/light{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/hallway/secondary/entry)
"wYK" = (
/obj/machinery/power/supermatter_crystal/engine,
/turf/open/floor/engine,
/area/engine/supermatter)
-"wZs" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white{
- heat_capacity = 1e+006
- },
-/area/hallway/secondary/entry)
"xah" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -61678,10 +61904,6 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/wood,
/area/lawoffice)
-"xeN" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/white,
-/area/hallway/secondary/entry)
"xgh" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
@@ -79230,26 +79452,26 @@ bIW
bKc
bOy
bMt
-bLn
-bOy
+bLs
+bMy
bPo
-bQg
-bQg
-bQg
-bQg
-bQg
-bQg
-bQg
-bQg
-bQg
bWX
-bXJ
-bZo
-bZo
-bZo
-bZo
-bZo
-bZo
+bWX
+bWX
+bWX
+bWX
+bWX
+bWX
+bWX
+bWX
+cek
+cdx
+dpc
+dpc
+dpc
+dpc
+dpc
+dpc
cbO
ccF
cdx
@@ -79741,7 +79963,7 @@ aaa
bGI
bHM
bHM
-bHM
+bNw
bLq
bMv
bNw
@@ -80252,11 +80474,11 @@ aaa
aaa
aaa
aaa
-koE
+aht
aqG
bGE
bKf
-mSY
+bKf
bMw
bNy
bNw
@@ -80508,12 +80730,12 @@ aaa
aaa
aaa
aaa
-koE
-koE
+aht
+aht
aqG
bGE
bKf
-mSY
+bKf
bMx
bNz
bHM
@@ -80764,13 +80986,13 @@ aaa
aaa
aaa
aaa
-koE
-koE
-koE
+aaa
+aaa
+aaa
aqG
bGE
wDe
-ppY
+bHM
bHM
bNA
bHM
@@ -81014,23 +81236,23 @@ aZx
aaa
aaa
aaa
-mZE
-bVp
-bVp
-bVp
-bVp
-bVp
-eit
-gTy
-eit
-eit
-tbF
-aZx
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
bIY
-bLs
-aZx
+bIY
+aht
+aht
bNB
-bMy
+abI
abI
aby
abI
@@ -81271,21 +81493,21 @@ aZx
aaa
aaa
aaa
-bGI
-aZx
-aZx
-aZx
-aZx
-aZx
-aZx
-aZx
-aZx
-aZx
-aZx
-aZx
-bIY
-wZs
-aZx
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aht
amC
aaa
aht
@@ -81528,21 +81750,21 @@ aZx
aaa
aaa
aaa
-bGI
-aZx
-tbY
-wYJ
-xeN
-xeN
-xeN
-wYJ
-xeN
-eVT
-dpc
-vxZ
-bIY
-nho
-aZx
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
amB
aht
aht
@@ -81785,21 +82007,21 @@ aZx
aaa
aaa
aaa
-bGI
-aZx
-mVD
-dpc
-dpc
-dpc
-wUc
-vaB
-vaB
-vaB
-vaB
-vaB
-vaB
-kVy
-aZx
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aht
amC
aaa
aht
@@ -82042,21 +82264,21 @@ aZx
aaa
aaa
aaa
-bGI
-aZx
-mVD
-dpc
-aZx
-aZx
-aZx
-aZx
-aZx
-aZx
-aZx
-aZx
-aZx
-aZx
-aZx
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aht
+aht
amB
aht
aht
@@ -82299,21 +82521,21 @@ aZx
aaa
aaa
aaa
-aqG
-aZx
-mVD
-dpc
-aZx
-koE
-koE
-koE
-koE
-koE
-koE
-koE
-koE
-koE
-koE
+aaa
+aaa
+aaa
+aaa
+aaa
+aht
+aaa
+aaa
+aaa
+aaa
+aht
+aht
+aht
+aht
+aht
amD
aaa
aht
@@ -82555,12 +82777,12 @@ bon
aZx
aaa
aaa
-koE
-aqG
-aZx
-mVD
-dpc
-aZx
+aaa
+aaa
+aaa
+aaa
+aaa
+aht
bBV
bDf
bDf
@@ -82815,12 +83037,12 @@ aZx
aZx
aZx
aZx
-mVD
-uxI
+aaa
+aht
bAI
-epg
abI
-koE
+abI
+aht
abI
aaa
bva
@@ -83073,7 +83295,7 @@ bbR
bbR
aZx
kIc
-hCb
+kIc
bAJ
bBX
bBX
@@ -83123,7 +83345,7 @@ cfN
cfN
xYV
cjm
-koE
+aht
aaa
aaa
aaa
@@ -83381,7 +83603,7 @@ cfN
qWo
cjm
cjm
-koE
+aht
aaa
aaa
aaa
@@ -84136,8 +84358,8 @@ bva
bNK
bva
bva
-koE
-mgU
+aht
+aht
kSb
kSb
aht
@@ -84395,7 +84617,7 @@ bQl
cqX
xNx
ctS
-aaa
+cFB
aaa
aaa
aaa
@@ -84407,8 +84629,8 @@ aaa
aaa
kSb
kSb
-koE
-koE
+aht
+aht
nKo
aaa
aaa
@@ -102547,11 +102769,11 @@ aaa
aaa
aaa
aaa
-apX
-apX
-apX
-apX
-apX
+aaF
+aaF
+aaF
+aaF
+atn
atn
aww
axv
@@ -102798,19 +103020,19 @@ aaa
aiS
cBy
aiS
-aiS
-aiS
-aiT
-aiT
-aiT
-aiS
-aiS
-aiS
-aiS
-atm
-aun
-atn
-awz
+aaF
+aaF
+aaJ
+aaJ
+aaJ
+aaF
+aaF
+abw
+abz
+abH
+abl
+axw
+abg
axw
ayu
azC
@@ -103053,23 +103275,23 @@ aaa
aaa
aaa
aiT
-akq
-ale
-ale
-ale
-anp
-ale
-ale
-ale
-ale
-ale
-ale
-ale
-auo
-atn
-awy
-axw
-ayu
+akn
+ajv
+aaH
+aaN
+abc
+abm
+abm
+abq
+abm
+abm
+abA
+abT
+abK
+abL
+abM
+abP
+abR
azC
axw
aBU
@@ -103310,23 +103532,23 @@ aaa
aaa
aaa
aiS
-aiS
-aiS
-aiS
-aiS
-aiT
-aiT
-aiT
-aiS
-aiS
-aiS
-asl
-aiS
-aup
-atn
-awA
-axx
-ayv
+akn
+aaE
+aaF
+aaR
+aaL
+aaO
+aaO
+aaO
+aaO
+aaO
+aaW
+aaF
+abb
+abd
+abh
+abQ
+abS
azD
aAS
aat
@@ -103566,22 +103788,22 @@ rmC
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
aiS
-apu
-ale
-auq
-atn
-awB
+akn
+aaG
+aaF
+aaS
+aaL
+abn
+aaO
+aaO
+aaO
+aaO
+aaW
+aaY
+aba
+axw
+abg
axw
axw
axw
@@ -103823,22 +104045,22 @@ rmC
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
aiS
akn
-ajv
-aqZ
-atn
-gcj
+aaF
+aaF
+aaS
+abj
+aaO
+aaO
+aaO
+aaO
+aaO
+aaW
+aaY
+awB
+abe
+abi
axw
axw
axw
@@ -104080,18 +104302,18 @@ rmC
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
aiS
akn
+aaF
+aaI
+aaS
+aaL
+abo
+aaO
+abr
+aaO
+aaO
+abB
atn
atn
avm
@@ -104337,18 +104559,18 @@ rmC
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aiT
+aiS
akn
+aaF
+aaK
+aaS
+aaL
+aaO
+aaO
+aaO
+aaO
+aaO
+abC
atn
aur
aur
@@ -104591,22 +104813,22 @@ rmC
rmC
rmC
rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
aaa
aaa
aaa
-aaa
-aiT
+aiS
akn
-atn
+aaF
+aaI
+aaS
+aaL
+aaO
+aaO
+aaO
+aaO
+aaO
+aaW
+avm
aur
aur
aur
@@ -104848,22 +105070,22 @@ rmC
rmC
rmC
rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-aaa
aaa
aaa
aaa
aiS
-asm
-atn
+akn
+aaF
+aaF
+aaT
+aaL
+aaO
+aaO
+aaO
+aaO
+aaO
+aaW
+avm
aur
aur
aur
@@ -105105,22 +105327,22 @@ rmC
rmC
rmC
rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-aaa
aaa
aaa
aaa
aiT
akn
-atn
+ajv
+aaF
+aaU
+aaL
+aaO
+aaO
+abs
+aaO
+aaO
+aaW
+avm
aur
aur
aur
@@ -105362,21 +105584,21 @@ rmC
rmC
rmC
rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-aaa
aaa
aaa
aaa
aiT
akn
+aaQ
+aaF
+aaV
+aaM
+aaP
+aaP
+abt
+aaP
+aaP
+abD
atn
aur
aur
@@ -105619,21 +105841,21 @@ rmC
rmC
rmC
rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-aaa
aaa
aaa
aaa
aiS
akn
+sbk
+aaF
+aaX
+aaZ
+aaZ
+abk
+abp
+abu
+abx
+abE
atn
atn
avm
@@ -105876,22 +106098,22 @@ rmC
rmC
rmC
rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-aaa
aaa
aaa
aaa
aiS
akn
-ato
+ajv
+aaF
+aaF
+aaF
+aaF
+aaF
+aaF
+aaF
+aaF
+abF
+aaF
aiS
atn
awC
@@ -106133,21 +106355,21 @@ rmC
rmC
rmC
rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-aaa
aaa
aaa
aaa
aiS
-asn
+aaD
+ale
+ale
+ale
+ale
+ale
+ale
+ale
+abv
+ale
+abG
ale
ale
avn
@@ -106390,20 +106612,20 @@ rmC
rmC
rmC
rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-aaa
aaa
aaa
aaa
aiS
+aiS
+aiS
+aiS
+aiS
+aiT
+aiS
+aiS
+aiS
+aiS
+aiS
aiT
aiS
aiS
@@ -106647,15 +106869,15 @@ rmC
rmC
rmC
rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
aaa
aaa
@@ -106904,15 +107126,15 @@ rmC
rmC
rmC
rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
aaa
aaa
@@ -107161,15 +107383,15 @@ rmC
rmC
rmC
rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
aaa
aaa
@@ -107418,15 +107640,15 @@ rmC
rmC
rmC
rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
aaa
aaa
@@ -107675,15 +107897,15 @@ rmC
rmC
rmC
rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
aaa
aaa
diff --git a/_maps/map_files/Snaxi/Snaxi.dmm b/_maps/map_files/Snaxi/Snaxi.dmm
index 37576ef011..43e7915ca4 100644
--- a/_maps/map_files/Snaxi/Snaxi.dmm
+++ b/_maps/map_files/Snaxi/Snaxi.dmm
@@ -1,4 +1,309 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"aaa" = (
+/obj/effect/landmark/event_spawn,
+/mob/living/simple_animal/hostile/retaliate/goat{
+ name = "Pete"
+ },
+/turf/open/floor/plasteel/freezer,
+/area/crew_quarters/kitchen)
+"aab" = (
+/obj/structure/curtain,
+/obj/machinery/shower{
+ pixel_y = 20
+ },
+/turf/open/floor/plasteel/white,
+/area/crew_quarters/dorms)
+"aac" = (
+/obj/machinery/shower{
+ pixel_y = 20
+ },
+/obj/structure/curtain,
+/turf/open/floor/plasteel/white,
+/area/crew_quarters/dorms)
+"aad" = (
+/obj/item/radio/intercom{
+ name = "Station Intercom (General)";
+ pixel_x = 30
+ },
+/turf/open/floor/plasteel/freezer,
+/area/crew_quarters/dorms)
+"aae" = (
+/obj/machinery/button/door{
+ id = "Bath1";
+ name = "Door Bolt Control";
+ normaldoorcontrol = 1;
+ pixel_x = 24;
+ pixel_y = -5;
+ specialfunctions = 4
+ },
+/obj/machinery/light/small{
+ dir = 8
+ },
+/obj/structure/toilet/secret/low_loot{
+ pixel_y = 14
+ },
+/turf/open/floor/plasteel/freezer,
+/area/crew_quarters/dorms)
+"aaf" = (
+/obj/machinery/light,
+/obj/structure/urinal{
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel/freezer,
+/area/crew_quarters/dorms)
+"aag" = (
+/obj/structure/table/reinforced,
+/obj/machinery/door/firedoor/border_only{
+ name = "south facing firelock"
+ },
+/mob/living/carbon/monkey/punpun,
+/turf/open/floor/plasteel/grimy,
+/area/crew_quarters/bar)
+"aah" = (
+/obj/structure/table/reinforced,
+/obj/item/clothing/glasses/meson{
+ pixel_y = 4
+ },
+/obj/item/cartridge/atmos,
+/obj/item/cartridge/engineering{
+ pixel_x = -3;
+ pixel_y = 2
+ },
+/obj/item/cartridge/engineering{
+ pixel_x = -3;
+ pixel_y = 2
+ },
+/obj/item/cartridge/engineering{
+ pixel_x = -3;
+ pixel_y = 2
+ },
+/obj/item/radio/intercom{
+ dir = 4;
+ name = "Station Intercom (General)";
+ pixel_x = 27
+ },
+/obj/machinery/keycard_auth{
+ pixel_y = -28
+ },
+/mob/living/simple_animal/parrot/Poly,
+/turf/open/floor/plasteel,
+/area/crew_quarters/heads/chief)
+"aai" = (
+/obj/effect/turf_decal/bot,
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/mob/living/simple_animal/sloth/paperwork,
+/turf/open/floor/plasteel,
+/area/quartermaster/storage)
+"aaj" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/effect/turf_decal/bot,
+/obj/machinery/navbeacon{
+ codes_txt = "delivery;dir=8";
+ dir = 8;
+ freq = 1400;
+ location = "QM #1"
+ },
+/obj/machinery/power/apc{
+ areastring = "/area/maintenance/starboard";
+ dir = 4;
+ name = "Starboard Maintenance APC";
+ pixel_x = 26
+ },
+/mob/living/simple_animal/bot/mulebot{
+ beacon_freq = 1400;
+ home_destination = "QM #1";
+ suffix = "#1"
+ },
+/turf/open/floor/pod/dark,
+/area/maintenance/starboard)
+"aak" = (
+/obj/effect/turf_decal/bot,
+/obj/machinery/navbeacon{
+ codes_txt = "delivery;dir=8";
+ dir = 8;
+ freq = 1400;
+ location = "QM #2"
+ },
+/obj/machinery/camera{
+ c_tag = "Cargo Garage";
+ dir = 8
+ },
+/mob/living/simple_animal/bot/mulebot{
+ home_destination = "QM #2";
+ suffix = "#2"
+ },
+/turf/open/floor/pod/dark,
+/area/maintenance/starboard)
+"aal" = (
+/obj/structure/chair{
+ dir = 8
+ },
+/obj/item/radio/intercom{
+ pixel_x = 28
+ },
+/obj/machinery/light_switch{
+ pixel_y = 26
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/machinery/camera{
+ c_tag = "Chief Medical Office";
+ dir = 8;
+ network = list("ss13","medbay");
+ pixel_y = -22
+ },
+/mob/living/simple_animal/pet/cat/Runtime,
+/turf/open/floor/plasteel/white,
+/area/crew_quarters/heads/cmo)
+"aam" = (
+/obj/structure/chair/comfy/brown{
+ color = "#596479";
+ dir = 1
+ },
+/mob/living/simple_animal/mouse/brown/Tom,
+/turf/open/floor/plasteel/dark,
+/area/security/prison)
+"aan" = (
+/obj/machinery/camera{
+ c_tag = "Head of Security's Office";
+ dir = 8
+ },
+/obj/structure/bed/dogbed{
+ desc = "A comfy-looking pet bed. You can even strap your pet in, in case the gravity turns off.";
+ name = "pet bed"
+ },
+/obj/item/storage/secure/safe/HoS{
+ pixel_x = 35
+ },
+/mob/living/simple_animal/hostile/retaliate/bat/secbat{
+ desc = "An adorable fruit bat with a cute little hat, may or may not have a reputation for biting out eyeballs, or at least that's what the HoS'd tell you.";
+ name = "Colonel Chomps"
+ },
+/turf/open/floor/carpet,
+/area/crew_quarters/heads/hos)
+"aao" = (
+/obj/structure/closet/emcloset/anchored,
+/obj/structure/sign/directions/medical{
+ dir = 8;
+ icon_state = "direction_med";
+ pixel_y = 36
+ },
+/obj/structure/sign/directions/science{
+ dir = 8;
+ icon_state = "direction_sci";
+ pixel_y = 28
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/aft)
+"aap" = (
+/obj/machinery/quantumpad{
+ map_pad_id = "5";
+ map_pad_link_id = "6"
+ },
+/obj/structure/sign/directions/evac{
+ pixel_y = 40
+ },
+/obj/structure/sign/directions/security{
+ pixel_y = 32
+ },
+/obj/structure/sign/directions/command{
+ pixel_y = 24
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/aft)
+"aaq" = (
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 6
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 6
+ },
+/obj/structure/sign/directions/supply{
+ pixel_x = 32;
+ pixel_y = -36
+ },
+/obj/structure/sign/directions/engineering{
+ dir = 4;
+ icon_state = "direction_eng";
+ pixel_x = 32;
+ pixel_y = -28
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/aft)
+"aar" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/sign/departments/botany,
+/turf/open/floor/plating,
+/area/hydroponics)
+"aas" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/structure/sign/departments/engineering,
+/turf/open/floor/plating,
+/area/engine/engineering)
+"aat" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/power/apc{
+ areastring = "/area/hallway/primary/fore";
+ dir = 1;
+ name = "Fore Primary Hallway APC";
+ pixel_y = 24
+ },
+/obj/structure/sign/directions/engineering{
+ dir = 4;
+ icon_state = "direction_eng";
+ pixel_x = 0;
+ pixel_y = 40
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/fore)
+"aau" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/sign/departments/custodian{
+ pixel_y = -32
+ },
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness)
+"aav" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/structure/disposalpipe/trunk{
+ dir = 1
+ },
+/obj/machinery/disposal/bin,
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness)
"aaw" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -11,10 +316,198 @@
},
/turf/open/floor/plasteel/white,
/area/science/misc_lab)
+"aax" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/sign/departments/cargo,
+/turf/open/floor/plating,
+/area/quartermaster/storage)
+"aay" = (
+/obj/structure/disposalpipe/junction/yjunction{
+ dir = 1
+ },
+/obj/structure/sign/departments/cargo{
+ pixel_x = -32;
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/fore)
+"aaz" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/disposalpipe/segment,
+/obj/structure/sign/directions/engineering{
+ dir = 1;
+ icon_state = "direction_eng";
+ pixel_x = 32;
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/fore)
+"aaA" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/structure/sign/warning/pods{
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel/white/corner{
+ dir = 4
+ },
+/area/hallway/primary/port)
+"aaB" = (
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/obj/structure/sign/departments/chemistry{
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/port)
+"aaC" = (
+/obj/structure/sign/directions/medical{
+ dir = 8;
+ icon_state = "direction_med";
+ pixel_y = 36
+ },
+/obj/structure/sign/directions/science{
+ dir = 8;
+ icon_state = "direction_sci";
+ pixel_y = 28
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/port)
+"aaD" = (
+/obj/structure/sign/directions/engineering{
+ dir = 4;
+ icon_state = "direction_eng";
+ pixel_y = 36
+ },
+/obj/structure/sign/directions/supply{
+ dir = 4;
+ icon_state = "direction_supply";
+ pixel_x = 0;
+ pixel_y = 28
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/port)
+"aaE" = (
+/obj/structure/sign/directions/evac{
+ pixel_x = -32;
+ pixel_y = -24
+ },
+/obj/structure/sign/directions/security{
+ pixel_x = -32;
+ pixel_y = -32
+ },
+/obj/structure/sign/directions/command{
+ pixel_x = -32;
+ pixel_y = -40
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/port)
+"aaF" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/purple{
+ dir = 8
+ },
+/obj/structure/sign/departments/science{
+ pixel_x = -32;
+ pixel_y = -32
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/port)
+"aaG" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
+ dir = 4
+ },
+/obj/structure/sign/directions/medical{
+ dir = 8;
+ icon_state = "direction_med";
+ pixel_y = 40
+ },
+/obj/structure/sign/directions/science{
+ dir = 8;
+ icon_state = "direction_sci";
+ pixel_y = 32
+ },
+/obj/structure/sign/directions/security{
+ pixel_y = 24
+ },
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/icemoon/surface/outdoors)
"aaH" = (
/obj/machinery/smartfridge/chemistry/preloaded,
/turf/closed/wall,
/area/medical/chemistry)
+"aaI" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
+ dir = 4
+ },
+/obj/structure/sign/directions/engineering{
+ dir = 4;
+ icon_state = "direction_eng";
+ pixel_y = 40
+ },
+/obj/structure/sign/directions/supply{
+ dir = 4;
+ icon_state = "direction_supply";
+ pixel_x = 0;
+ pixel_y = 32
+ },
+/obj/structure/sign/directions/evac{
+ pixel_y = 24
+ },
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/icemoon/surface/outdoors)
+"aaJ" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/sign/departments/evac,
+/turf/open/floor/plating,
+/area/hallway/secondary/exit/departure_lounge)
+"aaK" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/item/radio/intercom{
+ pixel_y = 25
+ },
+/obj/structure/sign/directions/evac{
+ dir = 4;
+ pixel_x = 0;
+ pixel_y = 40
+ },
+/turf/open/floor/plasteel/white/corner{
+ dir = 4
+ },
+/area/hallway/secondary/exit/departure_lounge)
+"aaL" = (
+/obj/structure/sign/departments/restroom{
+ pixel_x = 32;
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel/grimy,
+/area/crew_quarters/fitness/recreation)
"aaM" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
/obj/machinery/atmospherics/components/binary/valve{
@@ -22,6 +515,24 @@
},
/turf/open/floor/plating/asteroid/snow/icemoon,
/area/icemoon/surface/outdoors)
+"aaN" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on,
+/obj/machinery/quantumpad{
+ map_pad_id = "1";
+ map_pad_link_id = "2"
+ },
+/obj/structure/sign/directions/medical{
+ dir = 8;
+ icon_state = "direction_med";
+ pixel_y = 36
+ },
+/obj/structure/sign/directions/science{
+ dir = 8;
+ icon_state = "direction_sci";
+ pixel_y = 28
+ },
+/turf/open/floor/plasteel,
+/area/quartermaster/miningdock)
"aaO" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 9
@@ -36,13 +547,155 @@
},
/turf/open/floor/plasteel,
/area/engine/engineering)
+"aaQ" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
+/obj/machinery/computer/shuttle/snow_taxi,
+/obj/structure/sign/directions/supply{
+ dir = 4;
+ icon_state = "direction_supply";
+ pixel_x = 0;
+ pixel_y = 36
+ },
+/obj/structure/sign/directions/engineering{
+ dir = 4;
+ icon_state = "direction_eng";
+ pixel_y = 28
+ },
+/turf/open/floor/plasteel,
+/area/quartermaster/miningdock)
+"aaR" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/central)
"aaS" = (
/turf/closed/wall/r_wall,
/area/medical/surgery)
+"aaT" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on,
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/central)
+"aaU" = (
+/obj/structure/sign/departments/restroom{
+ pixel_x = 32
+ },
+/turf/open/floor/carpet,
+/area/crew_quarters/dorms)
+"aaV" = (
+/obj/structure/sign/directions/evac{
+ dir = 1;
+ icon_state = "direction_evac";
+ pixel_y = 8
+ },
+/obj/structure/sign/directions/security{
+ dir = 8;
+ icon_state = "direction_sec";
+ pixel_x = 0;
+ pixel_y = 0
+ },
+/obj/structure/sign/directions/command{
+ dir = 8;
+ icon_state = "direction_bridge";
+ pixel_y = -8
+ },
+/turf/closed/wall/r_wall,
+/area/hallway/primary/central)
+"aaW" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/structure/sign/departments/security,
+/turf/open/floor/plating,
+/area/hallway/primary/central)
+"aaX" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/central)
+"aaY" = (
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/central)
+"aaZ" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/sign/mining{
+ pixel_x = 32
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/central)
"aba" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/medical/surgery)
+"abb" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/central)
+"abc" = (
+/obj/structure/sign/directions/command{
+ pixel_x = 32;
+ pixel_y = -40
+ },
+/obj/structure/sign/directions/supply{
+ dir = 4;
+ icon_state = "direction_supply";
+ pixel_x = 32;
+ pixel_y = -24
+ },
+/obj/structure/sign/directions/science{
+ dir = 4;
+ pixel_x = 32;
+ pixel_y = -32
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/central)
+"abd" = (
+/obj/effect/turf_decal/tile/purple{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/central)
"abe" = (
/obj/structure/table/wood,
/obj/machinery/computer/security/wooden_tv,
@@ -52,14 +705,308 @@
},
/turf/open/floor/wood,
/area/maintenance/bar)
+"abf" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/central)
+"abg" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/purple{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/central)
+"abh" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/structure/reagent_dispensers/watertank,
+/obj/item/radio/intercom{
+ pixel_y = -26
+ },
+/obj/structure/sign/departments/xenobio{
+ pixel_x = 32
+ },
+/turf/open/floor/plasteel/white,
+/area/science/misc_lab)
+"abi" = (
+/obj/machinery/airalarm{
+ dir = 8;
+ pixel_x = 24
+ },
+/obj/effect/turf_decal/tile/purple{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/central)
+"abj" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/machinery/light{
+ dir = 8
+ },
+/obj/structure/sign/departments/holy{
+ pixel_x = -32
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/central)
"abk" = (
/obj/machinery/light,
/turf/open/floor/plasteel/dark,
/area/ai_monitored/security/armory)
+"abl" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/structure/sign/departments/holy{
+ pixel_x = -32;
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/central)
+"abm" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/structure/sign/directions/evac{
+ dir = 8;
+ icon_state = "direction_evac";
+ pixel_x = 32;
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/central)
+"abn" = (
+/obj/structure/sign/poster/official/ian,
+/turf/closed/wall,
+/area/crew_quarters/heads/hop)
+"abo" = (
+/obj/effect/landmark/start/assistant,
+/obj/structure/sign/poster/official/build{
+ pixel_x = -32;
+ pixel_y = -32
+ },
+/turf/open/floor/plasteel,
+/area/storage/primary)
+"abp" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/tile/brown,
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/structure/filingcabinet,
+/turf/open/floor/plasteel,
+/area/quartermaster/storage)
+"abq" = (
+/obj/structure/toilet{
+ contents = newlist(/obj/item/toy/snappop/phoenix);
+ dir = 4
+ },
+/obj/machinery/light/small{
+ dir = 1;
+ light_color = "#ffc1c1"
+ },
+/turf/open/floor/plasteel/freezer,
+/area/hallway/primary/port)
+"abr" = (
+/obj/structure/sink/kitchen{
+ pixel_y = 28
+ },
+/turf/open/floor/plasteel/freezer,
+/area/hallway/primary/port)
"abs" = (
/obj/structure/table/optable,
/turf/open/floor/plasteel/freezer,
/area/medical/surgery)
+"abt" = (
+/obj/machinery/door/airlock{
+ name = "Unisex Restroom"
+ },
+/turf/open/floor/plasteel/freezer,
+/area/hallway/primary/port)
+"abu" = (
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/structure/sign/departments/restroom{
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/port)
+"abv" = (
+/obj/effect/turf_decal/tile/green{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/green{
+ dir = 8
+ },
+/obj/machinery/camera{
+ c_tag = "Hydroponics North"
+ },
+/obj/structure/disposalpipe/trunk{
+ dir = 8
+ },
+/obj/machinery/disposal/bin,
+/obj/structure/sign/poster/official/hydro_ad{
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel/dark,
+/area/hydroponics)
+"abw" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/turf_decal/tile/bar{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/bar,
+/obj/structure/disposalpipe/segment,
+/obj/structure/sign/poster/official/high_class_martini{
+ pixel_x = -32
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/aft)
+"abx" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/obj/structure/table/wood,
+/obj/structure/sign/poster/official/soft_cap_pop_art{
+ pixel_x = -32
+ },
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
+"aby" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/machinery/computer/arcade/minesweeper{
+ dir = 8
+ },
+/obj/structure/sign/poster/official/nanomichi_ad{
+ pixel_x = 32
+ },
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
+"abz" = (
+/obj/structure/chair/sofa/right{
+ dir = 1
+ },
+/obj/structure/sign/poster/official/fruit_bowl{
+ pixel_y = -32
+ },
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
+"abA" = (
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 9
+ },
+/obj/structure/sign/poster/official/fashion{
+ pixel_y = -32
+ },
+/turf/open/floor/carpet,
+/area/crew_quarters/dorms)
+"abB" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/structure/sign/poster/official/report_crimes{
+ pixel_x = -32
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/fore)
+"abC" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/door/airlock/external{
+ req_one_access_txt = "13,8"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
+/turf/open/floor/plating,
+/area/maintenance/port/fore)
+"abD" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/door/airlock/external{
+ req_one_access_txt = "13,8"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/maintenance/port/fore)
+"abE" = (
+/obj/machinery/atmospherics/components/unary/thermomachine/freezer,
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/machinery/camera{
+ c_tag = "Medbay Cryogenics";
+ network = list("ss13","medbay")
+ },
+/obj/structure/sign/poster/official/help_others{
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/central)
+"abF" = (
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/structure/closet/secure_closet/security/engine,
+/obj/item/radio/intercom{
+ pixel_y = -26
+ },
+/obj/machinery/camera{
+ c_tag = "Security Post - Cargo";
+ dir = 1
+ },
+/obj/structure/sign/poster/official/do_not_question{
+ pixel_x = 32
+ },
+/turf/open/floor/plasteel,
+/area/security/checkpoint/supply)
"abG" = (
/obj/effect/turf_decal/stripes/corner{
dir = 4
@@ -67,11 +1014,160 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
/turf/open/floor/plasteel,
/area/engine/atmospherics_engine)
+"abH" = (
+/obj/structure/table,
+/obj/item/storage/firstaid/brute,
+/obj/item/storage/firstaid/brute{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/blue,
+/obj/structure/sign/poster/official/medical_green_cross{
+ pixel_y = -32
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/central)
+"abI" = (
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/yellow,
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/structure/sign/poster/official/safety_eye_protection{
+ pixel_y = -32
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/chemistry)
+"abJ" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/obj/structure/sign/poster/official/walk{
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/port)
+"abK" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/sign/poster/official/build{
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/port)
+"abL" = (
+/obj/structure/table,
+/obj/item/mmi,
+/obj/item/mmi,
+/obj/item/mmi,
+/obj/structure/sign/poster/official/state_laws{
+ pixel_y = -32
+ },
+/turf/open/floor/plasteel/white,
+/area/science/robotics/lab)
+"abM" = (
+/obj/structure/closet/secure_closet/security/med,
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/machinery/camera{
+ c_tag = "Security Post - Medbay";
+ dir = 1
+ },
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/structure/sign/poster/official/here_for_your_safety{
+ pixel_y = -32
+ },
+/turf/open/floor/plasteel,
+/area/security/checkpoint/medical)
+"abN" = (
+/obj/machinery/light,
+/obj/machinery/camera{
+ c_tag = "Escape Arm Southwest";
+ dir = 1
+ },
+/obj/structure/closet/crate/bin,
+/obj/structure/sign/directions/security{
+ pixel_y = -32
+ },
+/turf/open/floor/plasteel,
+/area/hallway/secondary/exit/departure_lounge)
+"abO" = (
+/obj/machinery/light,
+/obj/structure/closet/crate/bin,
+/obj/structure/sign/directions/command{
+ pixel_y = -32
+ },
+/turf/open/floor/plasteel,
+/area/hallway/secondary/exit/departure_lounge)
+"abP" = (
+/obj/structure/chair{
+ dir = 1
+ },
+/obj/structure/sign/poster/official/cohiba_robusto_ad{
+ pixel_y = -32
+ },
+/turf/open/floor/plasteel,
+/area/hallway/secondary/exit/departure_lounge)
"abQ" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/effect/landmark/event_spawn,
/turf/open/floor/wood,
/area/crew_quarters/theatre)
+"abR" = (
+/obj/structure/chair/stool,
+/obj/structure/sign/poster/official/foam_force_ad{
+ pixel_x = 32
+ },
+/turf/open/floor/plasteel/grimy,
+/area/crew_quarters/fitness/recreation)
+"abS" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/door/firedoor/border_only{
+ name = "south facing firelock"
+ },
+/obj/structure/sign/poster/official/no_erp{
+ pixel_x = 32
+ },
+/turf/open/floor/plasteel,
+/area/quartermaster/miningoffice)
+"abT" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
+/obj/structure/disposalpipe/segment,
+/obj/structure/sign/directions/evac{
+ dir = 8;
+ icon_state = "direction_evac";
+ pixel_x = 32;
+ pixel_y = 40
+ },
+/obj/structure/sign/directions/engineering{
+ dir = 4;
+ icon_state = "direction_eng";
+ pixel_x = 32;
+ pixel_y = 24
+ },
+/obj/structure/sign/directions/medical{
+ dir = 4;
+ pixel_x = 32;
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/central)
"abU" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -81,6 +1177,25 @@
},
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors)
+"abV" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/structure/sign/poster/official/obey{
+ pixel_x = -32
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/central)
+"abW" = (
+/obj/structure/tank_dispenser/oxygen,
+/obj/machinery/camera/motion{
+ c_tag = "Armory Motion Sensor North"
+ },
+/obj/structure/sign/poster/official/ion_rifle{
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel/dark,
+/area/ai_monitored/security/armory)
"abX" = (
/obj/machinery/airalarm{
pixel_y = 28
@@ -98,6 +1213,15 @@
},
/turf/open/floor/plasteel,
/area/quartermaster/storage)
+"abY" = (
+/obj/machinery/computer/camera_advanced/xenobio{
+ dir = 1
+ },
+/obj/structure/sign/poster/official/anniversary_vintage_reprint{
+ pixel_y = -32
+ },
+/turf/open/floor/plasteel/white,
+/area/science/xenobiology)
"abZ" = (
/obj/effect/landmark/start/medical_doctor,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -105,6 +1229,38 @@
},
/turf/open/floor/plasteel/freezer,
/area/medical/surgery)
+"aca" = (
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
+/obj/machinery/camera{
+ c_tag = "Brig Evidence Storage"
+ },
+/obj/structure/sign/poster/official/space_cops{
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/main)
+"acb" = (
+/obj/structure/sign/poster/official/science{
+ pixel_y = -32
+ },
+/turf/open/floor/plasteel/white,
+/area/science/mixing)
+"acc" = (
+/obj/structure/sign/poster/contraband/lusty_xenomorph{
+ pixel_x = -32;
+ pixel_y = -32
+ },
+/turf/open/floor/plating,
+/area/maintenance/aft/secondary)
+"acd" = (
+/obj/structure/reagent_dispensers/watertank,
+/obj/structure/sign/poster/contraband/bountyhunters{
+ pixel_x = 32
+ },
+/turf/open/floor/plating,
+/area/maintenance/central)
"ace" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -114,6 +1270,19 @@
},
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors)
+"acf" = (
+/obj/structure/chair/stool,
+/obj/structure/sign/poster/official/bless_this_spess{
+ pixel_x = -32
+ },
+/turf/open/floor/carpet,
+/area/chapel/main)
+"acg" = (
+/obj/structure/sign/poster/official/wtf_is_co2{
+ pixel_x = 32
+ },
+/turf/open/floor/plasteel,
+/area/science/storage)
"acj" = (
/obj/effect/landmark/blobstart,
/turf/open/floor/plating,
@@ -772,16 +1941,6 @@
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
-"aon" = (
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/obj/effect/turf_decal/tile/yellow,
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/chemistry)
"aoo" = (
/obj/structure/table/glass,
/obj/machinery/reagentgrinder{
@@ -915,9 +2074,6 @@
},
/turf/open/floor/plasteel/dark,
/area/tcommsat/computer)
-"arG" = (
-/turf/open/floor/plating,
-/area/medical/medbay/central)
"arH" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -1548,7 +2704,7 @@
/turf/open/floor/plasteel/white,
/area/science/lab)
"ayu" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-16"
},
/obj/effect/turf_decal/tile/purple{
@@ -2950,24 +4106,6 @@
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plating,
/area/engine/engineering)
-"aOl" = (
-/obj/structure/closet/secure_closet/security/med,
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/machinery/camera{
- c_tag = "Security Post - Medbay";
- dir = 1
- },
-/obj/machinery/light{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/medical)
"aOm" = (
/obj/effect/turf_decal/tile/red,
/obj/effect/turf_decal/tile/red{
@@ -3023,7 +4161,7 @@
/area/engine/supermatter)
"aOP" = (
/obj/structure/table/wood,
-/obj/item/storage/pill_bottle/dice,
+/obj/item/storage/box/dice,
/turf/open/floor/plasteel/dark,
/area/security/prison)
"aPw" = (
@@ -3545,8 +4683,8 @@
name = "supply dock loading door"
},
/obj/machinery/conveyor{
- id = "QMLoad2";
- dir = 1
+ dir = 1;
+ id = "QMLoad2"
},
/turf/open/floor/plating,
/area/quartermaster/storage)
@@ -4558,7 +5696,6 @@
department = "Mining";
pixel_x = -30
},
-/obj/structure/closet/crate/bin,
/turf/open/floor/plasteel,
/area/quartermaster/miningdock)
"bzj" = (
@@ -4938,13 +6075,6 @@
},
/turf/open/floor/carpet,
/area/hallway/primary/central)
-"bBB" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
"bBH" = (
/obj/structure/cable{
icon_state = "0-4"
@@ -6490,10 +7620,6 @@
/obj/machinery/holopad,
/turf/open/floor/carpet,
/area/hallway/secondary/exit/departure_lounge)
-"bQf" = (
-/obj/structure/closet/emcloset/anchored,
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
"bQg" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -7162,15 +8288,6 @@
/obj/structure/closet/crate/coffin,
/turf/open/floor/wood,
/area/chapel/office)
-"cbz" = (
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/machinery/camera{
- c_tag = "Brig Evidence Storage"
- },
-/turf/open/floor/plasteel/dark,
-/area/security/main)
"cbL" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -7758,7 +8875,7 @@
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-10"
},
/turf/open/floor/carpet,
@@ -8467,15 +9584,6 @@
},
/turf/open/floor/plasteel,
/area/storage/primary)
-"cGQ" = (
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/machinery/light{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
"cGZ" = (
/obj/machinery/light{
dir = 8
@@ -8830,18 +9938,6 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors)
-"cSv" = (
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/structure/disposalpipe/trunk{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
"cSC" = (
/obj/effect/landmark/event_spawn,
/turf/open/floor/plasteel/white,
@@ -9032,7 +10128,7 @@
/obj/structure/cable{
icon_state = "2-8"
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-10"
},
/turf/open/floor/plasteel/dark,
@@ -9410,7 +10506,7 @@
/turf/open/floor/plasteel,
/area/hallway/primary/fore)
"dij" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-10"
},
/turf/open/floor/carpet,
@@ -9807,14 +10903,6 @@
},
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors)
-"dvh" = (
-/obj/structure/table/reinforced,
-/mob/living/carbon/monkey/punpun,
-/obj/machinery/door/firedoor/border_only{
- name = "south facing firelock"
- },
-/turf/open/floor/plasteel/grimy,
-/area/crew_quarters/bar)
"dvs" = (
/obj/machinery/door/airlock/public/glass{
name = "Snow Airlock"
@@ -10026,21 +11114,9 @@
pixel_x = 32
},
/obj/effect/turf_decal/tile/brown,
+/obj/machinery/rnd/production/techfab/department/cargo,
/turf/open/floor/plasteel,
/area/quartermaster/storage)
-"dDf" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/fore)
"dDC" = (
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
@@ -10876,15 +11952,6 @@
},
/turf/open/floor/plasteel,
/area/science/robotics/lab)
-"eeh" = (
-/obj/machinery/light,
-/obj/machinery/camera{
- c_tag = "Escape Arm Southwest";
- dir = 1
- },
-/obj/structure/closet/crate/bin,
-/turf/open/floor/plasteel,
-/area/hallway/secondary/exit/departure_lounge)
"eex" = (
/obj/machinery/atmospherics/pipe/simple/general/visible,
/obj/machinery/meter,
@@ -11361,7 +12428,7 @@
/turf/open/floor/plasteel,
/area/janitor)
"eue" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-04"
},
/obj/effect/turf_decal/tile/blue{
@@ -11404,13 +12471,6 @@
dir = 8
},
/area/hallway/primary/fore)
-"evr" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/door/firedoor/border_only{
- name = "south facing firelock"
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/miningoffice)
"evI" = (
/obj/machinery/atmospherics/components/trinary/filter/atmos/n2{
dir = 1
@@ -11633,10 +12693,6 @@
},
/turf/open/floor/plating,
/area/engine/storage)
-"eEa" = (
-/obj/machinery/light,
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/dorms)
"eEy" = (
/obj/machinery/doorButtons/access_button{
idDoor = "virology_airlock_interior";
@@ -11666,17 +12722,11 @@
/obj/structure/disposalpipe/segment{
dir = 9
},
-/turf/open/floor/plasteel/dark,
-/area/teleporter)
-"eFy" = (
-/obj/machinery/light{
- dir = 4
- },
-/obj/machinery/computer/arcade/minesweeper{
+/obj/machinery/computer/gateway_control{
dir = 8
},
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
+/turf/open/floor/plasteel/dark,
+/area/teleporter)
"eFB" = (
/obj/structure/table/wood,
/obj/item/reagent_containers/rag,
@@ -12084,19 +13134,6 @@
},
/turf/open/floor/wood,
/area/crew_quarters/bar)
-"eOK" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/hallway/primary/central)
"eOO" = (
/obj/structure/weightmachine/weightlifter,
/turf/open/floor/plasteel,
@@ -12377,13 +13414,6 @@
/obj/structure/table,
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
-"eZn" = (
-/obj/structure/tank_dispenser/oxygen,
-/obj/machinery/camera/motion{
- c_tag = "Armory Motion Sensor North"
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/security/armory)
"eZA" = (
/obj/structure/cable{
icon_state = "0-4"
@@ -12398,8 +13428,8 @@
/area/bridge/meeting_room)
"eZU" = (
/obj/machinery/conveyor{
- id = "QMLoad2";
- dir = 1
+ dir = 1;
+ id = "QMLoad2"
},
/turf/open/floor/plating,
/area/quartermaster/storage)
@@ -12854,14 +13884,6 @@
},
/turf/open/floor/engine/co2,
/area/engine/atmos)
-"fnu" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/obj/machinery/quantumpad{
- map_pad_id = "1";
- map_pad_link_id = "2"
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
"fnx" = (
/obj/machinery/light{
dir = 1
@@ -12945,24 +13967,6 @@
},
/turf/open/floor/plasteel/white,
/area/science/robotics/lab)
-"fpW" = (
-/obj/effect/turf_decal/bot,
-/mob/living/simple_animal/bot/mulebot{
- home_destination = "QM #2";
- suffix = "#2"
- },
-/obj/machinery/navbeacon{
- codes_txt = "delivery;dir=8";
- dir = 8;
- freq = 1400;
- location = "QM #2"
- },
-/obj/machinery/camera{
- c_tag = "Cargo Garage";
- dir = 8
- },
-/turf/open/floor/pod/dark,
-/area/maintenance/starboard)
"fqj" = (
/obj/machinery/field/generator,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
@@ -13095,11 +14099,6 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/closed/wall,
/area/storage/eva)
-"fuy" = (
-/obj/machinery/light,
-/obj/structure/closet/crate/bin,
-/turf/open/floor/plasteel,
-/area/hallway/secondary/exit/departure_lounge)
"fuB" = (
/obj/machinery/camera{
c_tag = "Auxiliary Bridge North";
@@ -13696,13 +14695,6 @@
},
/turf/open/floor/plating,
/area/storage/atmos)
-"fNd" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
"fNh" = (
/obj/structure/cable,
/turf/open/floor/plating/snowed/smoothed/icemoon,
@@ -14580,6 +15572,10 @@
/obj/effect/turf_decal/tile/purple{
dir = 8
},
+/obj/machinery/disposal/bin,
+/obj/structure/disposalpipe/trunk{
+ dir = 8
+ },
/turf/open/floor/plasteel/white,
/area/medical/genetics)
"goM" = (
@@ -15074,18 +16070,6 @@
/obj/machinery/power/port_gen/pacman,
/turf/open/floor/plating,
/area/engine/storage)
-"gEz" = (
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/turf/open/floor/carpet,
-/area/crew_quarters/dorms)
"gFb" = (
/obj/machinery/vending/wardrobe/law_wardrobe,
/obj/item/radio/intercom{
@@ -15270,19 +16254,6 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plasteel,
/area/hallway/primary/port)
-"gKB" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/machinery/light{
- dir = 4
- },
-/obj/structure/reagent_dispensers/watertank,
-/obj/item/radio/intercom{
- pixel_y = -26
- },
-/turf/open/floor/plasteel/white,
-/area/science/misc_lab)
"gKR" = (
/obj/machinery/mineral/equipment_vendor,
/obj/structure/disposalpipe/segment{
@@ -15582,13 +16553,6 @@
},
/turf/open/floor/plating,
/area/maintenance/solars/port/aft)
-"gRS" = (
-/obj/machinery/light{
- dir = 8
- },
-/obj/structure/table/wood,
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
"gSh" = (
/obj/structure/cable{
icon_state = "1-8"
@@ -16183,31 +17147,6 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/port)
-"hnB" = (
-/obj/structure/chair{
- dir = 8
- },
-/obj/item/radio/intercom{
- pixel_x = 28
- },
-/obj/machinery/light_switch{
- pixel_y = 26
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/mob/living/simple_animal/pet/cat/Runtime,
-/obj/machinery/camera{
- c_tag = "Chief Medical Office";
- dir = 8;
- network = list("ss13","medbay");
- pixel_y = -22
- },
-/turf/open/floor/plasteel/white,
-/area/crew_quarters/heads/cmo)
"hnO" = (
/obj/machinery/atmospherics/components/unary/cryo_cell,
/turf/open/floor/plasteel/white,
@@ -16869,12 +17808,6 @@
},
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors)
-"hGM" = (
-/obj/structure/urinal{
- pixel_y = 32
- },
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/dorms)
"hGU" = (
/obj/structure/closet/secure_closet/personal/cabinet{
pixel_x = -8
@@ -17387,7 +18320,7 @@
/obj/machinery/light{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-10"
},
/turf/open/floor/wood,
@@ -17869,14 +18802,6 @@
/obj/structure/closet/crate/coffin,
/turf/open/floor/wood,
/area/chapel/office)
-"ifQ" = (
-/mob/living/simple_animal/mouse/brown/Tom,
-/obj/structure/chair/comfy/brown{
- color = "#596479";
- dir = 1
- },
-/turf/open/floor/plasteel/dark,
-/area/security/prison)
"ifT" = (
/obj/structure/cable{
icon_state = "0-4"
@@ -19707,19 +20632,6 @@
},
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors)
-"jiV" = (
-/obj/structure/table,
-/obj/item/storage/firstaid/brute,
-/obj/item/storage/firstaid/brute{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/effect/turf_decal/tile/blue,
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
"jiY" = (
/obj/effect/turf_decal/tile/brown{
dir = 1
@@ -19920,7 +20832,6 @@
/obj/structure/cable{
icon_state = "0-2"
},
-/obj/machinery/gateway,
/obj/effect/turf_decal/bot_white,
/turf/open/floor/plasteel/dark,
/area/teleporter)
@@ -20459,10 +21370,6 @@
"jJu" = (
/turf/closed/wall/r_wall,
/area/medical/medbay/zone3)
-"jKb" = (
-/obj/effect/landmark/start/assistant,
-/turf/open/floor/plasteel,
-/area/storage/primary)
"jKF" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -20689,13 +21596,6 @@
},
/turf/open/floor/plasteel,
/area/hallway/secondary/exit/departure_lounge)
-"jPP" = (
-/obj/machinery/gateway{
- dir = 8
- },
-/obj/effect/turf_decal/bot_white,
-/turf/open/floor/plasteel/dark,
-/area/teleporter)
"jQj" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/cable{
@@ -21090,8 +21990,8 @@
"kdM" = (
/obj/effect/turf_decal/stripes,
/obj/machinery/conveyor{
- id = "QMLoad2";
- dir = 1
+ dir = 1;
+ id = "QMLoad2"
},
/turf/open/floor/plasteel,
/area/quartermaster/storage)
@@ -22195,19 +23095,6 @@
},
/turf/open/floor/engine,
/area/engine/atmospherics_engine)
-"kPj" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
"kPn" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel,
@@ -22643,7 +23530,7 @@
/turf/open/floor/engine,
/area/engine/engineering)
"lfs" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-08"
},
/turf/open/floor/plasteel,
@@ -24382,24 +25269,6 @@
},
/turf/open/floor/plasteel,
/area/engine/engineering)
-"mkm" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/power/apc{
- areastring = "/area/hallway/primary/fore";
- dir = 1;
- name = "Fore Primary Hallway APC";
- pixel_y = 24
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/fore)
"mkr" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -24800,13 +25669,6 @@
/obj/machinery/telecomms/processor/preset_four,
/turf/open/floor/plasteel/dark/telecomms,
/area/tcommsat/server)
-"mzB" = (
-/obj/structure/table,
-/obj/item/mmi,
-/obj/item/mmi,
-/obj/item/mmi,
-/turf/open/floor/plasteel/white,
-/area/science/robotics/lab)
"mAk" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 10
@@ -25363,22 +26225,6 @@
},
/turf/open/floor/plasteel/freezer,
/area/crew_quarters/dorms)
-"mQo" = (
-/obj/effect/turf_decal/tile/green{
- dir = 1
- },
-/obj/effect/turf_decal/tile/green{
- dir = 8
- },
-/obj/machinery/camera{
- c_tag = "Hydroponics North"
- },
-/obj/structure/disposalpipe/trunk{
- dir = 8
- },
-/obj/machinery/disposal/bin,
-/turf/open/floor/plasteel/dark,
-/area/hydroponics)
"mQC" = (
/obj/machinery/airalarm{
dir = 1;
@@ -26013,13 +26859,6 @@
/obj/effect/landmark/start/paramedic,
/turf/open/floor/plasteel/white,
/area/medical/medbay/zone3)
-"nhO" = (
-/obj/machinery/airalarm/server{
- dir = 1;
- pixel_y = -22
- },
-/turf/open/floor/circuit/telecomms/mainframe,
-/area/tcommsat/server)
"nij" = (
/obj/machinery/light{
dir = 1
@@ -26132,12 +26971,6 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plating,
/area/medical/genetics)
-"nmY" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
"nnj" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
@@ -26170,14 +27003,6 @@
},
/turf/open/floor/plasteel,
/area/hydroponics)
-"noB" = (
-/obj/effect/turf_decal/bot,
-/mob/living/simple_animal/sloth/paperwork,
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/storage)
"noQ" = (
/obj/effect/spawner/structure/window/plasma/reinforced,
/turf/open/floor/plating,
@@ -26796,34 +27621,6 @@
},
/turf/open/floor/plasteel,
/area/engine/atmos)
-"nGa" = (
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/light{
- dir = 4
- },
-/obj/effect/turf_decal/bot,
-/mob/living/simple_animal/bot/mulebot{
- beacon_freq = 1400;
- home_destination = "QM #1";
- suffix = "#1"
- },
-/obj/machinery/navbeacon{
- codes_txt = "delivery;dir=8";
- dir = 8;
- freq = 1400;
- location = "QM #1"
- },
-/obj/machinery/power/apc{
- areastring = "/area/maintenance/starboard";
- dir = 4;
- name = "Starboard Maintenance APC";
- pixel_x = 26
- },
-/turf/open/floor/pod/dark,
-/area/maintenance/starboard)
"nGd" = (
/obj/effect/turf_decal/delivery,
/obj/machinery/portable_atmospherics/canister/toxins,
@@ -26894,7 +27691,7 @@
"nIM" = (
/obj/structure/table/wood/poker,
/obj/item/toy/cards/deck,
-/obj/item/storage/pill_bottle/dice{
+/obj/item/storage/box/dice{
pixel_x = 8
},
/obj/structure/sign/poster/contraband/random{
@@ -27181,7 +27978,6 @@
/obj/effect/turf_decal/tile/purple{
dir = 1
},
-/obj/structure/closet/crate/bin,
/turf/open/floor/plasteel/white,
/area/medical/genetics)
"nSf" = (
@@ -27645,9 +28441,6 @@
/turf/closed/wall,
/area/quartermaster/sorting)
"ohf" = (
-/obj/machinery/gateway{
- dir = 5
- },
/obj/effect/turf_decal/bot_white/left,
/turf/open/floor/plasteel/dark,
/area/teleporter)
@@ -27765,9 +28558,6 @@
},
/turf/open/floor/plating/asteroid/snow/icemoon,
/area/engine/atmospherics_engine)
-"oiX" = (
-/turf/closed/wall,
-/area/crew_quarters/heads/hop)
"oje" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -27870,7 +28660,7 @@
/turf/open/floor/carpet,
/area/quartermaster/miningoffice)
"old" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "applebush"
},
/turf/open/floor/wood,
@@ -28206,7 +28996,9 @@
/obj/effect/turf_decal/tile/purple{
dir = 8
},
-/obj/structure/disposalpipe/segment,
+/obj/structure/disposalpipe/sorting/mail/flip{
+ sortType = 23
+ },
/turf/open/floor/plasteel/white,
/area/medical/genetics)
"ouE" = (
@@ -28541,7 +29333,7 @@
/turf/open/floor/carpet,
/area/crew_quarters/heads/hop)
"oGU" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-10"
},
/turf/open/floor/wood,
@@ -28745,23 +29537,6 @@
/obj/effect/landmark/event_spawn,
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/ai_upload_foyer)
-"oLT" = (
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/machinery/light{
- dir = 1
- },
-/obj/item/radio/intercom{
- pixel_y = 25
- },
-/turf/open/floor/plasteel/white/corner{
- dir = 4
- },
-/area/hallway/secondary/exit/departure_lounge)
"oME" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -29582,13 +30357,6 @@
},
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors)
-"pkh" = (
-/mob/living/simple_animal/hostile/retaliate/goat{
- name = "Pete"
- },
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/kitchen)
"pkJ" = (
/turf/open/floor/wood{
icon_state = "wood-broken6"
@@ -29612,7 +30380,7 @@
c_tag = "Courtroom East";
dir = 8
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "applebush"
},
/turf/open/floor/wood,
@@ -30313,20 +31081,6 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plasteel,
/area/hallway/primary/central)
-"pCj" = (
-/obj/structure/sink{
- dir = 8;
- pixel_x = -12;
- pixel_y = 2
- },
-/obj/structure/mirror{
- pixel_x = -28
- },
-/obj/structure/urinal{
- pixel_y = 32
- },
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/dorms)
"pCo" = (
/obj/machinery/atmospherics/pipe/simple/orange/visible{
dir = 9
@@ -30919,12 +31673,6 @@
},
/turf/open/floor/plasteel,
/area/quartermaster/storage)
-"pUz" = (
-/obj/structure/disposalpipe/junction/yjunction{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/fore)
"pUP" = (
/obj/machinery/door/airlock/public/glass{
name = "Chapel"
@@ -31093,15 +31841,6 @@
},
/turf/open/floor/plasteel,
/area/engine/engineering)
-"qbh" = (
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/machinery/light{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/port)
"qbr" = (
/obj/effect/turf_decal/tile/red{
dir = 4
@@ -31887,13 +32626,6 @@
},
/turf/open/floor/plating/asteroid/snow/icemoon,
/area/icemoon/surface/outdoors)
-"qAq" = (
-/obj/machinery/quantumpad{
- map_pad_id = "5";
- map_pad_link_id = "6"
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
"qAx" = (
/obj/structure/disposalpipe/segment{
dir = 9
@@ -32100,8 +32832,8 @@
/area/hallway/secondary/exit/departure_lounge)
"qGt" = (
/obj/structure/bodycontainer/crematorium{
- id = "crematoriumChapel";
- dir = 8
+ dir = 8;
+ id = "crematoriumChapel"
},
/obj/machinery/button/crematorium{
id = "crematoriumChapel";
@@ -32163,7 +32895,7 @@
/turf/open/floor/carpet,
/area/crew_quarters/dorms)
"qHO" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/turf/open/floor/plasteel,
@@ -32353,7 +33085,7 @@
/area/bridge)
"qMN" = (
/obj/structure/table,
-/obj/item/storage/pill_bottle/dice,
+/obj/item/storage/box/dice,
/turf/open/floor/plasteel/grimy,
/area/crew_quarters/fitness/recreation)
"qNB" = (
@@ -32971,7 +33703,7 @@
dir = 4
},
/obj/effect/turf_decal/tile/neutral,
-/obj/item/twohanded/required/kirbyplants,
+/obj/item/kirbyplants,
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
"rhX" = (
@@ -33787,35 +34519,6 @@
},
/turf/open/floor/plasteel,
/area/engine/engineering)
-"rFQ" = (
-/obj/structure/table/reinforced,
-/mob/living/simple_animal/parrot/Poly,
-/obj/item/clothing/glasses/meson{
- pixel_y = 4
- },
-/obj/item/cartridge/atmos,
-/obj/item/cartridge/engineering{
- pixel_x = -3;
- pixel_y = 2
- },
-/obj/item/cartridge/engineering{
- pixel_x = -3;
- pixel_y = 2
- },
-/obj/item/cartridge/engineering{
- pixel_x = -3;
- pixel_y = 2
- },
-/obj/item/radio/intercom{
- dir = 4;
- name = "Station Intercom (General)";
- pixel_x = 27
- },
-/obj/machinery/keycard_auth{
- pixel_y = -28
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/heads/chief)
"rGc" = (
/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
dir = 6
@@ -34308,10 +35011,6 @@
},
/turf/open/floor/plasteel/dark,
/area/medical/morgue)
-"rYN" = (
-/obj/structure/chair/stool,
-/turf/open/floor/carpet,
-/area/chapel/main)
"rYQ" = (
/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
dir = 10
@@ -34356,7 +35055,7 @@
/area/engine/engineering)
"saN" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-10"
},
/turf/open/floor/plasteel,
@@ -34529,16 +35228,6 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
-"seR" = (
-/obj/machinery/airalarm{
- dir = 8;
- pixel_x = 24
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
"seZ" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 6
@@ -34795,15 +35484,6 @@
/obj/machinery/computer/card,
/turf/open/floor/wood,
/area/crew_quarters/heads/captain)
-"soN" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/port)
"spa" = (
/obj/structure/disposalpipe/segment{
dir = 10
@@ -34847,7 +35527,7 @@
dir = 8
},
/obj/effect/turf_decal/tile/blue,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-10"
},
/turf/open/floor/plasteel/dark,
@@ -35312,16 +35992,6 @@
/obj/effect/turf_decal/stripes/corner,
/turf/open/floor/engine,
/area/engine/engineering)
-"sIn" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/door/airlock/external{
- req_one_access_txt = "13,8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/port/fore)
"sIT" = (
/obj/structure/reagent_dispensers/fueltank,
/turf/open/floor/pod/dark,
@@ -35405,9 +36075,6 @@
/turf/open/floor/plating,
/area/hallway/secondary/exit/departure_lounge)
"sLr" = (
-/obj/machinery/gateway{
- dir = 6
- },
/obj/effect/turf_decal/bot_white/right,
/obj/effect/turf_decal/stripes/corner{
dir = 1
@@ -36250,7 +36917,7 @@
/obj/effect/turf_decal/tile/red{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-10"
},
/turf/open/floor/plasteel/dark,
@@ -36575,9 +37242,9 @@
/obj/effect/turf_decal/delivery,
/obj/structure/table/reinforced,
/obj/machinery/door/window/eastleft{
+ dir = 8;
name = "Hydroponics Desk";
- req_access_txt = "35";
- dir = 8
+ req_access_txt = "35"
},
/obj/machinery/door/firedoor/border_only{
dir = 8;
@@ -37173,18 +37840,6 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/carpet,
/area/hallway/secondary/exit/departure_lounge)
-"tJL" = (
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
- },
-/obj/structure/disposalpipe/segment{
- dir = 6
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
"tKa" = (
/obj/machinery/door/airlock/security/glass{
id_tag = "innerbrig";
@@ -37443,24 +38098,6 @@
},
/turf/open/floor/plasteel,
/area/hallway/secondary/exit/departure_lounge)
-"tQd" = (
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/structure/closet/secure_closet/security/engine,
-/obj/item/radio/intercom{
- pixel_y = -26
- },
-/obj/machinery/camera{
- c_tag = "Security Post - Cargo";
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/supply)
"tQv" = (
/obj/effect/turf_decal/tile/purple,
/obj/effect/turf_decal/tile/purple{
@@ -37707,11 +38344,6 @@
},
/turf/open/floor/plasteel,
/area/science/robotics/mechbay)
-"tWx" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
"tXn" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -38025,23 +38657,6 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/carpet,
/area/crew_quarters/dorms)
-"ugr" = (
-/obj/machinery/button/door{
- id = "Bath1";
- name = "Door Bolt Control";
- normaldoorcontrol = 1;
- pixel_x = 24;
- pixel_y = -5;
- specialfunctions = 4
- },
-/obj/machinery/shower{
- pixel_y = 20
- },
-/obj/machinery/light/small{
- dir = 8
- },
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/dorms)
"uha" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -39249,8 +39864,8 @@
name = "supply dock loading door"
},
/obj/machinery/conveyor{
- id = "QMLoad2";
- dir = 1
+ dir = 1;
+ id = "QMLoad2"
},
/turf/open/floor/plating,
/area/quartermaster/storage)
@@ -39697,8 +40312,8 @@
/area/security/checkpoint/supply)
"vgX" = (
/obj/machinery/conveyor{
- id = "QMLoad2";
- dir = 1
+ dir = 1;
+ id = "QMLoad2"
},
/turf/open/floor/plasteel,
/area/quartermaster/storage)
@@ -39826,16 +40441,6 @@
/obj/machinery/meter,
/turf/open/floor/engine,
/area/engine/engineering)
-"vlz" = (
-/obj/structure/urinal{
- pixel_y = 32
- },
-/obj/item/radio/intercom{
- name = "Station Intercom (General)";
- pixel_x = 30
- },
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/dorms)
"vlC" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 1
@@ -40098,9 +40703,6 @@
/turf/open/floor/plasteel,
/area/engine/engineering)
"vse" = (
-/obj/machinery/gateway{
- dir = 10
- },
/obj/machinery/light{
dir = 8
},
@@ -41640,13 +42242,6 @@
},
/turf/open/floor/engine,
/area/engine/engineering)
-"wie" = (
-/obj/machinery/gateway{
- dir = 1
- },
-/obj/effect/turf_decal/bot_white,
-/turf/open/floor/plasteel/dark,
-/area/teleporter)
"wje" = (
/turf/open/floor/plasteel,
/area/hallway/primary/port)
@@ -42942,9 +43537,6 @@
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors)
"xcd" = (
-/obj/machinery/gateway{
- dir = 4
- },
/obj/effect/turf_decal/bot_white,
/turf/open/floor/plasteel/dark,
/area/teleporter)
@@ -43001,24 +43593,6 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plasteel,
/area/hallway/primary/central)
-"xdr" = (
-/obj/machinery/camera{
- c_tag = "Head of Security's Office";
- dir = 8
- },
-/obj/structure/bed/dogbed{
- desc = "A comfy-looking pet bed. You can even strap your pet in, in case the gravity turns off.";
- name = "pet bed"
- },
-/mob/living/simple_animal/hostile/retaliate/bat/secbat{
- desc = "An adorable fruit bat with a cute little hat, may or may not have a reputation for biting out eyeballs, or at least that's what the HoS'd tell you.";
- name = "Colonel Chomps"
- },
-/obj/item/storage/secure/safe/HoS{
- pixel_x = 35
- },
-/turf/open/floor/carpet,
-/area/crew_quarters/heads/hos)
"xdD" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{
dir = 4
@@ -43145,9 +43719,6 @@
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
-"xhH" = (
-/turf/closed/wall/r_wall,
-/area/hallway/primary/central)
"xhV" = (
/obj/effect/turf_decal/bot_white,
/obj/structure/window/reinforced{
@@ -43208,7 +43779,7 @@
/obj/structure/cable{
icon_state = "0-4"
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-10"
},
/obj/machinery/power/apc{
@@ -43227,20 +43798,6 @@
/obj/machinery/vending/snack/random,
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
-"xlg" = (
-/obj/machinery/atmospherics/components/unary/thermomachine/freezer,
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/machinery/camera{
- c_tag = "Medbay Cryogenics";
- network = list("ss13","medbay")
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
"xlm" = (
/obj/machinery/vending/wardrobe/atmos_wardrobe,
/turf/open/floor/plasteel,
@@ -43344,11 +43901,6 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plasteel/grimy,
/area/crew_quarters/bar)
-"xou" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/obj/machinery/computer/shuttle/snow_taxi,
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
"xow" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/door/airlock/security/glass{
@@ -43522,18 +44074,6 @@
/obj/machinery/atmospherics/pipe/simple/supply/visible,
/turf/open/floor/plating,
/area/maintenance/department/electrical)
-"xve" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/obj/effect/turf_decal/tile/bar,
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
"xvj" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -43707,10 +44247,6 @@
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
-"xCr" = (
-/obj/effect/landmark/blobstart,
-/turf/open/floor/plating,
-/area/medical/medbay/central)
"xCC" = (
/obj/effect/turf_decal/tile/red{
dir = 1
@@ -43876,9 +44412,6 @@
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/engine/atmos)
"xHk" = (
-/obj/machinery/gateway{
- dir = 9
- },
/obj/effect/turf_decal/bot_white/right,
/turf/open/floor/plasteel/dark,
/area/teleporter)
@@ -44340,10 +44873,6 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/central)
-"xXX" = (
-/obj/structure/reagent_dispensers/watertank,
-/turf/open/floor/plating,
-/area/maintenance/central)
"xYD" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
/turf/open/floor/carpet,
@@ -44398,10 +44927,6 @@
},
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors)
-"yae" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
"ybp" = (
/obj/structure/chair{
dir = 8
@@ -56146,7 +56671,7 @@ won
evJ
fsQ
mxo
-nhO
+pTw
apJ
apJ
apJ
@@ -56915,7 +57440,7 @@ avT
avT
gLH
xHk
-jPP
+xcd
vse
mSs
qQH
@@ -57171,7 +57696,7 @@ bBh
avT
avT
gLH
-wie
+xcd
ePa
jrR
nTQ
@@ -58980,8 +59505,8 @@ ash
ash
nQr
ash
-ash
-ash
+tmO
+tmO
wje
ahC
nOK
@@ -59237,9 +59762,9 @@ rbW
aoR
apO
ash
-arG
-ash
-qbh
+abq
+tmO
+abu
auY
hEf
eGO
@@ -59494,8 +60019,8 @@ rRV
aoT
pWz
ash
-xCr
-ash
+abr
+abt
lxF
rbo
ioG
@@ -59748,11 +60273,11 @@ tUi
ash
tVS
anm
-jiV
-ash
-ash
+abH
ash
ash
+tmO
+tmO
dXR
hOA
irg
@@ -60012,7 +60537,7 @@ arI
syN
atr
rbo
-jwo
+aaF
azq
azq
azq
@@ -60251,7 +60776,7 @@ ash
cxX
sXJ
sXJ
-hnB
+aal
qhU
vCE
gIm
@@ -61311,7 +61836,7 @@ aPB
oqL
aLG
aNk
-aOl
+abM
aPA
avT
avT
@@ -62565,7 +63090,7 @@ vvH
vvH
fsA
gZX
-xlg
+abE
jUu
xGP
anm
@@ -63348,7 +63873,7 @@ mAx
ndm
rQN
aoX
-soN
+aaB
ojv
oTu
oTu
@@ -64631,7 +65156,7 @@ aoX
ali
yds
yds
-aon
+abI
aoX
rJw
tkr
@@ -64866,10 +65391,10 @@ avT
avT
xUL
rTG
-sIn
+abC
kxU
sdH
-sIn
+abD
kxU
pyw
nYZ
@@ -65147,7 +65672,7 @@ yds
yds
qWL
aoX
-gsM
+abJ
tkr
iPX
rQJ
@@ -65672,7 +66197,7 @@ ayA
sNK
xmo
rqW
-mzB
+abL
rQJ
szG
aHG
@@ -66419,7 +66944,7 @@ xUL
xUL
xUL
tmO
-fYx
+aaA
oDm
tmO
rhX
@@ -66689,7 +67214,7 @@ nrJ
iAR
rik
xWq
-aAL
+abK
gxi
wEP
wJH
@@ -67718,7 +68243,7 @@ xWq
xWq
xWq
tmO
-wje
+aaC
wje
tmO
ydp
@@ -68232,7 +68757,7 @@ xUL
xUL
xUL
tmO
-wje
+aaD
iPX
tmO
tmO
@@ -68490,7 +69015,7 @@ xUL
xUL
usE
buO
-wje
+aaE
cpC
tmO
ydp
@@ -71358,7 +71883,7 @@ avT
kfv
kfv
ilb
-ifQ
+aam
rlG
wSb
wav
@@ -72140,7 +72665,7 @@ wDk
pmK
dbB
nxv
-eZn
+abW
xBv
nQM
lZi
@@ -74713,7 +75238,7 @@ oJF
piv
nre
bWR
-xdr
+aan
uKb
fKC
rVN
@@ -75233,7 +75758,7 @@ cBD
bQj
gCG
sdN
-xXX
+acd
ubL
diH
uPJ
@@ -75483,7 +76008,7 @@ bDr
alG
fmt
cBD
-cbz
+aca
jae
bNS
pST
@@ -75748,7 +76273,7 @@ giT
bZF
xkT
bVR
-rYN
+acf
qOb
bSd
bXO
@@ -77263,7 +77788,7 @@ xZg
xZg
xZg
uBa
-eeh
+abN
grV
cTD
cTD
@@ -77273,7 +77798,7 @@ cTD
grV
lbp
knn
-eOK
+aaW
bBz
lbp
cBD
@@ -77493,7 +78018,7 @@ gky
ptY
cgH
ktw
-xZL
+aaG
lzB
avT
avT
@@ -77528,30 +78053,30 @@ vPQ
vPQ
vPQ
bwu
+aaR
+aaT
+aaX
+aaY
+abb
lhQ
-yae
-kPj
-bBB
-lhQ
-lhQ
-vPQ
-cGQ
-vPQ
-vPQ
+abV
+abf
+abb
+abb
bNn
vPQ
qQt
vPQ
bJF
bVX
-cGQ
+abj
hhz
vPQ
vPQ
vPQ
haj
pjn
-tNf
+abl
sAw
vPQ
mdG
@@ -78264,7 +78789,7 @@ cPI
kxP
vAs
ktw
-xZL
+aaI
lzB
avT
avT
@@ -78279,7 +78804,7 @@ wxT
bUP
fLK
rmN
-oLT
+aaK
ljL
uBa
uBa
@@ -78300,19 +78825,19 @@ fXU
ffm
jBl
fmw
-tWx
+abT
pBU
reS
+abc
lhQ
-lhQ
-ceA
-vun
-ceA
-ceA
-ceA
-seR
-ceA
-ceA
+abd
+abg
+abd
+abd
+abd
+abi
+abd
+abd
bmP
bQs
vun
@@ -78324,7 +78849,7 @@ ceA
vun
lhQ
lhQ
-ceA
+abm
bPc
ceA
bUL
@@ -78548,7 +79073,7 @@ piX
hJw
kop
uBa
-fuy
+abO
bwx
bwx
bwx
@@ -79062,7 +79587,7 @@ fWE
wbE
wbE
uBa
-rcH
+abP
bwx
iSo
bpM
@@ -80608,8 +81133,8 @@ tHU
bBL
guv
bpO
-bDR
-gfF
+aaL
+abR
bDR
jOl
bBL
@@ -80847,13 +81372,13 @@ iaO
dnm
hHC
dnm
-unA
+aaJ
unA
unA
unA
unA
dnm
-unA
+aaJ
dnm
unA
unA
@@ -80870,7 +81395,7 @@ bsx
bLT
bLT
bLT
-xhH
+aaV
rle
cSG
bCQ
@@ -81125,7 +81650,7 @@ vAs
vAs
vAs
bLT
-fnu
+aaN
bxR
mPM
ohK
@@ -81145,7 +81670,7 @@ bQC
gsK
wuB
pyI
-bXW
+acg
eqZ
wpN
vOV
@@ -81303,7 +81828,7 @@ dvs
mtP
naE
mtP
-mtP
+aaU
nOY
mtP
naE
@@ -81382,7 +81907,7 @@ vAs
vAs
vAs
bLT
-xou
+aaQ
jkL
fcJ
cqd
@@ -81555,7 +82080,7 @@ ydp
avT
avT
iHM
-iHM
+pgp
pgp
pgp
pgp
@@ -81810,11 +82335,11 @@ xUL
ydp
ydp
ydp
-avT
bmX
avT
pgp
-pCj
+aab
+dZV
dZV
gLk
pgp
@@ -81900,7 +82425,7 @@ bEi
bEi
lbp
bAs
-nmY
+aaZ
bCL
bDW
gpp
@@ -82069,9 +82594,9 @@ ydp
ydp
ydp
avT
-avT
pgp
-hGM
+aac
+gLk
gLk
gLk
pgp
@@ -82325,10 +82850,10 @@ ydp
ydp
ydp
ydp
-ydp
avT
pgp
-vlz
+aab
+aad
gLk
fBs
pgp
@@ -82419,11 +82944,11 @@ aGl
bEa
pHl
aaw
-gKB
+abh
qJV
fjU
fjU
-fjU
+acb
qJV
fuG
qJV
@@ -82583,7 +83108,7 @@ ydp
ydp
ydp
avT
-avT
+pgp
pgp
pgp
pgp
@@ -82842,7 +83367,7 @@ ydp
avT
ydp
pgp
-ugr
+aae
pBh
gLk
pgp
@@ -83101,7 +83626,7 @@ ydp
pgp
pgp
pgp
-eEa
+aaf
pgp
pgp
pgp
@@ -83374,8 +83899,8 @@ skZ
mSt
geO
cQv
-nGa
-fpW
+aaj
+aak
oyf
dzS
dSQ
@@ -83622,7 +84147,7 @@ mWy
pgp
uEG
dKn
-gEz
+abA
pax
sdq
iux
@@ -83706,13 +84231,13 @@ dFp
wTK
tDY
oXn
-cSg
+abY
tRe
egg
cbQ
iXG
bWf
-bVa
+acc
bVa
bWf
ftV
@@ -84207,7 +84732,7 @@ bvq
oCZ
lxV
dGP
-evr
+abS
lxV
hJE
cmC
@@ -84651,7 +85176,7 @@ iML
kFr
vuO
vaj
-rTv
+aau
mSt
dWt
fyr
@@ -85402,7 +85927,7 @@ xUL
xUL
xUL
kVO
-bQf
+aao
qgm
qgm
qgm
@@ -85419,7 +85944,7 @@ xJB
hyK
vVN
qeL
-oiX
+abn
trU
knI
oIb
@@ -85661,7 +86186,7 @@ xUL
qaO
gct
sGE
-tJL
+aaq
ixf
ixf
giv
@@ -86194,7 +86719,7 @@ iqZ
seG
tYT
qKA
-cSv
+aav
pJS
pJS
tQG
@@ -86444,7 +86969,7 @@ mKv
sAh
sAh
sAh
-urI
+aar
uEz
uEz
hrS
@@ -86687,7 +87212,7 @@ xUL
xUL
xUL
kVO
-qAq
+aap
acq
fJc
lfy
@@ -87208,7 +87733,7 @@ wAx
wuQ
vnM
wAx
-mQo
+abv
mbE
qss
sYv
@@ -87485,7 +88010,7 @@ mhq
bNF
wIA
hTO
-noB
+aai
wIA
kti
nrg
@@ -88491,7 +89016,7 @@ hAw
skK
vKa
gdg
-pkh
+aaa
loM
vKa
nsv
@@ -88512,7 +89037,7 @@ pJS
leq
qxT
wIA
-iCO
+abp
pJS
pJS
pJS
@@ -89016,12 +89541,12 @@ fTy
jvb
xZp
dVr
-gRS
+abx
msK
cKk
dNB
rmV
-dDf
+abB
gaf
pMD
shN
@@ -89274,7 +89799,7 @@ stW
iKV
hFj
oNv
-guV
+abz
cKk
meG
mcU
@@ -90307,7 +90832,7 @@ jHT
rkd
mcU
rNS
-vyf
+aax
vyf
hLQ
nsf
@@ -90324,7 +90849,7 @@ gwY
pdD
hMM
qKP
-tQd
+abF
jIt
avT
avT
@@ -90570,7 +91095,7 @@ vkk
qSi
vkk
vkk
-pUz
+aay
pqj
mcU
pqj
@@ -91063,7 +91588,7 @@ pCU
ixf
kcn
llu
-xve
+abw
gJP
eGi
mIe
@@ -91341,7 +91866,7 @@ uqy
yes
iqH
iqH
-iqH
+aaz
iqH
yes
iqH
@@ -92097,10 +92622,10 @@ gcY
xop
fbq
lFv
-dvh
+aag
gkl
eOt
-eFy
+aby
rYc
hbb
rkd
@@ -92360,7 +92885,7 @@ cKk
cKk
cKk
cKk
-mkm
+aat
lpl
xcA
srk
@@ -93904,7 +94429,7 @@ fPd
eYu
xOj
jKF
-jKb
+abo
wdR
sda
pAC
@@ -94929,7 +95454,7 @@ wTe
sPt
iBL
bnU
-fNd
+aas
bDg
fKE
bnU
@@ -96982,7 +97507,7 @@ ulr
jJb
xfH
puE
-rFQ
+aah
iiY
piR
tty
diff --git a/_maps/map_files/debug/multiz.dmm b/_maps/map_files/debug/multiz.dmm
index 3f7cacd1a8..4614829679 100644
--- a/_maps/map_files/debug/multiz.dmm
+++ b/_maps/map_files/debug/multiz.dmm
@@ -1300,7 +1300,7 @@
"dO" = (
/obj/structure/table,
/obj/machinery/light,
-/obj/item/twohanded/fireaxe,
+/obj/item/fireaxe,
/obj/item/extinguisher,
/turf/open/floor/plasteel,
/area/storage/primary)
diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm
index f82ba2d735..5a14eb9041 100644
--- a/_maps/map_files/generic/CentCom.dmm
+++ b/_maps/map_files/generic/CentCom.dmm
@@ -58,7 +58,7 @@
/obj/structure/table/wood{
layer = 3.3
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-05";
pixel_y = 4
},
@@ -294,7 +294,7 @@
/area/holodeck/rec_center/winterwonderland)
"aT" = (
/obj/structure/table/wood,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-05";
pixel_y = 10
},
@@ -1686,19 +1686,19 @@
/obj/item/melee/chainofcommand{
name = "chain whip"
},
-/obj/item/twohanded/spear,
+/obj/item/spear,
/turf/open/floor/holofloor/asteroid,
/area/holodeck/rec_center/thunderdome1218)
"ez" = (
/obj/structure/table/wood,
/obj/item/scythe,
-/obj/item/twohanded/spear,
+/obj/item/spear,
/turf/open/floor/holofloor/asteroid,
/area/holodeck/rec_center/thunderdome1218)
"eA" = (
/obj/structure/table/wood,
/obj/item/tailclub,
-/obj/item/twohanded/spear,
+/obj/item/spear,
/turf/open/floor/holofloor/asteroid,
/area/holodeck/rec_center/thunderdome1218)
"eB" = (
@@ -2916,11 +2916,11 @@
/turf/open/floor/circuit/green/anim,
/area/ctf)
"hE" = (
-/obj/item/twohanded/ctf/blue,
+/obj/item/ctf/blue,
/turf/open/floor/circuit/green/anim,
/area/ctf)
"hF" = (
-/obj/item/twohanded/ctf/red,
+/obj/item/ctf/red,
/turf/open/floor/circuit/green/anim,
/area/ctf)
"hG" = (
@@ -4002,7 +4002,7 @@
/turf/open/floor/plasteel/dark,
/area/centcom/control)
"ke" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/neutral{
@@ -4106,7 +4106,7 @@
/turf/open/floor/plasteel,
/area/centcom/supply)
"kk" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/effect/turf_decal/tile/neutral{
@@ -4211,7 +4211,7 @@
/turf/open/floor/plasteel/grimy,
/area/centcom/control)
"kB" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/machinery/firealarm{
@@ -4234,7 +4234,7 @@
/obj/structure/window/reinforced{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/turf/open/floor/plasteel/grimy,
@@ -4243,7 +4243,7 @@
/obj/structure/window/reinforced{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/turf/open/floor/plasteel/grimy,
@@ -4284,13 +4284,13 @@
/obj/structure/window/reinforced{
dir = 8
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/turf/open/floor/plasteel/grimy,
/area/centcom/control)
"kJ" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/machinery/airalarm{
@@ -4733,7 +4733,7 @@
/turf/open/floor/plasteel,
/area/centcom/control)
"lQ" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/machinery/firealarm{
@@ -5168,7 +5168,7 @@
/turf/open/floor/plasteel,
/area/centcom/control)
"mL" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/effect/turf_decal/tile/green{
@@ -5180,7 +5180,7 @@
/turf/open/floor/plasteel,
/area/centcom/control)
"mM" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21";
pixel_x = -3;
pixel_y = 3
@@ -5957,7 +5957,7 @@
/obj/machinery/status_display/ai{
pixel_y = 32
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-15";
pixel_x = -6;
pixel_y = 12
@@ -6171,7 +6171,7 @@
/turf/open/floor/plasteel,
/area/centcom/control)
"oy" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21";
pixel_x = -3;
pixel_y = 3
@@ -6517,7 +6517,7 @@
/turf/open/floor/plasteel/grimy,
/area/centcom/ferry)
"ph" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/machinery/light{
@@ -6751,7 +6751,7 @@
/turf/open/floor/plasteel/dark,
/area/centcom/control)
"pw" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/structure/extinguisher_cabinet{
@@ -6998,13 +6998,13 @@
/turf/open/floor/plasteel/dark,
/area/centcom/ferry)
"qd" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/turf/open/floor/wood,
/area/centcom/ferry)
"qe" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/machinery/light_switch{
@@ -7525,7 +7525,7 @@
/turf/open/floor/plasteel,
/area/centcom/ferry)
"rt" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/machinery/newscaster{
@@ -7550,7 +7550,7 @@
/turf/open/floor/wood,
/area/centcom/ferry)
"rv" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/machinery/light{
@@ -7732,7 +7732,7 @@
/turf/open/floor/grass,
/area/centcom/control)
"rL" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/structure/extinguisher_cabinet{
@@ -8429,7 +8429,7 @@
/area/centcom/ferry)
"tx" = (
/obj/structure/table/wood,
-/obj/item/storage/pill_bottle/dice,
+/obj/item/storage/box/dice,
/turf/open/floor/plasteel/grimy,
/area/centcom/ferry)
"ty" = (
@@ -8611,7 +8611,7 @@
/turf/open/floor/plasteel,
/area/centcom/ferry)
"tJ" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/effect/turf_decal/tile/green{
@@ -8650,7 +8650,7 @@
/turf/open/floor/plasteel,
/area/centcom/control)
"tO" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/green{
@@ -8667,7 +8667,7 @@
/turf/closed/indestructible/riveted,
/area/centcom/evac)
"tS" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/stripes/line{
@@ -9109,7 +9109,7 @@
/turf/open/floor/plasteel/dark,
/area/centcom/ferry)
"uT" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/effect/turf_decal/tile/neutral{
@@ -9139,7 +9139,7 @@
/turf/open/floor/plasteel/dark,
/area/centcom/ferry)
"uV" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/neutral{
@@ -10077,7 +10077,7 @@
/turf/open/floor/plating,
/area/centcom/ferry)
"xi" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/delivery,
@@ -10147,7 +10147,7 @@
/turf/open/floor/plasteel,
/area/centcom/control)
"xp" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/green{
@@ -10159,7 +10159,7 @@
/turf/open/floor/plasteel,
/area/centcom/control)
"xq" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/green,
@@ -10178,7 +10178,7 @@
/turf/open/floor/plating,
/area/centcom/evac)
"xs" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/effect/turf_decal/stripes/line{
@@ -10217,7 +10217,7 @@
/area/wizard_station)
"xy" = (
/obj/structure/table/wood/fancy,
-/obj/item/storage/pill_bottle/dice{
+/obj/item/storage/box/dice{
icon_state = "magicdicebag"
},
/turf/open/floor/carpet,
@@ -10741,7 +10741,7 @@
/turf/open/floor/plasteel/dark,
/area/centcom/ferry)
"zd" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/machinery/light{
@@ -11247,7 +11247,7 @@
/turf/open/floor/plasteel/dark,
/area/centcom/ferry)
"Am" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/red{
@@ -11268,7 +11268,7 @@
/turf/open/floor/plasteel,
/area/centcom/control)
"Ap" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/effect/turf_decal/tile/blue,
@@ -11541,7 +11541,7 @@
/turf/open/floor/plasteel,
/area/centcom/evac)
"Ba" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/stripes/line,
@@ -12161,7 +12161,7 @@
/turf/open/floor/plasteel/dark,
/area/centcom/ferry)
"Cw" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/machinery/power/apc{
@@ -12198,7 +12198,7 @@
/turf/open/floor/plasteel/dark,
/area/centcom/ferry)
"Cy" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/machinery/light,
@@ -12219,7 +12219,7 @@
/turf/open/floor/plasteel/dark,
/area/centcom/ferry)
"Cz" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/structure/extinguisher_cabinet{
@@ -12616,7 +12616,7 @@
/turf/open/floor/plasteel/dark,
/area/centcom/evac)
"Df" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/structure/extinguisher_cabinet{
@@ -13008,7 +13008,7 @@
/turf/open/floor/plasteel/dark,
/area/centcom/control)
"DV" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/green{
@@ -13017,7 +13017,7 @@
/turf/open/floor/plasteel,
/area/centcom/control)
"DW" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/effect/turf_decal/tile/green,
@@ -13571,7 +13571,7 @@
/turf/open/floor/plasteel,
/area/tdome/tdomeobserve)
"Fs" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/effect/turf_decal/tile/green{
@@ -13585,7 +13585,7 @@
},
/area/tdome/tdomeobserve)
"Fu" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/green,
@@ -13670,7 +13670,7 @@
/turf/open/floor/plasteel/white,
/area/tdome/tdomeobserve)
"FG" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/red,
@@ -13750,7 +13750,7 @@
/turf/open/floor/plasteel,
/area/tdome/tdomeobserve)
"FQ" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/green{
@@ -13848,7 +13848,7 @@
},
/area/tdome/tdomeobserve)
"Gg" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/effect/turf_decal/tile/neutral{
@@ -13862,7 +13862,7 @@
},
/area/tdome/tdomeobserve)
"Gh" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/red{
@@ -13871,7 +13871,7 @@
/turf/open/floor/plasteel,
/area/tdome/tdomeobserve)
"Gi" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/red{
@@ -13884,7 +13884,7 @@
/turf/open/floor/plasteel,
/area/tdome/tdomeobserve)
"Gj" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/effect/turf_decal/tile/red,
@@ -13913,7 +13913,7 @@
/turf/open/floor/plasteel,
/area/tdome/tdomeobserve)
"Gn" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/effect/turf_decal/tile/green,
@@ -13923,7 +13923,7 @@
/turf/open/floor/plasteel,
/area/tdome/tdomeobserve)
"Go" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/green,
@@ -13936,7 +13936,7 @@
/turf/open/floor/plasteel,
/area/tdome/tdomeobserve)
"Gp" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/green{
@@ -14876,7 +14876,7 @@
/turf/open/floor/plasteel,
/area/tdome/tdomeobserve)
"HZ" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/neutral,
@@ -14966,7 +14966,7 @@
/turf/open/floor/plasteel,
/area/tdome/tdomeobserve)
"Ig" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/neutral{
@@ -15790,7 +15790,7 @@
/turf/open/floor/plasteel,
/area/tdome/tdomeadmin)
"JZ" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/machinery/firealarm{
@@ -15822,7 +15822,7 @@
/turf/open/floor/plasteel/dark,
/area/tdome/tdomeadmin)
"Kc" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/neutral{
@@ -17577,7 +17577,7 @@
/turf/open/floor/wood,
/area/centcom/holding)
"RQ" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21";
pixel_x = -3;
pixel_y = 3
@@ -18850,7 +18850,7 @@
/turf/open/indestructible/binary,
/area/space)
"Zh" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-10"
},
/turf/open/indestructible/hotelwood,
diff --git a/_maps/map_files/generic/City_of_Cogs.dmm b/_maps/map_files/generic/City_of_Cogs.dmm
index 1195ad62c5..9ef765aa28 100644
--- a/_maps/map_files/generic/City_of_Cogs.dmm
+++ b/_maps/map_files/generic/City_of_Cogs.dmm
@@ -10,20 +10,10 @@
/obj/structure/grille/ratvar,
/turf/open/indestructible/reebe_void,
/area/reebe)
-"ad" = (
-/obj/structure/lattice/clockwork,
-/obj/item/clockwork/component/belligerent_eye/blind_eye,
-/turf/open/indestructible/reebe_void,
-/area/reebe)
"ae" = (
/obj/structure/lattice/clockwork,
/turf/open/indestructible/reebe_void,
/area/reebe)
-"af" = (
-/obj/structure/lattice/clockwork,
-/obj/item/clockwork/component/geis_capacitor/antennae,
-/turf/open/indestructible/reebe_void,
-/area/reebe)
"ag" = (
/obj/structure/lattice/catwalk/clockwork,
/turf/open/indestructible/reebe_void,
@@ -39,14 +29,6 @@
"aj" = (
/turf/open/floor/clockwork/reebe,
/area/reebe/city_of_cogs)
-"ak" = (
-/obj/structure/destructible/clockwork/massive/celestial_gateway,
-/turf/open/floor/clockwork/reebe,
-/area/reebe/city_of_cogs)
-"al" = (
-/obj/machinery/sleeper/clockwork,
-/turf/open/floor/clockwork/reebe,
-/area/reebe/city_of_cogs)
"an" = (
/obj/structure/noticeboard,
/obj/item/paper/fluff/ruins/djstation{
@@ -64,10 +46,6 @@
},
/turf/open/floor/clockwork/reebe,
/area/reebe/city_of_cogs)
-"aq" = (
-/obj/machinery/computer/camera_advanced/ratvar,
-/turf/open/floor/clockwork/reebe,
-/area/reebe/city_of_cogs)
"ar" = (
/obj/structure/closet/wardrobe/mixed,
/turf/open/floor/clockwork/reebe,
@@ -96,12 +74,6 @@
},
/turf/open/floor/clockwork/reebe,
/area/reebe/city_of_cogs)
-"ax" = (
-/obj/structure/chair/brass{
- dir = 1
- },
-/turf/open/floor/clockwork/reebe,
-/area/reebe/city_of_cogs)
"ay" = (
/obj/machinery/door/airlock/clockwork/brass{
name = "Dressing Room"
@@ -109,7 +81,7 @@
/turf/open/floor/clockwork/reebe,
/area/reebe/city_of_cogs)
"az" = (
-/obj/structure/destructible/clockwork/heralds_beacon,
+/obj/structure/destructible/clockwork/eminence_spire,
/turf/open/floor/clockwork/reebe,
/area/reebe/city_of_cogs)
"aA" = (
@@ -118,17 +90,6 @@
},
/turf/open/floor/clockwork/reebe,
/area/reebe/city_of_cogs)
-"aB" = (
-/obj/structure/table/reinforced/brass,
-/obj/item/clockwork/construct_chassis/cogscarab,
-/turf/open/floor/clockwork/reebe,
-/area/reebe/city_of_cogs)
-"aC" = (
-/obj/machinery/sleeper/clockwork{
- dir = 1
- },
-/turf/open/floor/clockwork/reebe,
-/area/reebe/city_of_cogs)
"aD" = (
/obj/machinery/door/airlock/clockwork/brass{
name = "Listening Station"
@@ -149,15 +110,6 @@
opacity = 0
},
/area/reebe/city_of_cogs)
-"aH" = (
-/obj/effect/landmark/servant_of_ratvar,
-/turf/open/floor/clockwork/reebe,
-/area/reebe/city_of_cogs)
-"aI" = (
-/obj/structure/table/reinforced/brass,
-/obj/item/clockwork/slab,
-/turf/open/floor/clockwork/reebe,
-/area/reebe/city_of_cogs)
"aJ" = (
/obj/structure/table/reinforced/brass,
/obj/item/screwdriver/brass,
@@ -182,162 +134,22 @@
/obj/item/weldingtool/experimental/brass,
/turf/open/floor/clockwork/reebe,
/area/reebe/city_of_cogs)
-"aO" = (
-/obj/structure/lattice/catwalk/clockwork,
-/obj/item/clockwork/component/belligerent_eye/lens_gem,
-/turf/open/indestructible/reebe_void,
-/area/reebe)
-"aP" = (
-/obj/structure/lattice/catwalk/clockwork,
-/obj/item/clockwork/component/hierophant_ansible/obelisk,
-/turf/open/indestructible/reebe_void,
-/area/reebe)
-"aQ" = (
-/obj/structure/lattice/clockwork,
-/obj/item/clockwork/alloy_shards/clockgolem_remains,
-/turf/open/indestructible/reebe_void,
-/area/reebe)
-"aR" = (
-/obj/effect/landmark/city_of_cogs,
-/turf/open/indestructible/clock_spawn_room,
-/area/reebe/city_of_cogs)
"aS" = (
-/obj/effect/clockwork/servant_blocker{
- dir = 1
- },
-/obj/structure/lattice/catwalk/clockwork,
-/turf/open/indestructible/reebe_void,
-/area/reebe/city_of_cogs)
-"aT" = (
-/turf/open/indestructible/clock_spawn_room,
-/area/reebe/city_of_cogs)
-"aU" = (
-/obj/structure/grille/ratvar,
-/obj/structure/window/reinforced/clockwork/fulltile,
-/turf/open/indestructible/clock_spawn_room,
-/area/reebe/city_of_cogs)
-"aV" = (
-/obj/machinery/door/airlock/clockwork/brass,
-/turf/open/indestructible/clock_spawn_room,
-/area/reebe/city_of_cogs)
-"aW" = (
-/obj/item/clockwork/component/replicant_alloy/replication_plate,
-/turf/open/indestructible/reebe_void/spawning/lattices,
-/area/reebe)
-"aX" = (
-/obj/structure/table/reinforced/brass,
-/obj/item/clockwork/component/belligerent_eye,
-/turf/open/indestructible/clock_spawn_room,
-/area/reebe/city_of_cogs)
-"aY" = (
-/obj/effect/clockwork/servant_blocker{
- dir = 1
- },
-/obj/structure/lattice/clockwork,
-/turf/open/indestructible/reebe_void,
-/area/reebe)
-"aZ" = (
-/obj/structure/table/reinforced/brass,
-/obj/item/clockwork/component/belligerent_eye/blind_eye,
-/turf/open/indestructible/clock_spawn_room,
-/area/reebe/city_of_cogs)
-"ba" = (
-/obj/structure/table/reinforced/brass,
-/obj/item/clockwork/component/belligerent_eye/lens_gem,
-/turf/open/indestructible/clock_spawn_room,
-/area/reebe/city_of_cogs)
-"bb" = (
-/obj/structure/table/reinforced/brass,
-/obj/item/clockwork/component/geis_capacitor,
-/turf/open/indestructible/clock_spawn_room,
-/area/reebe/city_of_cogs)
-"bc" = (
-/obj/structure/table/reinforced/brass,
-/obj/item/clockwork/component/geis_capacitor/antennae,
-/turf/open/indestructible/clock_spawn_room,
-/area/reebe/city_of_cogs)
-"bd" = (
-/obj/structure/table/reinforced/brass,
-/obj/item/clockwork/component/geis_capacitor/fallen_armor,
-/turf/open/indestructible/clock_spawn_room,
-/area/reebe/city_of_cogs)
-"be" = (
-/obj/structure/table/reinforced/brass,
-/obj/item/clockwork/component/hierophant_ansible,
-/turf/open/indestructible/clock_spawn_room,
-/area/reebe/city_of_cogs)
-"bf" = (
-/obj/structure/table/reinforced/brass,
/obj/item/clockwork/component/hierophant_ansible/obelisk,
-/turf/open/indestructible/clock_spawn_room,
-/area/reebe/city_of_cogs)
-"bg" = (
-/obj/structure/table/reinforced/brass,
-/obj/item/clockwork/component/replicant_alloy,
-/turf/open/indestructible/clock_spawn_room,
-/area/reebe/city_of_cogs)
-"bh" = (
-/obj/structure/lattice/catwalk/clockwork,
-/obj/item/clockwork/integration_cog,
-/turf/open/indestructible/reebe_void,
-/area/reebe)
-"bi" = (
-/obj/structure/lattice/catwalk/clockwork,
-/obj/item/clockwork/component/vanguard_cogwheel/onyx_prism,
-/turf/open/indestructible/reebe_void,
-/area/reebe)
-"bj" = (
-/obj/structure/destructible/clockwork/eminence_spire,
/turf/open/floor/clockwork/reebe,
-/area/reebe/city_of_cogs)
-"bk" = (
-/obj/structure/table/reinforced/brass,
-/obj/item/clockwork/component/replicant_alloy/replication_plate,
-/turf/open/indestructible/clock_spawn_room,
-/area/reebe/city_of_cogs)
-"bl" = (
-/obj/structure/table/reinforced/brass,
-/obj/item/clockwork/component/replicant_alloy/smashed_anima_fragment,
-/turf/open/indestructible/clock_spawn_room,
-/area/reebe/city_of_cogs)
-"bm" = (
-/obj/structure/table/reinforced/brass,
-/obj/item/clockwork/component/vanguard_cogwheel,
-/turf/open/indestructible/clock_spawn_room,
-/area/reebe/city_of_cogs)
-"bn" = (
-/obj/structure/table/reinforced/brass,
-/obj/item/clockwork/component/vanguard_cogwheel/onyx_prism,
-/turf/open/indestructible/clock_spawn_room,
-/area/reebe/city_of_cogs)
-"bo" = (
-/obj/structure/window/reinforced/clockwork/fulltile,
-/obj/structure/grille/ratvar,
-/turf/open/indestructible/clock_spawn_room,
-/area/reebe/city_of_cogs)
-"bp" = (
-/obj/structure/window/reinforced/clockwork/fulltile,
-/turf/open/indestructible/clock_spawn_room,
-/area/reebe/city_of_cogs)
+/area/reebe)
+"aT" = (
+/obj/item/clockwork/component/geis_capacitor/antennae,
+/turf/open/floor/clockwork/reebe,
+/area/reebe)
"bt" = (
/obj/structure/table/bronze,
/turf/open/floor/clockwork/reebe,
/area/reebe/city_of_cogs)
-"bu" = (
-/obj/structure/table/reinforced/brass,
-/turf/open/indestructible/clock_spawn_room,
-/area/reebe/city_of_cogs)
-"bw" = (
-/obj/structure/chair/brass{
- dir = 8
- },
-/turf/open/indestructible/clock_spawn_room,
-/area/reebe/city_of_cogs)
-"bx" = (
-/obj/structure/chair/brass{
- dir = 4
- },
-/turf/open/indestructible/clock_spawn_room,
+"bC" = (
+/obj/structure/table/bronze,
+/obj/item/storage/belt/utility/servant,
+/turf/open/floor/clockwork/reebe,
/area/reebe/city_of_cogs)
"bE" = (
/obj/structure/table/reinforced/brass,
@@ -348,53 +160,114 @@
/obj/item/healthanalyzer/advanced,
/turf/open/floor/clockwork/reebe,
/area/reebe/city_of_cogs)
-"eV" = (
-/obj/structure/chair/stool/bar/brass,
-/turf/open/indestructible/clock_spawn_room,
+"dl" = (
+/turf/open/floor/clockwork/reebe,
+/area/reebe)
+"dx" = (
+/obj/structure/destructible/clockwork/powered/clockwork_obelisk,
+/obj/effect/clockwork/sigil/transmission,
+/turf/open/floor/clockwork/reebe,
/area/reebe/city_of_cogs)
-"nj" = (
-/obj/structure/table/bronze,
-/turf/open/indestructible/clock_spawn_room,
+"ew" = (
+/obj/structure/table/reinforced/brass,
+/obj/item/clockwork/construct_chassis/cogscarab{
+ pixel_y = 20
+ },
+/obj/item/clockwork/construct_chassis/cogscarab{
+ pixel_x = -7;
+ pixel_y = 6
+ },
+/obj/item/clockwork/construct_chassis/cogscarab{
+ pixel_x = 7;
+ pixel_y = 6
+ },
+/turf/open/floor/clockwork/reebe,
/area/reebe/city_of_cogs)
-"ww" = (
-/obj/structure/table/bronze,
-/obj/item/camera_film,
-/turf/open/indestructible/clock_spawn_room,
-/area/reebe/city_of_cogs)
-"xH" = (
-/obj/structure/chair/stool/brass,
-/turf/open/indestructible/clock_spawn_room,
-/area/reebe/city_of_cogs)
-"ym" = (
-/obj/structure/table/bronze,
+"hY" = (
+/obj/item/clockwork/alloy_shards/pinion_lock,
+/turf/open/floor/clockwork/reebe,
+/area/reebe)
+"nX" = (
+/obj/item/clockwork/alloy_shards/clockgolem_remains,
+/obj/item/clockwork/weapon/ratvarian_spear,
+/obj/item/clockwork/alloy_shards/pinion_lock,
+/turf/open/floor/clockwork/reebe,
+/area/reebe)
+"om" = (
+/obj/item/clockwork/component/replicant_alloy/smashed_anima_fragment,
+/obj/item/clockwork/component/geis_capacitor/fallen_armor,
+/turf/open/floor/clockwork/reebe,
+/area/reebe)
+"sW" = (
+/obj/structure/table/reinforced/brass,
+/obj/item/storage/belt/utility/servant,
+/obj/item/storage/belt/utility/servant,
+/obj/item/storage/belt/utility/servant,
+/obj/item/storage/belt/utility/servant,
/obj/item/storage/belt/utility/servant,
/obj/item/storage/belt/utility/servant,
/turf/open/floor/clockwork/reebe,
/area/reebe/city_of_cogs)
+"vx" = (
+/obj/effect/clockwork/sigil/transmission,
+/turf/open/floor/clockwork/reebe,
+/area/reebe/city_of_cogs)
+"wV" = (
+/obj/item/clockwork/alloy_shards/large,
+/turf/open/indestructible/reebe_void/spawning/lattices,
+/area/reebe)
+"xR" = (
+/obj/item/clockwork/alloy_shards/medium,
+/turf/open/indestructible/reebe_void/spawning/lattices,
+/area/reebe)
+"yY" = (
+/obj/item/clockwork/alloy_shards/small,
+/turf/open/floor/clockwork/reebe,
+/area/reebe)
"zb" = (
/turf/open/space/basic,
/area/space)
-"EE" = (
-/obj/structure/table/bronze,
-/obj/item/camera,
-/turf/open/indestructible/clock_spawn_room,
+"Fd" = (
+/obj/item/clockwork/alloy_shards/clockgolem_remains,
+/turf/open/floor/clockwork/reebe,
+/area/reebe)
+"Fj" = (
+/obj/machinery/sleeper/syndie/fullupgrade{
+ desc = "A large cryogenics unit built from brass. Its surface is pleasantly cool the touch.";
+ enter_message = "You hear the gentle hum and click of machinery, and are lulled into a sense of peace.";
+ icon_state = "sleeper_clockwork";
+ name = "soothing sleeper"
+ },
+/turf/open/floor/clockwork/reebe,
/area/reebe/city_of_cogs)
-"NH" = (
-/obj/structure/table/bronze,
-/obj/item/taperecorder,
-/turf/open/indestructible/clock_spawn_room,
-/area/reebe/city_of_cogs)
-"VP" = (
+"Ia" = (
+/obj/item/clockwork/alloy_shards/small,
+/turf/open/indestructible/reebe_void/spawning/lattices,
+/area/reebe)
+"OB" = (
+/obj/item/clockwork/component/geis_capacitor/fallen_armor,
+/turf/open/floor/clockwork/reebe,
+/area/reebe)
+"Rw" = (
/obj/structure/table/reinforced/brass,
-/obj/item/clockwork/slab,
-/obj/item/clockwork/slab,
-/obj/item/clockwork/slab,
-/obj/item/clockwork/slab,
-/obj/item/clockwork/slab,
-/obj/item/clockwork/slab,
-/obj/item/clockwork/slab,
-/obj/item/clockwork/slab,
-/obj/item/clockwork/slab,
+/obj/item/clockwork/replica_fabricator,
+/obj/item/clockwork/replica_fabricator,
+/turf/open/floor/clockwork/reebe,
+/area/reebe/city_of_cogs)
+"Sr" = (
+/obj/item/clockwork/component/replicant_alloy/smashed_anima_fragment,
+/turf/open/floor/clockwork/reebe,
+/area/reebe)
+"TH" = (
+/obj/structure/lattice/catwalk/clockwork,
+/turf/open/indestructible/reebe_void/spawning/lattices,
+/area/reebe/city_of_cogs)
+"Wv" = (
+/obj/item/clockwork/component/belligerent_eye/blind_eye,
+/turf/open/floor/clockwork/reebe,
+/area/reebe)
+"WA" = (
+/obj/effect/clockwork/sigil/vitality,
/turf/open/floor/clockwork/reebe,
/area/reebe/city_of_cogs)
"WT" = (
@@ -24671,7 +24544,7 @@ aa
aa
aa
aa
-ab
+aa
aa
aa
aa
@@ -24908,58 +24781,58 @@ 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
-aF
-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
+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
@@ -25155,76 +25028,76 @@ 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
-aF
-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
+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
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -25411,78 +25284,78 @@ 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
-aF
-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
+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
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -25668,79 +25541,79 @@ 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
-ae
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-aF
-ab
-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
+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
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -25925,80 +25798,80 @@ 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
-ac
-ae
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-aF
-ab
-ab
-ab
-ab
-ab
-ab
-aW
-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
+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
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -26182,81 +26055,81 @@ aa
aa
aa
aa
-ab
-ab
-ab
-ae
-af
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ae
-ab
-aP
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-aF
-ab
-ab
-ab
-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
+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
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -26439,82 +26312,82 @@ aa
aa
aa
aa
-ab
-ab
-ab
-ab
-ac
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-aF
-ab
-ab
-ab
-ab
-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
+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
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -26696,83 +26569,83 @@ 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
-aF
-ab
-ab
-ab
-ab
-ab
-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
+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
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -26953,84 +26826,84 @@ aa
aa
aa
aa
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ae
-ae
-ae
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-aF
-aF
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-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
+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
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -27210,85 +27083,85 @@ aa
aa
aa
aa
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ae
-ag
-ag
-ag
-ae
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aG
-aY
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ah
-ah
-bo
-bo
-bo
-bo
-bo
-bo
-bo
-ah
-ah
-ae
-ae
-ae
-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
+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
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -27467,85 +27340,85 @@ aa
aa
aa
aa
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ae
-ag
-ag
-ag
-ae
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aG
-aS
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-nj
-nj
-ah
-ah
-ah
-ae
-ae
-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
+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
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -27724,6 +27597,31 @@ 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
ab
@@ -27733,76 +27631,51 @@ ab
ab
ab
ab
-ab
-ab
-ab
-ah
-ah
-ai
-ah
-ah
-aG
-aG
-aG
-aG
-aG
-aG
-aG
-aG
-aG
-aG
-aG
-aG
-aG
-aG
-aG
-aG
-aG
-aG
-aG
-aG
-aG
-aG
-aG
-aG
-aG
-aG
-aG
-aG
-aG
-aj
-aS
-bu
-bu
-bu
-bu
-bu
-bu
-bu
-bu
-bu
-bu
-bu
-bu
-aU
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-xH
-EE
-bo
-aX
-bo
-ag
+ae
+ae
ae
ab
ab
ab
ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aF
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -27974,6 +27847,38 @@ 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
ab
ab
ab
@@ -27982,84 +27887,52 @@ ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ah
-ar
-aj
-bt
-ah
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aS
-bw
-bw
-bw
-bw
-bw
-bw
-bw
-bw
-bw
-bw
-bw
-bw
-aU
-aT
-aT
-aR
-aT
-aR
-aT
-aR
-eV
-NH
-bo
-aZ
-bo
+ae
+ag
+ag
ag
ae
ab
ab
ab
ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -28231,6 +28104,38 @@ 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
ab
ab
ab
@@ -28239,84 +28144,52 @@ ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ah
-as
-aj
-aj
-ay
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aS
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-bo
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-xH
-nj
-bo
-ba
-bo
+ae
+ag
+ag
ag
ae
-bi
-ab
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+aF
ab
ab
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -28488,17 +28361,38 @@ aa
aa
aa
aa
-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
+aa
+aa
+aa
+aa
+aa
ab
ab
ab
@@ -28508,72 +28402,51 @@ ab
ab
ab
ah
-VP
-aj
-ym
ah
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aS
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aV
-aT
-aT
-aR
-aT
-aR
-aT
-aR
-eV
-nj
-bo
-bb
-bo
-ag
-ae
+ai
+ah
+ah
+aG
+aG
+aG
+aG
+aG
+aG
+aG
+aF
ab
-ae
-ac
ab
+ab
+ab
+ab
+ab
+aa
+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
@@ -28745,17 +28618,38 @@ aa
aa
aa
aa
-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
+aa
+aa
+aa
+aa
+aa
ab
ab
ab
@@ -28765,9 +28659,9 @@ ab
ab
ab
ah
-ah
-ay
-ah
+ar
+aj
+bt
ah
aj
aj
@@ -28775,62 +28669,41 @@ aj
aj
aj
aj
+TH
aj
aj
aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aS
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-bo
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-xH
-ww
-bo
-bc
-bo
-ag
-ae
+aa
+dl
+ab
+aa
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
@@ -29002,6 +28875,38 @@ 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
ab
ab
ab
@@ -29010,84 +28915,52 @@ ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-an
-au
-aj
-au
ah
+as
+aj
+aj
+ay
aj
aj
aj
aj
aj
aj
+TH
aj
aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aS
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aU
-aT
-aT
-aR
-aT
-aR
-aT
-aR
-eV
-nj
-bo
-bd
-bo
-ag
-ae
+aa
+dl
+aa
+aa
+ab
+dl
+ab
+dl
+dl
+dl
+ab
+ab
+dl
ab
ab
ab
ab
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -29259,16 +29132,38 @@ aa
aa
aa
aa
-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
+aa
+aa
+aa
+aa
+aa
ab
ab
ab
@@ -29278,10 +29173,9 @@ ab
ab
ab
ah
-ah
-av
+aL
aj
-av
+bC
ah
aj
aj
@@ -29289,62 +29183,41 @@ aj
aj
aj
aj
+TH
+ab
aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aS
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aU
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-xH
-nj
-bo
-be
-bo
-ag
-ae
+aa
+dl
+aa
+Wv
+ab
+Fd
+yY
+yY
+dl
+dl
+dl
ab
ab
ab
ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -29516,6 +29389,38 @@ 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
ab
ab
ab
@@ -29524,84 +29429,52 @@ ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ae
-ai
-ao
-aj
-aj
-aj
-aD
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aS
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-bp
-bp
-ah
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-EE
-nj
ah
ah
+ay
ah
-ae
-ae
+ah
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aa
+dl
+ab
+aa
+Fd
+ab
+hY
+Sr
+dl
+ab
+ab
+dl
ab
ab
ab
ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -29773,6 +29646,38 @@ 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
ab
ab
ab
@@ -29781,23 +29686,11 @@ ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ae
+an
+au
+aj
+au
ah
-ah
-aw
-aj
-aw
-ai
-aH
aj
aj
aj
@@ -29806,59 +29699,39 @@ aj
aj
aj
aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aS
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-bp
-bg
-ah
-ah
-bo
-bo
-bo
-bo
-bo
-bo
-bo
-ah
-ah
-ae
-ae
-ae
+aa
+dl
+aa
+ab
+ab
+OB
+ab
+yY
+dl
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
@@ -30030,6 +29903,38 @@ 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
ab
ab
ab
@@ -30037,85 +29942,53 @@ ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ae
-ae
-ag
-ag
-an
-au
-aj
-au
-ai
-aI
-aK
-aH
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aS
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-bp
-bp
-ah
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-ww
-nj
ah
ah
+av
+aj
+av
ah
-ae
-ae
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aa
+dl
+dl
+aa
+aa
+om
+Fd
ab
ab
ab
ab
+dl
+dl
+dl
+dl
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -30287,92 +30160,92 @@ 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
ab
ab
ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ah
-ah
-ah
-ai
-ah
-ah
-ah
-ai
-ap
-ai
-ah
-aJ
-aH
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aS
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aU
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-xH
-nj
-bo
-bf
-bo
-ag
ae
+ai
+ao
+aj
+aj
+aj
+aD
+aj
+aj
+aj
+aj
+aj
+aj
+TH
+aa
+aa
+aa
+aT
+Wv
ab
ab
ab
ab
+ab
+ab
+ab
+dl
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -30544,92 +30417,92 @@ 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
ab
ab
ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ac
-ah
-aj
-aj
-aj
-aj
-aj
-ai
-aj
-aj
-aj
-ai
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aS
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aU
-aT
-aT
-aR
-aT
-aR
-aT
-aR
-eV
-nj
-bo
-bg
-bo
-ag
ae
+ah
+ah
+aw
+aj
+aw
+ai
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aa
+ab
+ab
+ab
+Ia
+ab
+yY
+ab
+ab
+dl
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
@@ -30801,92 +30674,92 @@ 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
+aa
+aa
+aa
+aa
ab
ab
ab
ab
ae
-ah
-aj
-aj
-aj
-aj
-aj
-ai
-aj
-az
-aj
-ai
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aS
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-ai
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-xH
-EE
-bo
-bk
-bo
+ae
ag
-ae
+ag
+an
+au
+aj
+au
+ai
+aL
+aK
+aj
+aj
+aj
+aj
+aj
+ab
+ab
+aa
+Fd
+ab
+Ia
+ab
+ab
+ab
+Wv
ab
ab
ab
ab
+dl
+ab
+dl
+ab
+dl
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -31058,30 +30931,52 @@ 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
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ae
-ag
+ah
+ah
+ah
+ai
+ah
+ah
+ah
ai
-aj
-aj
-ak
-aj
-aj
-ap
-aj
-aj
-aj
ap
+ai
+ah
+aJ
aj
aj
aj
@@ -31090,60 +30985,38 @@ aj
aj
aj
aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aS
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aV
-aT
-aT
-aR
-aT
-aR
-aT
-aR
-eV
-nj
-bo
-bl
-bo
-ag
-ae
+aa
+ab
+ab
+ab
+Ia
ab
ab
ab
ab
+ab
+ab
+ab
+dl
+ab
+dl
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -31317,17 +31190,38 @@ 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
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ae
+ac
ah
aj
aj
@@ -31336,7 +31230,7 @@ aj
aj
ai
aj
-bj
+aj
aj
ai
aj
@@ -31345,62 +31239,41 @@ aj
aj
aj
aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aS
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-ai
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-xH
-nj
-bo
-bm
-bo
-ag
-ae
+TH
+aa
+aa
+ab
+ab
+Sr
+ab
+ab
+Ia
+ab
+ab
+dl
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
@@ -31574,15 +31447,36 @@ aa
aa
aa
aa
-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
+aa
+aa
+aa
ab
ae
ah
@@ -31598,66 +31492,45 @@ aj
ai
aj
aj
-aH
-aH
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
aj
aj
aj
aj
aj
aj
+aa
aS
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aU
-aT
-aT
-aR
-aT
-aR
-aT
-aR
-eV
-nj
-bo
-bn
-bo
-ag
-ae
+ab
+aa
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
@@ -31831,90 +31704,90 @@ aa
aa
aa
aa
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ah
-ah
-ah
-ai
-ah
-ah
-ah
-ai
-ap
-ai
-ah
-aj
-aH
-aL
-aN
-aH
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aS
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aU
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-xH
-nj
-bo
-aX
-bo
-ag
+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
ae
+ag
+ai
+aj
+aj
+dx
+aj
+aj
+ap
+aj
+aj
+aj
+ap
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+ab
+aa
+ab
+aa
+xR
+nX
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
@@ -32088,33 +31961,49 @@ aa
aa
aa
aa
-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
+aa
+aa
+aa
ab
ae
-ae
-ag
ah
-aq
-ax
+aj
+aj
+aj
aj
aj
ai
aj
-aH
-aM
-aL
-aH
+aj
+aj
+ai
aj
aj
aj
@@ -32124,54 +32013,38 @@ aj
aj
aj
aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aS
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-bp
-bp
-ah
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-NH
-EE
-ah
-ah
-ah
-ae
-ae
+aa
+ab
+aa
+ab
+ab
+ab
+wV
ab
ab
ab
ab
+ab
+ab
+dl
+dl
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -32345,32 +32218,49 @@ aa
aa
aa
aa
-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
+aa
+aa
+aa
ab
ae
-ai
-aq
-ax
+ah
+aj
+aj
+aj
aj
aj
ai
aj
aj
-aH
-aH
+aj
+ai
aj
aj
aj
@@ -32378,50 +32268,11 @@ aj
aj
aj
aj
+ab
aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aS
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-bp
-bk
-ah
-ah
-bo
-bo
-bo
-bo
-bo
-bo
-bo
-ah
-ah
-ae
+ab
+aa
+xR
ab
ab
ab
@@ -32429,6 +32280,28 @@ ab
ab
ab
ab
+ab
+ab
+dl
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -32602,90 +32475,90 @@ 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
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ae
+ah
+ah
+ah
ai
-aq
-ax
-aj
-aj
-aE
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aS
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-bp
-bp
-ah
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-nj
-nj
ah
ah
ah
-ae
-ae
+ai
+ap
+ai
+ah
+aj
+aj
+aL
+aN
+aj
+aj
+aj
+ab
+aa
+dl
+aa
+ab
+OB
ab
ab
ab
ab
+ab
+dl
+ab
+dl
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -32859,90 +32732,90 @@ 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
ab
ab
-ab
-ad
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ai
-aq
-ax
-aj
-aB
-ah
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aS
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aU
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-xH
-EE
-bo
-aZ
-bo
-ag
ae
+ae
+ag
+ah
+ew
+aj
+aj
+aj
+ai
+aj
+aj
+aM
+aL
+aj
+aj
+aj
+aa
+aa
+aa
ab
ab
ab
ab
+ab
+ab
+ab
+ab
+dl
+ab
+ab
+dl
+ab
+dl
+ab
+ab
+ab
+dl
+dl
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -33116,90 +32989,90 @@ 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
ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ah
-aq
-ax
-aj
-aB
-ah
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aS
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aU
-aT
-aT
-aR
-aT
-aR
-aT
-aR
-eV
-nj
-bo
-ba
-bo
-ag
ae
+ai
+aj
+aj
+aj
+aj
+ai
+aj
+aj
+aj
+aj
+aj
+aj
+TH
+aa
+dl
+hY
ab
ab
ab
ab
+ab
+ab
+ab
+ab
+dl
+ab
+ab
+ab
+ab
+dl
+ab
+dl
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -33373,90 +33246,90 @@ 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
ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ah
-ah
-ah
-ah
-aA
-ah
-ah
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aS
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-bo
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-xH
-NH
-bo
-bb
-bo
-ag
ae
+ai
+az
+vx
+aj
+aj
+aE
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aa
+aa
+ab
+ab
+ab
+aT
+Wv
+ab
+ab
+ab
+dl
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
@@ -33630,6 +33503,36 @@ 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
ab
@@ -33637,20 +33540,11 @@ ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ah
-al
+ai
aj
aj
aj
-aC
+sW
ah
aj
aj
@@ -33661,59 +33555,38 @@ aj
aj
aj
aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aS
+aa
aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aV
-aT
-aT
-aR
-aT
-aR
-aT
-aR
-eV
-nj
-bo
-bc
-bo
-ag
-ae
ab
ab
ab
ab
+ab
+dl
+ab
+ab
+dl
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -33887,6 +33760,68 @@ 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
+ab
+ab
+ab
+ab
+ab
+ah
+aj
+aj
+aj
+Rw
+ah
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+ab
+ab
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+dl
ab
ab
ab
@@ -33897,80 +33832,18 @@ ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ai
-bE
-aj
-aj
-aj
-aj
-aA
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aS
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-bo
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-xH
-ww
-bo
-bd
-bo
-ag
-ae
-ab
-ab
-ab
-ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -34144,15 +34017,36 @@ aa
aa
aa
aa
-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
+aa
+aa
+aa
ab
ab
ab
@@ -34160,11 +34054,11 @@ ab
ab
ab
ah
-al
-aj
-aj
-aj
-aC
+ah
+ah
+ah
+aA
+ah
ah
aj
aj
@@ -34175,59 +34069,38 @@ aj
aj
aj
aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aG
-aS
-bx
-bx
-bx
-bx
-bx
-bx
-bx
-bx
-bx
-bx
-bx
-bx
-aU
-aT
-aT
-aR
-aT
-aR
-aT
-aR
-eV
-EE
-bo
-be
-bo
-ag
-ae
+aa
+hY
+ab
+ab
+dl
+ab
+dl
ab
ab
ab
ab
+ab
+dl
+ab
+ab
+dl
+dl
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -34401,15 +34274,36 @@ aa
aa
aa
aa
-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
+aa
+aa
+aa
ab
ab
ab
@@ -34417,74 +34311,53 @@ ab
ab
ab
ah
+Fj
+aj
+aj
+aj
+WA
ah
-ah
-ai
-ah
-ah
-ah
-aG
-aG
-aG
-aG
-aG
-aG
-aG
-aG
-aG
-aG
-aG
-aG
-aG
-aG
-aG
-aG
-aG
-aG
-aG
-aG
-aG
-aG
-aG
-aG
-aG
-aG
-aG
-aG
-aG
-aG
-aS
-bu
-bu
-bu
-bu
-bu
-bu
-bu
-bu
-bu
-bu
-bu
-bu
-aU
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-xH
-nj
-bo
-bf
-bo
-ag
-ae
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+ab
+ab
+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
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -34658,6 +34531,62 @@ 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
+ab
+ab
+ab
+ab
+ai
+bE
+aj
+aj
+aj
+aj
+aA
+aj
+aj
+aj
+aj
+aj
+aj
+TH
+aj
+aj
+aj
+ab
+aa
+Fd
ab
ab
ab
@@ -34669,79 +34598,23 @@ ab
ab
ab
ab
+dl
ab
ab
+dl
ab
-ab
-ab
-ab
-ae
-ae
-ag
-ae
-ae
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-ab
-aS
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-aT
-aT
-aT
-aT
-aT
-aT
-aT
-nj
-nj
-ah
-ah
-ah
-ae
-ae
-ab
-ab
-ab
-ab
+dl
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -34915,11 +34788,61 @@ 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
ab
ab
ab
+ab
+ah
+Fj
+aj
+aj
+aj
+WA
+ah
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+ab
+ab
+ab
+dl
+ab
aa
ab
ab
@@ -34937,68 +34860,18 @@ ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-aY
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ah
-ah
-bo
-bo
-bo
-bo
-bo
-bo
-bo
-ah
-ah
-ae
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -35178,6 +35051,50 @@ 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
+ab
+ab
+ab
+ab
+ah
+ah
+ah
+ai
+ah
+ah
+ah
+aG
+aG
+aG
+aG
+aG
+aG
+aG
ab
ab
ab
@@ -35200,61 +35117,17 @@ ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-aF
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ab
-ab
-ab
-ab
-ab
-ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -35435,6 +35308,30 @@ 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
ab
@@ -35443,74 +35340,50 @@ ab
ab
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+ae
+ae
+ag
+ae
+ae
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+aF
aF
ab
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+aF
ab
-ab
-ab
-ab
-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
@@ -35692,6 +35565,30 @@ 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
ab
@@ -35735,38 +35632,14 @@ ab
ab
ab
ab
-ab
-ab
-ab
-aF
-ab
-ab
-ab
-ab
-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
@@ -35949,6 +35822,30 @@ 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
ab
@@ -35969,37 +35866,6 @@ ab
ab
ab
ab
-aO
-ac
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-aQ
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-aF
-ab
-ab
-ab
-ab
ab
ab
ab
@@ -36041,6 +35907,13 @@ aa
aa
aa
aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
WT
zb
zb
@@ -36206,10 +36079,30 @@ aa
aa
aa
aa
-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
ab
ab
ab
@@ -36253,32 +36146,12 @@ ab
ab
ab
aF
-ab
-ab
-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
@@ -36463,78 +36336,78 @@ 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
-aF
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ac
-bh
-ae
-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
+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
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -36720,77 +36593,77 @@ 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
-aF
-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
+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
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -36977,76 +36850,76 @@ 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
-aF
-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
+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
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -37244,58 +37117,58 @@ 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
aa
-aF
-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
+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
diff --git a/_maps/shuttles/arrival_delta.dmm b/_maps/shuttles/arrival_delta.dmm
index 62e30ef335..c7d331e368 100644
--- a/_maps/shuttles/arrival_delta.dmm
+++ b/_maps/shuttles/arrival_delta.dmm
@@ -203,7 +203,7 @@
/obj/machinery/status_display/evac{
pixel_x = -32
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/neutral{
@@ -226,7 +226,7 @@
/obj/machinery/status_display/ai{
pixel_x = 32
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/neutral,
@@ -277,7 +277,7 @@
/turf/closed/wall/mineral/titanium,
/area/shuttle/arrival)
"A" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/neutral{
@@ -307,12 +307,12 @@
"D" = (
/obj/structure/table/reinforced,
/obj/item/folder,
-/obj/item/storage/pill_bottle/dice,
+/obj/item/storage/box/dice,
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
/area/shuttle/arrival)
"E" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/neutral,
diff --git a/_maps/shuttles/arrival_omega.dmm b/_maps/shuttles/arrival_omega.dmm
index f580149163..9285a4a716 100644
--- a/_maps/shuttles/arrival_omega.dmm
+++ b/_maps/shuttles/arrival_omega.dmm
@@ -138,7 +138,7 @@
/turf/open/floor/plasteel,
/area/shuttle/arrival)
"o" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
@@ -237,7 +237,7 @@
/area/shuttle/arrival)
"C" = (
/obj/structure/table/reinforced,
-/obj/item/storage/pill_bottle/dice{
+/obj/item/storage/box/dice{
pixel_x = -2;
pixel_y = 8
},
diff --git a/_maps/shuttles/emergency_bar.dmm b/_maps/shuttles/emergency_bar.dmm
index 7bc7de9bf1..55fd4bd56a 100644
--- a/_maps/shuttles/emergency_bar.dmm
+++ b/_maps/shuttles/emergency_bar.dmm
@@ -175,7 +175,7 @@
pixel_x = 6;
pixel_y = 24
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21";
pixel_x = -3;
pixel_y = 3
@@ -385,7 +385,7 @@
/turf/open/floor/plasteel,
/area/shuttle/escape)
"bc" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21";
pixel_x = -3;
pixel_y = 3
@@ -424,7 +424,7 @@
/turf/open/floor/plasteel,
/area/shuttle/escape)
"bg" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-10"
},
/obj/effect/turf_decal/tile/bar,
@@ -557,7 +557,7 @@
/turf/open/floor/plating/airless,
/area/shuttle/escape)
"bG" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21";
pixel_x = -3;
pixel_y = 3
diff --git a/_maps/shuttles/emergency_birdboat.dmm b/_maps/shuttles/emergency_birdboat.dmm
index 43a6a85bf7..dcffda7ba2 100644
--- a/_maps/shuttles/emergency_birdboat.dmm
+++ b/_maps/shuttles/emergency_birdboat.dmm
@@ -47,7 +47,7 @@
/turf/open/floor/mineral/titanium/blue,
/area/shuttle/escape)
"k" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/turf/open/floor/mineral/titanium/blue,
@@ -144,7 +144,7 @@
/turf/open/floor/mineral/titanium/white,
/area/shuttle/escape)
"B" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/turf/open/floor/mineral/titanium,
diff --git a/_maps/shuttles/emergency_cere.dmm b/_maps/shuttles/emergency_cere.dmm
index f49e70aeb9..9608f7f28a 100644
--- a/_maps/shuttles/emergency_cere.dmm
+++ b/_maps/shuttles/emergency_cere.dmm
@@ -420,7 +420,7 @@
/turf/open/floor/plasteel/dark,
/area/shuttle/escape)
"aM" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/item/radio/intercom{
@@ -446,7 +446,7 @@
/turf/open/floor/plasteel/dark,
/area/shuttle/escape)
"aP" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/item/radio/intercom{
@@ -968,7 +968,7 @@
/turf/open/floor/plasteel,
/area/shuttle/escape)
"ca" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/turf/open/floor/plasteel,
@@ -994,7 +994,7 @@
/obj/machinery/light{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/turf/open/floor/plasteel,
diff --git a/_maps/shuttles/emergency_delta.dmm b/_maps/shuttles/emergency_delta.dmm
index 564115443d..b4b22b2ff6 100644
--- a/_maps/shuttles/emergency_delta.dmm
+++ b/_maps/shuttles/emergency_delta.dmm
@@ -167,7 +167,7 @@
/turf/open/floor/plasteel/white,
/area/shuttle/escape)
"an" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21";
pixel_x = -3;
pixel_y = 3
@@ -196,7 +196,7 @@
/turf/open/floor/plasteel,
/area/shuttle/escape)
"ap" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21";
pixel_x = -3;
pixel_y = 3
@@ -800,7 +800,7 @@
/turf/open/floor/mineral/plastitanium/red/brig,
/area/shuttle/escape)
"bz" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/machinery/button/flasher{
@@ -814,7 +814,7 @@
/turf/open/floor/plasteel,
/area/shuttle/escape)
"bA" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/neutral{
@@ -1018,7 +1018,7 @@
/turf/open/floor/plasteel/dark,
/area/shuttle/escape)
"cb" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21";
pixel_x = -3;
pixel_y = 3
@@ -1338,7 +1338,7 @@
/turf/open/floor/plasteel,
/area/shuttle/escape)
"cA" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21";
pixel_x = -3;
pixel_y = 3
diff --git a/_maps/shuttles/emergency_imfedupwiththisworld.dmm b/_maps/shuttles/emergency_imfedupwiththisworld.dmm
index 349918ef29..ca2e6059ec 100644
--- a/_maps/shuttles/emergency_imfedupwiththisworld.dmm
+++ b/_maps/shuttles/emergency_imfedupwiththisworld.dmm
@@ -155,7 +155,7 @@
/turf/open/floor/carpet,
/area/shuttle/escape)
"y" = (
-/obj/item/twohanded/required/kirbyplants,
+/obj/item/kirbyplants,
/turf/open/floor/wood,
/area/shuttle/escape)
"z" = (
diff --git a/_maps/shuttles/emergency_luxury.dmm b/_maps/shuttles/emergency_luxury.dmm
index a7faface75..8a16763007 100644
--- a/_maps/shuttles/emergency_luxury.dmm
+++ b/_maps/shuttles/emergency_luxury.dmm
@@ -305,7 +305,7 @@
/turf/open/floor/carpet/royalblue,
/area/shuttle/escape/luxury)
"bg" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-10"
},
/turf/open/floor/carpet/red,
@@ -320,7 +320,7 @@
/turf/open/floor/carpet/royalblue,
/area/shuttle/escape/luxury)
"bj" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21";
pixel_x = -3;
pixel_y = 3
@@ -328,13 +328,13 @@
/turf/open/floor/wood,
/area/shuttle/escape/luxury)
"bk" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-10"
},
/turf/open/floor/carpet/royalblue,
/area/shuttle/escape/luxury)
"bl" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21";
pixel_x = -3;
pixel_y = 3
@@ -437,7 +437,7 @@
dir = 4;
light_range = 8
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-10"
},
/turf/open/floor/carpet/red,
diff --git a/_maps/shuttles/emergency_omega.dmm b/_maps/shuttles/emergency_omega.dmm
index bd99f35bb5..83b9c28305 100644
--- a/_maps/shuttles/emergency_omega.dmm
+++ b/_maps/shuttles/emergency_omega.dmm
@@ -194,7 +194,7 @@
/turf/open/floor/mineral/plastitanium/red/brig,
/area/shuttle/escape)
"as" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21";
pixel_x = -3;
pixel_y = 3
@@ -317,7 +317,7 @@
/turf/open/floor/plasteel,
/area/shuttle/escape)
"aC" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21";
pixel_x = -3;
pixel_y = 3
@@ -530,7 +530,7 @@
/turf/open/floor/plasteel,
/area/shuttle/escape)
"aS" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21";
pixel_x = -3;
pixel_y = 3
diff --git a/_maps/shuttles/emergency_pubby.dmm b/_maps/shuttles/emergency_pubby.dmm
index 0eea5ab1c8..7c43bef2ce 100644
--- a/_maps/shuttles/emergency_pubby.dmm
+++ b/_maps/shuttles/emergency_pubby.dmm
@@ -110,7 +110,7 @@
/obj/machinery/computer/security/telescreen/entertainment{
pixel_y = 32
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21";
pixel_x = -3;
pixel_y = 3
@@ -183,7 +183,7 @@
/area/shuttle/escape)
"aB" = (
/obj/structure/window/reinforced,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-11"
},
/obj/effect/turf_decal/tile/green,
@@ -589,7 +589,7 @@
/turf/open/floor/mineral/titanium/blue,
/area/shuttle/escape)
"bu" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/turf/open/floor/mineral/plastitanium/red/brig,
diff --git a/_maps/shuttles/emergency_raven.dmm b/_maps/shuttles/emergency_raven.dmm
index 05446968e7..daba49a238 100644
--- a/_maps/shuttles/emergency_raven.dmm
+++ b/_maps/shuttles/emergency_raven.dmm
@@ -1014,7 +1014,7 @@
/turf/open/floor/plasteel/dark,
/area/shuttle/escape)
"bV" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/effect/turf_decal/tile/green{
@@ -1029,7 +1029,7 @@
/turf/open/floor/plasteel/dark,
/area/shuttle/escape)
"bW" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/effect/turf_decal/tile/green{
@@ -1094,7 +1094,7 @@
/turf/open/floor/plasteel/dark,
/area/shuttle/escape)
"cd" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/effect/turf_decal/tile/green{
@@ -1107,7 +1107,7 @@
/turf/open/floor/plasteel/dark,
/area/shuttle/escape)
"ce" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/effect/turf_decal/tile/green,
diff --git a/_maps/shuttles/emergency_scrapheap.dmm b/_maps/shuttles/emergency_scrapheap.dmm
index 4bd8f07c8e..cc51c2b8f8 100644
--- a/_maps/shuttles/emergency_scrapheap.dmm
+++ b/_maps/shuttles/emergency_scrapheap.dmm
@@ -194,7 +194,7 @@
/turf/open/floor/mineral/plastitanium/red/brig,
/area/shuttle/escape)
"aF" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/mineral/titanium/blue,
/area/shuttle/escape)
"aG" = (
diff --git a/_maps/shuttles/emergency_syndicate.dmm b/_maps/shuttles/emergency_syndicate.dmm
index 85048b9d89..3c2c3cb19b 100644
--- a/_maps/shuttles/emergency_syndicate.dmm
+++ b/_maps/shuttles/emergency_syndicate.dmm
@@ -1351,7 +1351,7 @@
dir = 1
},
/obj/effect/turf_decal/tile/neutral,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/turf/open/floor/plasteel/dark,
@@ -1842,7 +1842,7 @@
dir = 1
},
/obj/effect/turf_decal/tile/neutral,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/turf/open/floor/plasteel/dark,
diff --git a/_maps/shuttles/ferry_lighthouse.dmm b/_maps/shuttles/ferry_lighthouse.dmm
index a12e8858cb..1b4e685bd0 100644
--- a/_maps/shuttles/ferry_lighthouse.dmm
+++ b/_maps/shuttles/ferry_lighthouse.dmm
@@ -236,7 +236,7 @@
/turf/open/floor/wood,
/area/shuttle/transport)
"bd" = (
-/obj/item/twohanded/required/kirbyplants/dead{
+/obj/item/kirbyplants/dead{
desc = "It doesn't look very healthy...";
name = "potted plant"
},
diff --git a/_maps/shuttles/hunter_bounty.dmm b/_maps/shuttles/hunter_bounty.dmm
new file mode 100644
index 0000000000..034747f85d
--- /dev/null
+++ b/_maps/shuttles/hunter_bounty.dmm
@@ -0,0 +1,490 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/template_noop,
+/area/template_noop)
+"b" = (
+/turf/closed/wall/mineral/plastitanium,
+/area/shuttle/hunter)
+"c" = (
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
+/obj/machinery/door/airlock/external,
+/turf/open/floor/plating,
+/area/shuttle/hunter)
+"d" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/shuttle/hunter)
+"e" = (
+/obj/structure/shuttle/engine/propulsion{
+ dir = 8
+ },
+/turf/open/floor/plating/airless,
+/area/shuttle/hunter)
+"f" = (
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
+/obj/machinery/door/airlock/external,
+/obj/structure/fans/tiny,
+/turf/open/floor/plating,
+/area/shuttle/hunter)
+"g" = (
+/obj/structure/sign/warning/vacuum/external,
+/turf/closed/wall/mineral/plastitanium,
+/area/shuttle/hunter)
+"h" = (
+/turf/open/floor/plating,
+/area/shuttle/hunter)
+"i" = (
+/obj/structure/grille,
+/obj/structure/window/plastitanium,
+/turf/open/floor/plating,
+/area/shuttle/hunter)
+"j" = (
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plating,
+/area/shuttle/hunter)
+"k" = (
+/obj/structure/sign/poster/contraband/bountyhunters,
+/turf/closed/wall/mineral/plastitanium,
+/area/shuttle/hunter)
+"l" = (
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 1
+ },
+/obj/machinery/door/airlock/external,
+/turf/open/floor/plating,
+/area/shuttle/hunter)
+"m" = (
+/obj/structure/chair/office{
+ dir = 4
+ },
+/turf/open/floor/pod/light,
+/area/shuttle/hunter)
+"n" = (
+/obj/structure/table,
+/turf/open/floor/pod/light,
+/area/shuttle/hunter)
+"o" = (
+/obj/structure/chair/office{
+ dir = 8
+ },
+/turf/open/floor/pod/light,
+/area/shuttle/hunter)
+"p" = (
+/obj/effect/mob_spawn/human/fugitive/bounty/hook{
+ short_desc = null
+ },
+/turf/open/floor/pod/light,
+/area/shuttle/hunter)
+"q" = (
+/obj/structure/shuttle/engine/heater{
+ dir = 8
+ },
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/turf/open/floor/plating/airless,
+/area/shuttle/hunter)
+"r" = (
+/obj/machinery/computer/launchpad{
+ dir = 4
+ },
+/turf/open/floor/pod/dark,
+/area/shuttle/hunter)
+"s" = (
+/turf/open/floor/pod/dark,
+/area/shuttle/hunter)
+"t" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
+ },
+/turf/open/floor/pod/dark,
+/area/shuttle/hunter)
+"v" = (
+/obj/structure/chair/office{
+ dir = 4
+ },
+/turf/open/floor/pod/dark,
+/area/shuttle/hunter)
+"w" = (
+/obj/structure/table,
+/obj/item/phone,
+/turf/open/floor/pod/dark,
+/area/shuttle/hunter)
+"x" = (
+/obj/structure/table,
+/turf/open/floor/pod/dark,
+/area/shuttle/hunter)
+"y" = (
+/obj/structure/chair/office{
+ dir = 8
+ },
+/turf/open/floor/pod/dark,
+/area/shuttle/hunter)
+"z" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/turf/open/floor/pod/dark,
+/area/shuttle/hunter)
+"A" = (
+/obj/machinery/computer/shuttle/hunter{
+ dir = 8
+ },
+/turf/open/floor/pod/dark,
+/area/shuttle/hunter)
+"B" = (
+/obj/machinery/launchpad,
+/turf/open/floor/pod/dark,
+/area/shuttle/hunter)
+"C" = (
+/obj/item/multitool,
+/turf/open/floor/pod/dark,
+/area/shuttle/hunter)
+"D" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/pod/dark,
+/area/shuttle/hunter)
+"E" = (
+/obj/structure/window/plastitanium,
+/turf/closed/wall/mineral/plastitanium,
+/area/shuttle/hunter)
+"F" = (
+/obj/machinery/power/smes,
+/turf/open/floor/pod/dark,
+/area/shuttle/hunter)
+"G" = (
+/obj/machinery/fugitive_capture,
+/turf/open/floor/pod/dark,
+/area/shuttle/hunter)
+"H" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/turf/open/floor/pod/dark,
+/area/shuttle/hunter)
+"I" = (
+/obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/hunter{
+ dir = 8
+ },
+/turf/open/floor/pod/dark,
+/area/shuttle/hunter)
+"J" = (
+/obj/structure/table,
+/obj/item/storage/toolbox/mechanical,
+/turf/open/floor/pod/light,
+/area/shuttle/hunter)
+"K" = (
+/obj/machinery/suit_storage_unit/standard_unit{
+ storage_type = /obj/item/tank/internals/oxygen/yellow
+ },
+/turf/open/floor/pod/light,
+/area/shuttle/hunter)
+"L" = (
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 1
+ },
+/obj/machinery/door/airlock/external,
+/obj/docking_port/stationary{
+ dwidth = 11;
+ height = 16;
+ id = "pirateship_home";
+ name = "Deep Space";
+ width = 17
+ },
+/obj/docking_port/mobile{
+ dheight = 3;
+ dwidth = 3;
+ height = 13;
+ id = "huntership";
+ movement_force = list("KNOCKDOWN" = 0, "THROW" = 0);
+ name = "hunter shuttle";
+ width = 15
+ },
+/obj/structure/fans/tiny,
+/turf/open/floor/plating,
+/area/shuttle/hunter)
+"M" = (
+/obj/effect/mob_spawn/human/fugitive/bounty/armor{
+ dir = 1;
+ short_desc = null
+ },
+/turf/open/floor/pod/light,
+/area/shuttle/hunter)
+"P" = (
+/obj/structure/fluff/empty_sleeper{
+ dir = 1
+ },
+/turf/open/floor/pod/light,
+/area/shuttle/hunter)
+"U" = (
+/obj/structure/grille,
+/obj/structure/window/plastitanium,
+/obj/structure/window/plastitanium,
+/turf/open/floor/plating,
+/area/shuttle/hunter)
+"Z" = (
+/obj/effect/mob_spawn/human/fugitive/bounty/synth{
+ short_desc = null
+ },
+/turf/open/floor/pod/light,
+/area/shuttle/hunter)
+
+(1,1,1) = {"
+a
+a
+a
+b
+a
+a
+a
+a
+a
+b
+a
+a
+a
+"}
+(2,1,1) = {"
+a
+a
+a
+b
+a
+a
+a
+a
+a
+b
+a
+a
+a
+"}
+(3,1,1) = {"
+b
+a
+a
+b
+a
+e
+a
+e
+a
+b
+a
+a
+b
+"}
+(4,1,1) = {"
+b
+a
+e
+b
+b
+q
+i
+q
+b
+b
+e
+a
+b
+"}
+(5,1,1) = {"
+b
+b
+q
+b
+b
+r
+B
+F
+b
+b
+q
+b
+b
+"}
+(6,1,1) = {"
+b
+b
+g
+b
+b
+s
+C
+G
+b
+b
+g
+b
+b
+"}
+(7,1,1) = {"
+f
+d
+h
+j
+l
+t
+D
+H
+c
+d
+h
+j
+L
+"}
+(8,1,1) = {"
+b
+b
+i
+b
+b
+s
+s
+s
+b
+b
+i
+b
+b
+"}
+(9,1,1) = {"
+a
+b
+i
+b
+m
+v
+s
+s
+K
+b
+i
+b
+a
+"}
+(10,1,1) = {"
+a
+a
+i
+k
+n
+w
+x
+s
+K
+b
+i
+a
+a
+"}
+(11,1,1) = {"
+a
+a
+a
+b
+J
+x
+x
+s
+K
+b
+a
+a
+a
+"}
+(12,1,1) = {"
+a
+a
+a
+E
+o
+y
+s
+s
+K
+b
+a
+a
+a
+"}
+(13,1,1) = {"
+a
+a
+a
+i
+b
+s
+s
+s
+b
+i
+a
+a
+a
+"}
+(14,1,1) = {"
+a
+a
+a
+U
+p
+s
+s
+s
+P
+i
+a
+a
+a
+"}
+(15,1,1) = {"
+a
+a
+a
+i
+Z
+z
+s
+z
+M
+i
+a
+a
+a
+"}
+(16,1,1) = {"
+a
+a
+a
+E
+i
+A
+n
+I
+i
+b
+a
+a
+a
+"}
+(17,1,1) = {"
+a
+a
+a
+a
+i
+i
+i
+i
+i
+a
+a
+a
+a
+"}
diff --git a/_maps/shuttles/hunter_russian.dmm b/_maps/shuttles/hunter_russian.dmm
new file mode 100644
index 0000000000..a053d952ef
--- /dev/null
+++ b/_maps/shuttles/hunter_russian.dmm
@@ -0,0 +1,501 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/template_noop,
+/area/template_noop)
+"b" = (
+/turf/closed/wall,
+/area/shuttle/hunter)
+"c" = (
+/obj/structure/shuttle/engine/propulsion{
+ dir = 8
+ },
+/turf/open/floor/plating/airless,
+/area/shuttle/hunter)
+"d" = (
+/obj/structure/shuttle/engine/heater{
+ dir = 8
+ },
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/turf/open/floor/plating/airless,
+/area/shuttle/hunter)
+"e" = (
+/obj/machinery/portable_atmospherics/scrubber/huge,
+/turf/open/floor/plating,
+/area/shuttle/hunter)
+"f" = (
+/obj/machinery/power/smes,
+/turf/open/floor/plating,
+/area/shuttle/hunter)
+"g" = (
+/turf/open/floor/plating,
+/area/shuttle/hunter)
+"h" = (
+/obj/machinery/door/airlock/security/glass,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/hunter)
+"i" = (
+/obj/machinery/door/airlock/security/glass,
+/obj/structure/fans/tiny,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/hunter)
+"j" = (
+/obj/effect/turf_decal/bot,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating,
+/area/shuttle/hunter)
+"k" = (
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/hunter)
+"m" = (
+/obj/structure/reagent_dispensers/fueltank,
+/obj/item/weldingtool/largetank,
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/hunter)
+"n" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/reagent_dispensers/watertank,
+/obj/item/reagent_containers/glass/bucket,
+/obj/item/mop,
+/obj/item/storage/bag/trash{
+ pixel_x = 6
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/hunter)
+"o" = (
+/obj/effect/mob_spawn/human/fugitive/russian{
+ dir = 4;
+ short_desc = null
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/hunter)
+"p" = (
+/obj/effect/turf_decal/bot,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/closet/crate{
+ icon_state = "crateopen"
+ },
+/turf/open/floor/plating,
+/area/shuttle/hunter)
+"q" = (
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/hunter)
+"r" = (
+/obj/effect/turf_decal/arrows{
+ dir = 4
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/hunter)
+"s" = (
+/obj/structure/table,
+/obj/item/storage/fancy/cigarettes/cigars/cohiba{
+ pixel_y = 6
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/hunter)
+"t" = (
+/obj/effect/turf_decal/bot,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/closet/crate/large{
+ icon_state = "crittercrate"
+ },
+/turf/open/floor/plating,
+/area/shuttle/hunter)
+"u" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/hunter)
+"v" = (
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/shuttle/hunter)
+"w" = (
+/obj/machinery/fugitive_capture,
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/hunter)
+"x" = (
+/obj/effect/turf_decal/bot,
+/turf/open/floor/plating,
+/area/shuttle/hunter)
+"y" = (
+/turf/template_noop,
+/area/shuttle/hunter)
+"z" = (
+/obj/structure/chair{
+ dir = 4
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/hunter)
+"A" = (
+/obj/machinery/computer/shuttle/hunter{
+ dir = 8
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/hunter)
+"B" = (
+/obj/effect/turf_decal/bot,
+/obj/structure/closet/crate{
+ icon_state = "crateopen"
+ },
+/turf/open/floor/plating,
+/area/shuttle/hunter)
+"C" = (
+/obj/machinery/computer/camera_advanced{
+ dir = 8
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/hunter)
+"D" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/hunter)
+"E" = (
+/obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/hunter{
+ dir = 8;
+ x_offset = 0;
+ y_offset = 3
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/hunter)
+"F" = (
+/obj/effect/turf_decal/bot,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/closet/crate/engineering{
+ icon_state = "engi_crateopen"
+ },
+/turf/open/floor/plating,
+/area/shuttle/hunter)
+"G" = (
+/obj/structure/table,
+/obj/item/reagent_containers/food/drinks/bottle/vodka,
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/hunter)
+"H" = (
+/obj/effect/turf_decal/bot,
+/obj/structure/closet/crate/coffin{
+ icon_state = "coffinopen"
+ },
+/turf/open/floor/plating,
+/area/shuttle/hunter)
+"I" = (
+/obj/effect/turf_decal/bot,
+/obj/structure/mecha_wreckage/ripley,
+/turf/open/floor/plating,
+/area/shuttle/hunter)
+"J" = (
+/obj/machinery/portable_atmospherics/canister/oxygen,
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/hunter)
+"K" = (
+/obj/machinery/door/airlock/security/glass,
+/obj/structure/fans/tiny,
+/obj/docking_port/stationary{
+ dwidth = 11;
+ height = 16;
+ id = "pirateship_home";
+ name = "Deep Space";
+ width = 17
+ },
+/obj/docking_port/mobile{
+ dheight = 3;
+ dwidth = 3;
+ height = 13;
+ id = "huntership";
+ movement_force = list("KNOCKDOWN" = 0, "THROW" = 0);
+ name = "hunter shuttle";
+ width = 15
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/hunter)
+"L" = (
+/obj/effect/mob_spawn/human/fugitive/russian{
+ dir = 1;
+ short_desc = null
+ },
+/turf/open/floor/plating,
+/area/shuttle/hunter)
+"N" = (
+/obj/machinery/suit_storage_unit/standard_unit,
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/hunter)
+"Q" = (
+/obj/item/book/manual/ripley_build_and_repair,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/hunter)
+"Y" = (
+/obj/machinery/suit_storage_unit/standard_unit,
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/hunter)
+
+(1,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(2,1,1) = {"
+a
+a
+a
+a
+a
+a
+b
+c
+c
+b
+a
+a
+a
+a
+a
+a
+"}
+(3,1,1) = {"
+a
+c
+c
+a
+b
+b
+b
+d
+d
+b
+b
+b
+a
+c
+c
+a
+"}
+(4,1,1) = {"
+b
+d
+d
+b
+b
+p
+t
+x
+B
+B
+F
+b
+b
+d
+d
+b
+"}
+(5,1,1) = {"
+b
+e
+g
+b
+j
+q
+u
+q
+q
+u
+u
+H
+b
+g
+L
+b
+"}
+(6,1,1) = {"
+b
+e
+g
+h
+k
+k
+k
+k
+k
+D
+k
+k
+h
+g
+L
+b
+"}
+(7,1,1) = {"
+b
+f
+g
+b
+x
+k
+Y
+Y
+Y
+Y
+Q
+I
+b
+g
+L
+b
+"}
+(8,1,1) = {"
+b
+b
+b
+b
+b
+h
+b
+b
+b
+b
+h
+b
+b
+b
+b
+b
+"}
+(9,1,1) = {"
+a
+b
+b
+b
+m
+k
+b
+y
+y
+b
+k
+N
+b
+b
+b
+a
+"}
+(10,1,1) = {"
+a
+a
+a
+i
+k
+k
+v
+y
+y
+v
+k
+k
+K
+a
+a
+a
+"}
+(11,1,1) = {"
+a
+a
+a
+b
+n
+r
+b
+y
+y
+b
+r
+J
+b
+a
+a
+a
+"}
+(12,1,1) = {"
+a
+a
+a
+b
+b
+h
+b
+b
+b
+b
+h
+b
+b
+a
+a
+a
+"}
+(13,1,1) = {"
+a
+a
+a
+b
+o
+k
+r
+z
+z
+k
+k
+o
+b
+a
+a
+a
+"}
+(14,1,1) = {"
+a
+a
+a
+b
+b
+s
+w
+A
+C
+E
+G
+b
+b
+a
+a
+a
+"}
+(15,1,1) = {"
+a
+a
+a
+a
+b
+b
+v
+v
+v
+v
+b
+b
+a
+a
+a
+a
+"}
diff --git a/_maps/shuttles/hunter_space_cop.dmm b/_maps/shuttles/hunter_space_cop.dmm
new file mode 100644
index 0000000000..44eb5052b2
--- /dev/null
+++ b/_maps/shuttles/hunter_space_cop.dmm
@@ -0,0 +1,250 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"aa" = (
+/obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/hunter{
+ dir = 8;
+ view_range = 7;
+ x_offset = 6
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/hunter)
+"ab" = (
+/obj/machinery/computer/shuttle/hunter{
+ dir = 8
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/hunter)
+"ac" = (
+/obj/structure/fans/tiny,
+/obj/docking_port/stationary{
+ dir = 4;
+ dwidth = 3;
+ height = 12;
+ id = "huntership_home";
+ name = "Deep Space";
+ width = 7
+ },
+/obj/docking_port/mobile{
+ dir = 4;
+ dwidth = 3;
+ height = 12;
+ id = "huntership";
+ name = "hunter shuttle";
+ width = 7
+ },
+/obj/machinery/door/poddoor/shutters{
+ id = "Interpolship"
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/hunter)
+"ae" = (
+/obj/machinery/button/door{
+ id = "Interpolship";
+ pixel_y = 26
+ },
+/obj/effect/turf_decal/stripes{
+ dir = 8
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/hunter)
+"af" = (
+/obj/effect/turf_decal/stripes{
+ dir = 8
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/hunter)
+"ag" = (
+/obj/effect/turf_decal/delivery,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/hunter)
+"ah" = (
+/obj/effect/turf_decal/loading_area{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/hunter)
+"aj" = (
+/obj/structure/closet/crate/eva,
+/obj/effect/turf_decal/box,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/hunter)
+"ak" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 1
+ },
+/obj/effect/mob_spawn/human/fugitive/spacepol{
+ dir = 1;
+ short_desc = null
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/hunter)
+"al" = (
+/obj/effect/turf_decal/stripes{
+ dir = 8
+ },
+/obj/effect/turf_decal/caution{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/hunter)
+"bY" = (
+/obj/structure/chair/comfy/shuttle,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/hunter)
+"gi" = (
+/obj/structure/table,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/hunter)
+"hB" = (
+/obj/structure/shuttle/engine/propulsion{
+ dir = 8
+ },
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/hunter)
+"hJ" = (
+/obj/structure/window/shuttle,
+/obj/structure/grille,
+/turf/open/floor/plating,
+/area/shuttle/hunter)
+"ku" = (
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/hunter)
+"lp" = (
+/obj/machinery/fugitive_capture,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/hunter)
+"rR" = (
+/obj/machinery/door/airlock/titanium,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/hunter)
+"te" = (
+/obj/structure/fans/tiny,
+/obj/machinery/door/poddoor/shutters{
+ id = "Interpolship"
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/hunter)
+"An" = (
+/obj/effect/spawner/structure/window/shuttle,
+/turf/open/floor/plating,
+/area/shuttle/hunter)
+"Pq" = (
+/turf/template_noop,
+/area/template_noop)
+"Rz" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/hunter)
+"RO" = (
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/hunter)
+
+(1,1,1) = {"
+Pq
+ku
+te
+ac
+te
+ku
+Pq
+"}
+(2,1,1) = {"
+Pq
+ku
+ae
+al
+af
+ku
+Pq
+"}
+(3,1,1) = {"
+Pq
+ku
+bY
+RO
+ak
+ku
+Pq
+"}
+(4,1,1) = {"
+hB
+ku
+bY
+RO
+ak
+ku
+hB
+"}
+(5,1,1) = {"
+ku
+ku
+bY
+RO
+ak
+ku
+ku
+"}
+(6,1,1) = {"
+Pq
+hJ
+ag
+RO
+RO
+hJ
+Pq
+"}
+(7,1,1) = {"
+Pq
+hJ
+ah
+RO
+aj
+hJ
+Pq
+"}
+(8,1,1) = {"
+Pq
+ku
+lp
+RO
+aj
+ku
+Pq
+"}
+(9,1,1) = {"
+hB
+ku
+ku
+rR
+ku
+ku
+hB
+"}
+(10,1,1) = {"
+ku
+ku
+RO
+Rz
+RO
+ku
+ku
+"}
+(11,1,1) = {"
+Pq
+An
+aa
+gi
+ab
+An
+Pq
+"}
+(12,1,1) = {"
+Pq
+ku
+An
+An
+An
+ku
+Pq
+"}
diff --git a/_maps/shuttles/whiteship_cog.dmm b/_maps/shuttles/whiteship_cog.dmm
index 9410682219..9e4463df6b 100644
--- a/_maps/shuttles/whiteship_cog.dmm
+++ b/_maps/shuttles/whiteship_cog.dmm
@@ -32,11 +32,6 @@
"g" = (
/turf/closed/wall/mineral/titanium/nodiagonal,
/area/shuttle/abandoned)
-"h" = (
-/obj/machinery/door/airlock/external,
-/obj/structure/fans/tiny,
-/turf/open/floor/plating,
-/area/shuttle/abandoned)
"i" = (
/obj/machinery/suit_storage_unit/security,
/obj/machinery/light/small{
@@ -64,6 +59,7 @@
/area/shuttle/abandoned)
"m" = (
/obj/structure/bed,
+/obj/item/bedsheet/orange,
/turf/open/floor/plasteel,
/area/shuttle/abandoned)
"n" = (
@@ -130,7 +126,6 @@
/area/shuttle/abandoned)
"x" = (
/obj/machinery/door/firedoor/border_only/closed{
- icon_state = "door_closed";
dir = 4
},
/obj/machinery/door/window/eastright,
@@ -174,12 +169,12 @@
dir = 8
},
/obj/structure/closet/crate/secure/weapon,
-/obj/item/gun/energy/laser/carbine,
/obj/machinery/button/flasher{
id = "cogws";
pixel_x = -24;
pixel_y = 8
},
+/obj/item/gun/energy/laser/retro,
/turf/open/floor/plasteel,
/area/shuttle/abandoned)
"D" = (
@@ -191,7 +186,7 @@
/obj/effect/turf_decal/tile/red{
dir = 4
},
-/obj/item/gun/energy/e_gun/stun,
+/obj/item/gun/energy/laser/retro,
/turf/open/floor/plasteel,
/area/shuttle/abandoned)
"E" = (
@@ -228,12 +223,14 @@
"I" = (
/obj/structure/table/reinforced,
/obj/item/clothing/glasses/sunglasses,
+/obj/item/gps{
+ gpstag = "NTPRS"
+ },
/turf/open/floor/plasteel/grimy,
/area/shuttle/abandoned)
"J" = (
/obj/structure/curtain,
/obj/machinery/shower{
- name = "shower";
pixel_y = 12
},
/obj/item/soap/nanotrasen,
@@ -329,13 +326,13 @@ d
"}
(5,1,1) = {"
d
-h
+g
n
n
B
H
n
-h
+g
d
"}
(6,1,1) = {"
diff --git a/_maps/templates/shelter_2.dmm b/_maps/templates/shelter_2.dmm
index 825cb26e3a..0a25527358 100644
--- a/_maps/templates/shelter_2.dmm
+++ b/_maps/templates/shelter_2.dmm
@@ -93,7 +93,7 @@
/area/survivalpod)
"q" = (
/obj/structure/tubes,
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/pod,
/area/survivalpod)
"r" = (
diff --git a/byond-extools.dll b/byond-extools.dll
index a83ea1e543..4910fad01b 100644
Binary files a/byond-extools.dll and b/byond-extools.dll differ
diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm
index c9e03389f1..d1c1d309cd 100644
--- a/code/__DEFINES/DNA.dm
+++ b/code/__DEFINES/DNA.dm
@@ -108,6 +108,8 @@
#define TR_KEEPSE (1<<5) // changelings shouldn't edit the DNA's SE when turning into a monkey
#define TR_DEFAULTMSG (1<<6)
#define TR_KEEPORGANS (1<<8)
+#define TR_KEEPREAGENTS (1<<10)
+#define TR_KEEPSTUNS (1<<9)
#define CLONER_FRESH_CLONE "fresh"
@@ -140,6 +142,7 @@
#define CUSTOM_SKINTONE 24 //adds a "_g" suffix to bodypart overlays icon states if a custom skintone is used.
#define HORNCOLOR 25
#define WINGCOLOR 26
+#define CAN_SCAR 27 // If this species can be scarred (fleshy)
//organ slots
#define ORGAN_SLOT_BRAIN "brain"
@@ -184,4 +187,4 @@
#define G_MALE 1
#define G_FEMALE 2
#define G_PLURAL 3
-#define G_NEUTER 4
\ No newline at end of file
+#define G_NEUTER 4
diff --git a/code/__DEFINES/_flags/_flags.dm b/code/__DEFINES/_flags/_flags.dm
index dae3df6f0b..0734feaa42 100644
--- a/code/__DEFINES/_flags/_flags.dm
+++ b/code/__DEFINES/_flags/_flags.dm
@@ -138,6 +138,22 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
#define MOBILITY_FLAGS_DEFAULT (MOBILITY_MOVE | MOBILITY_STAND | MOBILITY_PICKUP | MOBILITY_USE | MOBILITY_UI | MOBILITY_STORAGE | MOBILITY_PULL | MOBILITY_RESIST)
#define MOBILITY_FLAGS_ANY_INTERACTION (MOBILITY_USE | MOBILITY_PICKUP | MOBILITY_UI | MOBILITY_STORAGE)
-// melee_attack_chain() attackchain_flags
-/// The attack is from a parry counterattack.
-#define ATTACKCHAIN_PARRY_COUNTERATTACK (1<<0)
+/// If the thing can reflect light (lasers/energy)
+#define RICOCHET_SHINY (1<<0)
+/// If the thing can reflect matter (bullets/bomb shrapnel)
+#define RICOCHET_HARD (1<<1)
+
+#define KEEP_TOGETHER_ORIGINAL "keep_together_original"
+
+//setter for KEEP_TOGETHER to allow for multiple sources to set and unset it
+#define ADD_KEEP_TOGETHER(x, source)\
+ if ((x.appearance_flags & KEEP_TOGETHER) && !HAS_TRAIT(x, TRAIT_KEEP_TOGETHER)) ADD_TRAIT(x, TRAIT_KEEP_TOGETHER, KEEP_TOGETHER_ORIGINAL); \
+ ADD_TRAIT(x, TRAIT_KEEP_TOGETHER, source);\
+ x.appearance_flags |= KEEP_TOGETHER
+
+#define REMOVE_KEEP_TOGETHER(x, source)\
+ REMOVE_TRAIT(x, TRAIT_KEEP_TOGETHER, source);\
+ if(HAS_TRAIT_FROM_ONLY(x, TRAIT_KEEP_TOGETHER, KEEP_TOGETHER_ORIGINAL))\
+ REMOVE_TRAIT(x, TRAIT_KEEP_TOGETHER, KEEP_TOGETHER_ORIGINAL);\
+ else if(!HAS_TRAIT(x, TRAIT_KEEP_TOGETHER))\
+ x.appearance_flags &= ~KEEP_TOGETHER
diff --git a/code/__DEFINES/flags/do_after.dm b/code/__DEFINES/_flags/do_after.dm
similarity index 100%
rename from code/__DEFINES/flags/do_after.dm
rename to code/__DEFINES/_flags/do_after.dm
diff --git a/code/__DEFINES/_flags/item_flags.dm b/code/__DEFINES/_flags/item_flags.dm
index c6a3886ed3..26e764c45b 100644
--- a/code/__DEFINES/_flags/item_flags.dm
+++ b/code/__DEFINES/_flags/item_flags.dm
@@ -52,3 +52,4 @@
#define ORGAN_VITAL (1<<4) //Currently only the brain
#define ORGAN_NO_SPOIL (1<<5) //Do not spoil under any circumstances
#define ORGAN_NO_DISMEMBERMENT (1<<6) //Immune to disembowelment.
+#define ORGAN_EDIBLE (1<<7) //is a snack? :D
diff --git a/code/__DEFINES/_flags/obj_flags.dm b/code/__DEFINES/_flags/obj_flags.dm
index ebb9b4bda0..a936a5cef5 100644
--- a/code/__DEFINES/_flags/obj_flags.dm
+++ b/code/__DEFINES/_flags/obj_flags.dm
@@ -12,4 +12,9 @@
#define SHOVABLE_ONTO (1<<9) //called on turf.shove_act() to consider whether an object should have a niche effect (defined in their own shove_act()) when someone is pushed onto it, or do a sanity CanPass() check.
#define BLOCK_Z_FALL (1<<10)
+/// Integrity defines for clothing (not flags but close enough)
+#define CLOTHING_PRISTINE 0 // We have no damage on the clothing
+#define CLOTHING_DAMAGED 1 // There's some damage on the clothing but it still has at least one functioning bodypart and can be equipped
+#define CLOTHING_SHREDDED 2 // The clothing is useless and cannot be equipped unless repaired first
+
// If you add new ones, be sure to add them to /obj/Initialize as well for complete mapping support
diff --git a/code/__DEFINES/_flags/return_values.dm b/code/__DEFINES/_flags/return_values.dm
new file mode 100644
index 0000000000..28606265b3
--- /dev/null
+++ b/code/__DEFINES/_flags/return_values.dm
@@ -0,0 +1,22 @@
+/////////// ATTACKCHAIN_FLAGS ////////////
+// melee_attack_chain(), attackby(), pre_attack(), afterattack(), and tool_act(), attack() and **anything that is called by ClickOn()** return values.
+// These are all passed down through the attack chain and are binary OR'd into each other!
+/// Stop the attack chain if still in melee_attack_chain()
+#define STOP_ATTACK_PROC_CHAIN (1<<0)
+/// This attack should discard last_action instead of flushing (storing) it). You should probably know what you're doing if you use this considering this is how clickdelay is enforced.
+#define DISCARD_LAST_ACTION (1<<1)
+/// There are a number of "safety nets" intended to default-handle clickdelay. Return this flag to bypass ALL of them. Be sure
+/// you know EXACTLY what you are doing!
+#define NO_AUTO_CLICKDELAY_HANDLING (1<<2)
+/// Only used with UnarmedAttack(). Interrupts unarmed attack from progressing.
+#define INTERRUPT_UNARMED_ATTACK (1<<3)
+/// Attack should not set next action even if the atom wants it to be an action
+#define ATTACK_IGNORE_ACTION (1<<4)
+/// Attack should not at all check last_action/attack_hand_speed even if the atom wants to
+#define ATTACK_IGNORE_CLICKDELAY (1<<5)
+/// This attack is from a parry counterattack
+#define ATTACK_IS_PARRY_COUNTERATTACK (1<<6)
+
+// obj/item/dropped()
+/// dropped() relocated this item, return FALSE for doUnEquip.
+#define ITEM_RELOCATED_BY_DROPPED "relocated_by_dropped"
diff --git a/code/__DEFINES/flags/shields.dm b/code/__DEFINES/_flags/shields.dm
similarity index 100%
rename from code/__DEFINES/flags/shields.dm
rename to code/__DEFINES/_flags/shields.dm
diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm
index e8e75c132a..198356f804 100644
--- a/code/__DEFINES/admin.dm
+++ b/code/__DEFINES/admin.dm
@@ -74,6 +74,12 @@
#define ADMIN_PUNISHMENT_MAZING "Puzzle"
#define ADMIN_PUNISHMENT_PIE "Cream Pie"
#define ADMIN_PUNISHMENT_CUSTOM_PIE "Custom Cream Pie"
+#define ADMIN_PUNISHMENT_SHOES "Knot Shoes"
+#define ADMIN_PUNISHMENT_CRACK ":B:oneless"
+#define ADMIN_PUNISHMENT_BLEED ":B:loodless"
+#define ADMIN_PUNISHMENT_SCARIFY "Scarify"
+#define ADMIN_PUNISHMENT_PICKLE "Pickle-ify"
+#define ADMIN_PUNISHMENT_FRY "Fry"
#define AHELP_ACTIVE 1
#define AHELP_CLOSED 2
diff --git a/code/__DEFINES/admin/keybindings.dm b/code/__DEFINES/admin/keybindings.dm
index 3efc26c7d5..fcfe7c5e58 100644
--- a/code/__DEFINES/admin/keybindings.dm
+++ b/code/__DEFINES/admin/keybindings.dm
@@ -1,6 +1,6 @@
// Defines for managed input/keybinding system.
/// Max length of a keypress command before it's considered to be a forged packet/bogus command
-#define MAX_KEYPRESS_COMMANDLENGTH 16
+#define MAX_KEYPRESS_COMMANDLENGTH 32
/// Maximum keys that can be bound to one button
#define MAX_COMMANDS_PER_KEY 5
/// Maximum keys per keybind
diff --git a/code/__DEFINES/antagonists.dm b/code/__DEFINES/antagonists.dm
index ea380cf49b..b883a54209 100644
--- a/code/__DEFINES/antagonists.dm
+++ b/code/__DEFINES/antagonists.dm
@@ -11,6 +11,17 @@
#define NUKE_RESULT_WRONG_STATION 7
#define NUKE_RESULT_WRONG_STATION_DEAD 8
+//fugitive end results
+#define FUGITIVE_RESULT_BADASS_HUNTER 0
+#define FUGITIVE_RESULT_POSTMORTEM_HUNTER 1
+#define FUGITIVE_RESULT_MAJOR_HUNTER 2
+#define FUGITIVE_RESULT_HUNTER_VICTORY 3
+#define FUGITIVE_RESULT_MINOR_HUNTER 4
+#define FUGITIVE_RESULT_STALEMATE 5
+#define FUGITIVE_RESULT_MINOR_FUGITIVE 6
+#define FUGITIVE_RESULT_FUGITIVE_VICTORY 7
+#define FUGITIVE_RESULT_MAJOR_FUGITIVE 8
+
#define APPRENTICE_DESTRUCTION "destruction"
#define APPRENTICE_BLUESPACE "bluespace"
#define APPRENTICE_ROBELESS "robeless"
diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm
index 2b19b557b2..621af2c811 100644
--- a/code/__DEFINES/atmospherics.dm
+++ b/code/__DEFINES/atmospherics.dm
@@ -136,7 +136,7 @@
#define TANK_FRAGMENT_SCALE (6.*ONE_ATMOSPHERE) //+1 for each SCALE kPa aboe threshold
#define TANK_MAX_RELEASE_PRESSURE (ONE_ATMOSPHERE*3)
#define TANK_MIN_RELEASE_PRESSURE 0
-#define TANK_DEFAULT_RELEASE_PRESSURE 16
+#define TANK_DEFAULT_RELEASE_PRESSURE 17
//CANATMOSPASS
#define ATMOS_PASS_YES 1
@@ -270,16 +270,9 @@
T.pixel_x = (PipingLayer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_P_X;\
T.pixel_y = (PipingLayer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_P_Y;
-#define THERMAL_ENERGY(gas) (gas.temperature * gas.heat_capacity())
#define QUANTIZE(variable) (round(variable,0.0000001))/*I feel the need to document what happens here. Basically this is used to catch most rounding errors, however it's previous value made it so that
once gases got hot enough, most procedures wouldnt occur due to the fact that the mole counts would get rounded away. Thus, we lowered it a few orders of magnititude */
-//prefer this to gas_mixture/total_moles in performance critical areas
-#define TOTAL_MOLES(cached_gases, out_var)\
- out_var = 0;\
- for(var/total_moles_id in cached_gases){\
- out_var += cached_gases[total_moles_id];\
- }
#ifdef TESTING
GLOBAL_LIST_INIT(atmos_adjacent_savings, list(0,0))
@@ -288,6 +281,19 @@ GLOBAL_LIST_INIT(atmos_adjacent_savings, list(0,0))
#define CALCULATE_ADJACENT_TURFS(T) SSadjacent_air.queue[T] = 1
#endif
+#define EXTOOLS (world.system_type == MS_WINDOWS ? "byond-extools.dll" : "libbyond-extools.so")
+
+GLOBAL_VAR(atmos_extools_initialized) // this must be an uninitialized (null) one or init_monstermos will be called twice because reasons
+#define ATMOS_EXTOOLS_CHECK if(!GLOB.atmos_extools_initialized){\
+ GLOB.atmos_extools_initialized=TRUE;\
+ if(fexists(EXTOOLS)){\
+ var/result = call(EXTOOLS,"init_monstermos")();\
+ if(result != "ok") {CRASH(result);}\
+ } else {\
+ CRASH("[EXTOOLS] does not exist!");\
+ }\
+}
+
//Unomos - So for whatever reason, garbage collection actually drastically decreases the cost of atmos later in the round. Turning this into a define yields massively improved performance.
#define GAS_GARBAGE_COLLECT(GASGASGAS)\
var/list/CACHE_GAS = GASGASGAS;\
@@ -296,10 +302,6 @@ GLOBAL_LIST_INIT(atmos_adjacent_savings, list(0,0))
CACHE_GAS -= id;\
}
-#define ARCHIVE_TEMPERATURE(gas) gas.temperature_archived = gas.temperature
-
-#define ARCHIVE(gas) gas.temperature_archived = gas.temperature; gas.gas_archive = gas.gases.Copy();
-
GLOBAL_LIST_INIT(pipe_paint_colors, list(
"amethyst" = rgb(130,43,255), //supplymain
"blue" = rgb(0,0,255),
diff --git a/code/__DEFINES/atom_hud.dm b/code/__DEFINES/atom_hud.dm
index 322a150617..01f14c748e 100644
--- a/code/__DEFINES/atom_hud.dm
+++ b/code/__DEFINES/atom_hud.dm
@@ -59,6 +59,7 @@
#define ANTAG_HUD_CLOCKWORK 22
#define ANTAG_HUD_BROTHER 23
#define ANTAG_HUD_BLOODSUCKER 24
+#define ANTAG_HUD_FUGITIVE 25
// Notification action types
#define NOTIFY_JUMP "jump"
diff --git a/code/__DEFINES/cargo.dm b/code/__DEFINES/cargo.dm
index 52a2d56697..bba5b5c5ed 100644
--- a/code/__DEFINES/cargo.dm
+++ b/code/__DEFINES/cargo.dm
@@ -32,4 +32,8 @@
list("", "\improper S.T.E.A.L.T.H. pod MKVII", "A supply pod that, under normal circumstances, is completely invisible to conventional methods of detection. How are you even seeing this?"),\
list("gondolapod", "gondola", "The silent walker. This one seems to be part of a delivery agency."),\
list("", "", "")\
-)
\ No newline at end of file
+)
+
+#define PACK_GOODY_NONE 0
+#define PACK_GOODY_PUBLIC 1 //can be bought by both privates and cargo
+#define PACK_GOODY_PRIVATE 2 //can be bought only by privates
\ No newline at end of file
diff --git a/code/__DEFINES/chemistry/reactions.dm b/code/__DEFINES/chemistry/reactions.dm
new file mode 100644
index 0000000000..0deadcbfe0
--- /dev/null
+++ b/code/__DEFINES/chemistry/reactions.dm
@@ -0,0 +1,4 @@
+// Reaction priorities, higher makes it checked first. Otherwise, it goes based on reaction temperature requirements.
+
+#define CHEMICAL_REACTION_PRIORITY_DEFAULT 100
+#define CHEMICAL_REACTION_PRIORITY_SMOKE 1000
diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm
index 07f24fd8a3..585e8da7d7 100644
--- a/code/__DEFINES/citadel_defines.dm
+++ b/code/__DEFINES/citadel_defines.dm
@@ -98,6 +98,7 @@
#define NO_APHRO (1<<9)
#define NO_ASS_SLAP (1<<10)
#define BIMBOFICATION (1<<11)
+#define NO_AUTO_WAG (1<<12)
#define TOGGLES_CITADEL 0
diff --git a/code/__DEFINES/clockcult.dm b/code/__DEFINES/clockcult.dm
index 2f2f94413b..f597eb4ae7 100644
--- a/code/__DEFINES/clockcult.dm
+++ b/code/__DEFINES/clockcult.dm
@@ -8,6 +8,7 @@
GLOBAL_VAR_INIT(clockwork_construction_value, 0) //The total value of all structures built by the clockwork cult
GLOBAL_VAR_INIT(clockwork_vitality, 0) //How much Vitality is stored, total
GLOBAL_VAR_INIT(clockwork_power, 0) //How many watts of power are globally available to the clockwork cult
+GLOBAL_LIST_EMPTY(active_daemons) //A list of all active tinkerer's daemons
GLOBAL_VAR_INIT(neovgre_exists, 0) //Does neovgre exist?
GLOBAL_LIST_EMPTY(all_clockwork_objects) //All clockwork items, structures, and effects in existence
@@ -19,7 +20,8 @@ GLOBAL_VAR_INIT(ark_of_the_clockwork_justiciar, FALSE) //The Ark on the Reebe z-
GLOBAL_VAR_INIT(clockwork_gateway_activated, FALSE) //if a gateway to the celestial derelict has ever been successfully activated
GLOBAL_VAR_INIT(script_scripture_unlocked, FALSE) //If script scripture is available, through converting at least one crewmember
-GLOBAL_VAR_INIT(application_scripture_unlocked, FALSE) //If script scripture is available
+GLOBAL_VAR_INIT(application_scripture_unlocked, FALSE) //If application scripture is available
+GLOBAL_VAR_INIT(judgement_scripture_unlocked, FALSE) //If judgement scripture is available
GLOBAL_LIST_EMPTY(all_scripture) //a list containing scripture instances; not used to track existing scripture
//Scripture tiers and requirements; peripherals should never be used
@@ -27,13 +29,13 @@ GLOBAL_LIST_EMPTY(all_scripture) //a list containing scripture instances; not us
#define SCRIPTURE_DRIVER "Driver"
#define SCRIPTURE_SCRIPT "Script"
#define SCRIPTURE_APPLICATION "Application"
+#define SCRIPTURE_JUDGEMENT "Judgement"
//Various costs related to power.
#define MAX_CLOCKWORK_POWER 80000 //The max power in W that the cult can stockpile
#define SCRIPT_UNLOCK_THRESHOLD 35000 //Scripts will unlock if the total power reaches this amount
-#define APPLICATION_UNLOCK_THRESHOLD 50000 //Applications will unlock if the total powre reaches this amount
-
-#define ABSCOND_ABDUCTION_COST 95
+#define APPLICATION_UNLOCK_THRESHOLD 50000 //Applications will unlock if the total power reaches this amount
+#define JUDGEMENT_UNLOCK_THRESHOLD 80000 //might as well have this unlock at a power amount like the other scriptures, Judgement unlocks at this amount.
//clockcult power defines
#define MIN_CLOCKCULT_POWER 25 //the minimum amount of power clockcult machines will handle gracefully
@@ -59,11 +61,11 @@ GLOBAL_LIST_EMPTY(all_scripture) //a list containing scripture instances; not us
//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
-#define GATEWAY_REEBE_FOUND 240 //when progress is at or above this, the gateway finds reebe and begins drawing power
+#define GATEWAY_REEBE_FOUND 120 //when progress is at or above this, the gateway finds reebe and begins drawing power
-#define GATEWAY_RATVAR_COMING 480 //when progress is at or above this, ratvar has entered and is coming through the gateway
+#define GATEWAY_RATVAR_COMING 240 //when progress is at or above this, ratvar has entered and is coming through the gateway
-#define GATEWAY_RATVAR_ARRIVAL 600 //when progress is at or above this, game over ratvar's here everybody go home
+#define GATEWAY_RATVAR_ARRIVAL 300 //when progress is at or above this, game over ratvar's here everybody go home
//Objective text define
#define CLOCKCULT_OBJECTIVE "Construct the Ark of the Clockwork Justicar and free Ratvar."
@@ -81,7 +83,7 @@ GLOBAL_LIST_EMPTY(all_scripture) //a list containing scripture instances; not us
#define CLOCKWORK_ARMOR_COOLDOWN 1800 //The cooldown period between summoning suits of clockwork armor
-#define RATVARIAN_SPEAR_COOLDOWN 300 //The cooldown period between summoning another Ratvarian spear
+#define RATVARIAN_WEAPON_COOLDOWN 300 //The cooldown period between summoning another Ratvarian spear
#define MARAUDER_SCRIPTURE_SCALING_THRESHOLD 600 //The amount of deciseconds that must pass before marauder scripture will not gain a recital penalty
@@ -89,4 +91,8 @@ GLOBAL_LIST_EMPTY(all_scripture) //a list containing scripture instances; not us
#define MARAUDER_SCRIPTURE_SCALING_MAX 300 //The maximum extra time applied to the marauder scripture
-#define ARK_SCREAM_COOLDOWN 600 //This much time has to pass between instances of the Ark taking damage before it will "scream" again
+#define GUARDIAN_EMERGE_THRESHOLD 65 //guardian cannot emerge unless host is at this% or less health
+
+#define ARK_SCREAM_COOLDOWN 300 //This much time has to pass between instances of the Ark taking damage before it will "scream" again
+
+#define PRISM_DELAY_DURATION 1200 //how long prolonging prisms delay the shuttle for; defaults to 2 minutes
\ No newline at end of file
diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm
index bf053635af..6a60768875 100644
--- a/code/__DEFINES/combat.dm
+++ b/code/__DEFINES/combat.dm
@@ -108,7 +108,6 @@
#define CLICK_CD_RANGE 4
#define CLICK_CD_RAPID 2
#define CLICK_CD_CLICK_ABILITY 6
-#define CLICK_CD_BREAKOUT 100
#define CLICK_CD_HANDCUFFED 10
#define CLICK_CD_RESIST 20
#define CLICK_CD_GRABBING 10
@@ -155,17 +154,17 @@
#define SHOVE_KNOCKDOWN_HUMAN 30
#define SHOVE_KNOCKDOWN_TABLE 30
#define SHOVE_KNOCKDOWN_COLLATERAL 10
-//for the shove slowdown, see __DEFINES/movespeed_modification.dm
-#define SHOVE_SLOWDOWN_LENGTH 30
-#define SHOVE_SLOWDOWN_STRENGTH 0.85 //multiplier
+/// how long they're staggered for
+#define SHOVE_STAGGER_DURATION 35
+/// how long they're off balance for
+#define SHOVE_OFFBALANCE_DURATION 30
//Shove disarming item list
GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list(
/obj/item/gun)))
-//Combat object defines
-
//Embedded objects
+
#define EMBEDDED_PAIN_CHANCE 15 //Chance for embedded objects to cause pain (damage user)
#define EMBEDDED_ITEM_FALLOUT 5 //Chance for embedded object to fall out (causing pain but removing the object)
#define EMBED_CHANCE 45 //Chance for an object to embed into somebody when thrown (if it's sharp)
@@ -174,7 +173,16 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list(
#define EMBEDDED_IMPACT_PAIN_MULTIPLIER 4 //Coefficient of multiplication for the damage the item does when it first embeds (this*item.w_class)
#define EMBED_THROWSPEED_THRESHOLD 4 //The minimum value of an item's throw_speed for it to embed (Unless it has embedded_ignore_throwspeed_threshold set to 1)
#define EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER 8 //Coefficient of multiplication for the damage the item does when removed without a surgery (this*item.w_class)
-#define EMBEDDED_UNSAFE_REMOVAL_TIME 150 //A Time in ticks, total removal time = (this/item.w_class)
+#define EMBEDDED_UNSAFE_REMOVAL_TIME 30 //A Time in ticks, total removal time = (this*item.w_class)
+#define EMBEDDED_JOSTLE_CHANCE 5 //Chance for embedded objects to cause pain every time they move (jostle)
+#define EMBEDDED_JOSTLE_PAIN_MULTIPLIER 1 //Coefficient of multiplication for the damage the item does while
+#define EMBEDDED_PAIN_STAM_PCT 0.0 //This percentage of all pain will be dealt as stam damage rather than brute (0-1)
+#define EMBED_CHANCE_TURF_MOD -15 //You are this many percentage points less likely to embed into a turf (good for things glass shards and spears vs walls)
+
+#define EMBED_HARMLESS list("pain_mult" = 0, "jostle_pain_mult" = 0, "ignore_throwspeed_threshold" = TRUE)
+#define EMBED_HARMLESS_SUPERIOR list("pain_mult" = 0, "jostle_pain_mult" = 0, "ignore_throwspeed_threshold" = TRUE, "embed_chance" = 100, "fall_chance" = 0.1)
+#define EMBED_POINTY list("ignore_throwspeed_threshold" = TRUE)
+#define EMBED_POINTY_SUPERIOR list("embed_chance" = 100, "ignore_throwspeed_threshold" = TRUE)
//Gun weapon weight
#define WEAPON_LIGHT 1
@@ -189,6 +197,14 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list(
#define EGUN_SELFCHARGE 1
#define EGUN_SELFCHARGE_BORG 2
+//Gun suppression
+#define SUPPRESSED_NONE 0
+#define SUPPRESSED_QUIET 1 ///standard suppressed
+#define SUPPRESSED_VERY 2 /// no message
+
+//Nice shot bonus
+#define NICE_SHOT_RICOCHET_BONUS 10 //if the shooter has the NICE_SHOT trait and they fire a ricocheting projectile, add this to the ricochet chance and auto aim angle
+
///Time to spend without clicking on other things required for your shots to become accurate.
#define GUN_AIMING_TIME (2 SECONDS)
@@ -253,21 +269,28 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list(
//stamina cost defines.
#define STAM_COST_ATTACK_OBJ_MULT 1.2
-#define STAM_COST_ATTACK_MOB_MULT 0.8
+#define STAM_COST_ATTACK_MOB_MULT 1
#define STAM_COST_BATON_MOB_MULT 1
#define STAM_COST_NO_COMBAT_MULT 1.25
#define STAM_COST_W_CLASS_MULT 1.25
#define STAM_COST_THROW_MULT 2
+#define STAM_COST_THROW_MOB 2.5 //multiplied by (mob size + 1)^2.
///Multiplier of the (STAMINA_NEAR_CRIT - user current stamina loss) : (STAMINA_NEAR_CRIT - STAMINA_SOFTCRIT) ratio used in damage penalties when stam soft-critted.
#define STAM_CRIT_ITEM_ATTACK_PENALTY 0.66
/// changeNext_move penalty multiplier of the above.
#define STAM_CRIT_ITEM_ATTACK_DELAY 1.75
/// Damage penalty when fighting prone.
-#define LYING_DAMAGE_PENALTY 0.5
+#define LYING_DAMAGE_PENALTY 0.7
/// Added delay when firing guns stam-softcritted. Summed with a hardset CLICK_CD_RANGE delay, similar to STAM_CRIT_DAMAGE_DELAY otherwise.
#define STAM_CRIT_GUN_DELAY 2.75
+//stamina recovery defines. Blocked if combat mode is on.
+#define STAM_RECOVERY_STAM_CRIT -7.5
+#define STAM_RECOVERY_RESTING -6
+#define STAM_RECOVERY_NORMAL -3
+#define STAM_RECOVERY_LIMB 4 //limbs recover stamina separately from handle_status_effects(), and aren't blocked by combat mode.
+
/**
* should the current-attack-damage be lower than the item force multiplied by this value,
* a "inefficiently" prefix will be added to the message.
diff --git a/code/__DEFINES/configuration.dm b/code/__DEFINES/configuration.dm
index 6b70eb1e0f..a4bf69b2ad 100644
--- a/code/__DEFINES/configuration.dm
+++ b/code/__DEFINES/configuration.dm
@@ -8,3 +8,12 @@
//flags
#define CONFIG_ENTRY_LOCKED 1 //can't edit
#define CONFIG_ENTRY_HIDDEN 2 //can't see value
+
+// Policy config keys
+// MAKE SURE THESE ARE UPPERCASE
+/// Displayed to cloned patients
+#define POLICYCONFIG_ON_CLONE "ON_CLONE"
+/// Displayed to defibbed/revival surgery'd patients before the memory loss time threshold
+#define POLICYCONFIG_ON_DEFIB_INTACT "ON_DEFIB_INTACT"
+/// Displayed to defibbed/revival surgery'd patients after the memory loss time threshold
+#define POLICYCONFIG_ON_DEFIB_LATE "ON_DEFIB_LATE"
diff --git a/code/__DEFINES/cooldowns.dm b/code/__DEFINES/cooldowns.dm
new file mode 100644
index 0000000000..29c7a25dad
--- /dev/null
+++ b/code/__DEFINES/cooldowns.dm
@@ -0,0 +1,71 @@
+//// COOLDOWN SYSTEMS
+/*
+ * We have 2 cooldown systems: timer cooldowns (divided between stoppable and regular) and world.time cooldowns.
+ *
+ * When to use each?
+ *
+ * * Adding a commonly-checked cooldown, like on a subsystem to check for processing
+ * * * Use the world.time ones, as they are cheaper.
+ *
+ * * Adding a rarely-used one for special situations, such as giving an uncommon item a cooldown on a target.
+ * * * Timer cooldown, as adding a new variable on each mob to track the cooldown of said uncommon item is going too far.
+ *
+ * * Triggering events at the end of a cooldown.
+ * * * Timer cooldown, registering to its signal.
+ *
+ * * Being able to check how long left for the cooldown to end.
+ * * * Either world.time or stoppable timer cooldowns, depending on the other factors. Regular timer cooldowns do not support this.
+ *
+ * * Being able to stop the timer before it ends.
+ * * * Either world.time or stoppable timer cooldowns, depending on the other factors. Regular timer cooldowns do not support this.
+*/
+
+
+/*
+ * Cooldown system based on an datum-level associative lazylist using timers.
+*/
+
+//INDEXES
+#define COOLDOWN_EMPLOYMENT_CABINET "employment cabinet"
+
+
+//TIMER COOLDOWN MACROS
+
+#define COMSIG_CD_STOP(cd_index) "cooldown_[cd_index]"
+#define COMSIG_CD_RESET(cd_index) "cd_reset_[cd_index]"
+
+#define TIMER_COOLDOWN_START(cd_source, cd_index, cd_time) LAZYSET(cd_source.cooldowns, cd_index, addtimer(CALLBACK(GLOBAL_PROC, /proc/end_cooldown, cd_source, cd_index), cd_time))
+
+#define TIMER_COOLDOWN_CHECK(cd_source, cd_index) LAZYACCESS(cd_source.cooldowns, cd_index)
+
+#define TIMER_COOLDOWN_END(cd_source, cd_index) LAZYREMOVE(cd_source.cooldowns, cd_index)
+
+/*
+ * Stoppable timer cooldowns.
+ * Use indexes the same as the regular tiemr cooldowns.
+ * They make use of the TIMER_COOLDOWN_CHECK() and TIMER_COOLDOWN_END() macros the same, just not the TIMER_COOLDOWN_START() one.
+ * A bit more expensive than the regular timers, but can be reset before they end and the time left can be checked.
+*/
+
+#define S_TIMER_COOLDOWN_START(cd_source, cd_index, cd_time) LAZYSET(cd_source.cooldowns, cd_index, addtimer(CALLBACK(GLOBAL_PROC, /proc/end_cooldown, cd_source, cd_index), cd_time, TIMER_STOPPABLE))
+
+#define S_TIMER_COOLDOWN_RESET(cd_source, cd_index) reset_cooldown(cd_source, cd_index)
+
+#define S_TIMER_COOLDOWN_TIMELEFT(cd_source, cd_index) (timeleft(TIMER_COOLDOWN_CHECK(cd_source, cd_index)))
+
+
+/*
+ * Cooldown system based on storing world.time on a variable, plus the cooldown time.
+ * Better performance over timer cooldowns, lower control. Same functionality.
+*/
+
+#define COOLDOWN_DECLARE(cd_index) var/##cd_index = 0
+
+#define COOLDOWN_START(cd_source, cd_index, cd_time) (cd_source.cd_index = world.time + cd_time)
+
+//Returns true if the cooldown has run its course, false otherwise
+#define COOLDOWN_FINISHED(cd_source, cd_index) (cd_source.cd_index < world.time)
+
+#define COOLDOWN_RESET(cd_source, cd_index) cd_source.cd_index = 0
+
+#define COOLDOWN_TIMELEFT(cd_source, cd_index) (max(0, cd_source.cd_index - world.time))
diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm
index ea9ebbec02..5b8a4d5fc3 100644
--- a/code/__DEFINES/dcs/signals.dm
+++ b/code/__DEFINES/dcs/signals.dm
@@ -26,17 +26,27 @@
#define COMPONENT_ADD_TRAIT (1<<0)
#define COMPONENT_REMOVE_TRAIT (1<<1)
+/// fires on the target datum when an element is attached to it (/datum/element)
+#define COMSIG_ELEMENT_ATTACH "element_attach"
+/// fires on the target datum when an element is attached to it (/datum/element)
+#define COMSIG_ELEMENT_DETACH "element_detach"
+
// /atom signals
+//from base of atom/proc/Initialize(): sent any time a new atom is created
+#define COMSIG_ATOM_CREATED "atom_created"
#define COMSIG_PARENT_ATTACKBY "atom_attackby" //from base of atom/attackby(): (/obj/item, /mob/living, params)
#define COMPONENT_NO_AFTERATTACK 1 //Return this in response if you don't want afterattack to be called
#define COMSIG_ATOM_HULK_ATTACK "hulk_attack" //from base of atom/attack_hulk(): (/mob/living/carbon/human)
+#define COMSIG_ATOM_ATTACK_ANIMAL "attack_animal" //from base of atom/animal_attack(): (/mob/user)
#define COMSIG_PARENT_EXAMINE "atom_examine" //from base of atom/examine(): (/mob, list/examine_return_text)
-#define COMSIG_ATOM_GET_EXAMINE_NAME "atom_examine_name" //from base of atom/get_examine_name(): (/mob, list/overrides)
+///from base of atom/get_examine_name(): (/mob, list/overrides)
+#define COMSIG_ATOM_GET_EXAMINE_NAME "atom_examine_name"
+#define COMSIG_PARENT_EXAMINE_MORE "atom_examine_more" ///from base of atom/examine_more(): (/mob)
//Positions for overrides list
- #define EXAMINE_POSITION_ARTICLE 1
- #define EXAMINE_POSITION_BEFORE 2
+ #define EXAMINE_POSITION_ARTICLE (1<<0)
+ #define EXAMINE_POSITION_BEFORE (1<<1)
//End positions
- #define COMPONENT_EXNAME_CHANGED 1
+ #define COMPONENT_EXNAME_CHANGED (1<<0)
#define COMSIG_ATOM_UPDATE_ICON "atom_update_icon" //from base of atom/update_icon(): ()
#define COMSIG_ATOM_NO_UPDATE_ICON_STATE 1
#define COMSIG_ATOM_NO_UPDATE_OVERLAYS 2
@@ -135,10 +145,10 @@
#define HEARING_SPEAKER 2
// #define HEARING_LANGUAGE 3
#define HEARING_RAW_MESSAGE 4
- /* #define HEARING_RADIO_FREQ 5
- #define HEARING_SPANS 6
+// #define HEARING_RADIO_FREQ 5
+// #define HEARING_SPANS 6
#define HEARING_MESSAGE_MODE 7
- #define HEARING_SOURCE 8*/
+// #define HEARING_SOURCE 8
#define COMSIG_MOVABLE_DISPOSING "movable_disposing" //called when the movable is added to a disposal holder object for disposal movement: (obj/structure/disposalholder/holder, obj/machinery/disposal/source)
#define COMSIG_MOVABLE_TELEPORTED "movable_teleported" //from base of do_teleport(): (channel, turf/origin, turf/destination)
@@ -173,6 +183,10 @@
#define COMSIG_MOB_THROW "mob_throw" //from base of /mob/throw_item(): (atom/target)
#define COMSIG_MOB_KEY_CHANGE "mob_key_change" //from base of /mob/transfer_ckey(): (new_character, old_character)
#define COMSIG_MOB_PRE_PLAYER_CHANGE "mob_pre_player_change" //sent to the target mob from base of /mob/transfer_ckey() and /mind/transfer_to(): (our_character, their_character)
+///from /mob/living/handle_eye_contact(): (mob/living/other_mob)
+#define COMSIG_MOB_EYECONTACT "mob_eyecontact"
+ /// return this if you want to block printing this message to this person, if you want to print your own (does not affect the other person's message)
+ #define COMSIG_BLOCK_EYECONTACT (1<<0)
// #define COMPONENT_STOP_MIND_TRANSFER 1
#define COMSIG_MOB_UPDATE_SIGHT "mob_update_sight" //from base of /mob/update_sight(): ()
#define COMSIG_MOB_ON_NEW_MIND "mob_on_new_mind" //called when a new mind is assigned to a mob: ()
@@ -192,6 +206,8 @@
#define COMSIG_MOB_ANTAG_ON_GAIN "mob_antag_on_gain" //from base of /datum/antagonist/on_gain(): (antag_datum)
#define COMSIG_MOB_SPELL_CAN_CAST "mob_spell_can_cast" //from base of /obj/effect/proc_holder/spell/can_cast(): (spell)
+#define COMSIG_MOB_SWAP_HANDS "mob_swap_hands" //from base of mob/swap_hand(): (obj/item)
+ #define COMPONENT_BLOCK_SWAP 1
// /client signals
#define COMSIG_MOB_CLIENT_LOGIN "mob_client_login" //sent when a mob/login() finishes: (client)
@@ -216,6 +232,11 @@
#define COMSIG_LIVING_RUN_BLOCK "living_do_run_block" //from base of mob/living/do_run_block(): (real_attack, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone)
#define COMSIG_LIVING_GET_BLOCKING_ITEMS "get_blocking_items" //from base of mob/living/get_blocking_items(): (list/items)
+#define COMSIG_LIVING_ACTIVE_BLOCK_START "active_block_start" //from base of mob/living/keybind_start_active_blocking(): (obj/item/blocking_item, list/backup_items)
+ #define COMPONENT_PREVENT_BLOCK_START 1
+#define COMSIG_LIVING_ACTIVE_PARRY_START "active_parry_start" //from base of mob/living/initiate_parry_sequence(): (parrying_method, datum/parrying_item_mob_or_art, list/backup_items)
+ #define COMPONENT_PREVENT_PARRY_START 1
+
//ALL OF THESE DO NOT TAKE INTO ACCOUNT WHETHER AMOUNT IS 0 OR LOWER AND ARE SENT REGARDLESS!
#define COMSIG_LIVING_STATUS_STUN "living_stun" //from base of mob/living/Stun() (amount, update, ignore)
#define COMSIG_LIVING_STATUS_KNOCKDOWN "living_knockdown" //from base of mob/living/Knockdown() (amount, update, ignore)
@@ -227,10 +248,23 @@
#define COMSIG_LIVING_STATUS_STAGGER "living_stagger" //from base of mob/living/Stagger() (amount, update, ignore)
#define COMPONENT_NO_STUN 1 //For all of them
-// /mob/living/carbon signals
+#define COMSIG_LIVING_LIFE "life_tick" //from base of mob/living/Life() (seconds, times_fired)
+ #define COMPONENT_INTERRUPT_LIFE_BIOLOGICAL 1 // interrupt biological processes
+ #define COMPONENT_INTERRUPT_LIFE_PHYSICAL 2 // interrupt physical handling
+
+// /mob/living/carbon physiology signals
+#define COMSIG_CARBON_GAIN_WOUND "carbon_gain_wound" //from /datum/wound/proc/apply_wound() (/mob/living/carbon/C, /datum/wound/W, /obj/item/bodypart/L)
+#define COMSIG_CARBON_LOSE_WOUND "carbon_lose_wound" //from /datum/wound/proc/remove_wound() (/mob/living/carbon/C, /datum/wound/W, /obj/item/bodypart/L)
+///from base of /obj/item/bodypart/proc/attach_limb(): (new_limb, special) allows you to fail limb attachment
+#define COMSIG_CARBON_ATTACH_LIMB "carbon_attach_limb"
+ #define COMPONENT_NO_ATTACH (1<<0)
+#define COMSIG_CARBON_REMOVE_LIMB "carbon_remove_limb" //from base of /obj/item/bodypart/proc/drop_limb(special, dismembered)
+
#define COMSIG_CARBON_SOUNDBANG "carbon_soundbang" //from base of mob/living/carbon/soundbang_act(): (list(intensity))
#define COMSIG_CARBON_IDENTITY_TRANSFERRED_TO "carbon_id_transferred_to" //from datum/dna/transfer_identity(): (datum/dna, transfer_SE)
#define COMSIG_CARBON_TACKLED "carbon_tackled" //sends from tackle.dm on tackle completion
+#define COMSIG_CARBON_EMBED_RIP "item_embed_start_rip" // defined twice, in carbon and human's topics, fired when interacting with a valid embedded_object to pull it out (mob/living/carbon/target, /obj/item, /obj/item/bodypart/L)
+#define COMSIG_CARBON_EMBED_REMOVAL "item_embed_remove_safe" // called when removing a given item from a mob, from mob/living/carbon/remove_embedded_object(mob/living/carbon/target, /obj/item)
// /mob/living/silicon signals
#define COMSIG_ROBOT_UPDATE_ICONS "robot_update_icons" //from base of robot/update_icons(): ()
@@ -243,6 +277,9 @@
#define COMSIG_OBJ_DECONSTRUCT "obj_deconstruct" //from base of obj/deconstruct(): (disassembled)
#define COMSIG_OBJ_BREAK "obj_break" //from base of /obj/obj_break(): (damage_flag)
#define COMSIG_OBJ_SETANCHORED "obj_setanchored" //called in /obj/structure/setAnchored(): (value)
+#define COMSIG_OBJ_ATTACK_GENERIC "obj_attack_generic" //from base of atom/animal_attack(): (/mob/user)
+ #define COMPONENT_STOP_GENERIC_ATTACK 1
+
// /machinery signals
#define COMSIG_MACHINE_EJECT_OCCUPANT "eject_occupant" //from base of obj/machinery/dropContents() (occupant)
@@ -268,7 +305,13 @@
#define COMSIG_ITEM_ATTACK_ZONE "item_attack_zone" //from base of mob/living/carbon/attacked_by(): (mob/living/carbon/target, mob/living/user, hit_zone)
#define COMSIG_ITEM_IMBUE_SOUL "item_imbue_soul" //return a truthy value to prevent ensouling, checked in /obj/effect/proc_holder/spell/targeted/lichdom/cast(): (mob/user)
#define COMSIG_ITEM_HIT_REACT "item_hit_react" //from base of obj/item/hit_reaction(): (list/args)
-#define COMSIG_ITEM_WEARERCROSSED "wearer_crossed" //called on item when crossed by something (): (/atom/movable)
+#define COMSIG_ITEM_WEARERCROSSED "wearer_crossed" //called on item when crossed by something (): (/atom/movable)
+#define COMSIG_ITEM_SHARPEN_ACT "sharpen_act" //from base of item/sharpener/attackby(): (amount, max)
+ #define COMPONENT_BLOCK_SHARPEN_APPLIED 1
+ #define COMPONENT_BLOCK_SHARPEN_BLOCKED 2
+ #define COMPONENT_BLOCK_SHARPEN_ALREADY 4
+ #define COMPONENT_BLOCK_SHARPEN_MAXED 8
+#define COMSIG_ITEM_MICROWAVE_ACT "microwave_act" //called on item when microwaved (): (obj/machinery/microwave/M)
#define COMSIG_ITEM_WORN_OVERLAYS "item_worn_overlays" //from base of obj/item/worn_overlays(): (isinhands, icon_file, used_state, style_flags, list/overlays)
// THE FOLLOWING TWO BLOCKS SHOULD RETURN BLOCK FLAGS AS DEFINED IN __DEFINES/combat.dm!
#define COMSIG_ITEM_CHECK_BLOCK "check_block" //from base of obj/item/check_block(): (mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return)
@@ -277,9 +320,15 @@
#define COMSIG_ITEM_MOUSE_EXIT "item_mouse_exit" //from base of obj/item/MouseExited(): (location, control, params)
#define COMSIG_ITEM_MOUSE_ENTER "item_mouse_enter" //from base of obj/item/MouseEntered(): (location, control, params)
#define COMSIG_ITEM_DECONSTRUCTOR_DEEPSCAN "deconstructor_deepscan" //Called by deconstructive analyzers deepscanning an item: (obj/machinery/rnd/destructive_analyzer/analyzer_machine, mob/user, list/information_list)
+#define COMSIG_ITEM_DISABLE_EMBED "item_disable_embed" ///from [/obj/item/proc/disableEmbedding]:
+#define COMSIG_MINE_TRIGGERED "minegoboom" ///from [/obj/effect/mine/proc/triggermine]:
// Uncovered information
#define COMPONENT_DEEPSCAN_UNCOVERED_INFORMATION 1
+// /obj/item/grenade signals
+#define COMSIG_GRENADE_PRIME "grenade_prime" //called in /obj/item/gun/process_fire (user, target, params, zone_override)
+#define COMSIG_GRENADE_ARMED "grenade_armed" //called in /obj/item/gun/process_fire (user, target, params, zone_override)
+
// /obj/item/clothing signals
#define COMSIG_SHOES_STEP_ACTION "shoes_step_action" //from base of obj/item/clothing/shoes/proc/step_action(): ()
#define COMSIG_SUIT_MADE_HELMET "suit_made_helmet" //from base of obj/item/clothing/suit/MakeHelmet(): (helmet)
@@ -307,12 +356,20 @@
#define COMSIG_PEN_ROTATED "pen_rotated" //called after rotation in /obj/item/pen/attack_self(): (rotation, mob/living/carbon/user)
// /obj/item/projectile signals (sent to the firer)
+#define COMSIG_PROJECTILE_SELF_ON_HIT "projectile_self_on_hit" // from base of /obj/item/projectile/proc/on_hit(): (atom/movable/firer, atom/target, Angle)
#define COMSIG_PROJECTILE_ON_HIT "projectile_on_hit" // from base of /obj/item/projectile/proc/on_hit(): (atom/movable/firer, atom/target, Angle)
#define COMSIG_PROJECTILE_BEFORE_FIRE "projectile_before_fire" // from base of /obj/item/projectile/proc/fire(): (obj/item/projectile, atom/original_target)
+#define COMSIG_PROJECTILE_FIRE "projectile_fire" ///from the base of /obj/item/projectile/proc/fire(): ()
+#define COMSIG_PROJECTILE_RANGE_OUT "projectile_range_out" // sent to targets during the process_hit proc of projectiles
+#define COMSIG_EMBED_TRY_FORCE "item_try_embed" // sent when trying to force an embed (mainly for projectiles, only used in the embed element)
+#define COMSIG_PROJECTILE_PREHIT "com_proj_prehit" ///sent to targets during the process_hit proc of projectiles
+
+#define COMSIG_PELLET_CLOUD_INIT "pellet_cloud_init" // sent to targets during the process_hit proc of projectiles
// /mob/living/carbon/human signals
#define COMSIG_HUMAN_MELEE_UNARMED_ATTACK "human_melee_unarmed_attack" //from mob/living/carbon/human/UnarmedAttack(): (atom/target)
#define COMSIG_HUMAN_MELEE_UNARMED_ATTACKBY "human_melee_unarmed_attackby" //from mob/living/carbon/human/UnarmedAttack(): (mob/living/carbon/human/attacker)
+#define COMSIG_HUMAN_EARLY_UNARMED_ATTACK "human_early_unarmed_attack"
#define COMSIG_HUMAN_DISARM_HIT "human_disarm_hit" //Hit by successful disarm attack (mob/living/carbon/human/attacker,zone_targeted)
#define COMSIG_HUMAN_PREFS_COPIED_TO "human_prefs_copied_to" //from datum/preferences/copy_to(): (datum/preferences, icon_updates, roundstart_checks)
#define COMSIG_HUMAN_HARDSET_DNA "human_hardset_dna" //from mob/living/carbon/human/hardset_dna(): (ui, list/mutation_index, newreal_name, newblood_type, datum/species, newfeatures)
@@ -390,6 +447,11 @@
#define COMSIG_TRY_STORAGE_RETURN_INVENTORY "storage_return_inventory" //(list/list_to_inject_results_into, recursively_search_inside_storages = TRUE)
#define COMSIG_TRY_STORAGE_CAN_INSERT "storage_can_equip" //(obj/item/insertion_candidate, mob/user, silent) - returns bool
+// /datum/component/two_handed signals
+#define COMSIG_TWOHANDED_WIELD "twohanded_wield" //from base of datum/component/two_handed/proc/wield(mob/living/carbon/user): (/mob/user)
+ #define COMPONENT_TWOHANDED_BLOCK_WIELD 1
+#define COMSIG_TWOHANDED_UNWIELD "twohanded_unwield" //from base of datum/component/two_handed/proc/unwield(mob/living/carbon/user): (/mob/user)
+
// /datum/action signals
#define COMSIG_ACTION_TRIGGER "action_trigger" //from base of datum/action/proc/Trigger(): (datum/action)
#define COMPONENT_ACTION_BLOCK_TRIGGER 1
diff --git a/code/__DEFINES/food.dm b/code/__DEFINES/food.dm
index a347fd7327..77e8d82aca 100644
--- a/code/__DEFINES/food.dm
+++ b/code/__DEFINES/food.dm
@@ -18,4 +18,8 @@
#define DRINK_VERYGOOD 3
#define DRINK_FANTASTIC 4
#define FOOD_AMAZING 5
-#define RACE_DRINK 6
\ No newline at end of file
+#define RACE_DRINK 6
+
+#define FOOD_IN_CONTAINER (1<<0)
+
+#define STOP_SERVING_BREAKFAST (15 MINUTES)
diff --git a/code/__DEFINES/footsteps.dm b/code/__DEFINES/footsteps.dm
index 5acda2274c..2dd66b9833 100644
--- a/code/__DEFINES/footsteps.dm
+++ b/code/__DEFINES/footsteps.dm
@@ -6,6 +6,7 @@
#define FOOTSTEP_GRASS "grass"
#define FOOTSTEP_WATER "water"
#define FOOTSTEP_LAVA "lava"
+#define FOOTSTEP_MEAT "meat"
//barefoot sounds
#define FOOTSTEP_WOOD_BAREFOOT "woodbarefoot"
#define FOOTSTEP_WOOD_CLAW "woodclaw"
@@ -89,6 +90,8 @@ GLOBAL_LIST_INIT(footstep, list(
'sound/effects/footstep/lava1.ogg',
'sound/effects/footstep/lava2.ogg',
'sound/effects/footstep/lava3.ogg'), 100, 0),
+ FOOTSTEP_MEAT = list(list(
+ 'sound/effects/meatslap.ogg'), 100, 0)
))
//bare footsteps lists
@@ -131,6 +134,8 @@ GLOBAL_LIST_INIT(barefootstep, list(
'sound/effects/footstep/lava1.ogg',
'sound/effects/footstep/lava2.ogg',
'sound/effects/footstep/lava3.ogg'), 100, 0),
+ FOOTSTEP_MEAT = list(list(
+ 'sound/effects/meatslap.ogg'), 100, 0)
))
//claw footsteps lists
@@ -173,6 +178,8 @@ GLOBAL_LIST_INIT(clawfootstep, list(
'sound/effects/footstep/lava1.ogg',
'sound/effects/footstep/lava2.ogg',
'sound/effects/footstep/lava3.ogg'), 100, 0),
+ FOOTSTEP_MEAT = list(list(
+ 'sound/effects/meatslap.ogg'), 100, 0)
))
//heavy footsteps list
@@ -189,4 +196,6 @@ GLOBAL_LIST_INIT(heavyfootstep, list(
'sound/effects/footstep/lava1.ogg',
'sound/effects/footstep/lava2.ogg',
'sound/effects/footstep/lava3.ogg'), 100, 0),
+ FOOTSTEP_MEAT = list(list(
+ 'sound/effects/meatslap.ogg'), 100, 0)
))
diff --git a/code/__DEFINES/integrated_electronics.dm b/code/__DEFINES/integrated_electronics.dm
index 727314abc6..71bdfb37ea 100644
--- a/code/__DEFINES/integrated_electronics.dm
+++ b/code/__DEFINES/integrated_electronics.dm
@@ -7,10 +7,10 @@
#define PULSE_CHANNEL "pulse channel"
// Methods of obtaining a circuit.
-#define IC_SPAWN_DEFAULT 1 // If the circuit comes in the default circuit box and able to be printed in the IC printer.
+#define IC_SPAWN_DEFAULT 1 // If the circuit comes in the default circuit box and is able to be printed in the IC printer.
#define IC_SPAWN_RESEARCH 2 // If the circuit design will be available in the IC printer after upgrading it.
-// Categories that help differentiate circuits that can do different tipes of actions
+// Categories that help differentiate circuits that can do different types of actions
#define IC_ACTION_MOVEMENT (1<<0) // If the circuit can move the assembly
#define IC_ACTION_COMBAT (1<<1) // If the circuit can cause harm
#define IC_ACTION_LONG_RANGE (1<<2) // If the circuit communicate with something outside of the assembly
diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm
index c55662e86f..964c4e911e 100644
--- a/code/__DEFINES/is_helpers.dm
+++ b/code/__DEFINES/is_helpers.dm
@@ -65,9 +65,8 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list(
#define isslimeperson(A) (is_species(A, /datum/species/jelly/slime))
#define isluminescent(A) (is_species(A, /datum/species/jelly/luminescent))
#define iszombie(A) (is_species(A, /datum/species/zombie))
-#define ismoth(A) (is_species(A, /datum/species/insect))
#define ishumanbasic(A) (is_species(A, /datum/species/human))
-#define iscatperson(A) (ishumanbasic(A) && istype(A.dna.species, /datum/species/human/felinid) )
+#define iscatperson(A) (ishumanbasic(A) && istype(A.dna.species, /datum/species/human/felinid))
#define isdwarf(A) (is_species(A, /datum/species/dwarf))
#define isdullahan(A) (is_species(A, /datum/species/dullahan))
#define isangel(A) (is_species(A, /datum/species/angel))
@@ -80,8 +79,6 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list(
#define isipcperson(A) (is_species(A, /datum/species/ipc))
#define issynthliz(A) (is_species(A, /datum/species/synthliz))
#define ismammal(A) (is_species(A, /datum/species/mammal))
-#define isavian(A) (is_species(A, /datum/species/avian))
-#define isaquatic(A) (is_species(A, /datum/species/aquatic))
#define isinsect(A) (is_species(A, /datum/species/insect))
#define isxenoperson(A) (is_species(A, /datum/species/xeno))
#define isstartjelly(A) (is_species(A, /datum/species/jelly/roundstartslime))
@@ -135,6 +132,8 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list(
#define iscat(A) (istype(A, /mob/living/simple_animal/pet/cat))
+#define isdog(A) (istype(A, /mob/living/simple_animal/pet/dog))
+
#define iscorgi(A) (istype(A, /mob/living/simple_animal/pet/dog/corgi))
#define ishostile(A) (istype(A, /mob/living/simple_animal/hostile))
@@ -180,6 +179,12 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list(
#define isitem(A) (istype(A, /obj/item))
+#define isgrenade(A) (istype(A, /obj/item/grenade))
+
+#define islandmine(A) (istype(A, /obj/effect/mine))
+
+#define isammocasing(A) (istype(A, /obj/item/ammo_casing))
+
#define isidcard(I) (istype(I, /obj/item/card/id))
#define isstructure(A) (istype(A, /obj/structure))
@@ -208,7 +213,7 @@ GLOBAL_LIST_INIT(pointed_types, typecacheof(list(
#define isgun(A) (istype(A, /obj/item/gun))
-#define isfood(A) (istype(A, /obj/item/reagent_containers/food))
+#define isfood(A) (istype(A, /obj/item/reagent_containers/food/snacks))
//Assemblies
#define isassembly(O) (istype(O, /obj/item/assembly))
diff --git a/code/__DEFINES/logging.dm b/code/__DEFINES/logging.dm
index 7e1559cede..71de692410 100644
--- a/code/__DEFINES/logging.dm
+++ b/code/__DEFINES/logging.dm
@@ -38,6 +38,7 @@
#define LOG_ADMIN_PRIVATE (1 << 14)
#define LOG_ASAY (1 << 15)
#define LOG_VIRUS (1 << 16)
+#define LOG_SHUTTLE (1 << 18)
//Individual logging panel pages
#define INDIVIDUAL_ATTACK_LOG (LOG_ATTACK)
diff --git a/code/__DEFINES/machines.dm b/code/__DEFINES/machines.dm
index 5a26feb624..0e8e34d20e 100644
--- a/code/__DEFINES/machines.dm
+++ b/code/__DEFINES/machines.dm
@@ -115,3 +115,7 @@
//these flags are used to tell the DNA modifier if a plant gene cannot be extracted or modified.
#define PLANT_GENE_REMOVABLE (1<<0)
#define PLANT_GENE_EXTRACTABLE (1<<1)
+
+#define CLONEPOD_GET_MIND 1
+#define CLONEPOD_POLL_MIND 2
+#define CLONEPOD_NO_MIND 3
\ No newline at end of file
diff --git a/code/__DEFINES/materials.dm b/code/__DEFINES/materials.dm
index e2ae22345f..72e827a7c8 100644
--- a/code/__DEFINES/materials.dm
+++ b/code/__DEFINES/materials.dm
@@ -4,8 +4,12 @@
/// Hard materials, such as iron or metal
#define MAT_CATEGORY_RIGID "rigid material"
+///Use this flag on TRUE if you want the basic recipes
+#define MAT_CATEGORY_BASE_RECIPES "basic recipes"
+
/// Flag for atoms, this flag ensures it isn't re-colored by materials. Useful for snowflake icons such as default toolboxes.
#define MATERIAL_COLOR (1<<0)
#define MATERIAL_ADD_PREFIX (1<<1)
-#define MATERIAL_EFFECTS (1<<2)
-#define MATERIAL_AFFECT_STATISTICS (1<<3)
\ No newline at end of file
+#define MATERIAL_AFFECT_STATISTICS (1<<2)
+
+#define MATERIAL_SOURCE(mat) "[mat.name]_material"
\ No newline at end of file
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index a39ebf36ba..120fdcb72d 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -432,6 +432,7 @@ GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_S
//text files
#define BRAIN_DAMAGE_FILE "traumas.json"
#define ION_FILE "ion_laws.json"
+#define REDPILL_FILE "redpill.json"
#define PIRATE_NAMES_FILE "pirates.json"
@@ -461,7 +462,7 @@ GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_S
#define EGG_LAYING_MESSAGES list("lays an egg.","squats down and croons.","begins making a huge racket.","begins clucking raucously.")
// list of all null rod weapons
-#define HOLY_WEAPONS /obj/item/nullrod, /obj/item/twohanded/dualsaber/hypereutactic/chaplain, /obj/item/gun/energy/laser/redtag/hitscan/chaplain, /obj/item/multitool/chaplain, /obj/item/clothing/gloves/fingerless/pugilist/chaplain, /obj/item/melee/baseball_bat/chaplain
+#define HOLY_WEAPONS /obj/item/nullrod, /obj/item/dualsaber/hypereutactic/chaplain, /obj/item/gun/energy/laser/redtag/hitscan/chaplain, /obj/item/multitool/chaplain, /obj/item/clothing/gloves/fingerless/pugilist/chaplain, /obj/item/melee/baseball_bat/chaplain
// Used by PDA and cartridge code to reduce repetitiveness of spritesheets
#define PDAIMG(what) {""}
@@ -533,3 +534,10 @@ GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_S
#define LOOT_RESTRICTION_CKEY 2
#define LOOT_RESTRICTION_MIND_PILE 3 //limited to the current pile.
#define LOOT_RESTRICTION_CKEY_PILE 4 //Idem
+
+//stages of shoe tying-ness
+#define SHOES_UNTIED 0
+#define SHOES_TIED 1
+#define SHOES_KNOTTED 2
+
+#define WANTED_FILE "wanted_message.json"
diff --git a/code/__DEFINES/misc/return_values.dm b/code/__DEFINES/misc/return_values.dm
deleted file mode 100644
index d55f603de9..0000000000
--- a/code/__DEFINES/misc/return_values.dm
+++ /dev/null
@@ -1,3 +0,0 @@
-// obj/item/dropped
-/// dropped() relocated this item, return FALSE for doUnEquip.
-#define ITEM_RELOCATED_BY_DROPPED "relocated_by_dropped"
diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index 8d8b9f47ae..52657e9104 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -12,6 +12,8 @@
#define MOVE_INTENT_RUN "run"
//Blood levels
+#define BLOOD_VOLUME_MAX_LETHAL 2150
+#define BLOOD_VOLUME_EXCESS 2100
#define BLOOD_VOLUME_MAXIMUM 2000
#define BLOOD_VOLUME_SLIME_SPLIT 1120
#define BLOOD_VOLUME_NORMAL 560
@@ -57,6 +59,7 @@
#define BODYPART_NOT_DISABLED 0
#define BODYPART_DISABLED_DAMAGE 1
#define BODYPART_DISABLED_PARALYSIS 2
+#define BODYPART_DISABLED_WOUND 3
#define DEFAULT_BODYPART_ICON 'icons/mob/human_parts.dmi'
#define DEFAULT_BODYPART_ICON_ORGANIC 'icons/mob/human_parts_greyscale.dmi'
@@ -98,16 +101,19 @@
#define BRAIN_TRAUMA_MILD /datum/brain_trauma/mild
#define BRAIN_TRAUMA_SEVERE /datum/brain_trauma/severe
#define BRAIN_TRAUMA_SPECIAL /datum/brain_trauma/special
+#define BRAIN_TRAUMA_MAGIC /datum/brain_trauma/magic
#define TRAUMA_RESILIENCE_BASIC 1 //Curable with chems
#define TRAUMA_RESILIENCE_SURGERY 2 //Curable with brain surgery
#define TRAUMA_RESILIENCE_LOBOTOMY 3 //Curable with lobotomy
-#define TRAUMA_RESILIENCE_MAGIC 4 //Curable only with magic
-#define TRAUMA_RESILIENCE_ABSOLUTE 5 //This is here to stay
+#define TRAUMA_RESILIENCE_WOUND 4 //Curable by healing the head wound
+#define TRAUMA_RESILIENCE_MAGIC 5 //Curable only with magic
+#define TRAUMA_RESILIENCE_ABSOLUTE 6 //This is here to stay
//Limit of traumas for each resilience tier
#define TRAUMA_LIMIT_BASIC 3
#define TRAUMA_LIMIT_SURGERY 2
+#define TRAUMA_LIMIT_WOUND 2
#define TRAUMA_LIMIT_LOBOTOMY 3
#define TRAUMA_LIMIT_MAGIC 3
#define TRAUMA_LIMIT_ABSOLUTE INFINITY
@@ -304,8 +310,15 @@
#define GRAB_PIXEL_SHIFT_NECK 16
#define SLEEP_CHECK_DEATH(X) sleep(X); if(QDELETED(src) || stat == DEAD) return;
+#define INTERACTING_WITH(X, Y) (Y in X.do_afters)
/// Field of vision defines.
#define FOV_90_DEGREES 90
#define FOV_180_DEGREES 180
#define FOV_270_DEGREES 270
+
+/// How far away you can be to make eye contact with someone while examining
+#define EYE_CONTACT_RANGE 5
+
+/// If you examine the same atom twice in this timeframe, we call examine_more() instead of examine()
+#define EXAMINE_MORE_TIME 1 SECONDS
diff --git a/code/__DEFINES/mobs/slowdowns.dm b/code/__DEFINES/mobs/slowdowns.dm
index 2d858e9509..4d9b4a0259 100644
--- a/code/__DEFINES/mobs/slowdowns.dm
+++ b/code/__DEFINES/mobs/slowdowns.dm
@@ -3,7 +3,7 @@
/// How much someone is slowed from fireman carrying a human
#define FIREMAN_CARRY_SLOWDOWN 0
/// How much someone is slowed by piggybacking a human
-#define PIGGYBACK_CARRY_SLOWDOWN 1
+#define PIGGYBACK_CARRY_SLOWDOWN 0
/// slowdown when in softcrit. Note that crawling slowdown will also apply at the same time!
#define SOFTCRIT_ADD_SLOWDOWN 2
/// slowdown when crawling
diff --git a/code/__DEFINES/movespeed_modification.dm b/code/__DEFINES/movespeed_modification.dm
index 699f39e79f..5e7d0a2cca 100644
--- a/code/__DEFINES/movespeed_modification.dm
+++ b/code/__DEFINES/movespeed_modification.dm
@@ -63,7 +63,6 @@
#define MOVESPEED_ID_TASED_STATUS "TASED"
#define MOVESPEED_ID_ELECTROSTAFF "ELECTROSTAFF"
-#define MOVESPEED_ID_SHOVE "SHOVE"
#define MOVESPEED_ID_FAT "FAT"
#define MOVESPEED_ID_COLD "COLD"
#define MOVESPEED_ID_HUNGRY "HUNGRY"
diff --git a/code/__DEFINES/robots.dm b/code/__DEFINES/robots.dm
index 09cea91540..a0fded3798 100644
--- a/code/__DEFINES/robots.dm
+++ b/code/__DEFINES/robots.dm
@@ -27,6 +27,7 @@
#define BOT_NAV 15 // computing navigation
#define BOT_WAIT_FOR_NAV 16 // waiting for nav computation
#define BOT_NO_ROUTE 17 // no destination beacon found (or no route)
+#define BOT_TIPPED 18 // someone tipped a medibot over ;_;
//Bot types
#define SEC_BOT (1<<0) // Secutritrons (Beepsky) and ED-209s
diff --git a/code/__DEFINES/rust_g.dm b/code/__DEFINES/rust_g.dm
index aeacdb7c51..20e7975ec4 100644
--- a/code/__DEFINES/rust_g.dm
+++ b/code/__DEFINES/rust_g.dm
@@ -6,7 +6,7 @@
#define RUSTG_JOB_ERROR "JOB PANICKED"
#define rustg_dmi_strip_metadata(fname) call(RUST_G, "dmi_strip_metadata")(fname)
-#define rustg_dmi_create_png(fname,width,height,data) call(RUST_G, "dmi_create_png")(fname,width,height,data)
+#define rustg_dmi_create_png(path, width, height, data) call(RUST_G, "dmi_create_png")(path, width, height, data)
#define rustg_git_revparse(rev) call(RUST_G, "rg_git_revparse")(rev)
#define rustg_git_commit_date(rev) call(RUST_G, "rg_git_commit_date")(rev)
@@ -14,14 +14,12 @@
#define rustg_log_write(fname, text, format) call(RUST_G, "log_write")(fname, text, format)
/proc/rustg_log_close_all() return call(RUST_G, "log_close_all")()
-// RUST-G defines & procs for HTTP component
#define RUSTG_HTTP_METHOD_GET "get"
-#define RUSTG_HTTP_METHOD_POST "post"
#define RUSTG_HTTP_METHOD_PUT "put"
#define RUSTG_HTTP_METHOD_DELETE "delete"
#define RUSTG_HTTP_METHOD_PATCH "patch"
#define RUSTG_HTTP_METHOD_HEAD "head"
-
+#define RUSTG_HTTP_METHOD_POST "post"
#define rustg_http_request_blocking(method, url, body, headers) call(RUST_G, "http_request_blocking")(method, url, body, headers)
#define rustg_http_request_async(method, url, body, headers) call(RUST_G, "http_request_async")(method, url, body, headers)
#define rustg_http_check_request(req_id) call(RUST_G, "http_check_request")(req_id)
diff --git a/code/__DEFINES/shuttles.dm b/code/__DEFINES/shuttles.dm
index 36ecebb699..80983b34be 100644
--- a/code/__DEFINES/shuttles.dm
+++ b/code/__DEFINES/shuttles.dm
@@ -7,6 +7,8 @@
#define SHUTTLE_STRANDED "stranded"
#define SHUTTLE_ESCAPE "escape"
#define SHUTTLE_ENDGAME "endgame: game over"
+#define SHUTTLE_RECHARGING "recharging"
+#define SHUTTLE_PREARRIVAL "landing"
#define EMERGENCY_IDLE_OR_RECALLED (SSshuttle.emergency && ((SSshuttle.emergency.mode == SHUTTLE_IDLE) || (SSshuttle.emergency.mode == SHUTTLE_RECALL)))
#define EMERGENCY_ESCAPED_OR_ENDGAMED (SSshuttle.emergency && ((SSshuttle.emergency.mode == SHUTTLE_ESCAPE) || (SSshuttle.emergency.mode == SHUTTLE_ENDGAME)))
diff --git a/code/__DEFINES/skills/defines.dm b/code/__DEFINES/skills/defines.dm
index 659c0fe11b..47aaeeb1dc 100644
--- a/code/__DEFINES/skills/defines.dm
+++ b/code/__DEFINES/skills/defines.dm
@@ -8,12 +8,6 @@
/// Levels
#define SKILL_PROGRESSION_LEVEL 4
-
-/// Max value of skill for numerical skills
-#define SKILL_NUMERICAL_MAX 100
-/// Min value of skill for numerical skills
-#define SKILL_NUMERICAL_MIN 0
-
// Standard values for job starting skills
#define STARTING_SKILL_SURGERY_MEDICAL 35 //out of SKILL_NUMERICAL_MAX
@@ -26,6 +20,13 @@
#define DEF_SKILL_GAIN 1
#define SKILL_GAIN_SURGERY_PER_STEP 0.25
+#define STD_USE_TOOL_MULT 1
+#define EASY_USE_TOOL_MULT 0.75
+#define TRIVIAL_USE_TOOL_MULT 0.5
+#define BARE_USE_TOOL_MULT 0.25
+
+//multiplier of the difference of max_value and min_value. Mostly for balance purposes between numerical and level-based skills.
+#define STD_NUM_SKILL_ITEM_GAIN_MULTI 0.002
//An extra point for each few seconds of delay when using a tool. Before the multiplier.
#define SKILL_GAIN_DELAY_DIVISOR 3 SECONDS
@@ -100,4 +101,10 @@
///Ascending priority defines.
#define MODIFIER_SKILL_PRIORITY_LOW 100
#define MODIFIER_SKILL_PRIORITY_DEF 50
-#define MODIFIER_SKILL_PRIORITY_MAX 1 //max priority, meant for job/antag modifiers so they don't null out other (de)buffs
\ No newline at end of file
+#define MODIFIER_SKILL_PRIORITY_MAX 1 //max priority, meant for job/antag modifiers so they don't null out other (de)buffs
+
+// UI Defines
+///Categories of skills, these will be displayed alphabetically.
+#define SKILL_UI_CAT_ENG "Engineering"
+#define SKILL_UI_CAT_MED "Medical"
+#define SKILL_UI_CAT_MISC "Misc"
diff --git a/code/__DEFINES/spaceman_dmm.dm b/code/__DEFINES/spaceman_dmm.dm
index b9c0544bc1..e21f3dc1c1 100644
--- a/code/__DEFINES/spaceman_dmm.dm
+++ b/code/__DEFINES/spaceman_dmm.dm
@@ -6,13 +6,28 @@
#define RETURN_TYPE(X) set SpacemanDMM_return_type = X
#define SHOULD_CALL_PARENT(X) set SpacemanDMM_should_call_parent = X
#define UNLINT(X) SpacemanDMM_unlint(X)
+ #define SHOULD_NOT_OVERRIDE(X) set SpacemanDMM_should_not_override = X
+ #define SHOULD_NOT_SLEEP(X) set SpacemanDMM_should_not_sleep = X
+ #define SHOULD_BE_PURE(X) set SpacemanDMM_should_be_pure = X
+ #define PRIVATE_PROC(X) set SpacemanDMM_private_proc = X
+ #define PROTECTED_PROC(X) set SpacemanDMM_protected_proc = X
+ #define VAR_FINAL var/SpacemanDMM_final
+ #define VAR_PRIVATE var/SpacemanDMM_private
+ #define VAR_PROTECTED var/SpacemanDMM_protected
#else
#define RETURN_TYPE(X)
#define SHOULD_CALL_PARENT(X)
#define UNLINT(X) X
+ #define SHOULD_NOT_OVERRIDE(X)
+ #define SHOULD_NOT_SLEEP(X)
+ #define SHOULD_BE_PURE(X)
+ #define PRIVATE_PROC(X)
+ #define PROTECTED_PROC(X)
+ #define VAR_FINAL var
+ #define VAR_PRIVATE var
+ #define VAR_PROTECTED var
#endif
/world/proc/enable_debugger()
- var/dll = world.GetConfig("env", "EXTOOLS_DLL")
- if (dll)
- call(dll, "debug_initialize")()
+ if (fexists(EXTOOLS))
+ call(EXTOOLS, "debug_initialize")()
diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm
index 593edf4705..9a3b5d55f4 100644
--- a/code/__DEFINES/status_effects.dm
+++ b/code/__DEFINES/status_effects.dm
@@ -36,6 +36,8 @@
#define STATUS_EFFECT_REGENERATIVE_CORE /datum/status_effect/regenerative_core //removes damage slowdown while giving a slow regenerating effect
+#define STATUS_EFFECT_DETERMINED /datum/status_effect/determined //currently in a combat high from being seriously wounded
+
/////////////
// DEBUFFS //
/////////////
@@ -96,6 +98,8 @@
#define STATUS_EFFECT_SPASMS /datum/status_effect/spasms //causes random muscle spasms
+#define STATUS_EFFECT_FAKE_VIRUS /datum/status_effect/fake_virus //gives you fluff messages for cough, sneeze, headache, etc but without an actual virus
+
#define STATUS_EFFECT_BREASTS_ENLARGEMENT /datum/status_effect/chem/breast_enlarger //Applied slowdown due to the ominous bulk.
#define STATUS_EFFECT_PENIS_ENLARGEMENT /datum/status_effect/chem/penis_enlarger //More applied slowdown, just like the above.
@@ -105,6 +109,11 @@
#define STATUS_EFFECT_ELECTROSTAFF /datum/status_effect/electrostaff //slows down victim
+#define STATUS_EFFECT_LIMP /datum/status_effect/limp //For when you have a busted leg (or two!) and want additional slowdown when walking on that leg
+
+/// shoves inflict this to indicate the next shove while this is in effect should disarm guns
+#define STATUS_EFFECT_OFF_BALANCE /datum/status_effect/off_balance
+
/////////////
// NEUTRAL //
/////////////
diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm
index 8c423ad09c..7a188281d0 100644
--- a/code/__DEFINES/subsystems.dm
+++ b/code/__DEFINES/subsystems.dm
@@ -107,6 +107,7 @@
#define FIRE_PRIORITY_INSTRUMENTS 30
#define FIRE_PRIORITY_FIELDS 30
#define FIRE_PRIOTITY_SMOOTHING 35
+#define FIRE_PRIORITY_HUDS 40
#define FIRE_PRIORITY_NETWORKS 40
#define FIRE_PRIORITY_OBJ 40
#define FIRE_PRIORITY_ACID 40
@@ -137,12 +138,13 @@
// SSair run section
#define SSAIR_PIPENETS 1
#define SSAIR_ATMOSMACHINERY 2
-#define SSAIR_REACTQUEUE 3
-#define SSAIR_EXCITEDGROUPS 4
-#define SSAIR_HIGHPRESSURE 5
-#define SSAIR_HOTSPOTS 6
-#define SSAIR_SUPERCONDUCTIVITY 7
-#define SSAIR_REBUILD_PIPENETS 8
+#define SSAIR_EXCITEDGROUPS 3
+#define SSAIR_HIGHPRESSURE 4
+#define SSAIR_HOTSPOTS 5
+#define SSAIR_SUPERCONDUCTIVITY 6
+#define SSAIR_REBUILD_PIPENETS 7
+#define SSAIR_EQUALIZE 8
+#define SSAIR_ACTIVETURFS 9
#define COMPILE_OVERLAYS(A)\
if (TRUE) {\
@@ -151,14 +153,17 @@
var/list/po = A.priority_overlays;\
if(LAZYLEN(rm)){\
A.overlays -= rm;\
- rm.Cut();\
+ A.remove_overlays = null;\
}\
if(LAZYLEN(ad)){\
A.overlays |= ad;\
- ad.Cut();\
+ A.add_overlays = null;\
}\
if(LAZYLEN(po)){\
A.overlays |= po;\
}\
+ else{\
+ A.priority_overlays = null;\
+ }\
A.flags_1 &= ~OVERLAY_QUEUED_1;\
}
diff --git a/code/__DEFINES/tools.dm b/code/__DEFINES/tools.dm
index 7e391caaed..a472e83795 100644
--- a/code/__DEFINES/tools.dm
+++ b/code/__DEFINES/tools.dm
@@ -17,6 +17,7 @@
//Glasswork Tools
#define TOOL_BLOW "blowing_rod"
#define TOOL_GLASS_CUT "glasskit"
+#define TOOL_BONESET "bonesetter"
// If delay between the start and the end of tool operation is less than MIN_TOOL_SOUND_DELAY,
// tool sound is only played when op is started. If not, it's played twice.
diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index f3f9f1e8b5..3e5b27d376 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -61,6 +61,12 @@
} while (0)
#define HAS_TRAIT(target, trait) (target.status_traits ? (target.status_traits[trait] ? TRUE : FALSE) : FALSE)
#define HAS_TRAIT_FROM(target, trait, source) (target.status_traits ? (target.status_traits[trait] ? (source in target.status_traits[trait]) : FALSE) : FALSE)
+#define HAS_TRAIT_FROM_ONLY(target, trait, source) (\
+ target.status_traits ?\
+ (target.status_traits[trait] ?\
+ ((source in target.status_traits[trait]) && (length(target.status_traits) == 1))\
+ : FALSE)\
+ : FALSE)
#define HAS_TRAIT_NOT_FROM(target, trait, source) (target.status_traits ? (target.status_traits[trait] ? (length(target.status_traits[trait] - source) > 0) : FALSE) : FALSE)
//mob traits
@@ -196,6 +202,7 @@
#define TRAIT_NO_ALCOHOL "alcohol_intolerance"
#define TRAIT_MUTATION_STASIS "mutation_stasis" //Prevents processed genetics mutations from processing.
#define TRAIT_FAST_PUMP "fast_pump"
+#define TRAIT_NICE_SHOT "nice_shot" //hnnnnnnnggggg..... you're pretty good....
// mobility flag traits
// IN THE FUTURE, IT WOULD BE NICE TO DO SOMETHING SIMILAR TO https://github.com/tgstation/tgstation/pull/48923/files (ofcourse not nearly the same because I have my.. thoughts on it)
@@ -221,10 +228,12 @@
#define TRAIT_SPRINT_LOCKED "sprint_locked"
//non-mob traits
-#define TRAIT_PARALYSIS "paralysis" //Used for limb-based paralysis, where replacing the limb will fix it
+#define TRAIT_PARALYSIS "paralysis" //Used for limb-based paralysis, where replacing the limb will fix it
#define VEHICLE_TRAIT "vehicle" // inherited from riding vehicles
#define INNATE_TRAIT "innate"
+///Used for managing KEEP_TOGETHER in [appearance_flags]
+#define TRAIT_KEEP_TOGETHER "keep-together"
// item traits
#define TRAIT_NODROP "nodrop"
@@ -301,3 +310,4 @@
#define ACTIVE_BLOCK_TRAIT "active_block"
/// This trait is added by the parry system.
#define ACTIVE_PARRY_TRAIT "active_parry"
+#define STICKY_NODROP "sticky-nodrop" //sticky nodrop sounds like a bad soundcloud rapper's name
\ No newline at end of file
diff --git a/code/__DEFINES/vv.dm b/code/__DEFINES/vv.dm
index 889e1bb1c0..101330cc8b 100644
--- a/code/__DEFINES/vv.dm
+++ b/code/__DEFINES/vv.dm
@@ -76,6 +76,13 @@
#define VV_HK_ADDCOMPONENT "addcomponent"
#define VV_HK_MODIFY_TRAITS "modtraits"
+// /datum/gas_mixture
+#define VV_HK_SET_MOLES "set_moles"
+#define VV_HK_EMPTY "empty"
+#define VV_HK_SET_TEMPERATURE "set_temp"
+#define VV_HK_PARSE_GASSTRING "parse_gasstring"
+#define VV_HK_SET_VOLUME "set_volume"
+
// /atom
#define VV_HK_MODIFY_TRANSFORM "atom_transform"
#define VV_HK_ADD_REAGENT "addreagent"
diff --git a/code/__DEFINES/wounds.dm b/code/__DEFINES/wounds.dm
new file mode 100644
index 0000000000..b993429961
--- /dev/null
+++ b/code/__DEFINES/wounds.dm
@@ -0,0 +1,43 @@
+#define WOUND_DAMAGE_EXPONENT 1.4
+
+#define WOUND_SEVERITY_TRIVIAL 0 // for jokey/meme wounds like stubbed toe, no standard messages/sounds or second winds
+#define WOUND_SEVERITY_MODERATE 1
+#define WOUND_SEVERITY_SEVERE 2
+#define WOUND_SEVERITY_CRITICAL 3
+#define WOUND_SEVERITY_LOSS 4 // theoretical total limb loss, like dismemberment for cuts
+
+#define WOUND_BRUTE 0
+#define WOUND_SHARP 1
+#define WOUND_BURN 2
+
+// How much determination reagent to add each time someone gains a new wound in [/datum/wound/proc/second_wind()]
+#define WOUND_DETERMINATION_MODERATE 1
+#define WOUND_DETERMINATION_SEVERE 2.5
+#define WOUND_DETERMINATION_CRITICAL 5
+
+#define WOUND_DETERMINATION_MAX 10
+
+// set wound_bonus on an item or attack to this to disable checking wounding for the attack
+#define CANT_WOUND -100
+
+// list in order of highest severity to lowest
+#define WOUND_LIST_BONE list(/datum/wound/brute/bone/critical, /datum/wound/brute/bone/severe, /datum/wound/brute/bone/moderate)
+#define WOUND_LIST_CUT list(/datum/wound/brute/cut/loss, /datum/wound/brute/cut/critical, /datum/wound/brute/cut/severe, /datum/wound/brute/cut/moderate)
+#define WOUND_LIST_BURN list(/datum/wound/burn/critical, /datum/wound/burn/severe, /datum/wound/burn/moderate)
+
+// Thresholds for infection for burn wounds, once infestation hits each threshold, things get steadily worse
+#define WOUND_INFECTION_MODERATE 4 // below this has no ill effects from infection
+#define WOUND_INFECTION_SEVERE 8 // then below here, you ooze some pus and suffer minor tox damage, but nothing serious
+#define WOUND_INFECTION_CRITICAL 12 // then below here, your limb occasionally locks up from damage and infection and briefly becomes disabled. Things are getting really bad
+#define WOUND_INFECTION_SEPTIC 20 // below here, your skin is almost entirely falling off and your limb locks up more frequently. You are within a stone's throw of septic paralysis and losing the limb
+// above WOUND_INFECTION_SEPTIC, your limb is completely putrid and you start rolling to lose the entire limb by way of paralyzation. After 3 failed rolls (~4-5% each probably), the limb is paralyzed
+
+#define WOUND_BURN_SANITIZATION_RATE 0.15 // how quickly sanitization removes infestation and decays per tick
+#define WOUND_CUT_MAX_BLOODFLOW 8 // how much blood you can lose per tick per cut max. 8 is a LOT of blood for one cut so don't worry about hitting it easily
+#define WOUND_BONE_HEAD_TIME_VARIANCE 20 // if we suffer a bone wound to the head that creates brain traumas, the timer for the trauma cycle is +/- by this percent (0-100)
+
+// The following are for persistent scar save formats
+#define SCAR_SAVE_ZONE 1 // The body_zone we're applying to on granting
+#define SCAR_SAVE_DESC 2 // The description we're loading
+#define SCAR_SAVE_PRECISE_LOCATION 3 // The precise location we're loading
+#define SCAR_SAVE_SEVERITY 4 // The severity the scar had
diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm
index ba29205452..719735392d 100644
--- a/code/__HELPERS/_lists.dm
+++ b/code/__HELPERS/_lists.dm
@@ -69,7 +69,7 @@
/proc/english_list(list/input, nothing_text = "nothing", and_text = " and ", comma_text = ", ", final_comma_text = "" )
var/total = input.len
if (!total)
- return "[nothing_text]"
+ return nothing_text
else if (total == 1)
return "[input[1]]"
else if (total == 2)
diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm
index 48f54fd60f..733cbcfd8d 100644
--- a/code/__HELPERS/_logging.dm
+++ b/code/__HELPERS/_logging.dm
@@ -55,7 +55,7 @@
WRITE_LOG(GLOB.world_game_log, "ADMIN: DSAY: [text]")
/proc/log_consent(text)
- WRITE_LOG(GLOB.world_game_log,"CONSENT: [text]")
+ WRITE_LOG(GLOB.world_game_log, "CONSENT: [text]")
/* All other items are public. */
/proc/log_game(text)
@@ -66,6 +66,9 @@
if (CONFIG_GET(flag/log_virus))
WRITE_LOG(GLOB.world_virus_log, "VIRUS: [text]")
+/proc/log_asset(text)
+ WRITE_LOG(GLOB.world_asset_log, "ASSET: [text]")
+
/proc/log_access(text)
if (CONFIG_GET(flag/log_access))
WRITE_LOG(GLOB.world_game_log, "ACCESS: [text]")
@@ -78,6 +81,10 @@
if (CONFIG_GET(flag/log_attack))
WRITE_LOG(GLOB.world_attack_log, "ATTACK: [text]")
+/proc/log_wounded(text)
+ if (CONFIG_GET(flag/log_attack))
+ WRITE_LOG(GLOB.world_attack_log, "WOUND: [text]")
+
/proc/log_manifest(ckey, datum/mind/mind,mob/body, latejoin = FALSE)
if (CONFIG_GET(flag/log_manifest))
WRITE_LOG(GLOB.world_manifest_log, "[ckey] \\ [body.real_name] \\ [mind.assigned_role] \\ [mind.special_role ? mind.special_role : "NONE"] \\ [latejoin ? "LATEJOIN":"ROUNDSTART"]")
@@ -115,6 +122,9 @@
//reusing the PDA option because I really don't think news comments are worth a config option
WRITE_LOG(GLOB.world_pda_log, "COMMENT: [text]")
+/proc/log_paper(text)
+ WRITE_LOG(GLOB.world_paper_log, "PAPER: [text]")
+
/proc/log_telecomms(text)
if (CONFIG_GET(flag/log_telecomms))
WRITE_LOG(GLOB.world_telecomms_log, "TCOMMS: [text]")
@@ -128,6 +138,10 @@
if (CONFIG_GET(flag/log_vote))
WRITE_LOG(GLOB.world_game_log, "VOTE: [text]")
+/proc/log_shuttle(text)
+ if (CONFIG_GET(flag/log_shuttle))
+ WRITE_LOG(GLOB.world_shuttle_log, "SHUTTLE: [text]")
+
/proc/log_craft(text)
if (CONFIG_GET(flag/log_craft))
WRITE_LOG(GLOB.world_crafting_log, "CRAFT: [text]")
diff --git a/code/__HELPERS/_string_lists.dm b/code/__HELPERS/_string_lists.dm
index 7d694c1844..43d45594e0 100644
--- a/code/__HELPERS/_string_lists.dm
+++ b/code/__HELPERS/_string_lists.dm
@@ -1,4 +1,5 @@
#define pick_list(FILE, KEY) (pick(strings(FILE, KEY)))
+#define pick_list_weighted(FILE, KEY) (pickweight(strings(FILE, KEY)))
#define pick_list_replacements(FILE, KEY) (strings_replacement(FILE, KEY))
#define json_load(FILE) (json_decode(file2text(FILE)))
diff --git a/code/__HELPERS/cmp.dm b/code/__HELPERS/cmp.dm
index 5fb4d05d42..0825e51ae4 100644
--- a/code/__HELPERS/cmp.dm
+++ b/code/__HELPERS/cmp.dm
@@ -120,3 +120,16 @@ GLOBAL_VAR_INIT(cmp_field, "name")
/proc/cmp_item_block_priority_asc(obj/item/A, obj/item/B)
return A.block_priority - B.block_priority
+
+/proc/cmp_skill_categories(datum/skill/A, datum/skill/B)
+ if(A.ui_category == B.ui_category)
+ return sorttext(A.name, B.name)
+ return sorttext(A.ui_category, B.ui_category)
+
+/proc/cmp_chemical_reactions_default(datum/chemical_reaction/A, datum/chemical_reaction/B)
+ if(A.priority != B.priority)
+ return B.priority - A.priority
+ else if(A.is_cold_recipe)
+ return A.required_temp - B.required_temp //return coldest
+ else
+ return B.required_temp - A.required_temp //return hottest
diff --git a/code/__HELPERS/dna.dm b/code/__HELPERS/dna.dm
index bb0c89d1f3..b74dacdc09 100644
--- a/code/__HELPERS/dna.dm
+++ b/code/__HELPERS/dna.dm
@@ -5,8 +5,9 @@
#define GET_INITIALIZED_MUTATION(A) GLOB.all_mutations[A]
#define GET_GENE_STRING(A, B) (B.mutation_index[A])
#define GET_SEQUENCE(A) (GLOB.full_sequences[A])
+#define GET_MUTATION_TYPE_FROM_ALIAS(A) (GLOB.alias_mutations[A])
#define GET_MUTATION_STABILIZER(A) ((A.stabilizer_coeff < 0) ? 1 : A.stabilizer_coeff)
#define GET_MUTATION_SYNCHRONIZER(A) ((A.synchronizer_coeff < 0) ? 1 : A.synchronizer_coeff)
#define GET_MUTATION_POWER(A) ((A.power_coeff < 0) ? 1 : A.power_coeff)
-#define GET_MUTATION_ENERGY(A) ((A.energy_coeff < 0) ? 1 : A.energy_coeff)
\ No newline at end of file
+#define GET_MUTATION_ENERGY(A) ((A.energy_coeff < 0) ? 1 : A.energy_coeff)
diff --git a/code/__HELPERS/do_after.dm b/code/__HELPERS/do_after.dm
index f1f483c345..30d40f3867 100644
--- a/code/__HELPERS/do_after.dm
+++ b/code/__HELPERS/do_after.dm
@@ -166,6 +166,9 @@
var/target_loc = target.loc
+ LAZYADD(user.do_afters, target)
+ LAZYADD(target.targeted_by, user)
+
var/holding = user.get_active_held_item()
var/datum/progressbar/progbar
if (progress)
@@ -183,6 +186,13 @@
break
if(uninterruptible)
continue
+ if(!(target in user.do_afters))
+ . = FALSE
+ break
+
+ if(!(target in user.do_afters))
+ . = FALSE
+ break
if(drifting && !user.inertia_dir)
drifting = 0
@@ -191,13 +201,16 @@
if((!drifting && user.loc != user_loc) || target.loc != target_loc || (!ignorehelditem && user.get_active_held_item() != holding) || user.incapacitated() || user.lying || (extra_checks && !extra_checks.Invoke()))
. = 0
break
- if (progress)
+ if(progress)
qdel(progbar)
+ if(!QDELETED(target))
+ LAZYREMOVE(user.do_afters, target)
+ LAZYREMOVE(target.targeted_by, user)
//some additional checks as a callback for for do_afters that want to break on losing health or on the mob taking action
/mob/proc/break_do_after_checks(list/checked_health, check_clicks)
- if(check_clicks && next_move > world.time)
+ if(check_clicks && !CheckActionCooldown())
return FALSE
return TRUE
@@ -216,6 +229,10 @@
if(target && !isturf(target))
Tloc = target.loc
+ if(target)
+ LAZYADD(user.do_afters, target)
+ LAZYADD(target.targeted_by, user)
+
var/atom/Uloc = user.loc
var/drifting = 0
@@ -260,6 +277,10 @@
. = 0
break
+ if(target && !(target in user.do_afters))
+ . = FALSE
+ break
+
if(needhand)
//This might seem like an odd check, but you can still need a hand even when it's empty
//i.e the hand is used to pull some item/tool out of the construction
@@ -270,8 +291,14 @@
if(user.get_active_held_item() != holding)
. = 0
break
- if (progress)
+ if(progress)
qdel(progbar)
+ if(!QDELETED(target))
+ LAZYREMOVE(user.do_afters, target)
+
+ if(!QDELETED(target))
+ LAZYREMOVE(user.do_afters, target)
+ LAZYREMOVE(target.targeted_by, user)
/mob/proc/do_after_coefficent() // This gets added to the delay on a do_after, default 1
. = 1
@@ -291,6 +318,8 @@
var/list/originalloc = list()
for(var/atom/target in targets)
originalloc[target] = target.loc
+ LAZYADD(user.do_afters, target)
+ LAZYADD(target.targeted_by, user)
var/holding = user.get_active_held_item()
var/datum/progressbar/progbar
@@ -321,3 +350,8 @@
break mainloop
if(progbar)
qdel(progbar)
+ for(var/thing in targets)
+ var/atom/target = thing
+ if(!QDELETED(target))
+ LAZYREMOVE(user.do_afters, target)
+ LAZYREMOVE(target.targeted_by, user)
diff --git a/code/__HELPERS/files.dm b/code/__HELPERS/files.dm
index 7c6c186bca..8b4f8d5b54 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", "md"))
+/client/proc/browse_files(root="data/logs/", max_iterations=10, list/valid_extensions=list("txt","log","htm", "html", "md", "json"))
var/path = root
for(var/i=0, i"
var/atom/A = thing
if (isnull(dir))
@@ -1160,9 +1161,10 @@ GLOBAL_LIST_INIT(freon_color_matrix, list("#2E5E69", "#60A2A8", "#A1AFB1", rgb(0
I = icon(I, icon_state, dir, frame, moving)
key = "[generate_asset_name(I)].png"
- register_asset(key, I)
+ if(!SSassets.cache[key])
+ register_asset(key, I)
for (var/thing2 in targets)
- send_asset(thing2, key, FALSE)
+ send_asset(thing2, key)
return ""
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 91826ee314..ca12567b59 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -145,9 +145,9 @@
continue
if(!S.ckeys_allowed)
snowflake_ipc_antenna_list[S.name] = mspath
- var/color1 = random_short_color()
- var/color2 = random_short_color()
- var/color3 = random_short_color()
+ var/color1 = random_color()
+ var/color2 = random_color()
+ var/color3 = random_color()
var/body_model = MALE
switch(intended_gender)
@@ -375,6 +375,8 @@ GLOBAL_LIST_EMPTY(species_list)
override = TRUE
if(HAS_TRAIT(M, TRAIT_SIXTHSENSE))
override = TRUE
+ if(SSticker.current_state == GAME_STATE_FINISHED)
+ override = TRUE
if(isnewplayer(M) && !override)
continue
if(M.stat != DEAD && !override)
diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm
index aa388d7413..045ca2c519 100644
--- a/code/__HELPERS/roundend.dm
+++ b/code/__HELPERS/roundend.dm
@@ -174,7 +174,7 @@
to_chat(world, "
The round has ended.")
if(LAZYLEN(GLOB.round_end_notifiees))
- send2irc("Notice", "[GLOB.round_end_notifiees.Join(", ")] the round has ended.")
+ world.TgsTargetedChatBroadcast("[GLOB.round_end_notifiees.Join(", ")] the round has ended.", FALSE)
for(var/I in round_end_events)
var/datum/callback/cb = I
@@ -233,6 +233,7 @@
for(var/antag_name in total_antagonists)
var/list/L = total_antagonists[antag_name]
log_game("[antag_name]s :[L.Join(", ")].")
+ set_observer_default_invisibility(0, "The round is over! You are now visible to the living.")
CHECK_TICK
SSdbcore.SetRoundEnd()
diff --git a/code/__HELPERS/sanitize_values.dm b/code/__HELPERS/sanitize_values.dm
index cbe1817233..0441e0bcb7 100644
--- a/code/__HELPERS/sanitize_values.dm
+++ b/code/__HELPERS/sanitize_values.dm
@@ -51,40 +51,111 @@
return default
return default
-/proc/sanitize_hexcolor(color, desired_format=3, include_crunch=0, default)
+#define RGB_FORMAT_INVALID 0
+#define RGB_FORMAT_SHORT 1
+#define RGB_FORMAT_LONG 2
+
+/**
+ * Sanitizes a hexadecimal color. Always outputs lowercase.
+ *
+ * @params
+ * * color - input color, 3 or 6 characters without the #.
+ * * desired_format - 3 or 6 characters without the potential #. can only put in 3 or 6 here.
+ * * include_crunch - do we put a # at the start
+ * * default - default color. must be 3 or 6 characters with or without #.
+ * * default_replacement - what we replace broken letters with.
+ */
+/proc/sanitize_hexcolor(color, desired_format = 3, include_crunch = 0, default = rgb(218, 72, 255), default_replacement = "f")
+ if(!istext(default) || (length(default) < 3))
+ CRASH("Default should be a text string of RGB format, with or without the crunch, 3 or 6 characters. Default was instead [default]")
+ if(!istext(default_replacement) || (length(default_replacement) != 1))
+ CRASH("Invalid default_replacement: [default_replacement]")
+ default_replacement = lowertext(default_replacement)
+ switch(text2ascii(default_replacement))
+ if(48 to 57)
+ if(97 to 102)
+ if(65 to 70)
+ else // yeah yeah i know 3 empty if's..
+ CRASH("Invalid default_replacement: [default_replacement]")
var/crunch = include_crunch ? "#" : ""
if(!istext(color))
- color = ""
+ color = default
- var/start = 1 + (text2ascii(color, 1) == 35)
var/len = length(color)
- var/char = ""
- // RRGGBB -> RGB but awful
- var/convert_to_shorthand = desired_format == 3 && length_char(color) > 3
+ // get rid of crunch
+ if(len && color[1] == "#")
+ if(len >= 2)
+ color = copytext(color, 2)
+ else
+ color = ""
+ len = length(color)
- . = ""
- var/i = start
- while(i <= len)
+ switch(desired_format)
+ if(3)
+ desired_format = RGB_FORMAT_SHORT
+ if(6)
+ desired_format = RGB_FORMAT_LONG
+ else
+ CRASH("Invalid desired_format: [desired_format]. Must be 3 or 6.")
+ var/current_format = RGB_FORMAT_INVALID
+ switch(length(color))
+ if(3)
+ current_format = RGB_FORMAT_SHORT
+ if(6)
+ current_format = RGB_FORMAT_LONG
+ else
+ current_format = RGB_FORMAT_INVALID
+
+ if(current_format == RGB_FORMAT_INVALID) // nah
+ color = default // process default
+ if(color[1] == "#") // we checked default was at least 3 chars long earlier
+ color = copytext(color, 2)
+ len = length(color)
+ switch(len)
+ if(3)
+ current_format = RGB_FORMAT_SHORT
+ if(6)
+ current_format = RGB_FORMAT_LONG
+ else
+ CRASH("Default was not 3 or 6 RGB hexadecimal characters: [default]")
+
+ var/sanitized = ""
+ var/char = ""
+ // first, sanitize hex
+ for(var/i in 1 to len)
char = color[i]
switch(text2ascii(char))
- if(48 to 57) //numbers 0 to 9
- . += char
- if(97 to 102) //letters a to f
- . += char
- if(65 to 70) //letters A to F
- . += lowertext(char)
+ if(48 to 57) // 0 to 9
+ sanitized += char
+ if(97 to 102) // a to f
+ sanitized += char
+ if(65 to 70) // A to F (capitalized!)
+ sanitized += lowertext(char)
else
- break
- i += length(char)
- if(convert_to_shorthand && i <= len) //skip next one
- i += length(color[i])
+ sanitized += default_replacement
+ // do we need to convert?
+ if(desired_format == current_format)
+ return crunch + sanitized // no
+ // yes
+ if((desired_format == RGB_FORMAT_SHORT) && (current_format == RGB_FORMAT_LONG)) // downconvert
+ var/temp = ""
+ // we could do some math but we're lazy and in practice floor()ing this.
+ for(var/i in 1 to 6 step 2)
+ temp += sanitized[i]
+ sanitized = temp
+ else if((desired_format == RGB_FORMAT_LONG) && (current_format == RGB_FORMAT_SHORT)) // upconvert
+ var/temp = ""
+ for(var/i in 1 to 3)
+ temp += sanitized[i]
+ temp += sanitized[i]
+ sanitized = temp
+ else
+ CRASH("Invalid desired_format and current_format pair: [desired_format], [current_format]. Could not determine which way to convert.")
+ return crunch + sanitized
- if(length_char(.) != desired_format)
- if(default)
- return default
- return crunch + repeat_string(desired_format, "0")
-
- return crunch + .
+#undef RGB_FORMAT_INVALID
+#undef RGB_FORMAT_SHORT
+#undef RGB_FORMAT_LONG
/proc/sanitize_ooccolor(color)
if(length(color) != length_char(color))
diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm
index 2c8497d5ed..7a18d2ce01 100644
--- a/code/__HELPERS/type2type.dm
+++ b/code/__HELPERS/type2type.dm
@@ -339,10 +339,24 @@
/proc/isLeap(y)
return ((y) % 4 == 0 && ((y) % 100 != 0 || (y) % 400 == 0))
-
+/// For finding out what body parts a body zone covers, the inverse of the below basically
+/proc/zone2body_parts_covered(def_zone)
+ switch(def_zone)
+ if(BODY_ZONE_CHEST)
+ return list(CHEST, GROIN)
+ if(BODY_ZONE_HEAD)
+ return list(HEAD)
+ if(BODY_ZONE_L_ARM)
+ return list(ARM_LEFT, HAND_LEFT)
+ if(BODY_ZONE_R_ARM)
+ return list(ARM_RIGHT, HAND_RIGHT)
+ if(BODY_ZONE_L_LEG)
+ return list(LEG_LEFT, FOOT_LEFT)
+ if(BODY_ZONE_R_LEG)
+ return list(LEG_RIGHT, FOOT_RIGHT)
//Turns a Body_parts_covered bitfield into a list of organ/limb names.
-//(I challenge you to find a use for this)
+//(I challenge you to find a use for this) -I found a use for it!!
/proc/body_parts_covered2organ_names(bpc)
var/list/covered_parts = list()
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index 508b737474..4addae3ac4 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -675,12 +675,6 @@ Turf and target are separate in case you want to teleport some distance from a t
loc = loc.loc
return null
-//For objects that should embed, but make no sense being is_sharp or is_pointed()
-//e.g: rods
-GLOBAL_LIST_INIT(can_embed_types, typecacheof(list(
- /obj/item/stack/rods,
- /obj/item/pipe)))
-
/*
Checks if that loc and dir has an item on the wall
*/
@@ -1443,7 +1437,6 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
/obj/item/reagent_containers/food/snacks/grown,
/obj/item/reagent_containers/food/snacks/grown/mushroom,
/obj/item/reagent_containers/food/snacks/grown/nettle, // base type
- /obj/item/reagent_containers/food/snacks/deepfryholder,
/obj/item/reagent_containers/food/snacks/grown/shell,
/obj/item/reagent_containers/food/snacks/clothing,
/obj/item/reagent_containers/food/snacks/store/bread
@@ -1515,6 +1508,8 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
set waitfor = FALSE
return call(source, proctype)(arglist(arguments))
+#define TURF_FROM_COORDS_LIST(List) (locate(List[1], List[2], List[3]))
+
/proc/num2sign(numeric)
if(numeric > 0)
return 1
diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm
index c3004a4501..85f5e4fd9b 100644
--- a/code/_globalvars/bitfields.dm
+++ b/code/_globalvars/bitfields.dm
@@ -140,6 +140,10 @@ GLOBAL_LIST_INIT(bitfields, list(
"BLOCK_FACE_ATOM_1" = BLOCK_FACE_ATOM_1,
"PREVENT_CONTENTS_EXPLOSION_1" = PREVENT_CONTENTS_EXPLOSION_1
),
+ "flags_ricochet" = list(
+ "RICOCHET_SHINY" = RICOCHET_SHINY,
+ "RICOCHET_HARD" = RICOCHET_HARD
+ ),
"clothing_flags" = list(
"LAVAPROTECT" = LAVAPROTECT,
"STOPSPRESSUREDAMAGE" = STOPSPRESSUREDAMAGE,
diff --git a/code/_globalvars/genetics.dm b/code/_globalvars/genetics.dm
index 39702fd62f..cebeab7a78 100644
--- a/code/_globalvars/genetics.dm
+++ b/code/_globalvars/genetics.dm
@@ -27,5 +27,6 @@ GLOBAL_LIST_EMPTY(full_sequences)
GLOBAL_LIST_EMPTY(bad_mutations)
GLOBAL_LIST_EMPTY(good_mutations)
GLOBAL_LIST_EMPTY(not_good_mutations)
+GLOBAL_LIST_EMPTY(alias_mutations) //alias = type
-GLOBAL_LIST_EMPTY(mutation_recipes)
\ No newline at end of file
+GLOBAL_LIST_EMPTY(mutation_recipes)
diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm
index df83f1b4e3..a25381f266 100644
--- a/code/_globalvars/lists/flavor_misc.dm
+++ b/code/_globalvars/lists/flavor_misc.dm
@@ -116,15 +116,16 @@ GLOBAL_LIST_INIT(ai_core_display_screens, list(
GLOBAL_LIST_INIT(security_depts_prefs, list(SEC_DEPT_RANDOM, SEC_DEPT_NONE, SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICAL, SEC_DEPT_SCIENCE, SEC_DEPT_SUPPLY))
- //Backpacks
-#define GBACKPACK "Grey Backpack"
-#define GSATCHEL "Grey Satchel"
-#define GDUFFELBAG "Grey Duffel Bag"
-#define LSATCHEL "Leather Satchel"
+//Backpacks
#define DBACKPACK "Department Backpack"
#define DSATCHEL "Department Satchel"
#define DDUFFELBAG "Department Duffel Bag"
-GLOBAL_LIST_INIT(backbaglist, list(DBACKPACK, DSATCHEL, DDUFFELBAG, GBACKPACK, GSATCHEL, GDUFFELBAG, LSATCHEL))
+GLOBAL_LIST_INIT(backbaglist, list(DBACKPACK, DSATCHEL, DDUFFELBAG, //everything after this point is a non-department backpack
+ "Grey Backpack" = /obj/item/storage/backpack,
+ "Grey Satchel" = /obj/item/storage/backpack/satchel,
+ "Grey Duffel Bag" = /obj/item/storage/backpack/duffelbag,
+ "Leather Satchel" = /obj/item/storage/backpack/satchel/leather,
+ "Snail Shell" = /obj/item/storage/backpack/snail))
//Suit/Skirt
#define PREF_SUIT "Jumpsuit"
@@ -223,3 +224,11 @@ GLOBAL_LIST_INIT(station_numerals, greek_letters + phonetic_alphabet + numbers_a
GLOBAL_LIST_INIT(admiral_messages, list("Do you know how expensive these stations are?","Stop wasting my time.","I was sleeping, thanks a lot.","Stand and fight you cowards!","You knew the risks coming in.","Stop being paranoid.","Whatever's broken just build a new one.","No.", "null","Error: No comment given.", "It's a good day to die!"))
GLOBAL_LIST_INIT(redacted_strings, list("\[REDACTED\]", "\[CLASSIFIED\]", "\[ARCHIVED\]", "\[EXPLETIVE DELETED\]", "\[EXPUNGED\]", "\[INFORMATION ABOVE YOUR SECURITY CLEARANCE\]", "\[MOVE ALONG CITIZEN\]", "\[NOTHING TO SEE HERE\]", "\[ACCESS DENIED\]"))
+
+GLOBAL_LIST_INIT(wisdoms, world.file2list("strings/wisdoms.txt"))
+
+GLOBAL_LIST_INIT(speech_verbs, list("default","says","gibbers", "states", "chitters", "declares", "bellows", "buzzes" ,"beeps", "chirps" ,"hisses" ,"poofs" ,"rattles", "mewls" ,"barks", "blorbles", "squeaks", "squawks", "flutters"))
+
+GLOBAL_LIST_INIT(roundstart_tongues, list("default","human tongue" = /obj/item/organ/tongue, "lizard tongue" = /obj/item/organ/tongue/lizard, "skeleton tongue" = /obj/item/organ/tongue/bone, "fly tongue" = /obj/item/organ/tongue/fly, "ipc tongue" = /obj/item/organ/tongue/robot/ipc))
+
+
diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm
index 69d4794e87..865f405442 100644
--- a/code/_globalvars/lists/maintenance_loot.dm
+++ b/code/_globalvars/lists/maintenance_loot.dm
@@ -116,6 +116,7 @@ GLOBAL_LIST_INIT(maintenance_loot, list(
/obj/item/autosurgeon/testicles = 1,
/obj/item/storage/box/marshmallow = 2,
/obj/item/clothing/gloves/tackler/offbrand = 1,
+ /obj/item/stack/sticky_tape = 1,
"" = 3
))
diff --git a/code/_globalvars/lists/mapping.dm b/code/_globalvars/lists/mapping.dm
index d214ec94ef..94b0338412 100644
--- a/code/_globalvars/lists/mapping.dm
+++ b/code/_globalvars/lists/mapping.dm
@@ -38,8 +38,7 @@ GLOBAL_LIST_EMPTY(servant_spawns) //Servants of Ratvar spawn here
GLOBAL_LIST_EMPTY(city_of_cogs_spawns) //Anyone entering the City of Cogs spawns here
GLOBAL_LIST_EMPTY(ruin_landmarks)
- //away missions
-GLOBAL_LIST_EMPTY(awaydestinations) //a list of landmarks that the warpgate can take you to
+//away missions
GLOBAL_LIST_EMPTY(vr_spawnpoints)
//used by jump-to-area etc. Updated by area/updateName()
diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm
index 959a62ebf8..134f9d9cbe 100644
--- a/code/_globalvars/lists/mobs.dm
+++ b/code/_globalvars/lists/mobs.dm
@@ -23,6 +23,7 @@ GLOBAL_LIST_EMPTY(joined_player_list) //all clients that have joined the game a
GLOBAL_LIST_EMPTY(silicon_mobs) //all silicon mobs
GLOBAL_LIST_EMPTY(mob_living_list) //all instances of /mob/living and subtypes
GLOBAL_LIST_EMPTY(carbon_list) //all instances of /mob/living/carbon and subtypes, notably does not contain brains or simple animals
+GLOBAL_LIST_EMPTY(human_list) //all instances of /mob/living/carbon/human and subtypes
GLOBAL_LIST_EMPTY(ai_list)
GLOBAL_LIST_EMPTY(pai_list)
GLOBAL_LIST_EMPTY(available_ai_shells)
diff --git a/code/_globalvars/lists/poll_ignore.dm b/code/_globalvars/lists/poll_ignore.dm
index f5f3adbcc0..d74238c06d 100644
--- a/code/_globalvars/lists/poll_ignore.dm
+++ b/code/_globalvars/lists/poll_ignore.dm
@@ -19,6 +19,7 @@
#define POLL_IGNORE_WIZARD "wizard"
#define POLL_IGNORE_CLONE "clone"
#define POLL_IGNORE_CONTRACTOR_SUPPORT "contractor_support"
+#define POLL_IGNORE_FUGITIVE "fugitive"
GLOBAL_LIST_INIT(poll_ignore_desc, list(
POLL_IGNORE_SENTIENCE_POTION = "Sentience potion",
@@ -39,7 +40,8 @@ GLOBAL_LIST_INIT(poll_ignore_desc, list(
POLL_IGNORE_DEMON = "Demons",
POLL_IGNORE_WIZARD = "Wizards",
POLL_IGNORE_CLONE = "Defective/SDGF clones",
- POLL_IGNORE_CONTRACTOR_SUPPORT = "Contractor Support Unit"
+ POLL_IGNORE_CONTRACTOR_SUPPORT = "Contractor Support Unit",
+ POLL_IGNORE_FUGITIVE = "Fugitive Hunter"
))
GLOBAL_LIST_INIT(poll_ignore, init_poll_ignore())
diff --git a/code/_globalvars/logging.dm b/code/_globalvars/logging.dm
index 65fd772dfe..e9f98f836e 100644
--- a/code/_globalvars/logging.dm
+++ b/code/_globalvars/logging.dm
@@ -28,8 +28,12 @@ GLOBAL_VAR(world_job_debug_log)
GLOBAL_PROTECT(world_job_debug_log)
GLOBAL_VAR(world_virus_log)
GLOBAL_PROTECT(world_virus_log)
+GLOBAL_VAR(world_asset_log)
+GLOBAL_PROTECT(world_asset_log)
GLOBAL_VAR(world_map_error_log)
GLOBAL_PROTECT(world_map_error_log)
+GLOBAL_VAR(world_paper_log)
+GLOBAL_PROTECT(world_paper_log)
GLOBAL_VAR(subsystem_log)
GLOBAL_PROTECT(subsystem_log)
GLOBAL_VAR(reagent_log)
@@ -47,10 +51,10 @@ GLOBAL_LIST_EMPTY(lastsignalers) //keeps last 100 signals here in format: "[src]
GLOBAL_PROTECT(lastsignalers)
GLOBAL_LIST_EMPTY(lawchanges) //Stores who uploaded laws to which silicon-based lifeform, and what the law was
GLOBAL_PROTECT(lawchanges)
-
GLOBAL_VAR(tgui_log)
GLOBAL_PROTECT(tgui_log)
-
+GLOBAL_VAR(world_shuttle_log)
+GLOBAL_PROTECT(world_shuttle_log)
GLOBAL_LIST_EMPTY(combatlog)
GLOBAL_PROTECT(combatlog)
GLOBAL_LIST_EMPTY(IClog)
diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm
index 1b100bebaf..8d8b8820b2 100644
--- a/code/_globalvars/traits.dm
+++ b/code/_globalvars/traits.dm
@@ -93,6 +93,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_PASSTABLE" = TRAIT_PASSTABLE,
"TRAIT_GIANT" = TRAIT_GIANT,
"TRAIT_DWARF" = TRAIT_DWARF,
+ "TRAIT_NICE_SHOT" = TRAIT_NICE_SHOT,
"TRAIT_COMBAT_MODE_LOCKED" = TRAIT_COMBAT_MODE_LOCKED,
"TRAIT_SPRINT_LOCKED" = TRAIT_SPRINT_LOCKED,
"TRAIT_AUTO_CATCH_ITEM" = TRAIT_AUTO_CATCH_ITEM,
@@ -116,7 +117,8 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_MASO" = TRAIT_MASO,
"TRAIT_HIGH_BLOOD" = TRAIT_HIGH_BLOOD,
"TRAIT_EMPATH" = TRAIT_EMPATH,
- "TRAIT_FRIENDLY" = TRAIT_FRIENDLY
+ "TRAIT_FRIENDLY" = TRAIT_FRIENDLY,
+ "TRAIT_NICE_SHOT" = TRAIT_NICE_SHOT
),
/obj/item/bodypart = list(
"TRAIT_PARALYSIS" = TRAIT_PARALYSIS
diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm
index 02cbd6bea5..18aaf66659 100644
--- a/code/_onclick/ai.dm
+++ b/code/_onclick/ai.dm
@@ -19,10 +19,6 @@
A.move_camera_by_click()
/mob/living/silicon/ai/ClickOn(var/atom/A, params)
- if(world.time <= next_click)
- return
- next_click = world.time + 1
-
if(!can_interact_with(A))
return
@@ -74,16 +70,16 @@
CtrlClickOn(A)
return
- if(world.time <= next_move)
+ if(!CheckActionCooldown(immediate = TRUE))
return
if(aicamera.in_camera_mode)
aicamera.camera_mode_off()
- aicamera.captureimage(pixel_turf, usr)
+ INVOKE_ASYNC(aicamera, /obj/item/camera.proc/captureimage, pixel_turf, usr)
return
if(waypoint_mode)
- waypoint_mode = 0
- set_waypoint(A)
+ waypoint_mode = FALSE
+ INVOKE_ASYNC(src, .proc/set_waypoint, A)
return
A.attack_ai(src)
@@ -94,8 +90,9 @@
The below is only really for safety, or you can alter the way
it functions and re-insert it above.
*/
-/mob/living/silicon/ai/UnarmedAttack(atom/A)
+/mob/living/silicon/ai/UnarmedAttack(atom/A, proximity, intent = a_intent, flags = NONE)
A.attack_ai(src)
+
/mob/living/silicon/ai/RangedAttack(atom/A)
A.attack_ai(src)
diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index ecbcb6ec01..042ab3aaee 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -1,38 +1,3 @@
-/*
- Click code cleanup
- ~Sayu
-*/
-
-// 1 decisecond click delay (above and beyond mob/next_move)
-//This is mainly modified by click code, to modify click delays elsewhere, use next_move and changeNext_move()
-/mob/var/next_click = 0
-
-// THESE DO NOT EFFECT THE BASE 1 DECISECOND DELAY OF NEXT_CLICK
-/mob/var/next_move_adjust = 0 //Amount to adjust action/click delays by, + or -
-/mob/var/next_move_modifier = 1 //Value to multiply action/click delays by
-
-
-//Delays the mob's next click/action by num deciseconds
-// eg: 10-3 = 7 deciseconds of delay
-// eg: 10*0.5 = 5 deciseconds of delay
-// DOES NOT EFFECT THE BASE 1 DECISECOND DELAY OF NEXT_CLICK
-
-/mob/proc/timeToNextMove()
- return max(0, next_move - world.time)
-
-/mob/proc/changeNext_move(num)
- next_move = world.time + ((num+next_move_adjust)*next_move_modifier)
-
-/mob/living/changeNext_move(num)
- last_click_move = next_move
- var/mod = next_move_modifier
- var/adj = next_move_adjust
- for(var/i in status_effects)
- var/datum/status_effect/S = i
- mod *= S.nextmove_modifier()
- adj += S.nextmove_adjust()
- next_move = world.time + ((num + adj)*mod)
-
/*
Before anything else, defer these calls to a per-mobtype handler. This allows us to
remove istype() spaghetti code, but requires the addition of other handler procs to simplify it.
@@ -45,7 +10,7 @@
/atom/Click(location,control,params)
if(flags_1 & INITIALIZED_1)
SEND_SIGNAL(src, COMSIG_CLICK, location, control, params, usr)
- usr.ClickOn(src, params)
+ usr.CommonClickOn(src, params)
/atom/DblClick(location,control,params)
if(flags_1 & INITIALIZED_1)
@@ -55,6 +20,21 @@
if(flags_1 & INITIALIZED_1)
usr.MouseWheelOn(src, delta_x, delta_y, params)
+/**
+ * Common mob click code
+ */
+/mob/proc/CommonClickOn(atom/A, params)
+ SHOULD_NOT_SLEEP(TRUE)
+ if(mob_transforming)
+ return
+ if(SEND_SIGNAL(src, COMSIG_MOB_CLICKON, A, params) & COMSIG_MOB_CANCEL_CLICKON)
+ return
+ . = ClickOn(A, params)
+ if(!(. & DISCARD_LAST_ACTION))
+ FlushCurrentAction()
+ else
+ DiscardCurrentAction()
+
/*
Standard mob ClickOn()
Handles exceptions: Buildmode, middle click, modified clicks, mech actions
@@ -68,50 +48,34 @@
* item/afterattack(atom,user,adjacent,params) - used both ranged and adjacent
* mob/RangedAttack(atom,params) - used only ranged, only used for tk and laser eyes but could be changed
*/
-/mob/proc/ClickOn( atom/A, params )
- if(world.time <= next_click)
- return
- next_click = world.time + world.tick_lag
-
+/mob/proc/ClickOn(atom/A, params)
+ SHOULD_NOT_SLEEP(TRUE)
if(check_click_intercept(params,A))
return
- if(notransform)
- return
-
- if(SEND_SIGNAL(src, COMSIG_MOB_CLICKON, A, params) & COMSIG_MOB_CANCEL_CLICKON)
- return
-
var/list/modifiers = params2list(params)
if(modifiers["shift"] && modifiers["middle"])
- ShiftMiddleClickOn(A)
- return
+ return ShiftMiddleClickOn(A)
if(modifiers["shift"] && modifiers["ctrl"])
- CtrlShiftClickOn(A)
- return
+ return CtrlShiftClickOn(A)
if(modifiers["middle"])
- MiddleClickOn(A)
- return
+ return MiddleClickOn(A)
if(modifiers["shift"] && (client && client.show_popup_menus || modifiers["right"])) //CIT CHANGE - makes shift-click examine use right click instead of left click in combat mode
- ShiftClickOn(A)
- return
+ return ShiftClickOn(A)
if(modifiers["alt"]) // alt and alt-gr (rightalt)
- AltClickOn(A)
- return
+ return AltClickOn(A)
if(modifiers["ctrl"])
- CtrlClickOn(A)
- return
+ return CtrlClickOn(A)
if(modifiers["right"]) //CIT CHANGE - allows right clicking to perform actions
- RightClickOn(A,params) //CIT CHANGE - ditto
- return //CIT CHANGE - ditto
+ return RightClickOn(A, params) //CIT CHANGE - ditto
if(incapacitated(ignore_restraints = 1))
return
face_atom(A)
- if(next_move > world.time) // in the year 2000...
+ if(!CheckActionCooldown(immediate = TRUE))
return
if(!modifiers["catcher"] && A.IsObscured())
@@ -119,12 +83,12 @@
if(ismecha(loc))
var/obj/mecha/M = loc
- return M.click_action(A,src,params)
+ M.click_action(A,src,params)
+ return TRUE
if(restrained())
- changeNext_move(CLICK_CD_HANDCUFFED) //Doing shit in cuffs shall be vey slow
- RestrainedClickOn(A)
- return
+ DelayNextAction(CLICK_CD_HANDCUFFED)
+ return RestrainedClickOn(A)
if(in_throw_mode)
throw_item(A)
@@ -141,12 +105,12 @@
//User itself, current loc, and user inventory
if(A in DirectAccess())
if(W)
- W.melee_attack_chain(src, A, params)
+ return W.melee_attack_chain(src, A, params)
else
- if(ismob(A))
- changeNext_move(CLICK_CD_MELEE)
- UnarmedAttack(A)
- return
+ . = UnarmedAttack(A, TRUE, a_intent)
+ if(!(. & NO_AUTO_CLICKDELAY_HANDLING) && ismob(A))
+ DelayNextAction(CLICK_CD_MELEE)
+ return
//Can't reach anything else in lockers or other weirdness
if(!loc.AllowClick())
@@ -155,16 +119,17 @@
//Standard reach turf to turf or reaching inside storage
if(CanReach(A,W))
if(W)
- W.melee_attack_chain(src, A, params)
+ return W.melee_attack_chain(src, A, params)
else
- if(ismob(A))
- changeNext_move(CLICK_CD_MELEE)
- UnarmedAttack(A, 1)
+ . = UnarmedAttack(A, TRUE, a_intent)
+ if(!(. & NO_AUTO_CLICKDELAY_HANDLING) && ismob(A))
+ DelayNextAction(CLICK_CD_MELEE)
+ return
else
if(W)
- W.ranged_attack_chain(src, A, params)
+ return W.ranged_attack_chain(src, A, params)
else
- RangedAttack(A,params)
+ return RangedAttack(A,params)
//Is the atom obscured by a PREVENT_CLICK_UNDER_1 object above it
/atom/proc/IsObscured()
@@ -269,10 +234,7 @@
proximity_flag is not currently passed to attack_hand, and is instead used
in human click code to allow glove touches only at melee range.
*/
-/mob/proc/UnarmedAttack(atom/A, proximity_flag)
- if(ismob(A))
- changeNext_move(CLICK_CD_MELEE)
- return
+/mob/proc/UnarmedAttack(atom/A, proximity, intent = a_intent, flags = NONE)
/*
Ranged unarmed attack:
@@ -305,7 +267,6 @@
var/datum/antagonist/changeling/C = mind.has_antag_datum(/datum/antagonist/changeling)
if(C && C.chosen_sting)
C.chosen_sting.try_to_sting(src,A)
- next_click = world.time + 5
return
swap_hand()
@@ -338,24 +299,24 @@
*/
/mob/proc/CtrlClickOn(atom/A)
- A.CtrlClick(src)
- return
+ return A.CtrlClick(src)
/atom/proc/CtrlClick(mob/user)
SEND_SIGNAL(src, COMSIG_CLICK_CTRL, user)
var/mob/living/ML = user
if(istype(ML))
- ML.pulled(src)
+ INVOKE_ASYNC(ML, /mob/living.verb/pulled, src)
/mob/living/carbon/human/CtrlClick(mob/user)
if(ishuman(user) && Adjacent(user) && !user.incapacitated())
- if(world.time < user.next_move)
+ if(!user.CheckActionCooldown())
return FALSE
var/mob/living/carbon/human/H = user
H.dna.species.grab(H, src, H.mind.martial_art)
- H.changeNext_move(CLICK_CD_MELEE)
+ H.DelayNextAction(CLICK_CD_MELEE)
+ return TRUE
else
- ..()
+ return ..()
/*
Alt click
Unused except for AI
@@ -378,8 +339,8 @@
var/datum/antagonist/changeling/C = mind.has_antag_datum(/datum/antagonist/changeling)
if(C && C.chosen_sting)
C.chosen_sting.try_to_sting(src,A)
- next_click = world.time + 5
- return
+ DelayNextAction(CLICK_CD_RANGE)
+ return TRUE
..()
/atom/proc/AltClick(mob/user)
@@ -414,9 +375,11 @@
return
/mob/living/LaserEyes(atom/A, params)
- changeNext_move(CLICK_CD_RANGE)
+ if(!CheckActionCooldown(CLICK_CD_RANGE))
+ return
+ DelayNextAction()
- var/obj/item/projectile/beam/LE = new /obj/item/projectile/beam( loc )
+ var/obj/item/projectile/beam/LE = new /obj/item/projectile/beam(loc)
LE.icon = 'icons/effects/genetics.dmi'
LE.icon_state = "eyelasers"
playsound(usr.loc, 'sound/weapons/taser2.ogg', 75, 1)
@@ -425,6 +388,7 @@
LE.def_zone = get_organ_target()
LE.preparePixelProjectile(A, src, params)
LE.fire()
+ return TRUE
// Simple helper to face what you clicked on, in case it should be needed in more than one place
/mob/proc/face_atom(atom/A, ismousemovement = FALSE)
diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm
index 9fcccedf1a..372fe46046 100644
--- a/code/_onclick/cyborg.dm
+++ b/code/_onclick/cyborg.dm
@@ -7,10 +7,6 @@
*/
/mob/living/silicon/robot/ClickOn(var/atom/A, var/params)
- if(world.time <= next_click)
- return
- next_click = world.time + 1
-
if(check_click_intercept(params,A))
return
@@ -19,25 +15,19 @@
var/list/modifiers = params2list(params)
if(modifiers["shift"] && modifiers["ctrl"])
- CtrlShiftClickOn(A)
- return
+ return CtrlShiftClickOn(A)
if(modifiers["shift"] && modifiers["middle"])
- ShiftMiddleClickOn(A)
- return
+ return ShiftMiddleClickOn(A)
if(modifiers["middle"])
- MiddleClickOn(A)
- return
+ return MiddleClickOn(A)
if(modifiers["shift"])
- ShiftClickOn(A)
- return
+ return ShiftClickOn(A)
if(modifiers["alt"]) // alt and alt-gr (rightalt)
- AltClickOn(A)
- return
+ return AltClickOn(A)
if(modifiers["ctrl"])
- CtrlClickOn(A)
- return
+ return CtrlClickOn(A)
- if(next_move >= world.time)
+ if(!CheckActionCooldown(immediate = TRUE))
return
face_atom(A) // change direction to face what you clicked on
@@ -50,7 +40,7 @@
*/
if(aicamera.in_camera_mode) //Cyborg picture taking
aicamera.camera_mode_off()
- aicamera.captureimage(A, usr)
+ INVOKE_ASYNC(aicamera, /obj/item/camera.proc/captureimage, A, usr)
return
var/obj/item/W = get_active_held_item()
@@ -58,13 +48,8 @@
if(!W && A.Adjacent(src) && (isobj(A) || ismob(A)))
var/atom/movable/C = A
if(C.can_buckle && C.has_buckled_mobs())
- if(C.buckled_mobs.len > 1)
- var/unbuckled = input(src, "Who do you wish to unbuckle?","Unbuckle Who?") as null|mob in C.buckled_mobs
- if(C.user_unbuckle_mob(unbuckled,src))
- return
- else
- if(C.user_unbuckle_mob(C.buckled_mobs[1],src))
- return
+ INVOKE_ASYNC(C, /atom/movable.proc/precise_user_unbuckle_mob, src)
+ return
if(!W && (get_dist(src,A) <= interaction_range))
A.attack_robot(src)
@@ -81,7 +66,9 @@
// cyborgs are prohibited from using storage items so we can I think safely remove (A.loc in contents)
if(A == loc || (A in loc) || (A in contents))
- W.melee_attack_chain(src, A, params)
+ . = W.melee_attack_chain(src, A, params)
+ if(!(. & NO_AUTO_CLICKDELAY_HANDLING) && ismob(A))
+ DelayNextAction(CLICK_CD_MELEE)
return
if(!isturf(loc))
@@ -90,11 +77,12 @@
// cyborgs are prohibited from using storage items so we can I think safely remove (A.loc && isturf(A.loc.loc))
if(isturf(A) || isturf(A.loc))
if(A.Adjacent(src)) // see adjacent.dm
- W.melee_attack_chain(src, A, params)
+ . = W.melee_attack_chain(src, A, params)
+ if(!(. & NO_AUTO_CLICKDELAY_HANDLING) && ismob(A))
+ DelayNextAction(CLICK_CD_MELEE)
return
else
- W.afterattack(A, src, 0, params)
- return
+ return W.afterattack(A, src, 0, params)
//Middle click cycles through selected modules.
/mob/living/silicon/robot/MiddleClickOn(atom/A)
@@ -175,8 +163,9 @@
clicks, you can do so here, but you will have to
change attack_robot() above to the proper function
*/
-/mob/living/silicon/robot/UnarmedAttack(atom/A)
+/mob/living/silicon/robot/UnarmedAttack(atom/A, proximity, intent = a_intent, flags = NONE)
A.attack_robot(src)
+
/mob/living/silicon/robot/RangedAttack(atom/A)
A.attack_robot(src)
diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm
index 4b963c730d..467c67e0c3 100644
--- a/code/_onclick/hud/_defines.dm
+++ b/code/_onclick/hud/_defines.dm
@@ -168,6 +168,8 @@
//UI position overrides for 1:1 screen layout. (default is 7:5)
#define ui_stamina "EAST-1:28,CENTER:17" // replacing internals button
#define ui_overridden_resist "EAST-3:24,SOUTH+1:7"
+#define ui_clickdelay "CENTER,SOUTH+1:-31"
+#define ui_resistdelay "EAST-3:24,SOUTH+1:4"
#define ui_combat_toggle "EAST-4:22,SOUTH:5"
#define ui_boxcraft "EAST-4:22,SOUTH+1:6"
diff --git a/code/_onclick/hud/action_button.dm b/code/_onclick/hud/action_button.dm
index 0ed3a9cf26..8a66374029 100644
--- a/code/_onclick/hud/action_button.dm
+++ b/code/_onclick/hud/action_button.dm
@@ -56,9 +56,6 @@
if(id && usr.client) //try to (un)remember position
usr.client.prefs.action_buttons_screen_locs["[name]_[id]"] = locked ? moved : null
return TRUE
- if(usr.next_click > world.time)
- return
- usr.next_click = world.time + 1
linked_action.Trigger()
return TRUE
diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm
index 3cedd92255..8111680c41 100644
--- a/code/_onclick/hud/alert.dm
+++ b/code/_onclick/hud/alert.dm
@@ -22,7 +22,7 @@
if(alerts[category])
thealert = alerts[category]
if(thealert.override_alerts)
- return 0
+ return thealert
if(new_master && new_master != thealert.master)
WARNING("[src] threw alert [category] with new_master [new_master] while already having that alert with master [thealert.master]")
@@ -36,7 +36,7 @@
clear_alert(category)
return .()
else //no need to update
- return 0
+ return thealert
else
thealert = new type()
thealert.override_alerts = override
@@ -242,7 +242,7 @@ If you're feeling frisky, examine yourself and click the underlined item to pull
/obj/screen/alert/embeddedobject/Click()
if(isliving(usr))
- var/mob/living/carbon/human/M = usr
+ var/mob/living/carbon/M = usr
return M.help_shake_act(M)
/obj/screen/alert/weightless
@@ -272,7 +272,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion."
var/mob/living/L = usr
if(!istype(L) || !L.can_resist())
return
- L.changeNext_move(CLICK_CD_RESIST)
+ L.MarkResistTime()
if(CHECK_MOBILITY(L, MOBILITY_MOVE))
return L.resist_fire() //I just want to start a flame in your hearrrrrrtttttt.
@@ -447,8 +447,6 @@ or shoot a gun to move around via Newton's 3rd Law of Motion."
var/time_name
if(G.seconds_until_activation)
time_name = "until the Ark activates"
- else if(G.grace_period)
- time_name = "of grace period remaining"
else if(G.progress_in_seconds)
time_name = "until the Ark finishes summoning"
if(time_info)
@@ -600,17 +598,32 @@ so as to remain in compliance with the most up-to-date laws."
var/mob/living/L = usr
if(!istype(L) || !L.can_resist())
return
- L.changeNext_move(CLICK_CD_RESIST)
- if(CHECK_MOBILITY(L, MOBILITY_MOVE) && (L.last_special <= world.time))
- return L.resist_restraints()
+ L.MarkResistTime()
+ return L.resist_restraints()
/obj/screen/alert/restrained/buckled/Click()
var/mob/living/L = usr
if(!istype(L) || !L.can_resist())
return
- L.changeNext_move(CLICK_CD_RESIST)
- if(L.last_special <= world.time)
- return L.resist_buckle()
+ L.MarkResistTime()
+ return L.resist_buckle()
+
+/obj/screen/alert/shoes/untied
+ name = "Untied Shoes"
+ desc = "Your shoes are untied! Click the alert or your shoes to tie them."
+ icon_state = "shoealert"
+
+/obj/screen/alert/shoes/knotted
+ name = "Knotted Shoes"
+ desc = "Someone tied your shoelaces together! Click the alert or your shoes to undo the knot."
+ icon_state = "shoealert"
+
+/obj/screen/alert/shoes/Click()
+ var/mob/living/carbon/C = usr
+ if(!istype(C) || !C.can_resist() || C != mob_viewer || !C.shoes)
+ return
+ C.MarkResistTime()
+ C.shoes.handle_tying(C)
// PRIVATE = only edit, use, or override these if you're editing the system as a whole
diff --git a/code/_onclick/hud/clockwork_marauder.dm b/code/_onclick/hud/clockwork_marauder.dm
new file mode 100644
index 0000000000..09f85db574
--- /dev/null
+++ b/code/_onclick/hud/clockwork_marauder.dm
@@ -0,0 +1,45 @@
+/datum/hud/marauder
+ var/obj/screen/hosthealth
+ var/obj/screen/blockchance
+ var/obj/screen/counterchance
+
+/datum/hud/marauder/New(mob/living/simple_animal/hostile/clockwork/marauder/guardian/owner)
+ ..()
+ var/obj/screen/using
+
+ healths = new /obj/screen/healths/clock()
+ infodisplay += healths
+
+ hosthealth = new /obj/screen/healths/clock()
+ hosthealth.screen_loc = ui_internal
+ infodisplay += hosthealth
+
+ using = new /obj/screen/marauder/emerge()
+ using.screen_loc = ui_zonesel
+ static_inventory += using
+
+/datum/hud/marauder/Destroy()
+ blockchance = null
+ counterchance = null
+ hosthealth = null
+ return ..()
+
+/mob/living/simple_animal/hostile/clockwork/marauder/guardian/create_mob_hud()
+ if(client && !hud_used)
+ hud_used = new /datum/hud/marauder(src, ui_style2icon(client.prefs.UI_style))
+
+/obj/screen/marauder
+ icon = 'icons/mob/clockwork_mobs.dmi'
+
+/obj/screen/marauder/emerge
+ icon_state = "clockguard_emerge"
+ name = "Emerge/Return"
+ desc = "Emerge or Return."
+
+/obj/screen/marauder/emerge/Click()
+ if(istype(usr, /mob/living/simple_animal/hostile/clockwork/marauder/guardian))
+ var/mob/living/simple_animal/hostile/clockwork/marauder/guardian/G = usr
+ if(G.is_in_host())
+ G.try_emerge()
+ else
+ G.return_to_host()
diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm
index 9380cf98aa..04141becf2 100644
--- a/code/_onclick/hud/human.dm
+++ b/code/_onclick/hud/human.dm
@@ -140,6 +140,17 @@
sprint_buffer.hud = src
static_inventory += sprint_buffer
+ // clickdelay
+ clickdelay = new
+ clickdelay.hud = src
+ clickdelay.screen_loc = ui_clickdelay
+ static_inventory += clickdelay
+
+ // resistdelay
+ resistdelay = new
+ resistdelay.hud = src
+ resistdelay.screen_loc = ui_resistdelay
+ static_inventory += resistdelay
using = new /obj/screen/drop()
using.icon = ui_style
diff --git a/code/_onclick/hud/map_popups.dm b/code/_onclick/hud/map_popups.dm
new file mode 100644
index 0000000000..777ebb0718
--- /dev/null
+++ b/code/_onclick/hud/map_popups.dm
@@ -0,0 +1,165 @@
+/client
+ /**
+ * Assoc list with all the active maps - when a screen obj is added to
+ * a map, it's put in here as well.
+ *
+ * Format: list( = list(/obj/screen))
+ */
+ var/list/screen_maps = list()
+
+/**
+ * A screen object, which acts as a container for turfs and other things
+ * you want to show on the map, which you usually attach to "vis_contents".
+ */
+/obj/screen
+ /**
+ * Map name assigned to this object.
+ * Automatically set by /client/proc/add_obj_to_map.
+ */
+ var/assigned_map
+ /**
+ * Mark this object as garbage-collectible after you clean the map
+ * it was registered on.
+ *
+ * This could probably be changed to be a proc, for conditional removal.
+ * But for now, this works.
+ */
+ var/del_on_map_removal = TRUE
+
+/**
+ * A generic background object.
+ * It is also implicitly used to allocate a rectangle on the map, which will
+ * be used for auto-scaling the map.
+ */
+/obj/screen/background
+ name = "background"
+ icon = 'icons/mob/map_backgrounds.dmi'
+ icon_state = "clear"
+ layer = GAME_PLANE
+ plane = GAME_PLANE
+
+/**
+ * Sets screen_loc of this screen object, in form of point coordinates,
+ * with optional pixel offset (px, py).
+ *
+ * If applicable, "assigned_map" has to be assigned before this proc call.
+ */
+/obj/screen/proc/set_position(x, y, px = 0, py = 0)
+ if(assigned_map)
+ screen_loc = "[assigned_map]:[x]:[px],[y]:[py]"
+ else
+ screen_loc = "[x]:[px],[y]:[py]"
+
+/**
+ * Sets screen_loc to fill a rectangular area of the map.
+ *
+ * If applicable, "assigned_map" has to be assigned before this proc call.
+ */
+/obj/screen/proc/fill_rect(x1, y1, x2, y2)
+ if(assigned_map)
+ screen_loc = "[assigned_map]:[x1],[y1] to [x2],[y2]"
+ else
+ screen_loc = "[x1],[y1] to [x2],[y2]"
+
+/**
+ * Registers screen obj with the client, which makes it visible on the
+ * assigned map, and becomes a part of the assigned map's lifecycle.
+ */
+/client/proc/register_map_obj(obj/screen/screen_obj)
+ if(!screen_obj.assigned_map)
+ CRASH("Can't register [screen_obj] without 'assigned_map' property.")
+ if(!screen_maps[screen_obj.assigned_map])
+ screen_maps[screen_obj.assigned_map] = list()
+ // NOTE: Possibly an expensive operation
+ var/list/screen_map = screen_maps[screen_obj.assigned_map]
+ if(!screen_map.Find(screen_obj))
+ screen_map += screen_obj
+ if(!screen.Find(screen_obj))
+ screen += screen_obj
+
+/**
+ * Clears the map of registered screen objects.
+ *
+ * Not really needed most of the time, as the client's screen list gets reset
+ * on relog. any of the buttons are going to get caught by garbage collection
+ * anyway. they're effectively qdel'd.
+ */
+/client/proc/clear_map(map_name)
+ if(!map_name || !(map_name in screen_maps))
+ return FALSE
+ for(var/obj/screen/screen_obj in screen_maps[map_name])
+ screen_maps[map_name] -= screen_obj
+ if(screen_obj.del_on_map_removal)
+ qdel(screen_obj)
+ screen_maps -= map_name
+
+/**
+ * Clears all the maps of registered screen objects.
+ */
+/client/proc/clear_all_maps()
+ for(var/map_name in screen_maps)
+ clear_map(map_name)
+
+/**
+ * Creates a popup window with a basic map element in it, without any
+ * further initialization.
+ *
+ * Ratio is how many pixels by how many pixels (keep it simple).
+ *
+ * Returns a map name.
+ */
+/client/proc/create_popup(name, ratiox = 100, ratioy = 100)
+ winclone(src, "popupwindow", name)
+ var/list/winparams = list()
+ winparams["size"] = "[ratiox]x[ratioy]"
+ winparams["on-close"] = "handle-popup-close [name]"
+ winset(src, "[name]", list2params(winparams))
+ winshow(src, "[name]", 1)
+
+ var/list/params = list()
+ params["parent"] = "[name]"
+ params["type"] = "map"
+ params["size"] = "[ratiox]x[ratioy]"
+ params["anchor1"] = "0,0"
+ params["anchor2"] = "[ratiox],[ratioy]"
+ winset(src, "[name]_map", list2params(params))
+
+ return "[name]_map"
+
+/**
+ * Create the popup, and get it ready for generic use by giving
+ * it a background.
+ *
+ * Width and height are multiplied by 64 by default.
+ */
+/client/proc/setup_popup(popup_name, width = 9, height = 9, \
+ tilesize = 2, bg_icon)
+ if(!popup_name)
+ return
+ clear_map("[popup_name]_map")
+ var/x_value = world.icon_size * tilesize * width
+ var/y_value = world.icon_size * tilesize * height
+ var/map_name = create_popup(popup_name, x_value, y_value)
+
+ var/obj/screen/background/background = new
+ background.assigned_map = map_name
+ background.fill_rect(1, 1, width, height)
+ if(bg_icon)
+ background.icon_state = bg_icon
+ register_map_obj(background)
+
+ return map_name
+
+/**
+ * Closes a popup.
+ */
+/client/proc/close_popup(popup)
+ winshow(src, popup, 0)
+ handle_popup_close(popup)
+
+/**
+ * When the popup closes in any way (player or proc call) it calls this.
+ */
+/client/verb/handle_popup_close(window_id as text)
+ set hidden = TRUE
+ clear_map("[window_id]_map")
diff --git a/code/_onclick/hud/parallax.dm b/code/_onclick/hud/parallax.dm
index d8ef1c525a..9050bcb5f0 100755
--- a/code/_onclick/hud/parallax.dm
+++ b/code/_onclick/hud/parallax.dm
@@ -128,7 +128,7 @@
deltimer(C.parallax_animate_timer)
var/datum/callback/CB = CALLBACK(src, .proc/update_parallax_motionblur, C, animatedir, new_parallax_movedir, newtransform)
if(skip_windups)
- CB.Invoke()
+ CB.InvokeAsync()
else
C.parallax_animate_timer = addtimer(CB, min(shortesttimer, PARALLAX_LOOP_TIME), TIMER_CLIENT_TIME|TIMER_STOPPABLE)
@@ -219,6 +219,7 @@
L.screen_loc = "CENTER-7:[round(L.offset_x,1)],CENTER-7:[round(L.offset_y,1)]"
/atom/movable/proc/update_parallax_contents()
+ set waitfor = FALSE
if(length(client_mobs_in_contents))
for(var/thing in client_mobs_in_contents)
var/mob/M = thing
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index 4ed286eb08..126cc18907 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -47,17 +47,7 @@
name = "swap hand"
/obj/screen/swap_hand/Click()
- // At this point in client Click() code we have passed the 1/10 sec check and little else
- // We don't even know if it's a middle click
- if(world.time <= usr.next_move)
- return 1
-
- if(usr.incapacitated())
- return 1
-
- if(ismob(usr))
- var/mob/M = usr
- M.swap_hand()
+ usr.swap_hand()
return 1
/obj/screen/craft
@@ -101,15 +91,9 @@
plane = HUD_PLANE
/obj/screen/inventory/Click(location, control, params)
- // At this point in client Click() code we have passed the 1/10 sec check and little else
- // We don't even know if it's a middle click
- if(world.time <= usr.next_move)
- return TRUE
-
- if(usr.incapacitated())
- return TRUE
- if(ismecha(usr.loc)) // stops inventory actions in a mech
- return TRUE
+ if(hud?.mymob && (hud.mymob != usr))
+ return
+ // just redirect clicks
if(hud?.mymob && slot_id)
var/obj/item/inv_item = hud.mymob.get_item_by_slot(slot_id)
@@ -153,7 +137,7 @@
var/image/item_overlay = image(holding)
item_overlay.alpha = 92
- if(!user.can_equip(holding, slot_id, TRUE))
+ if(!user.can_equip(holding, slot_id, TRUE, TRUE, TRUE))
item_overlay.color = "#FF0000"
else
item_overlay.color = "#00ff00"
@@ -190,17 +174,10 @@
/obj/screen/inventory/hand/Click(location, control, params)
- // At this point in client Click() code we have passed the 1/10 sec check and little else
- // We don't even know if it's a middle click
- var/mob/user = hud?.mymob
- if(usr != user)
- return TRUE
- if(world.time <= user.next_move)
- return TRUE
- if(user.incapacitated())
- return TRUE
- if (ismecha(user.loc)) // stops inventory actions in a mech
- return TRUE
+ if(hud?.mymob && (hud.mymob != usr))
+ return
+ var/mob/user = hud.mymob
+ // just redirect clicks
if(user.active_hand_index == held_index)
var/obj/item/I = user.get_active_held_item()
diff --git a/code/_onclick/hud/screen_objects/clickdelay.dm b/code/_onclick/hud/screen_objects/clickdelay.dm
new file mode 100644
index 0000000000..e0ad039cdf
--- /dev/null
+++ b/code/_onclick/hud/screen_objects/clickdelay.dm
@@ -0,0 +1,58 @@
+/obj/screen/action_bar
+
+/obj/screen/action_bar/Destroy()
+ STOP_PROCESSING(SShuds, src)
+ return ..()
+
+/obj/screen/action_bar/proc/mark_dirty()
+ var/mob/living/L = hud?.mymob
+ if(L?.client && update_to_mob(L))
+ START_PROCESSING(SShuds, src)
+
+/obj/screen/action_bar/process()
+ var/mob/living/L = hud?.mymob
+ if(!L?.client || !update_to_mob(L))
+ return PROCESS_KILL
+
+/obj/screen/action_bar/proc/update_to_mob(mob/living/L)
+ return FALSE
+
+/datum/hud/var/obj/screen/action_bar/clickdelay/clickdelay
+
+/obj/screen/action_bar/clickdelay
+ name = "click delay"
+ icon = 'icons/effects/progessbar.dmi'
+ icon_state = "prog_bar_100"
+ layer = 20 // under hand buttons
+
+/obj/screen/action_bar/clickdelay/Initialize()
+ . = ..()
+ var/matrix/M = new
+ M.Scale(2, 1)
+ transform = M
+
+/obj/screen/action_bar/clickdelay/update_to_mob(mob/living/L)
+ var/estimated = L.EstimatedNextActionTime()
+ var/diff = estimated - L.last_action
+ var/left = estimated - world.time
+ if(left < 0 || diff < 0)
+ icon_state = "prog_bar_100"
+ return FALSE
+ icon_state = "prog_bar_[round(clamp(((diff - left)/diff) * 100, 0, 100), 5)]"
+ return TRUE
+
+/datum/hud/var/obj/screen/action_bar/resistdelay/resistdelay
+
+/obj/screen/action_bar/resistdelay
+ name = "resist delay"
+ icon = 'icons/effects/progessbar.dmi'
+ icon_state = "prog_bar_100"
+
+/obj/screen/action_bar/resistdelay/update_to_mob(mob/living/L)
+ var/diff = L.next_resist - L.last_resist
+ var/left = L.next_resist - world.time
+ if(left < 0 || diff < 0)
+ icon_state = "prog_bar_100"
+ return FALSE
+ icon_state = "prog_bar_[round(clamp(((diff - left)/diff) * 100, 0, 100), 5)]"
+ return TRUE
diff --git a/modular_citadel/code/_onclick/hud/sprint.dm b/code/_onclick/hud/screen_objects/sprint.dm
similarity index 100%
rename from modular_citadel/code/_onclick/hud/sprint.dm
rename to code/_onclick/hud/screen_objects/sprint.dm
diff --git a/modular_citadel/code/_onclick/hud/stamina.dm b/code/_onclick/hud/screen_objects/stamina.dm
similarity index 100%
rename from modular_citadel/code/_onclick/hud/stamina.dm
rename to code/_onclick/hud/screen_objects/stamina.dm
diff --git a/code/_onclick/hud/screen_objects/storage.dm b/code/_onclick/hud/screen_objects/storage.dm
index 7e8bfe12ab..ce7bc96c96 100644
--- a/code/_onclick/hud/screen_objects/storage.dm
+++ b/code/_onclick/hud/screen_objects/storage.dm
@@ -9,12 +9,9 @@
/obj/screen/storage/Click(location, control, params)
if(!insertion_click)
return ..()
- if(world.time <= usr.next_move)
- return TRUE
- if(usr.incapacitated())
- return TRUE
- if (ismecha(usr.loc)) // stops inventory actions in a mech
- return TRUE
+ if(hud?.mymob && (hud.mymob != usr))
+ return
+ // just redirect clicks
if(master)
var/obj/item/I = usr.get_active_held_item()
if(I)
diff --git a/modular_citadel/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects/vore.dm
similarity index 100%
rename from modular_citadel/code/_onclick/hud/screen_objects.dm
rename to code/_onclick/hud/screen_objects/vore.dm
diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index 106db7f40a..6a26a6f116 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -7,21 +7,22 @@
*and lastly
*afterattack. The return value does not matter.
*/
-/obj/item/proc/melee_attack_chain(mob/user, atom/target, params, flags, damage_multiplier = 1)
+/obj/item/proc/melee_attack_chain(mob/user, atom/target, params, attackchain_flags, damage_multiplier = 1)
if(isliving(user))
var/mob/living/L = user
- if(!CHECK_MOBILITY(L, MOBILITY_USE) && !(flags & ATTACKCHAIN_PARRY_COUNTERATTACK))
+ if(!CHECK_MOBILITY(L, MOBILITY_USE) && !(attackchain_flags & ATTACK_IS_PARRY_COUNTERATTACK))
to_chat(L, "You are unable to swing [src] right now!")
return
- if(tool_behaviour && target.tool_act(user, src, tool_behaviour))
+ . = attackchain_flags
+ if(tool_behaviour && ((. = target.tool_act(user, src, tool_behaviour)) & STOP_ATTACK_PROC_CHAIN))
return
- if(pre_attack(target, user, params))
+ if((. |= pre_attack(target, user, params, ., damage_multiplier)) & STOP_ATTACK_PROC_CHAIN)
return
- if(target.attackby(src, user, params, flags, damage_multiplier))
+ if((. |= target.attackby(src, user, params, ., damage_multiplier)) & STOP_ATTACK_PROC_CHAIN)
return
if(QDELETED(src) || QDELETED(target))
return
- afterattack(target, user, TRUE, params)
+ . |= afterattack(target, user, TRUE, params)
/// Like melee_attack_chain but for ranged.
/obj/item/proc/ranged_attack_chain(mob/user, atom/target, params)
@@ -30,7 +31,7 @@
if(!CHECK_MOBILITY(L, MOBILITY_USE))
to_chat(L, "You are unable to raise [src] right now!")
return
- afterattack(target, user, FALSE, params)
+ return afterattack(target, user, FALSE, params)
// Called when the item is in the active hand, and clicked; alternately, there is an 'activate held object' verb or you can hit pagedown.
/obj/item/proc/attack_self(mob/user)
@@ -38,28 +39,43 @@
return
interact(user)
-/obj/item/proc/pre_attack(atom/A, mob/living/user, params) //do stuff before attackby!
+/obj/item/proc/pre_attack(atom/A, mob/living/user, params, attackchain_flags, damage_multiplier) //do stuff before attackby!
if(SEND_SIGNAL(src, COMSIG_ITEM_PRE_ATTACK, A, user, params) & COMPONENT_NO_ATTACK)
- return TRUE
- return FALSE //return TRUE to avoid calling attackby after this proc does stuff
+ return STOP_ATTACK_PROC_CHAIN
+ if(!(attackchain_flags & ATTACK_IGNORE_CLICKDELAY) && !CheckAttackCooldown(user, A))
+ return STOP_ATTACK_PROC_CHAIN
// No comment
/atom/proc/attackby(obj/item/W, mob/user, params)
if(SEND_SIGNAL(src, COMSIG_PARENT_ATTACKBY, W, user, params) & COMPONENT_NO_AFTERATTACK)
- return TRUE
- return FALSE
+ return STOP_ATTACK_PROC_CHAIN
/obj/attackby(obj/item/I, mob/living/user, params)
- return ..() || ((obj_flags & CAN_BE_HIT) && I.attack_obj(src, user))
+ . = ..()
+ if(. & STOP_ATTACK_PROC_CHAIN)
+ return
+ if(obj_flags & CAN_BE_HIT)
+ . |= I.attack_obj(src, user)
/mob/living/attackby(obj/item/I, mob/living/user, params, attackchain_flags, damage_multiplier)
- if(..())
- return TRUE
- I.attack_delay_done = FALSE //Should be set TRUE in pre_attacked_by()
- . = I.attack(src, user, attackchain_flags, damage_multiplier)
- if(!I.attack_delay_done) //Otherwise, pre_attacked_by() should handle it.
- user.changeNext_move(I.click_delay)
+ . = ..()
+ if(. & STOP_ATTACK_PROC_CHAIN)
+ return
+ . |= I.attack(src, user, attackchain_flags, damage_multiplier)
+ if(!(. & NO_AUTO_CLICKDELAY_HANDLING)) // SAFETY NET - unless the proc tells us we should not handle this, give them the basic melee cooldown!
+ I.ApplyAttackCooldown(user, src, attackchain_flags)
+/**
+ * Called when someone uses us to attack a mob in melee combat.
+ *
+ * This proc respects CheckAttackCooldown() default clickdelay handling.
+ *
+ * @params
+ * * mob/living/M - target
+ * * mob/living/user - attacker
+ * * attackchain_Flags - see [code/__DEFINES/_flags/return_values.dm]
+ * * damage_multiplier - what to multiply the damage by
+ */
/obj/item/proc/attack(mob/living/M, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1)
if(SEND_SIGNAL(src, COMSIG_ITEM_ATTACK, M, user) & COMPONENT_ITEM_NO_ATTACK)
return
@@ -88,6 +104,17 @@
if(weight)
user.adjustStaminaLossBuffered(weight)
+ // CIT SCREENSHAKE
+ if(force >= 15)
+ shake_camera(user, ((force - 10) * 0.01 + 1), ((force - 10) * 0.01))
+ if(M.client)
+ switch (M.client.prefs.damagescreenshake)
+ if (1)
+ shake_camera(M, ((force - 10) * 0.015 + 1), ((force - 10) * 0.015))
+ if (2)
+ if(!CHECK_MOBILITY(M, MOBILITY_MOVE))
+ shake_camera(M, ((force - 10) * 0.015 + 1), ((force - 10) * 0.015))
+
//the equivalent of the standard version of attack() but for object targets.
/obj/item/proc/attack_obj(obj/O, mob/living/user)
if(SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_OBJ, O, user) & COMPONENT_NO_ATTACK_OBJ)
@@ -95,8 +122,7 @@
if(item_flags & NOBLUDGEON)
return
user.do_attack_animation(O)
- if(!O.attacked_by(src, user))
- user.changeNext_move(click_delay)
+ O.attacked_by(src, user)
var/weight = getweight(user, STAM_COST_ATTACK_OBJ_MULT)
if(weight)
user.adjustStaminaLossBuffered(weight)//CIT CHANGE - makes attacking things cause stamina loss
@@ -109,12 +135,9 @@
var/bad_trait
var/stamloss = user.getStaminaLoss()
- var/next_move_mult = 1
if(stamloss > STAMINA_NEAR_SOFTCRIT) //The more tired you are, the less damage you do.
var/penalty = (stamloss - STAMINA_NEAR_SOFTCRIT)/(STAMINA_NEAR_CRIT - STAMINA_NEAR_SOFTCRIT)*STAM_CRIT_ITEM_ATTACK_PENALTY
totitemdamage *= 1 - penalty
- next_move_mult += penalty*STAM_CRIT_ITEM_ATTACK_DELAY
- user.changeNext_move(I.click_delay*next_move_mult)
if(SEND_SIGNAL(user, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_INACTIVE))
bad_trait = SKILL_COMBAT_MODE //blacklist combat skills.
@@ -123,21 +146,21 @@
if(totitemdamage)
totitemdamage = user.mind.item_action_skills_mod(I, totitemdamage, I.skill_difficulty, SKILL_ATTACK_OBJ, bad_trait)
for(var/skill in I.used_skills)
- if(!(I.used_skills[skill] & SKILL_TRAIN_ATTACK_OBJ))
+ if(!(SKILL_TRAIN_ATTACK_OBJ in I.used_skills[skill]))
continue
user.mind.auto_gain_experience(skill, I.skill_gain)
-
+ if(!(attackchain_flags & NO_AUTO_CLICKDELAY_HANDLING))
+ I.ApplyAttackCooldown(user, src, attackchain_flags)
if(totitemdamage)
visible_message("[user] has hit [src] with [I]!", null, null, COMBAT_MESSAGE_RANGE)
//only witnesses close by and the victim see a hit message.
log_combat(user, src, "attacked", I)
take_damage(totitemdamage, I.damtype, "melee", 1)
- return TRUE
/mob/living/attacked_by(obj/item/I, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1)
var/list/block_return = list()
var/totitemdamage = pre_attacked_by(I, user) * damage_multiplier
- if((user != src) && mob_run_block(I, totitemdamage, "the [I.name]", ((attackchain_flags & ATTACKCHAIN_PARRY_COUNTERATTACK)? ATTACK_TYPE_PARRY_COUNTERATTACK : NONE) | ATTACK_TYPE_MELEE, I.armour_penetration, user, null, block_return) & BLOCK_SUCCESS)
+ if((user != src) && mob_run_block(I, totitemdamage, "the [I.name]", ((attackchain_flags & ATTACK_IS_PARRY_COUNTERATTACK)? ATTACK_IS_PARRY_COUNTERATTACK : NONE) | ATTACK_TYPE_MELEE, I.armour_penetration, user, null, block_return) & BLOCK_SUCCESS)
return FALSE
totitemdamage = block_calculate_resultant_damage(totitemdamage, block_return)
send_item_attack_message(I, user, null, totitemdamage)
@@ -155,8 +178,7 @@
/mob/living/simple_animal/attacked_by(obj/item/I, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1)
if(I.force < force_threshold || I.damtype == STAMINA)
- playsound(loc, 'sound/weapons/tap.ogg', I.get_clamped_volume(), 1, -1)
- user.changeNext_move(I.click_delay) //pre_attacked_by not called
+ playsound(src, 'sound/weapons/tap.ogg', I.get_clamped_volume(), 1, -1)
else
return ..()
@@ -167,37 +189,44 @@
var/stamloss = user.getStaminaLoss()
var/stam_mobility_mult = 1
- var/next_move_mult = 1
if(stamloss > STAMINA_NEAR_SOFTCRIT) //The more tired you are, the less damage you do.
var/penalty = (stamloss - STAMINA_NEAR_SOFTCRIT)/(STAMINA_NEAR_CRIT - STAMINA_NEAR_SOFTCRIT)*STAM_CRIT_ITEM_ATTACK_PENALTY
stam_mobility_mult -= penalty
- next_move_mult += penalty*STAM_CRIT_ITEM_ATTACK_DELAY
if(stam_mobility_mult > LYING_DAMAGE_PENALTY && !CHECK_MOBILITY(user, MOBILITY_STAND)) //damage penalty for fighting prone, doesn't stack with the above.
stam_mobility_mult = LYING_DAMAGE_PENALTY
. *= stam_mobility_mult
- user.changeNext_move(I.click_delay*next_move_mult)
- I.attack_delay_done = TRUE
var/bad_trait
if(!(I.item_flags & NO_COMBAT_MODE_FORCE_MODIFIER))
if(SEND_SIGNAL(user, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_INACTIVE))
bad_trait = SKILL_COMBAT_MODE //blacklist combat skills.
if(SEND_SIGNAL(src, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_ACTIVE))
- . *= 0.5
+ . *= 0.8
else if(SEND_SIGNAL(src, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_INACTIVE))
- . *= 1.5
+ . *= 1.2
if(!user.mind || !I.used_skills)
return
if(.)
. = user.mind.item_action_skills_mod(I, ., I.skill_difficulty, SKILL_ATTACK_MOB, bad_trait)
for(var/skill in I.used_skills)
- if(!(I.used_skills[skill] & SKILL_TRAIN_ATTACK_MOB))
+ if(!(SKILL_TRAIN_ATTACK_MOB in I.used_skills[skill]))
continue
- user.mind.auto_gain_experience(skill, I.skill_gain)
+ var/datum/skill/S = GLOB.skill_datums[skill]
+ user.mind.auto_gain_experience(skill, I.skill_gain*S.item_skill_gain_multi)
-// Proximity_flag is 1 if this afterattack was called on something adjacent, in your square, or on your person.
-// Click parameters is the params string from byond Click() code, see that documentation.
+/**
+ * Called after attacking something if the melee attack chain isn't interrupted before.
+ * Also called when clicking on something with an item without being in melee range
+ *
+ * WARNING: This does not automatically check clickdelay if not in a melee attack! Be sure to account for this!
+ *
+ * @params
+ * * target - The thing we clicked
+ * * user - mob of person clicking
+ * * proximity_flag - are we in melee range/doing it in a melee attack
+ * * click_parameters - mouse control parameters, check BYOND ref.
+ */
/obj/item/proc/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
SEND_SIGNAL(src, COMSIG_ITEM_AFTERATTACK, target, user, proximity_flag, click_parameters)
SEND_SIGNAL(user, COMSIG_MOB_ITEM_AFTERATTACK, target, user, proximity_flag, click_parameters)
diff --git a/code/_onclick/observer.dm b/code/_onclick/observer.dm
index 9f9870a9e5..8a1e745308 100644
--- a/code/_onclick/observer.dm
+++ b/code/_onclick/observer.dm
@@ -37,7 +37,7 @@
CtrlClickOn(A)
return
- if(world.time <= next_move)
+ if(!CheckActionCooldown())
return
// You are responsible for checking config.ghost_interaction when you override this function
// Not all of them require checking, see below
@@ -63,18 +63,9 @@
// And here are some good things for free:
// Now you can click through portals, wormholes, gateways, and teleporters while observing. -Sayu
-/obj/machinery/gateway/centerstation/attack_ghost(mob/user)
- if(awaygate)
- user.forceMove(awaygate.loc)
- else
- to_chat(user, "[src] has no destination.")
- return ..()
-
-/obj/machinery/gateway/centeraway/attack_ghost(mob/user)
- if(stationgate)
- user.forceMove(stationgate.loc)
- else
- to_chat(user, "[src] has no destination.")
+/obj/effect/gateway_portal_bumper/attack_ghost(mob/user)
+ if(gateway)
+ gateway.Transfer(user)
return ..()
/obj/machinery/teleport/hub/attack_ghost(mob/user)
diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm
index d4ec44a641..975c6e62d4 100644
--- a/code/_onclick/other_mobs.dm
+++ b/code/_onclick/other_mobs.dm
@@ -4,39 +4,57 @@
Otherwise pretty standard.
*/
-/mob/living/carbon/human/UnarmedAttack(atom/A, proximity)
+
+/mob/living/carbon/human/UnarmedAttack(atom/A, proximity, intent = a_intent, attackchain_flags = NONE)
if(!has_active_hand()) //can't attack without a hand.
to_chat(src, "You look at your arm and sigh.")
return
+ var/obj/item/bodypart/check_arm = get_active_hand()
+ if(check_arm && check_arm.is_disabled() == BODYPART_DISABLED_WOUND)
+ to_chat(src, "The damage in your [check_arm.name] is preventing you from using it! Get it fixed, or at least splinted!")
+ return
+
+ . = attackchain_flags
// Special glove functions:
// If the gloves do anything, have them return 1 to stop
// normal attack_hand() here.
var/obj/item/clothing/gloves/G = gloves // not typecast specifically enough in defines
- if(proximity && istype(G) && G.Touch(A,1))
- return
-
- var/override = 0
+ if(proximity && istype(G))
+ . |= G.Touch(A, TRUE)
+ if(. & INTERRUPT_UNARMED_ATTACK)
+ return
for(var/datum/mutation/human/HM in dna.mutations)
- override += HM.on_attack_hand(A, proximity)
+ . |= HM.on_attack_hand(A, proximity, intent, .)
- if(override)
+ if(. & INTERRUPT_UNARMED_ATTACK)
return
SEND_SIGNAL(src, COMSIG_HUMAN_MELEE_UNARMED_ATTACK, A)
- A.attack_hand(src)
+ return . | A.attack_hand(src, intent, .)
-//Return TRUE to cancel other attack hand effects that respect it.
-/atom/proc/attack_hand(mob/user)
- . = FALSE
+/atom/proc/attack_hand(mob/user, act_intent = user.a_intent, attackchain_flags)
+ SHOULD_NOT_SLEEP(TRUE)
if(!(interaction_flags_atom & INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND))
add_fingerprint(user)
if(SEND_SIGNAL(src, COMSIG_ATOM_ATTACK_HAND, user) & COMPONENT_NO_ATTACK_HAND)
- . = TRUE
+ return
+ . = attackchain_flags
+ if(attack_hand_speed && !(. & ATTACK_IGNORE_CLICKDELAY))
+ if(!user.CheckActionCooldown(attack_hand_speed))
+ return
if(interaction_flags_atom & INTERACT_ATOM_ATTACK_HAND)
. = _try_interact(user)
+ INVOKE_ASYNC(src, .proc/on_attack_hand, user, act_intent, .)
+ if(!(. & ATTACK_IGNORE_ACTION))
+ if(attack_hand_unwieldlyness)
+ user.DelayNextAction(attack_hand_unwieldlyness, considered_action = attack_hand_is_action)
+ else if(attack_hand_is_action)
+ user.DelayNextAction()
+
+/atom/proc/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
//Return a non FALSE value to cancel whatever called this from propagating, if it respects it.
/atom/proc/_try_interact(mob/user)
@@ -44,7 +62,6 @@
return interact(user)
if(can_interact(user))
return interact(user)
- return FALSE
/atom/proc/can_interact(mob/user)
if(!user.can_interact_with(src))
@@ -74,8 +91,7 @@
else
add_fingerprint(user)
if(interaction_flags_atom & INTERACT_ATOM_UI_INTERACT)
- return ui_interact(user)
- return FALSE
+ ui_interact(user)
/*
/mob/living/carbon/human/RestrainedClickOn(var/atom/A) ---carbons will handle this
@@ -89,13 +105,19 @@
. = ..()
if(gloves)
var/obj/item/clothing/gloves/G = gloves
- if(istype(G) && G.Touch(A,0)) // for magic gloves
+ . |= G.Touch(A, FALSE)
+ if(. & INTERRUPT_UNARMED_ATTACK)
+ return
+ if(istype(glasses))
+ . |= glasses.ranged_attack(src, A, mouseparams)
+ if(. & INTERRUPT_UNARMED_ATTACK)
return
- if (istype(glasses) && glasses.ranged_attack(src,A,mouseparams))
- return
for(var/datum/mutation/human/HM in dna.mutations)
- HM.on_ranged_attack(A, mouseparams)
+ . |= HM.on_ranged_attack(A, mouseparams)
+
+ if(. & INTERRUPT_UNARMED_ATTACK)
+ return
if(isturf(A) && get_dist(src,A) <= 1)
src.Move_Pulled(A)
@@ -104,11 +126,11 @@
/*
Animals & All Unspecified
*/
-/mob/living/UnarmedAttack(atom/A)
- A.attack_animal(src)
+/mob/living/UnarmedAttack(atom/A, proximity, intent = a_intent, flags = NONE)
+ A.attack_animal(src, intent, flags)
/atom/proc/attack_animal(mob/user)
- return
+ SEND_SIGNAL(src, COMSIG_ATOM_ATTACK_ANIMAL, user)
/mob/living/RestrainedClickOn(atom/A)
return
@@ -116,8 +138,10 @@
/*
Monkeys
*/
-/mob/living/carbon/monkey/UnarmedAttack(atom/A)
- A.attack_paw(src)
+/mob/living/carbon/monkey/UnarmedAttack(atom/A, proximity, intent = a_intent, flags = NONE)
+ if(!CheckActionCooldown(CLICK_CD_MELEE))
+ return
+ return !isnull(A.attack_paw(src, intent, flags))
/atom/proc/attack_paw(mob/user)
if(SEND_SIGNAL(src, COMSIG_ATOM_ATTACK_PAW, user) & COMPONENT_NO_ATTACK_HAND)
@@ -138,6 +162,8 @@
return
if(is_muzzled())
return
+ if(!CheckActionCooldown(CLICK_CD_MELEE))
+ return
var/mob/living/carbon/ML = A
if(istype(ML))
var/dam_zone = pick(BODY_ZONE_CHEST, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
@@ -157,13 +183,14 @@
ML.ForceContractDisease(D)
else
ML.visible_message("[src] has attempted to bite [ML]!")
+ DelayNextAction()
/*
Aliens
Defaults to same as monkey in most places
*/
-/mob/living/carbon/alien/UnarmedAttack(atom/A)
- A.attack_alien(src)
+/mob/living/carbon/alien/UnarmedAttack(atom/A, proximity, intent = a_intent, flags = NONE)
+ A.attack_alien(src, intent, flags)
/atom/proc/attack_alien(mob/living/carbon/alien/user)
attack_paw(user)
@@ -173,29 +200,29 @@
return
// Babby aliens
-/mob/living/carbon/alien/larva/UnarmedAttack(atom/A)
- A.attack_larva(src)
+/mob/living/carbon/alien/larva/UnarmedAttack(atom/A, proximity, intent = a_intent, flags = NONE)
+ A.attack_larva(src, intent, flags)
+
/atom/proc/attack_larva(mob/user)
return
-
/*
Slimes
Nothing happening here
*/
-/mob/living/simple_animal/slime/UnarmedAttack(atom/A)
- A.attack_slime(src)
+/mob/living/simple_animal/slime/UnarmedAttack(atom/A, proximity, intent = a_intent, flags = NONE)
+ A.attack_slime(src, intent, flags)
+
/atom/proc/attack_slime(mob/user)
return
/mob/living/simple_animal/slime/RestrainedClickOn(atom/A)
return
-
/*
Drones
*/
-/mob/living/simple_animal/drone/UnarmedAttack(atom/A)
- A.attack_drone(src)
+/mob/living/simple_animal/drone/UnarmedAttack(atom/A, proximity, intent = a_intent, flags = NONE)
+ A.attack_drone(src, intent, flags)
/atom/proc/attack_drone(mob/living/simple_animal/drone/user)
attack_hand(user) //defaults to attack_hand. Override it when you don't want drones to do same stuff as humans.
@@ -203,55 +230,44 @@
/mob/living/simple_animal/slime/RestrainedClickOn(atom/A)
return
-
/*
True Devil
*/
-
-/mob/living/carbon/true_devil/UnarmedAttack(atom/A, proximity)
+/mob/living/carbon/true_devil/UnarmedAttack(atom/A, proximity, intent = a_intent, flags = NONE)
A.attack_hand(src)
/*
Brain
*/
-
-/mob/living/brain/UnarmedAttack(atom/A)//Stops runtimes due to attack_animal being the default
+/mob/living/brain/UnarmedAttack(atom/A, proximity, intent = a_intent, flags = NONE)
return
-
/*
pAI
*/
-
-/mob/living/silicon/pai/UnarmedAttack(atom/A)//Stops runtimes due to attack_animal being the default
+/mob/living/silicon/pai/UnarmedAttack(atom/A, proximity, intent = a_intent, flags = NONE)
return
-
/*
Simple animals
*/
-
-/mob/living/simple_animal/UnarmedAttack(atom/A, proximity)
+/mob/living/simple_animal/UnarmedAttack(atom/A, proximity, intent = a_intent, flags = NONE)
if(!dextrous)
return ..()
if(!ismob(A))
- A.attack_hand(src)
+ A.attack_hand(src, intent, flags)
update_inv_hands()
-
/*
Hostile animals
*/
-
-/mob/living/simple_animal/hostile/UnarmedAttack(atom/A)
+/mob/living/simple_animal/hostile/UnarmedAttack(atom/A, proximity, intent = a_intent, flags = NONE)
target = A
if(dextrous && !ismob(A))
- ..()
+ return ..()
else
AttackingTarget()
-
-
/*
New Players:
Have no reason to click on anything at all.
diff --git a/modular_citadel/code/_onclick/click.dm b/code/_onclick/right_click.dm
similarity index 60%
rename from modular_citadel/code/_onclick/click.dm
rename to code/_onclick/right_click.dm
index 004cc2fe80..4b2480eb8c 100644
--- a/modular_citadel/code/_onclick/click.dm
+++ b/code/_onclick/right_click.dm
@@ -5,7 +5,7 @@
face_atom(A)
- if(next_move > world.time) // in the year 2000...
+ if(!CheckActionCooldown())
return
if(!modifiers["catcher"] && A.IsObscured())
@@ -16,9 +16,8 @@
return M.click_action(A,src,params)
if(restrained())
- changeNext_move(CLICK_CD_HANDCUFFED) //Doing shit in cuffs shall be vey slow
- RestrainedClickOn(A)
- return
+ DelayNextAction(CLICK_CD_HANDCUFFED)
+ return RestrainedClickOn(A)
if(in_throw_mode)
throw_item(A)//todo: make it plausible to lightly toss items via right-click
@@ -36,13 +35,14 @@
//User itself, current loc, and user inventory
if(A in DirectAccess())
if(W)
- W.rightclick_melee_attack_chain(src, A, params)
+ return W.rightclick_melee_attack_chain(src, A, params)
else
- if(ismob(A))
- changeNext_move(CLICK_CD_MELEE)
- if(!AltUnarmedAttack(A))
- UnarmedAttack(A)
- return
+ if(!AltUnarmedAttack(A, TRUE))
+ . = UnarmedAttack(A, TRUE, a_intent)
+ if(!(. & NO_AUTO_CLICKDELAY_HANDLING) && ismob(A))
+ DelayNextAction(CLICK_CD_MELEE)
+ return
+ return
//Can't reach anything else in lockers or other weirdness
if(!loc.AllowClick())
@@ -51,23 +51,25 @@
//Standard reach turf to turf or reaching inside storage
if(CanReach(A,W))
if(W)
- W.rightclick_melee_attack_chain(src, A, params)
+ return W.rightclick_melee_attack_chain(src, A, params)
else
- if(ismob(A))
- changeNext_move(CLICK_CD_MELEE)
- if(!AltUnarmedAttack(A,1))
- UnarmedAttack(A,1)
+ if(!AltUnarmedAttack(A, TRUE))
+ . = UnarmedAttack(A, TRUE, a_intent)
+ if(!(. & NO_AUTO_CLICKDELAY_HANDLING) && ismob(A))
+ DelayNextAction(CLICK_CD_MELEE)
+ return
+ return
else
if(W)
if(!W.altafterattack(A, src, FALSE, params))
- W.afterattack(A, src, FALSE, params)
+ return W.afterattack(A, src, FALSE, params)
else
- if(!AltRangedAttack(A,params))
- RangedAttack(A,params)
+ if(!AltRangedAttack(A, params))
+ return RangedAttack(A, params)
/mob/proc/AltUnarmedAttack(atom/A, proximity_flag)
if(ismob(A))
- changeNext_move(CLICK_CD_MELEE)
+ DelayNextAction(CLICK_CD_MELEE)
return FALSE
/mob/proc/AltRangedAttack(atom/A, params)
diff --git a/modular_citadel/code/_onclick/item_attack.dm b/code/_onclick/right_item_attack.dm
similarity index 82%
rename from modular_citadel/code/_onclick/item_attack.dm
rename to code/_onclick/right_item_attack.dm
index bba3b14e2e..4ac9c96c8e 100644
--- a/modular_citadel/code/_onclick/item_attack.dm
+++ b/code/_onclick/right_item_attack.dm
@@ -1,10 +1,9 @@
/obj/item/proc/rightclick_melee_attack_chain(mob/user, atom/target, params)
if(!alt_pre_attack(target, user, params)) //Hey, does this item have special behavior that should override all normal right-click functionality?
if(!target.altattackby(src, user, params)) //Does the target do anything special when we right-click on it?
- melee_attack_chain(user, target, params) //Ugh. Lame! I'm filing a legal complaint about the discrimination against the right mouse button!
+ . = melee_attack_chain(user, target, params) //Ugh. Lame! I'm filing a legal complaint about the discrimination against the right mouse button!
else
- altafterattack(target, user, TRUE, params)
- return
+ . = altafterattack(target, user, TRUE, params)
/obj/item/proc/alt_pre_attack(atom/A, mob/living/user, params)
return FALSE //return something other than false if you wanna override attacking completely
diff --git a/modular_citadel/code/_onclick/other_mobs.dm b/code/_onclick/right_other_mobs.dm
similarity index 93%
rename from modular_citadel/code/_onclick/other_mobs.dm
rename to code/_onclick/right_other_mobs.dm
index ec740f023b..2dc9fddeef 100644
--- a/modular_citadel/code/_onclick/other_mobs.dm
+++ b/code/_onclick/right_other_mobs.dm
@@ -3,15 +3,14 @@
to_chat(src, "You look at the state of the universe and sigh.") //lets face it, people rarely ever see this message in its intended condition.
return TRUE
- if(!A.alt_attack_hand(src))
- A.attack_hand(src)
- return TRUE
- return TRUE
+ return A.alt_attack_hand(src)
/mob/living/carbon/human/AltRangedAttack(atom/A, params)
if(isturf(A) || incapacitated()) // pretty annoying to wave your fist at floors and walls. And useless.
- return TRUE
- changeNext_move(CLICK_CD_RANGE)
+ return
+ if(!CheckActionCooldown(CLICK_CD_RANGE))
+ return
+ DelayNextAction()
var/list/target_viewers = fov_viewers(11, A) //doesn't check for blindness.
if(!(src in target_viewers)) //click catcher issuing calls for out of view objects.
return TRUE
diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm
index 6cf01ec8ff..f8a14b8c30 100644
--- a/code/_onclick/telekinesis.dm
+++ b/code/_onclick/telekinesis.dm
@@ -102,9 +102,8 @@
//stops TK grabs being equipped anywhere but into hands
/obj/item/tk_grab/equipped(mob/user, slot)
if(slot == SLOT_HANDS)
- return
+ return ..()
qdel(src)
- return
/obj/item/tk_grab/examine(user)
if (focus)
@@ -124,7 +123,8 @@
. = ..()
if(!target || !user)
return
-
+ if(!user.CheckActionCooldown(CLICK_CD_MELEE))
+ return
if(!focus)
focus_object(target)
return
@@ -146,7 +146,7 @@
else
apply_focus_overlay()
focus.throw_at(target, 10, 1,user)
- user.changeNext_move(CLICK_CD_MELEE)
+ user.DelayNextAction(considered_action = TRUE, flush = TRUE)
update_icon()
/proc/tkMaxRangeCheck(mob/user, atom/target)
diff --git a/code/controllers/configuration/config_entry.dm b/code/controllers/configuration/config_entry.dm
index 4647b83cd7..259082a6ba 100644
--- a/code/controllers/configuration/config_entry.dm
+++ b/code/controllers/configuration/config_entry.dm
@@ -83,7 +83,7 @@
var/auto_trim = TRUE
/datum/config_entry/string/vv_edit_var(var_name, var_value)
- return var_name != "auto_trim" && ..()
+ return var_name != NAMEOF(src, auto_trim) && ..()
/datum/config_entry/string/ValidateAndSet(str_val, during_load)
if(!VASProcCallGuard(str_val))
@@ -110,7 +110,7 @@
return FALSE
/datum/config_entry/number/vv_edit_var(var_name, var_value)
- var/static/list/banned_edits = list("max_val", "min_val", "integer")
+ var/static/list/banned_edits = list(NAMEOF(src, max_val), NAMEOF(src, min_val), NAMEOF(src, integer))
return !(var_name in banned_edits) && ..()
/datum/config_entry/flag
@@ -209,12 +209,20 @@
new_value = new_list
continue_check_value = new_list.len
if(continue_check_value && continue_check_key && ValidateListEntry(new_key, new_value))
+ new_key = preprocess_key(new_key)
+ new_value = preprocess_value(new_value)
config_entry_value[new_key] = new_value
return TRUE
return FALSE
/datum/config_entry/keyed_list/vv_edit_var(var_name, var_value)
- return var_name != "splitter" && ..()
+ return var_name != NAMEOF(src, splitter) && ..()
+
+/datum/config_entry/keyed_list/proc/preprocess_key(key)
+ return key
+
+/datum/config_entry/keyed_list/proc/preprocess_value(value)
+ return value
//snowflake for donator things being on one line smh
/datum/config_entry/multi_keyed_flag
diff --git a/code/controllers/configuration/configuration.dm b/code/controllers/configuration/configuration.dm
index 8f34901d46..1c6e96f9e4 100644
--- a/code/controllers/configuration/configuration.dm
+++ b/code/controllers/configuration/configuration.dm
@@ -14,6 +14,7 @@
var/list/modes // allowed modes
var/list/gamemode_cache
var/list/votable_modes // votable modes
+ // var/list/ic_filter_regex
var/list/storyteller_cache
var/list/mode_names
var/list/mode_reports
@@ -104,7 +105,9 @@
var/list/lines = world.file2list("[directory]/[filename]")
var/list/_entries = entries
var/list/postload_required = list()
+ var/linenumber = 0
for(var/L in lines)
+ linenumber++
L = trim(L)
if(!L)
continue
@@ -132,7 +135,7 @@
if(entry == "$include")
if(!value)
- log_config("Warning: Invalid $include directive: [value]")
+ log_config("LINE [linenumber]: Invalid $include directive: [value]")
else
LoadEntries(value, stack)
++.
@@ -140,7 +143,7 @@
var/datum/config_entry/E = _entries[entry]
if(!E)
- log_config("Unknown setting in configuration: '[entry]'")
+ log_config("LINE [linenumber]: Unknown setting: '[entry]'")
continue
if(lockthis)
@@ -150,7 +153,7 @@
var/datum/config_entry/new_ver = entries_by_type[E.deprecated_by]
var/new_value = E.DeprecationUpdate(value)
var/good_update = istext(new_value)
- log_config("Entry [entry] is deprecated and will be removed soon. Migrate to [new_ver.name]![good_update ? " Suggested new value is: [new_value]" : ""]")
+ log_config("LINE [linenumber]: [entry] is deprecated and will be removed soon. Migrate to [new_ver.name]![good_update ? " Suggested new value is: [new_value]" : ""]")
if(!warned_deprecated_configs)
addtimer(CALLBACK(GLOBAL_PROC, /proc/message_admins, "This server is using deprecated configuration settings. Please check the logs and update accordingly."), 0)
warned_deprecated_configs = TRUE
@@ -162,10 +165,10 @@
var/validated = E.ValidateAndSet(value, TRUE)
if(!validated)
- log_config("Failed to validate setting \"[value]\" for [entry]")
+ log_config("LINE [linenumber]: Failed to validate setting \"[value]\" for [entry]")
else
if(E.modified && !E.dupes_allowed)
- log_config("Duplicate setting for [entry] ([value], [E.resident_file]) detected! Using latest.")
+ log_config("LINE [linenumber]: Duplicate setting for [entry] ([value], [E.resident_file]) detected! Using latest.")
if(E.postload_required)
postload_required[E] = TRUE
@@ -412,3 +415,21 @@
continue
runnable_modes[M] = probabilities[M.config_tag]
return runnable_modes
+/*
+/datum/controller/configuration/proc/LoadChatFilter()
+ var/list/in_character_filter = list()
+
+ if(!fexists("[directory]/in_character_filter.txt"))
+ return
+ log_config("Loading config file in_character_filter.txt...")
+ for(var/line in world.file2list("[directory]/in_character_filter.txt"))
+ if(!line)
+ continue
+ if(findtextEx(line,"#",1,2))
+ continue
+ in_character_filter += REGEX_QUOTE(line)
+
+ ic_filter_regex = in_character_filter.len ? regex("\\b([jointext(in_character_filter, "|")])\\b", "i") : null
+
+ syncChatRegexes()
+*/
diff --git a/code/controllers/configuration/entries/comms.dm b/code/controllers/configuration/entries/comms.dm
index 012c3ec9fe..e56ff3f0d1 100644
--- a/code/controllers/configuration/entries/comms.dm
+++ b/code/controllers/configuration/entries/comms.dm
@@ -25,4 +25,23 @@
/datum/config_entry/string/medal_hub_address
/datum/config_entry/string/medal_hub_password
- protection = CONFIG_ENTRY_HIDDEN
\ No newline at end of file
+ protection = CONFIG_ENTRY_HIDDEN
+
+/datum/config_entry/keyed_list/cross_server_bunker_override
+ key_mode = KEY_MODE_TEXT
+ value_mode = VALUE_MODE_TEXT
+ protection = CONFIG_ENTRY_LOCKED
+
+/datum/config_entry/keyed_list/cross_server_bunker_override/ValidateAndSet(str_val)
+ . = ..()
+ if(.)
+ var/list/newv = list()
+ for(var/I in config_entry_value)
+ newv[replacetext(I, "+", " ")] = config_entry_value[I]
+ config_entry_value = newv
+
+/datum/config_entry/keyed_list/cross_server_bunker_override/ValidateListEntry(key_name, key_value)
+ return key_value != "byond:\\address:port" && ..()
+
+/datum/config_entry/flag/allow_cross_server_bunker_override
+ protection = CONFIG_ENTRY_LOCKED
diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm
index 7e7d939c39..5765f291e9 100644
--- a/code/controllers/configuration/entries/game_options.dm
+++ b/code/controllers/configuration/entries/game_options.dm
@@ -168,12 +168,14 @@
/datum/config_entry/flag/join_with_mutant_humans //players can pick mutant bodyparts for humans before joining the game
-/datum/config_entry/flag/no_summon_guns //No
+/datum/config_entry/flag/no_summon_guns //No
/datum/config_entry/flag/no_summon_magic //Fun
/datum/config_entry/flag/no_summon_events //Allowed
+/datum/config_entry/flag/no_summon_traumas //!
+
/datum/config_entry/flag/no_intercept_report //Whether or not to send a communications intercept report roundstart. This may be overridden by gamemodes.
/datum/config_entry/number/arrivals_shuttle_dock_window //Time from when a player late joins on the arrivals shuttle to when the shuttle docks on the station
@@ -521,3 +523,10 @@
* Camera mobs, AIs, ghosts and some other are of course exempt from this. This also doesn't influence simplemob AI, for the best.
*/
/datum/config_entry/flag/use_field_of_vision
+
+//Shuttle size limiter
+/datum/config_entry/number/max_shuttle_count
+ config_entry_value = 6
+
+/datum/config_entry/number/max_shuttle_size
+ config_entry_value = 250
diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm
index a1f8f098d3..2d5e69f149 100644
--- a/code/controllers/configuration/entries/general.dm
+++ b/code/controllers/configuration/entries/general.dm
@@ -56,6 +56,8 @@
/datum/config_entry/flag/log_adminchat // log admin chat messages
protection = CONFIG_ENTRY_LOCKED
+/datum/config_entry/flag/log_shuttle // log shuttle related actions, ie shuttle computers, shuttle manipulator, emergency console
+
/datum/config_entry/flag/log_pda // log pda messages
/datum/config_entry/flag/log_telecomms // log telecomms messages
@@ -468,3 +470,5 @@
/datum/config_entry/flag/minimaps_enabled
config_entry_value = TRUE
+
+/datum/config_entry/string/centcom_ban_db // URL for the CentCom Galactic Ban DB API
diff --git a/code/controllers/configuration/entries/policy.dm b/code/controllers/configuration/entries/policy.dm
new file mode 100644
index 0000000000..de611e1813
--- /dev/null
+++ b/code/controllers/configuration/entries/policy.dm
@@ -0,0 +1,11 @@
+/// Seconds for CMD on defib-with-memory-loss policy config to display instead of defib-intact config
+/datum/config_entry/number/defib_cmd_time_limit
+ config_entry_value = 300
+ integer = TRUE
+
+/datum/config_entry/keyed_list/policyconfig
+ key_mode = KEY_MODE_TEXT
+ value_mode = VALUE_MODE_TEXT
+
+/datum/config_entry/keyed_list/policyconfig/preprocess_key(key)
+ return uppertext(..())
diff --git a/code/controllers/subsystem.dm b/code/controllers/subsystem.dm
index a16de2ba4c..4ee3a01956 100644
--- a/code/controllers/subsystem.dm
+++ b/code/controllers/subsystem.dm
@@ -210,10 +210,10 @@
/datum/controller/subsystem/vv_edit_var(var_name, var_value)
switch (var_name)
- if ("can_fire")
+ if (NAMEOF(src, can_fire))
//this is so the subsystem doesn't rapid fire to make up missed ticks causing more lag
if (var_value)
next_fire = world.time + wait
- if ("queued_priority") //editing this breaks things.
- return 0
+ if (NAMEOF(src, queued_priority)) //editing this breaks things.
+ return FALSE
. = ..()
diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm
index d8c7724333..baceb4d055 100644
--- a/code/controllers/subsystem/air.dm
+++ b/code/controllers/subsystem/air.dm
@@ -6,7 +6,7 @@ SUBSYSTEM_DEF(air)
flags = SS_BACKGROUND
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
- var/cost_turf_reactions = 0
+ var/cost_turfs = 0
var/cost_groups = 0
var/cost_highpressure = 0
var/cost_hotspots = 0
@@ -14,10 +14,9 @@ SUBSYSTEM_DEF(air)
var/cost_pipenets = 0
var/cost_rebuilds = 0
var/cost_atmos_machinery = 0
+ var/cost_equalize = 0
- var/list/excited_groups = list()
var/list/active_turfs = list()
- var/list/turf_react_queue = list()
var/list/hotspots = list()
var/list/networks = list()
var/list/pipenets_needing_rebuilt = list()
@@ -38,20 +37,25 @@ SUBSYSTEM_DEF(air)
var/map_loading = TRUE
var/list/queued_for_activation
+ var/log_explosive_decompression = TRUE // If things get spammy, admemes can turn this off.
+
+ var/monstermos_turf_limit = 10
+ var/monstermos_hard_turf_limit = 2000
+ var/monstermos_enabled = TRUE
+
/datum/controller/subsystem/air/stat_entry(msg)
msg += "C:{"
- msg += "RQ:[round(cost_turf_reactions,1)]|"
+ msg += "EQ:[round(cost_equalize,1)]|"
+ msg += "AT:[round(cost_turfs,1)]|"
msg += "EG:[round(cost_groups,1)]|"
msg += "HP:[round(cost_highpressure,1)]|"
msg += "HS:[round(cost_hotspots,1)]|"
msg += "SC:[round(cost_superconductivity,1)]|"
msg += "PN:[round(cost_pipenets,1)]|"
- msg += "RB:[round(cost_rebuilds,1)]|"
msg += "AM:[round(cost_atmos_machinery,1)]"
msg += "} "
msg += "AT:[active_turfs.len]|"
- msg += "RQ:[turf_react_queue.len]|"
- msg += "EG:[excited_groups.len]|"
+ msg += "EG:[get_amt_excited_groups()]|"
msg += "HS:[hotspots.len]|"
msg += "PN:[networks.len]|"
msg += "HP:[high_pressure_delta.len]|"
@@ -59,8 +63,8 @@ SUBSYSTEM_DEF(air)
msg += "AT/MS:[round((cost ? active_turfs.len/cost : 0),0.1)]"
..(msg)
-
/datum/controller/subsystem/air/Initialize(timeofday)
+ extools_update_ssair()
map_loading = FALSE
setup_allturfs()
setup_atmos_machinery()
@@ -68,6 +72,7 @@ SUBSYSTEM_DEF(air)
gas_reactions = init_gas_reactions()
return ..()
+/datum/controller/subsystem/air/proc/extools_update_ssair()
/datum/controller/subsystem/air/fire(resumed = 0)
var/timer = TICK_USAGE_REAL
@@ -76,6 +81,8 @@ SUBSYSTEM_DEF(air)
var/list/pipenet_rebuilds = pipenets_needing_rebuilt
for(var/thing in pipenet_rebuilds)
var/obj/machinery/atmospherics/AT = thing
+ if(!istype(AT))
+ continue
AT.build_network()
cost_rebuilds = MC_AVERAGE(cost_rebuilds, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer))
pipenets_needing_rebuilt.Cut()
@@ -99,12 +106,21 @@ SUBSYSTEM_DEF(air)
if(state != SS_RUNNING)
return
resumed = 0
- currentpart = SSAIR_REACTQUEUE
+ currentpart = monstermos_enabled ? SSAIR_EQUALIZE : SSAIR_ACTIVETURFS
- if(currentpart == SSAIR_REACTQUEUE)
+ if(currentpart == SSAIR_EQUALIZE)
timer = TICK_USAGE_REAL
- process_react_queue(resumed)
- cost_turf_reactions = MC_AVERAGE(cost_turf_reactions, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer))
+ process_turf_equalize(resumed)
+ cost_equalize = MC_AVERAGE(cost_equalize, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer))
+ if(state != SS_RUNNING)
+ return
+ resumed = 0
+ currentpart = SSAIR_ACTIVETURFS
+
+ if(currentpart == SSAIR_ACTIVETURFS)
+ timer = TICK_USAGE_REAL
+ process_active_turfs(resumed)
+ cost_turfs = MC_AVERAGE(cost_turfs, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer))
if(state != SS_RUNNING)
return
resumed = 0
@@ -146,6 +162,8 @@ SUBSYSTEM_DEF(air)
resumed = 0
currentpart = SSAIR_REBUILD_PIPENETS
+
+
/datum/controller/subsystem/air/proc/process_pipenets(resumed = 0)
if (!resumed)
src.currentrun = networks.Copy()
@@ -180,19 +198,6 @@ SUBSYSTEM_DEF(air)
return
-/datum/controller/subsystem/air/proc/process_react_queue(resumed = 0)
- if(!resumed)
- src.currentrun = turf_react_queue.Copy()
- var/list/currentrun = src.currentrun
- while(currentrun.len)
- var/turf/open/T = currentrun[currentrun.len]
- currentrun.len--
- if(T)
- T.process_cell_reaction()
- if(MC_TICK_CHECK)
- return
-
-
/datum/controller/subsystem/air/proc/process_super_conductivity(resumed = 0)
if (!resumed)
src.currentrun = active_super_conductivity.Copy()
@@ -227,10 +232,45 @@ SUBSYSTEM_DEF(air)
high_pressure_delta.len--
T.high_pressure_movements()
T.pressure_difference = 0
+ T.pressure_specific_target = null
if(MC_TICK_CHECK)
return
+/datum/controller/subsystem/air/proc/process_turf_equalize(resumed = 0)
+ //cache for sanic speed
+ var/fire_count = times_fired
+ if (!resumed)
+ src.currentrun = active_turfs.Copy()
+ //cache for sanic speed (lists are references anyways)
+ var/list/currentrun = src.currentrun
+ while(currentrun.len)
+ var/turf/open/T = currentrun[currentrun.len]
+ currentrun.len--
+ if (T)
+ T.equalize_pressure_in_zone(fire_count)
+ //equalize_pressure_in_zone(T, fire_count)
+ if (MC_TICK_CHECK)
+ return
+
+/datum/controller/subsystem/air/proc/process_active_turfs(resumed = 0)
+ //cache for sanic speed
+ var/fire_count = times_fired
+ if (!resumed)
+ src.currentrun = active_turfs.Copy()
+ //cache for sanic speed (lists are references anyways)
+ var/list/currentrun = src.currentrun
+ while(currentrun.len)
+ var/turf/open/T = currentrun[currentrun.len]
+ currentrun.len--
+ if (T)
+ T.process_cell(fire_count)
+ if (MC_TICK_CHECK)
+ return
+
/datum/controller/subsystem/air/proc/process_excited_groups(resumed = 0)
+ if(process_excited_groups_extools(resumed, (Master.current_ticklimit - TICK_USAGE) * 0.01 * world.tick_lag))
+ sleep()
+ /*
if (!resumed)
src.currentrun = excited_groups.Copy()
//cache for sanic speed (lists are references anyways)
@@ -246,29 +286,33 @@ SUBSYSTEM_DEF(air)
EG.dismantle()
if (MC_TICK_CHECK)
return
+ */
+
+/datum/controller/subsystem/air/proc/process_excited_groups_extools()
+/datum/controller/subsystem/air/proc/get_amt_excited_groups()
/datum/controller/subsystem/air/proc/remove_from_active(turf/open/T)
active_turfs -= T
- SSair_turfs.currentrun -= T
+ if(currentpart == SSAIR_ACTIVETURFS)
+ currentrun -= T
#ifdef VISUALIZE_ACTIVE_TURFS
T.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, "#00ff00")
#endif
if(istype(T))
- T.excited = 0
- if(T.excited_group)
- T.excited_group.garbage_collect()
- remove_from_react_queue(T)
+ T.set_excited(FALSE)
+ T.eg_garbage_collect()
/datum/controller/subsystem/air/proc/add_to_active(turf/open/T, blockchanges = 1)
if(istype(T) && T.air)
#ifdef VISUALIZE_ACTIVE_TURFS
T.add_atom_colour("#00ff00", TEMPORARY_COLOUR_PRIORITY)
#endif
- T.excited = TRUE
- active_turfs[T] = SSair_turfs.currentrun[T] = TRUE
- if(blockchanges && T.excited_group)
- T.excited_group.garbage_collect()
- add_to_react_queue(T)
+ T.set_excited(TRUE)
+ active_turfs |= T
+ if(currentpart == SSAIR_ACTIVETURFS)
+ currentrun |= T
+ if(blockchanges)
+ T.eg_garbage_collect()
else if(T.flags_1 & INITIALIZED_1)
for(var/turf/S in T.atmos_adjacent_turfs)
add_to_active(S)
@@ -279,17 +323,6 @@ SUBSYSTEM_DEF(air)
else
T.requires_activation = TRUE
-/datum/controller/subsystem/air/proc/add_to_react_queue(turf/open/T)
- if(istype(T) && T.air)
- turf_react_queue[T] = TRUE
- if(currentpart == SSAIR_REACTQUEUE)
- currentrun[T] = TRUE
-
-/datum/controller/subsystem/air/proc/remove_from_react_queue(turf/open/T)
- turf_react_queue -= T
- if(currentpart == SSAIR_REACTQUEUE)
- currentrun -= T
-
/datum/controller/subsystem/air/StartLoadingMap()
LAZYINITLIST(queued_for_activation)
map_loading = TRUE
@@ -337,11 +370,11 @@ SUBSYSTEM_DEF(air)
while (turfs_to_check.len)
var/ending_ats = active_turfs.len
- for(var/thing in excited_groups)
+ /*for(var/thing in excited_groups)
var/datum/excited_group/EG = thing
- EG.self_breakdown(space_is_all_consuming = 1)
- EG.dismantle()
- CHECK_TICK
+ //EG.self_breakdown(space_is_all_consuming = 1)
+ //EG.dismantle()
+ CHECK_TICK*/
var/msg = "HEY! LISTEN! [DisplayTimeText(world.timeofday - timer)] were wasted processing [starting_ats] turf(s) (connected to [ending_ats] other turfs) with atmos differences at round start."
to_chat(world, "[msg]")
@@ -349,6 +382,7 @@ SUBSYSTEM_DEF(air)
/turf/open/proc/resolve_active_graph()
. = list()
+ /*
var/datum/excited_group/EG = excited_group
if (blocks_air || !air)
return
@@ -369,7 +403,8 @@ SUBSYSTEM_DEF(air)
EG.add_turf(ET)
if (!ET.excited)
ET.excited = 1
- . += ET
+ . += ET*/
+
/turf/open/space/resolve_active_graph()
return list()
@@ -387,9 +422,8 @@ SUBSYSTEM_DEF(air)
CHECK_TICK
/datum/controller/subsystem/air/proc/setup_template_machinery(list/atmos_machines)
- if(!initialized)
- return
-
+ if(!initialized) // yogs - fixes randomized bars
+ return // yogs
for(var/A in atmos_machines)
var/obj/machinery/atmospherics/AM = A
AM.atmosinit()
@@ -413,6 +447,7 @@ SUBSYSTEM_DEF(air)
#undef SSAIR_PIPENETS
#undef SSAIR_ATMOSMACHINERY
+#undef SSAIR_ACTIVETURFS
#undef SSAIR_EXCITEDGROUPS
#undef SSAIR_HIGHPRESSURE
#undef SSAIR_HOTSPOTS
diff --git a/code/controllers/subsystem/air_turfs.dm b/code/controllers/subsystem/air_turfs.dm
index 9dd41aede5..7320defcae 100644
--- a/code/controllers/subsystem/air_turfs.dm
+++ b/code/controllers/subsystem/air_turfs.dm
@@ -1,5 +1,5 @@
//WHAT IF WE TAKE THE ACTIVE TURF PROCESSING AND PUSH IT SOMEWHERE ELSE!!!
-
+/*
SUBSYSTEM_DEF(air_turfs)
name = "Atmospherics - Turfs"
init_order = INIT_ORDER_AIR_TURFS
@@ -24,3 +24,4 @@ SUBSYSTEM_DEF(air_turfs)
return
resumed = 0
return
+*/
diff --git a/code/controllers/subsystem/assets.dm b/code/controllers/subsystem/assets.dm
index 7b6554bd3f..7285298283 100644
--- a/code/controllers/subsystem/assets.dm
+++ b/code/controllers/subsystem/assets.dm
@@ -6,17 +6,7 @@ SUBSYSTEM_DEF(assets)
var/list/preload = list()
/datum/controller/subsystem/assets/Initialize(timeofday)
-
- var/list/priority_assets = list(
- /datum/asset/simple/oui_theme_nano,
- /datum/asset/simple/goonchat
- )
-
- for(var/type in priority_assets)
- var/datum/asset/A = new type()
- A.register()
-
- for(var/type in typesof(/datum/asset) - (priority_assets | list(/datum/asset, /datum/asset/simple)))
+ for(var/type in typesof(/datum/asset))
var/datum/asset/A = type
if (type != initial(A._abstract))
get_asset_datum(type)
diff --git a/code/controllers/subsystem/atoms.dm b/code/controllers/subsystem/atoms.dm
index c1644df9c9..db1fced637 100644
--- a/code/controllers/subsystem/atoms.dm
+++ b/code/controllers/subsystem/atoms.dm
@@ -16,6 +16,7 @@ SUBSYSTEM_DEF(atoms)
/datum/controller/subsystem/atoms/Initialize(timeofday)
GLOB.fire_overlay.appearance_flags = RESET_COLOR
+ setupGenetics()
initialized = INITIALIZATION_INNEW_MAPLOAD
InitializeAtoms()
return ..()
@@ -106,6 +107,29 @@ SUBSYSTEM_DEF(atoms)
old_initialized = SSatoms.old_initialized
BadInitializeCalls = SSatoms.BadInitializeCalls
+/datum/controller/subsystem/atoms/proc/setupGenetics()
+ var/list/mutations = subtypesof(/datum/mutation/human)
+ shuffle_inplace(mutations)
+ for(var/A in subtypesof(/datum/generecipe))
+ var/datum/generecipe/GR = A
+ GLOB.mutation_recipes[initial(GR.required)] = initial(GR.result)
+ for(var/i in 1 to LAZYLEN(mutations))
+ var/path = mutations[i] //byond gets pissy when we do it in one line
+ var/datum/mutation/human/B = new path ()
+ B.alias = "Mutation [i]"
+ GLOB.all_mutations[B.type] = B
+ GLOB.full_sequences[B.type] = generate_gene_sequence(B.blocks)
+ GLOB.alias_mutations[B.alias] = B.type
+ if(B.locked)
+ continue
+ if(B.quality == POSITIVE)
+ GLOB.good_mutations |= B
+ else if(B.quality == NEGATIVE)
+ GLOB.bad_mutations |= B
+ else if(B.quality == MINOR_NEGATIVE)
+ GLOB.not_good_mutations |= B
+ CHECK_TICK
+
/datum/controller/subsystem/atoms/proc/InitLog()
. = ""
for(var/path in BadInitializeCalls)
diff --git a/code/controllers/subsystem/blackbox.dm b/code/controllers/subsystem/blackbox.dm
index d6991a40b4..dc1f246e3d 100644
--- a/code/controllers/subsystem/blackbox.dm
+++ b/code/controllers/subsystem/blackbox.dm
@@ -60,9 +60,9 @@ SUBSYSTEM_DEF(blackbox)
/datum/controller/subsystem/blackbox/vv_edit_var(var_name, var_value)
switch(var_name)
- if("feedback")
+ if(NAMEOF(src, feedback))
return FALSE
- if("sealed")
+ if(NAMEOF(src, sealed))
if(var_value)
return Seal()
return FALSE
diff --git a/code/controllers/subsystem/chat.dm b/code/controllers/subsystem/chat.dm
index 8d4de0c091..ba2794d00f 100644
--- a/code/controllers/subsystem/chat.dm
+++ b/code/controllers/subsystem/chat.dm
@@ -4,6 +4,7 @@ SUBSYSTEM_DEF(chat)
wait = 1
priority = FIRE_PRIORITY_CHAT
init_order = INIT_ORDER_CHAT
+
var/list/payload = list()
@@ -17,7 +18,7 @@ SUBSYSTEM_DEF(chat)
return
-/datum/controller/subsystem/chat/proc/queue(target, message, handle_whitespace = TRUE)
+/datum/controller/subsystem/chat/proc/queue(target, message, handle_whitespace = TRUE, trailing_newline = TRUE, confidential = TRUE)
if(!target || !message)
return
@@ -30,30 +31,35 @@ SUBSYSTEM_DEF(chat)
//Some macros remain in the string even after parsing and fuck up the eventual output
var/original_message = message
- message = replacetext(message, "\improper", "")
- message = replacetext(message, "\proper", "")
- if(handle_whitespace)
- message = replacetext(message, "\n", " ")
- message = replacetext(message, "\t", "[FOURSPACES][FOURSPACES]")
- message += " "
-
//url_encode it TWICE, this way any UTF-8 characters are able to be decoded by the Javascript.
//Do the double-encoding here to save nanoseconds
- var/twiceEncoded = url_encode(url_encode(message))
+ var/twiceEncoded
if(islist(target))
+ var/sanitized_message = FALSE
for(var/I in target)
var/client/C = CLIENT_FROM_VAR(I) //Grab us a client if possible
if(!C)
- return
+ continue
//Send it to the old style output window.
SEND_TEXT(C, original_message)
if(!C?.chatOutput || C.chatOutput.broken) //A player who hasn't updated his skin file.
continue
+
+ if(!sanitized_message)
+ message = replacetext(message, "\improper", "")
+ message = replacetext(message, "\proper", "")
+ if(handle_whitespace)
+ message = replacetext(message, "\n", " ")
+ message = replacetext(message, "\t", "[FOURSPACES][FOURSPACES]")
+ if (trailing_newline)
+ message += " "
+ twiceEncoded = url_encode(url_encode(message))
+ sanitized_message = TRUE
if(!C.chatOutput.loaded) //Client still loading, put their messages in a queue
C.chatOutput.messageQueue += message
@@ -73,6 +79,15 @@ SUBSYSTEM_DEF(chat)
if(!C?.chatOutput || C.chatOutput.broken) //A player who hasn't updated his skin file.
return
+ message = replacetext(message, "\improper", "")
+ message = replacetext(message, "\proper", "")
+ if(handle_whitespace)
+ message = replacetext(message, "\n", " ")
+ message = replacetext(message, "\t", "[FOURSPACES][FOURSPACES]")
+ if (trailing_newline)
+ message += " "
+ twiceEncoded = url_encode(url_encode(message))
+
if(!C.chatOutput.loaded) //Client still loading, put their messages in a queue
C.chatOutput.messageQueue += message
return
diff --git a/code/controllers/subsystem/events.dm b/code/controllers/subsystem/events.dm
index abc46cba25..2e4e728191 100644
--- a/code/controllers/subsystem/events.dm
+++ b/code/controllers/subsystem/events.dm
@@ -12,7 +12,7 @@ SUBSYSTEM_DEF(events)
var/frequency_upper = 6000 //10 minutes upper bound. Basically an event will happen every 3 to 10 minutes.
var/list/holidays //List of all holidays occuring today or null if no holidays
- var/wizardmode = 0
+ var/wizardmode = FALSE
/datum/controller/subsystem/events/Initialize(time, zlevel)
for(var/type in typesof(/datum/round_event_control))
@@ -91,6 +91,7 @@ SUBSYSTEM_DEF(events)
if(. == EVENT_CANT_RUN)//we couldn't run this event for some reason, set its max_occurrences to 0
E.max_occurrences = 0
else if(. == EVENT_READY)
+ E.random = TRUE
E.runEvent(TRUE)
//allows a client to trigger an event
diff --git a/code/controllers/subsystem/input.dm b/code/controllers/subsystem/input.dm
index 7c51ba4506..32936af9e9 100644
--- a/code/controllers/subsystem/input.dm
+++ b/code/controllers/subsystem/input.dm
@@ -64,19 +64,33 @@ SUBSYSTEM_DEF(input)
// Misc
macroset_classic_input["Tab"] = "\".winset \\\"mainwindow.macro=[SKIN_MACROSET_CLASSIC_HOTKEYS] map.focus=true input.background-color=[COLOR_INPUT_DISABLED]\\\"\""
macroset_classic_input["Escape"] = "\".winset \\\"input.text=\\\"\\\"\\\"\""
-
+
// FINALLY, WE CAN DO SOMETHING MORE NORMAL FOR THE SNOWFLAKE-BUT-LESS KEYSET.
+
+ // HAHA - SIKE. Because of BYOND weirdness (tl;dr not specifically binding this way results in potentially duplicate chatboxes when
+ // conflicts occur with something like say indicator vs say), we're going to snowflake this anyways
+ var/list/hard_binds = list(
+ "O" = "ooc",
+ "T" = "say",
+ "L" = "looc",
+ "M" = "me"
+ )
+ var/list/hard_bind_anti_collision = list()
+ var/list/anti_collision_modifiers = list("Ctrl", "Alt", "Shift", "Ctrl+Alt", "Ctrl+Shift", "Alt+Shift", "Ctrl+Alt+Shift")
+ for(var/key in hard_binds)
+ for(var/modifier in anti_collision_modifiers)
+ hard_bind_anti_collision["[modifier]+[key]"] = ".NONSENSICAL_VERB_THAT_DOES_NOTHING"
+
macroset_classic_hotkey = list(
"Any" = "\"KeyDown \[\[*\]\]\"",
"Any+UP" = "\"KeyUp \[\[*\]\]\"",
"Tab" = "\".winset \\\"mainwindow.macro=[SKIN_MACROSET_CLASSIC_INPUT] input.focus=true input.background-color=[COLOR_INPUT_ENABLED]\\\"\"",
"Escape" = "\".winset \\\"input.text=\\\"\\\"\\\"\"",
"Back" = "\".winset \\\"input.text=\\\"\\\"\\\"\"",
- "O" = "ooc",
- "T" = "say",
- "L" = "looc",
- "M" = "me"
)
+
+ macroset_classic_hotkey |= hard_binds
+ macroset_classic_hotkey |= hard_bind_anti_collision
// And finally, the modern set.
macroset_hotkey = list(
@@ -85,11 +99,10 @@ SUBSYSTEM_DEF(input)
"Tab" = "\".winset \\\"input.focus=true?map.focus=true input.background-color=[COLOR_INPUT_DISABLED]:input.focus=true input.background-color=[COLOR_INPUT_ENABLED]\\\"\"",
"Escape" = "\".winset \\\"input.text=\\\"\\\"\\\"\"",
"Back" = "\".winset \\\"input.text=\\\"\\\"\\\"\"",
- "O" = "ooc",
- "T" = "say",
- "L" = "looc",
- "M" = "me"
)
+
+ macroset_hotkey |= hard_binds
+ macroset_hotkey |= hard_bind_anti_collision
// Badmins just wanna have fun ♪
/datum/controller/subsystem/input/proc/refresh_client_macro_sets()
@@ -104,3 +117,8 @@ SUBSYSTEM_DEF(input)
for(var/i in 1 to clients.len)
var/client/C = clients[i]
C.keyLoop()
+
+/// *sigh
+/client/verb/NONSENSICAL_VERB_THAT_DOES_NOTHING()
+ set name = ".NONSENSICAL_VERB_THAT_DOES_NOTHING"
+ set hidden = TRUE
diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm
index b234c4c4f2..97addfa131 100644
--- a/code/controllers/subsystem/mapping.dm
+++ b/code/controllers/subsystem/mapping.dm
@@ -334,6 +334,7 @@ GLOBAL_LIST_EMPTY(the_station_areas)
for (var/map in mapvotes)
if (!map)
mapvotes.Remove(map)
+ continue
if (!(map in global.config.maplist))
mapvotes.Remove(map)
continue
@@ -468,11 +469,10 @@ GLOBAL_LIST_EMPTY(the_station_areas)
else
return
- possible_options += "Custom"
- var/lvl_name
- var/datum/space_level/level
+ var/away_name
+ var/datum/space_level/away_level
- var/answer = input("What kind ? ","Away/VR") as null|anything in possible_options
+ var/answer = input("What kind ? ","Away/VR") as null|anything in list(possible_options + "Custom")
switch(answer)
if(null)
return
@@ -480,34 +480,22 @@ GLOBAL_LIST_EMPTY(the_station_areas)
var/mapfile = input("Pick file:", "File") as null|file
if(!mapfile)
return
- lvl_name = "[mapfile] custom"
- to_chat(usr,"Loading [lvl_name]...")
+ away_name = "[mapfile] custom"
+ to_chat(usr,"Loading [away_name]...")
var/datum/map_template/template = new(mapfile, choice, ztraits)
- level = template.load_new_z(ztraits)
+ away_level = template.load_new_z(ztraits)
else
- lvl_name = answer
- to_chat(usr,"Loading [lvl_name]...")
- var/datum/map_template/template = new(lvl_name, choice)
- level = template.load_new_z(ztraits)
+ away_name = answer
+ to_chat(usr,"Loading [away_name]...")
+ var/datum/map_template/template = new(away_name, choice)
+ away_level = template.load_new_z(ztraits)
- message_admins("Admin [key_name_admin(usr)] has loaded [lvl_name] [choice].")
- log_admin("Admin [key_name(usr)] has loaded [lvl_name] [choice].")
- if(!level)
- message_admins("Loading [lvl_name] failed!")
+ message_admins("Admin [key_name_admin(usr)] has loaded [away_name] away mission.")
+ log_admin("Admin [key_name(usr)] has loaded [away_name] away mission.")
+ if(!away_level)
+ message_admins("Loading [away_name] failed!")
return
-
- if(choice == AWAY_MISSION_NAME && GLOB.the_gateway)
- //Link any found away gate with station gate
- var/obj/machinery/gateway/centeraway/new_gate
- for(var/obj/machinery/gateway/centeraway/G in GLOB.machines)
- if(G.z == level.z_value) //I'll have to refactor gateway shitcode before multi-away support.
- new_gate = G
- break
- //Link station gate with away gate and remove wait time.
- GLOB.the_gateway.awaygate = new_gate
- GLOB.the_gateway.wait = world.time
-
/datum/controller/subsystem/mapping/proc/RequestBlockReservation(width, height, z, type = /datum/turf_reservation, turf_type_override, border_type_override)
UNTIL((!z || reservation_ready["[z]"]) && !clearing_reserved_turfs)
var/datum/turf_reservation/reserve = new type
diff --git a/code/controllers/subsystem/materials.dm b/code/controllers/subsystem/materials.dm
index 96d733e8da..23d5a7a2b7 100644
--- a/code/controllers/subsystem/materials.dm
+++ b/code/controllers/subsystem/materials.dm
@@ -10,24 +10,52 @@ SUBSYSTEM_DEF(materials)
var/list/materials
///Dictionary of category || list of material refs
var/list/materials_by_category
+ ///Dictionary of category || list of material types, mostly used by rnd machines like autolathes.
+ var/list/materialtypes_by_category
+ ///A cache of all material combinations that have been used
+ var/list/list/material_combos
///List of stackcrafting recipes for materials using rigid materials
var/list/rigid_stack_recipes = list(
new /datum/stack_recipe("chair", /obj/structure/chair/greyscale, one_per_turf = TRUE, on_floor = TRUE, applies_mats = TRUE),
new /datum/stack_recipe("toilet", /obj/structure/toilet/greyscale, one_per_turf = TRUE, on_floor = TRUE, applies_mats = TRUE),
new /datum/stack_recipe("sink", /obj/structure/sink/greyscale, one_per_turf = TRUE, on_floor = TRUE, applies_mats = TRUE),
+ new /datum/stack_recipe("Floor tile", /obj/item/stack/tile/material, 1, 4, 20, applies_mats = TRUE)
)
///Ran on initialize, populated the materials and materials_by_category dictionaries with their appropiate vars (See these variables for more info)
/datum/controller/subsystem/materials/proc/InitializeMaterials()
materials = list()
materials_by_category = list()
+ materialtypes_by_category = list()
+ material_combos = list()
for(var/type in subtypesof(/datum/material))
var/datum/material/ref = new type
materials[type] = ref
for(var/c in ref.categories)
materials_by_category[c] += list(ref)
+ materialtypes_by_category[c] += list(type)
/datum/controller/subsystem/materials/proc/GetMaterialRef(datum/material/fakemat)
if(!materials)
InitializeMaterials()
- return materials[fakemat] || fakemat
\ No newline at end of file
+ return materials[fakemat] || fakemat
+
+
+///Returns a list to be used as an object's custom_materials. Lists will be cached and re-used based on the parameters.
+/datum/controller/subsystem/materials/proc/FindOrCreateMaterialCombo(list/materials_declaration, multiplier)
+ if(!material_combos)
+ InitializeMaterials()
+ var/list/combo_params = list()
+ for(var/x in materials_declaration)
+ var/datum/material/mat = x
+ var/path_name = ispath(mat) ? "[mat]" : "[mat.type]"
+ combo_params += "[path_name]=[materials_declaration[mat] * multiplier]"
+ sortTim(combo_params, /proc/cmp_text_asc) // We have to sort now in case the declaration was not in order
+ var/combo_index = combo_params.Join("-")
+ var/list/combo = material_combos[combo_index]
+ if(!combo)
+ combo = list()
+ for(var/mat in materials_declaration)
+ combo[GetMaterialRef(mat)] = materials_declaration[mat] * multiplier
+ material_combos[combo_index] = combo
+ return combo
diff --git a/code/controllers/subsystem/minimaps.dm b/code/controllers/subsystem/minimaps.dm
index 75de71ca96..c25036a47d 100644
--- a/code/controllers/subsystem/minimaps.dm
+++ b/code/controllers/subsystem/minimaps.dm
@@ -1,8 +1,8 @@
SUBSYSTEM_DEF(minimaps)
name = "Minimaps"
flags = SS_NO_FIRE
- var/list/station_minimaps
- var/datum/minimap_group/station_minimap
+ var/list/station_minimaps = list()
+ var/datum/minimap_group/station_minimap = null
/datum/controller/subsystem/minimaps/Initialize()
if(!CONFIG_GET(flag/minimaps_enabled))
@@ -12,9 +12,9 @@ SUBSYSTEM_DEF(minimaps)
return ..()
/datum/controller/subsystem/minimaps/proc/build_minimaps()
- station_minimaps = list()
for(var/z in SSmapping.levels_by_trait(ZTRAIT_STATION))
var/datum/space_level/SL = SSmapping.get_level(z)
var/name = (SL.name == initial(SL.name))? "[z] - Station" : "[z] - [SL.name]"
station_minimaps += new /datum/minimap(z, name = name)
+
station_minimap = new(station_minimaps, "Station")
diff --git a/code/controllers/subsystem/npcpool.dm b/code/controllers/subsystem/npcpool.dm
index 7fd3512448..2d2fbb0704 100644
--- a/code/controllers/subsystem/npcpool.dm
+++ b/code/controllers/subsystem/npcpool.dm
@@ -23,7 +23,7 @@ SUBSYSTEM_DEF(npcpool)
var/mob/living/simple_animal/SA = currentrun[currentrun.len]
--currentrun.len
- if(!SA.ckey && !SA.notransform)
+ if(!SA.ckey && !SA.mob_transforming)
if(SA.stat != DEAD)
SA.handle_automated_movement()
if(SA.stat != DEAD)
diff --git a/code/controllers/subsystem/persistence.dm b/code/controllers/subsystem/persistence.dm
index cd577e4ac6..b4a162c982 100644
--- a/code/controllers/subsystem/persistence.dm
+++ b/code/controllers/subsystem/persistence.dm
@@ -268,6 +268,7 @@ SUBSYSTEM_DEF(persistence)
SaveRandomizedRecipes()
SavePanicBunker()
SavePaintings()
+ SaveScars()
/datum/controller/subsystem/persistence/proc/LoadPanicBunker()
var/bunker_path = file("data/bunker_passthrough.json")
@@ -547,3 +548,24 @@ SUBSYSTEM_DEF(persistence)
var/json_file = file("data/paintings.json")
fdel(json_file)
WRITE_FILE(json_file, json_encode(paintings))
+
+/datum/controller/subsystem/persistence/proc/SaveScars()
+ for(var/i in GLOB.joined_player_list)
+ var/mob/living/carbon/human/ending_human = get_mob_by_ckey(i)
+ if(!istype(ending_human) || !ending_human.mind || !ending_human.client || !ending_human.client.prefs || !ending_human.client.prefs.persistent_scars)
+ continue
+
+ var/mob/living/carbon/human/original_human = ending_human.mind.original_character
+ if(!original_human || original_human.stat == DEAD || !original_human.all_scars || !(original_human == ending_human))
+ if(ending_human.client) // i was told if i don't check this every step of the way byond might decide a client ceases to exist mid proc so here we go
+ ending_human.client.prefs.scars_list["[ending_human.client.prefs.scars_index]"] = ""
+ else
+ for(var/k in ending_human.all_wounds)
+ var/datum/wound/W = k
+ W.remove_wound() // so we can get the scars for open wounds
+ if(!ending_human.client)
+ return
+ ending_human.client.prefs.scars_list["[ending_human.client.prefs.scars_index]"] = ending_human.format_scars()
+ if(!ending_human.client)
+ return
+ ending_human.client.prefs.save_character()
diff --git a/code/controllers/subsystem/processing/huds.dm b/code/controllers/subsystem/processing/huds.dm
new file mode 100644
index 0000000000..aea23d2400
--- /dev/null
+++ b/code/controllers/subsystem/processing/huds.dm
@@ -0,0 +1,6 @@
+// Smooth HUD updates, but low priority
+PROCESSING_SUBSYSTEM_DEF(huds)
+ name = "HUD updates"
+ wait = 0.5
+ priority = FIRE_PRIORITY_HUDS
+ stat_tag = "HUDS"
diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm
index 532eb19bc9..9bda1cd233 100644
--- a/code/controllers/subsystem/shuttle.dm
+++ b/code/controllers/subsystem/shuttle.dm
@@ -7,10 +7,9 @@ SUBSYSTEM_DEF(shuttle)
flags = SS_KEEP_TIMING|SS_NO_TICK_CHECK
runlevels = RUNLEVEL_SETUP | RUNLEVEL_GAME
- var/obj/machinery/shuttle_manipulator/manipulator
-
var/list/mobile = list()
var/list/stationary = list()
+ var/list/beacons = list()
var/list/transit = list()
var/list/transit_requesters = list()
@@ -57,6 +56,15 @@ SUBSYSTEM_DEF(shuttle)
var/realtimeofstart = 0
+ var/datum/map_template/shuttle/selected
+
+ var/obj/docking_port/mobile/existing_shuttle
+
+ var/obj/docking_port/mobile/preview_shuttle
+ var/datum/map_template/shuttle/preview_template
+
+ var/datum/turf_reservation/preview_reservation
+
/datum/controller/subsystem/shuttle/Initialize(timeofday)
ordernum = rand(1, 9000)
@@ -76,13 +84,10 @@ SUBSYSTEM_DEF(shuttle)
WARNING("No /obj/docking_port/mobile/emergency/backup placed on the map!")
if(!supply)
WARNING("No /obj/docking_port/mobile/supply placed on the map!")
- realtimeofstart = world.realtime
+ realtimeofstart = world.realtime
return ..()
/datum/controller/subsystem/shuttle/proc/initial_load()
- if(!istype(manipulator))
- CRASH("No shuttle manipulator found.")
-
for(var/s in stationary)
var/obj/docking_port/stationary/S = s
S.load_roundstart()
@@ -143,11 +148,13 @@ SUBSYSTEM_DEF(shuttle)
++alive
var/total = GLOB.joined_player_list.len
+ if(total <= 0)
+ return //no players no autoevac
if(alive / total <= threshold)
- var/msg = "Automatically dispatching shuttle due to crew death."
+ var/msg = "Automatically dispatching emergency shuttle due to crew death."
message_admins(msg)
- log_game("[msg] Alive: [alive], Roundstart: [total], Threshold: [threshold]")
+ log_shuttle("[msg] Alive: [alive], Roundstart: [total], Threshold: [threshold]")
emergencyNoRecall = TRUE
priority_announce("Catastrophic casualties detected: crisis shuttle protocols activated - jamming recall signals across all frequencies.")
if(emergency.timeLeft(1) > emergencyCallTime * 0.4)
@@ -172,6 +179,34 @@ SUBSYSTEM_DEF(shuttle)
return S
WARNING("couldn't find dock with id: [id]")
+/datum/controller/subsystem/shuttle/proc/canEvac(mob/user)
+ var/srd = CONFIG_GET(number/shuttle_refuel_delay)
+ if(world.time - SSticker.round_start_time < srd)
+ to_chat(user, "The emergency shuttle is refueling. Please wait [DisplayTimeText(srd - (world.time - SSticker.round_start_time))] before trying again.")
+ return FALSE
+
+ switch(emergency.mode)
+ if(SHUTTLE_RECALL)
+ to_chat(user, "The emergency shuttle may not be called while returning to CentCom.")
+ return FALSE
+ if(SHUTTLE_CALL)
+ to_chat(user, "The emergency shuttle is already on its way.")
+ return FALSE
+ if(SHUTTLE_DOCKED)
+ to_chat(user, "The emergency shuttle is already here.")
+ return FALSE
+ if(SHUTTLE_IGNITING)
+ to_chat(user, "The emergency shuttle is firing its engines to leave.")
+ return FALSE
+ if(SHUTTLE_ESCAPE)
+ to_chat(user, "The emergency shuttle is moving away to a safe distance.")
+ return FALSE
+ if(SHUTTLE_STRANDED)
+ to_chat(user, "The emergency shuttle has been disabled by CentCom.")
+ return FALSE
+
+ return TRUE
+
/datum/controller/subsystem/shuttle/proc/requestEvac(mob/user, call_reason)
if(!emergency)
WARNING("requestEvac(): There is no emergency shuttle, but the \
@@ -185,35 +220,14 @@ SUBSYSTEM_DEF(shuttle)
manually, and then calling register() on the mobile docking port. \
Good luck.")
emergency = backup_shuttle
- var/srd = CONFIG_GET(number/shuttle_refuel_delay)
- if(world.time - SSticker.round_start_time < srd)
- to_chat(user, "The emergency shuttle is refueling. Please wait [DisplayTimeText(srd - (world.time - SSticker.round_start_time))] before trying again.")
- return
- switch(emergency.mode)
- if(SHUTTLE_RECALL)
- to_chat(user, "The emergency shuttle may not be called while returning to CentCom.")
- return
- if(SHUTTLE_CALL)
- to_chat(user, "The emergency shuttle is already on its way.")
- return
- if(SHUTTLE_DOCKED)
- to_chat(user, "The emergency shuttle is already here.")
- return
- if(SHUTTLE_IGNITING)
- to_chat(user, "The emergency shuttle is firing its engines to leave.")
- return
- if(SHUTTLE_ESCAPE)
- to_chat(user, "The emergency shuttle is moving away to a safe distance.")
- return
- if(SHUTTLE_STRANDED)
- to_chat(user, "The emergency shuttle has been disabled by CentCom.")
- return
+ if(!canEvac(user))
+ return
call_reason = trim(html_encode(call_reason))
if(length(call_reason) < CALL_SHUTTLE_REASON_LENGTH && GLOB.security_level > SEC_LEVEL_GREEN)
- to_chat(user, "You must provide a reason.")
+ to_chat(user, "You must provide a reason.")
return
var/area/signal_origin = get_area(user)
@@ -235,11 +249,11 @@ SUBSYSTEM_DEF(shuttle)
var/area/A = get_area(user)
- log_game("[key_name(user)] has called the shuttle.")
- deadchat_broadcast("[user.real_name] has called the shuttle at [A.name].", user)
+ log_shuttle("[key_name(user)] has called the emergency shuttle.")
+ deadchat_broadcast(" has called the shuttle at [A.name].", "[user.real_name]", user)
if(call_reason)
SSblackbox.record_feedback("text", "shuttle_reason", 1, "[call_reason]")
- log_game("Shuttle call reason: [call_reason]")
+ log_shuttle("Shuttle call reason: [call_reason]")
message_admins("[ADMIN_LOOKUPFLW(user)] has called the shuttle. (TRIGGER CENTCOM RECALL)")
/datum/controller/subsystem/shuttle/proc/centcom_recall(old_timer, admiral_message)
@@ -272,9 +286,9 @@ SUBSYSTEM_DEF(shuttle)
/datum/controller/subsystem/shuttle/proc/cancelEvac(mob/user)
if(canRecall())
emergency.cancel(get_area(user))
- log_game("[key_name(user)] has recalled the shuttle.")
+ log_shuttle("[key_name(user)] has recalled the shuttle.")
message_admins("[ADMIN_LOOKUPFLW(user)] has recalled the shuttle.")
- deadchat_broadcast("[user.real_name] has recalled the shuttle from [get_area_name(user, TRUE)].", user)
+ deadchat_broadcast(" has recalled the shuttle from [get_area_name(user, TRUE)].", "[user.real_name]", user)
return 1
/datum/controller/subsystem/shuttle/proc/canRecall()
@@ -294,7 +308,7 @@ SUBSYSTEM_DEF(shuttle)
else
if(emergency.timeLeft(1) < emergencyCallTime * 0.25)
return
- return 1
+ return TRUE
/datum/controller/subsystem/shuttle/proc/autoEvac()
if (!SSticker.IsRoundInProgress())
@@ -322,7 +336,7 @@ SUBSYSTEM_DEF(shuttle)
if(callShuttle)
if(EMERGENCY_IDLE_OR_RECALLED)
emergency.request(null, set_coefficient = 2.5)
- log_game("There is no means of calling the shuttle anymore. Shuttle automatically called.")
+ log_shuttle("There is no means of calling the emergency shuttle anymore. Shuttle automatically called.")
message_admins("All the communications consoles were destroyed and all AIs are inactive. Shuttle called.")
/datum/controller/subsystem/shuttle/proc/registerHostileEnvironment(datum/bad)
@@ -559,6 +573,14 @@ SUBSYSTEM_DEF(shuttle)
shuttle_purchased = SSshuttle.shuttle_purchased
lockdown = SSshuttle.lockdown
+ selected = SSshuttle.selected
+
+ existing_shuttle = SSshuttle.existing_shuttle
+
+ preview_shuttle = SSshuttle.preview_shuttle
+ preview_template = SSshuttle.preview_template
+
+ preview_reservation = SSshuttle.preview_reservation
/datum/controller/subsystem/shuttle/proc/is_in_shuttle_bounds(atom/A)
var/area/current = get_area(A)
@@ -641,3 +663,252 @@ SUBSYSTEM_DEF(shuttle)
message_admins("Round end vote passed. Shuttle has been auto-called.")
emergencyNoRecall = TRUE
endvote_passed = TRUE
+
+/datum/controller/subsystem/shuttle/proc/action_load(datum/map_template/shuttle/loading_template, obj/docking_port/stationary/destination_port)
+ // Check for an existing preview
+ if(preview_shuttle && (loading_template != preview_template))
+ preview_shuttle.jumpToNullSpace()
+ preview_shuttle = null
+ preview_template = null
+ QDEL_NULL(preview_reservation)
+
+ if(!preview_shuttle)
+ if(load_template(loading_template))
+ preview_shuttle.linkup(loading_template, destination_port)
+ preview_template = loading_template
+
+ // get the existing shuttle information, if any
+ var/timer = 0
+ var/mode = SHUTTLE_IDLE
+ var/obj/docking_port/stationary/D
+
+ if(istype(destination_port))
+ D = destination_port
+ else if(existing_shuttle)
+ timer = existing_shuttle.timer
+ mode = existing_shuttle.mode
+ D = existing_shuttle.get_docked()
+
+ if(!D)
+ D = generate_transit_dock(preview_shuttle)
+
+ if(!D)
+ CRASH("No dock found for preview shuttle ([preview_template.name]), aborting.")
+
+ var/result = preview_shuttle.canDock(D)
+ // truthy value means that it cannot dock for some reason
+ // but we can ignore the someone else docked error because we'll
+ // be moving into their place shortly
+ if((result != SHUTTLE_CAN_DOCK) && (result != SHUTTLE_SOMEONE_ELSE_DOCKED))
+ WARNING("Template shuttle [preview_shuttle] cannot dock at [D] ([result]).")
+ return
+
+ if(existing_shuttle)
+ existing_shuttle.jumpToNullSpace()
+
+ var/list/force_memory = preview_shuttle.movement_force
+ preview_shuttle.movement_force = list("KNOCKDOWN" = 0, "THROW" = 0)
+ preview_shuttle.initiate_docking(D)
+ preview_shuttle.movement_force = force_memory
+
+ . = preview_shuttle
+
+ // Shuttle state involves a mode and a timer based on world.time, so
+ // plugging the existing shuttles old values in works fine.
+ preview_shuttle.timer = timer
+ preview_shuttle.mode = mode
+
+ preview_shuttle.register()
+
+ // TODO indicate to the user that success happened, rather than just
+ // blanking the modification tab
+ preview_shuttle = null
+ preview_template = null
+ existing_shuttle = null
+ selected = null
+ QDEL_NULL(preview_reservation)
+
+/datum/controller/subsystem/shuttle/proc/load_template(datum/map_template/shuttle/S)
+ . = FALSE
+ // load shuttle template, centred at shuttle import landmark,
+ preview_reservation = SSmapping.RequestBlockReservation(S.width, S.height, SSmapping.transit.z_value, /datum/turf_reservation/transit)
+ if(!preview_reservation)
+ CRASH("failed to reserve an area for shuttle template loading")
+ var/turf/BL = TURF_FROM_COORDS_LIST(preview_reservation.bottom_left_coords)
+ S.load(BL, centered = FALSE, register = FALSE)
+
+ var/affected = S.get_affected_turfs(BL, centered=FALSE)
+
+ var/found = 0
+ // Search the turfs for docking ports
+ // - We need to find the mobile docking port because that is the heart of
+ // the shuttle.
+ // - We need to check that no additional ports have slipped in from the
+ // template, because that causes unintended behaviour.
+ for(var/T in affected)
+ for(var/obj/docking_port/P in T)
+ if(istype(P, /obj/docking_port/mobile))
+ found++
+ if(found > 1)
+ qdel(P, force=TRUE)
+ log_world("Map warning: Shuttle Template [S.mappath] has multiple mobile docking ports.")
+ else
+ preview_shuttle = P
+ if(istype(P, /obj/docking_port/stationary))
+ log_world("Map warning: Shuttle Template [S.mappath] has a stationary docking port.")
+ if(!found)
+ var/msg = "load_template(): Shuttle Template [S.mappath] has no mobile docking port. Aborting import."
+ for(var/T in affected)
+ var/turf/T0 = T
+ T0.empty()
+
+ message_admins(msg)
+ WARNING(msg)
+ return
+ //Everything fine
+ S.post_load(preview_shuttle)
+ return TRUE
+
+/datum/controller/subsystem/shuttle/proc/unload_preview()
+ if(preview_shuttle)
+ preview_shuttle.jumpToNullSpace()
+ preview_shuttle = null
+
+
+/datum/controller/subsystem/shuttle/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.admin_state)
+ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "ShuttleManipulator", name, 800, 600, master_ui, state)
+ ui.open()
+
+
+/datum/controller/subsystem/shuttle/ui_data(mob/user)
+ var/list/data = list()
+ data["tabs"] = list("Status", "Templates", "Modification")
+
+ // Templates panel
+ data["templates"] = list()
+ var/list/templates = data["templates"]
+ data["templates_tabs"] = list()
+ data["selected"] = list()
+
+ for(var/shuttle_id in SSmapping.shuttle_templates)
+ var/datum/map_template/shuttle/S = SSmapping.shuttle_templates[shuttle_id]
+
+ if(!templates[S.port_id])
+ data["templates_tabs"] += S.port_id
+ templates[S.port_id] = list(
+ "port_id" = S.port_id,
+ "templates" = list())
+
+ var/list/L = list()
+ L["name"] = S.name
+ L["shuttle_id"] = S.shuttle_id
+ L["port_id"] = S.port_id
+ L["description"] = S.description
+ L["admin_notes"] = S.admin_notes
+
+ if(selected == S)
+ data["selected"] = L
+
+ templates[S.port_id]["templates"] += list(L)
+
+ data["templates_tabs"] = sortList(data["templates_tabs"])
+
+ data["existing_shuttle"] = null
+
+ // Status panel
+ data["shuttles"] = list()
+ for(var/i in mobile)
+ var/obj/docking_port/mobile/M = i
+ var/timeleft = M.timeLeft(1)
+ var/list/L = list()
+ L["name"] = M.name
+ L["id"] = M.id
+ L["timer"] = M.timer
+ L["timeleft"] = M.getTimerStr()
+ if (timeleft > 1 HOURS)
+ L["timeleft"] = "Infinity"
+ L["can_fast_travel"] = M.timer && timeleft >= 50
+ L["can_fly"] = TRUE
+ if(istype(M, /obj/docking_port/mobile/emergency))
+ L["can_fly"] = FALSE
+ else if(!M.destination)
+ L["can_fast_travel"] = FALSE
+ if (M.mode != SHUTTLE_IDLE)
+ L["mode"] = capitalize(M.mode)
+ L["status"] = M.getDbgStatusText()
+ if(M == existing_shuttle)
+ data["existing_shuttle"] = L
+
+ data["shuttles"] += list(L)
+
+ return data
+
+/datum/controller/subsystem/shuttle/ui_act(action, params)
+ if(..())
+ return
+
+ var/mob/user = usr
+
+ // Preload some common parameters
+ var/shuttle_id = params["shuttle_id"]
+ var/datum/map_template/shuttle/S = SSmapping.shuttle_templates[shuttle_id]
+
+ switch(action)
+ if("select_template")
+ if(S)
+ existing_shuttle = getShuttle(S.port_id)
+ selected = S
+ . = TRUE
+ if("jump_to")
+ if(params["type"] == "mobile")
+ for(var/i in mobile)
+ var/obj/docking_port/mobile/M = i
+ if(M.id == params["id"])
+ user.forceMove(get_turf(M))
+ . = TRUE
+ break
+
+ if("fly")
+ for(var/i in mobile)
+ var/obj/docking_port/mobile/M = i
+ if(M.id == params["id"])
+ . = TRUE
+ M.admin_fly_shuttle(user)
+ break
+
+ if("fast_travel")
+ for(var/i in mobile)
+ var/obj/docking_port/mobile/M = i
+ if(M.id == params["id"] && M.timer && M.timeLeft(1) >= 50)
+ M.setTimer(50)
+ . = TRUE
+ message_admins("[key_name_admin(usr)] fast travelled [M]")
+ log_admin("[key_name(usr)] fast travelled [M]")
+ SSblackbox.record_feedback("text", "shuttle_manipulator", 1, "[M.name]")
+ break
+
+ if("preview")
+ if(S)
+ . = TRUE
+ unload_preview()
+ load_template(S)
+ if(preview_shuttle)
+ preview_template = S
+ user.forceMove(get_turf(preview_shuttle))
+ if("load")
+ if(existing_shuttle == backup_shuttle)
+ // TODO make the load button disabled
+ WARNING("The shuttle that the selected shuttle will replace \
+ is the backup shuttle. Backup shuttle is required to be \
+ intact for round sanity.")
+ else if(S)
+ . = TRUE
+ // If successful, returns the mobile docking port
+ var/obj/docking_port/mobile/mdp = action_load(S)
+ if(mdp)
+ user.forceMove(get_turf(mdp))
+ message_admins("[key_name_admin(usr)] loaded [mdp] with the shuttle manipulator.")
+ log_admin("[key_name(usr)] loaded [mdp] with the shuttle manipulator.")
+ SSblackbox.record_feedback("text", "shuttle_manipulator", 1, "[mdp.name]")
diff --git a/code/controllers/subsystem/tgui.dm b/code/controllers/subsystem/tgui.dm
index dacbac409d..58bc28fa2f 100644
--- a/code/controllers/subsystem/tgui.dm
+++ b/code/controllers/subsystem/tgui.dm
@@ -11,7 +11,7 @@ SUBSYSTEM_DEF(tgui)
var/basehtml // The HTML base used for all UIs.
/datum/controller/subsystem/tgui/PreInit()
- basehtml = file2text('tgui-next/packages/tgui/public/tgui-main.html')
+ basehtml = file2text('tgui/packages/tgui/public/tgui.html')
/datum/controller/subsystem/tgui/Shutdown()
close_all_uis()
diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
index 8042631b7b..765f0c8382 100755
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -409,7 +409,7 @@ SUBSYSTEM_DEF(ticker)
var/mob/living = player.transfer_character()
if(living)
qdel(player)
- living.notransform = TRUE
+ living.mob_transforming = TRUE
if(living.client)
if (living.client.prefs && living.client.prefs.auto_ooc)
if (living.client.prefs.chat_toggles & CHAT_OOC)
@@ -423,7 +423,7 @@ SUBSYSTEM_DEF(ticker)
/datum/controller/subsystem/ticker/proc/release_characters(list/livings)
for(var/I in livings)
var/mob/living/L = I
- L.notransform = FALSE
+ L.mob_transforming = FALSE
/datum/controller/subsystem/ticker/proc/send_tip_of_the_round()
var/m
diff --git a/code/controllers/subsystem/title.dm b/code/controllers/subsystem/title.dm
index b19cf47693..bd843f959d 100644
--- a/code/controllers/subsystem/title.dm
+++ b/code/controllers/subsystem/title.dm
@@ -47,7 +47,7 @@ SUBSYSTEM_DEF(title)
. = ..()
if(.)
switch(var_name)
- if("icon")
+ if(NAMEOF(src, icon))
if(splash_turf)
splash_turf.icon = icon
@@ -66,4 +66,4 @@ SUBSYSTEM_DEF(title)
icon = SStitle.icon
splash_turf = SStitle.splash_turf
file_path = SStitle.file_path
- previous_icon = SStitle.previous_icon
\ No newline at end of file
+ previous_icon = SStitle.previous_icon
diff --git a/code/controllers/subsystem/traumas.dm b/code/controllers/subsystem/traumas.dm
index 87158f021e..f556f7dee7 100644
--- a/code/controllers/subsystem/traumas.dm
+++ b/code/controllers/subsystem/traumas.dm
@@ -79,7 +79,7 @@ SUBSYSTEM_DEF(traumas)
/obj/item/pda/clown, /obj/item/grown/bananapeel)),
"greytide" = typecacheof(list(/obj/item/clothing/under/color/grey, /obj/item/melee/baton/cattleprod,
- /obj/item/twohanded/spear, /obj/item/clothing/mask/gas)),
+ /obj/item/spear, /obj/item/clothing/mask/gas)),
"lizards" = typecacheof(list(/obj/item/toy/plush/lizardplushie, /obj/item/reagent_containers/food/snacks/kebab/tail,
/obj/item/organ/tail/lizard, /obj/item/reagent_containers/food/drinks/bottle/lizardwine)),
@@ -120,7 +120,7 @@ SUBSYSTEM_DEF(traumas)
/obj/item/card/id/captains_spare, /obj/item/card/id/centcom, /obj/machinery/door/airlock/command)),
"the supernatural" = typecacheof(list(/obj/structure/destructible/cult, /obj/item/tome,
- /obj/item/melee/cultblade, /obj/item/twohanded/required/cult_bastard, /obj/item/restraints/legcuffs/bola/cult,
+ /obj/item/melee/cultblade, /obj/item/cult_bastard, /obj/item/restraints/legcuffs/bola/cult,
/obj/item/clothing/suit/cultrobes, /obj/item/clothing/suit/space/hardsuit/cult,
/obj/item/clothing/suit/hooded/cultrobes, /obj/item/clothing/head/hooded/cult_hoodie, /obj/effect/rune,
/obj/item/stack/sheet/runed_metal, /obj/machinery/door/airlock/cult, /obj/singularity/narsie,
@@ -151,7 +151,7 @@ SUBSYSTEM_DEF(traumas)
"anime" = typecacheof(list(/obj/item/clothing/under/costume/schoolgirl, /obj/item/katana, /obj/item/reagent_containers/food/snacks/sashimi, /obj/item/reagent_containers/food/snacks/chawanmushi,
/obj/item/reagent_containers/food/drinks/bottle/sake, /obj/item/throwing_star, /obj/item/clothing/head/kitty/genuine, /obj/item/clothing/suit/space/space_ninja,
- /obj/item/clothing/mask/gas/space_ninja, /obj/item/clothing/shoes/space_ninja, /obj/item/clothing/gloves/space_ninja, /obj/item/twohanded/vibro_weapon,
+ /obj/item/clothing/mask/gas/space_ninja, /obj/item/clothing/shoes/space_ninja, /obj/item/clothing/gloves/space_ninja, /obj/item/vibro_weapon,
/obj/item/nullrod/scythe/vibro, /obj/item/energy_katana, /obj/item/toy/katana, /obj/item/nullrod/claymore/katana, /obj/structure/window/paperframe, /obj/structure/mineral_door/paperframe)),
"mimes" = typecacheof(list(/obj/item/pda/mime, /obj/item/clothing/under/rank/civilian/mime, /obj/item/clothing/mask/gas/mime,
@@ -168,7 +168,7 @@ SUBSYSTEM_DEF(traumas)
/obj/machinery/porta_turret/syndicate, /obj/structure/closet/syndicate, /obj/machinery/suit_storage_unit/syndicate, /obj/item/clothing/under/syndicate, /obj/item/folder/syndicate, /obj/item/documents/syndicate, /obj/item/clothing/glasses/phantomthief/syndicate, /obj/item/antag_spawner/nuke_ops, /obj/item/storage/box/syndicate,
/obj/structure/fluff/empty_sleeper/syndicate, /obj/item/implant/radio/syndicate, /obj/item/clothing/head/helmet/space/syndicate, /obj/machinery/nuclearbomb/syndicate, /obj/item/grenade/syndieminibomb, /obj/item/storage/backpack/duffelbag/syndie, /obj/item/gun/ballistic/automatic/pistol, /obj/item/gun/ballistic/revolver,
/obj/item/gun/ballistic/automatic/shotgun/bulldog, /obj/item/gun/ballistic/automatic/c20r, /obj/item/gun/ballistic/automatic/m90, /obj/item/gun/ballistic/automatic/l6_saw, /obj/item/storage/belt/grenade/full, /obj/item/gun/ballistic/automatic/sniper_rifle/syndicate, /obj/item/gun/energy/kinetic_accelerator/crossbow,
- /obj/item/melee/transforming/energy/sword/saber, /obj/item/twohanded/dualsaber, /obj/item/melee/powerfist, /obj/item/storage/box/syndie_kit, /obj/item/grenade/spawnergrenade/manhacks, /obj/item/grenade/chem_grenade/bioterrorfoam, /obj/item/reagent_containers/spray/chemsprayer/bioterror, /obj/item/ammo_box/magazine/m10mm,
+ /obj/item/melee/transforming/energy/sword/saber, /obj/item/dualsaber, /obj/item/melee/powerfist, /obj/item/storage/box/syndie_kit, /obj/item/grenade/spawnergrenade/manhacks, /obj/item/grenade/chem_grenade/bioterrorfoam, /obj/item/reagent_containers/spray/chemsprayer/bioterror, /obj/item/ammo_box/magazine/m10mm,
/obj/item/ammo_box/magazine/pistolm9mm, /obj/item/ammo_box/a357, /obj/item/ammo_box/magazine/m12g, /obj/item/ammo_box/magazine/mm195x129, /obj/item/antag_spawner/nuke_ops, /obj/mecha/combat/gygax/dark, /obj/mecha/combat/marauder/mauler, /obj/item/soap/syndie, /obj/item/gun/syringe/syndicate, /obj/item/cartridge/virus/syndicate,
/obj/item/cartridge/virus/frame, /obj/item/chameleon, /obj/item/storage/box/syndie_kit/cutouts, /obj/item/clothing/suit/space/hardsuit/syndi, /obj/item/card/emag, /obj/item/storage/toolbox/syndicate, /obj/item/storage/book/bible/syndicate, /obj/item/encryptionkey/binary, /obj/item/encryptionkey/syndicate, /obj/item/aiModule/syndicate,
/obj/item/clothing/shoes/magboots/syndie, /obj/item/powersink, /obj/item/sbeacondrop, /obj/item/sbeacondrop/bomb, /obj/item/syndicatedetonator, /obj/item/shield/energy, /obj/item/assault_pod, /obj/item/slimepotion/slime/sentience/nuclear, /obj/item/stack/telecrystal, /obj/item/jammer, /obj/item/codespeak_manual/unlimited,
@@ -176,7 +176,7 @@ SUBSYSTEM_DEF(traumas)
/obj/machinery/computer/pod/old/syndicate, /obj/machinery/vending/medical/syndicate_access, /obj/item/mmi/syndie, /obj/item/target/syndicate, /obj/machinery/vending/cigarette/syndicate, /obj/item/robot_module/syndicate, /obj/item/clothing/mask/gas/syndicate, /obj/machinery/power/singularity_beacon/syndicate, /obj/item/clothing/head/syndicatefake,
/obj/item/radio/headset/syndicate, /obj/item/gun/ballistic/automatic/pistol/antitank/syndicate, /obj/item/pda/syndicate, /obj/item/clothing/suit/armor/vest/capcarapace/syndicate, /obj/item/gun/ballistic/automatic/flechette, /obj/item/ammo_box/magazine/flechette, /obj/item/clothing/suit/toggle/lawyer/black/syndie, /obj/item/melee/transforming/energy/sword/cx/traitor,
/obj/structure/sign/poster/contraband/syndicate_pistol, /obj/structure/sign/poster/contraband/syndicate_recruitment, /obj/item/bedsheet/syndie, /obj/item/borg/upgrade/syndicate, /obj/item/tank/jetpack/oxygen/harness, /obj/item/firing_pin/implant/pindicate, /obj/item/reagent_containers/glass/bottle/traitor, /obj/item/storage/belt/military,
- /obj/item/twohanded/shockpaddles/syndicate, /obj/item/clothing/mask/cigarette/syndicate, /obj/item/toy/plush/nukeplushie)),
+ /obj/item/shockpaddles/syndicate, /obj/item/clothing/mask/cigarette/syndicate, /obj/item/toy/plush/nukeplushie)),
"eye" = typecacheof(list(/obj/item/organ/eyes, /obj/item/reagent_containers/syringe))
)
diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm
index 97a5ec2c2b..a93aff7d2b 100644
--- a/code/controllers/subsystem/vote.dm
+++ b/code/controllers/subsystem/vote.dm
@@ -15,6 +15,8 @@ SUBSYSTEM_DEF(vote)
var/vote_system = PLURALITY_VOTING
var/question = null
var/list/choices = list()
+ /// List of choice = object for statclick objects for statpanel voting
+ var/list/choice_statclicks = list()
var/list/scores = list()
var/list/choice_descs = list() // optional descriptions
var/list/voted = list()
@@ -47,7 +49,33 @@ SUBSYSTEM_DEF(vote)
client_popup.open(0)
next_pop = world.time+VOTE_COOLDOWN
-
+/**
+ * Renders a statpanel. Directly uses statpanel/stat calls since this is called from base of mob/Stat().
+ */
+/datum/controller/subsystem/vote/proc/render_statpanel(mob/M)
+ if(!mode) // check if vote is running
+ return
+ if(!statpanel("Status")) // don't bother if they're not focused on this panel
+ return
+ var/static/list/supported = list(PLURALITY_VOTING, APPROVAL_VOTING)
+ stat("Vote active!", "There is currently a vote running. Question: [question]")
+ if(!(vote_system in supported))
+ stat("", "The current vote system is not supported by statpanel rendering. Please vote manually by opening the vote popup using the action button or chat link.")
+ return
+ stat("Time Left:", "[round(end_time - world.time)] seconds")
+ stat(null, null)
+ stat("Choices:", null)
+ stat(null, null)
+ for(var/i in 1 to choice_statclicks.len)
+ var/choice = choice_statclicks[i]
+ var/ivotedforthis = FALSE
+ switch(vote_system)
+ if(APPROVAL_VOTING)
+ ivotedforthis = voted[usr.ckey] && (i in voted[usr.ckey])
+ if(PLURALITY_VOTING)
+ ivotedforthis = voted[usr.ckey] == i
+ stat(ivotedforthis? "\[X\]" : "\[ \]", choice_statclicks[choice])
+ stat(null, null)
/datum/controller/subsystem/vote/proc/reset()
initiator = null
@@ -59,9 +87,26 @@ SUBSYSTEM_DEF(vote)
voted.Cut()
voting.Cut()
scores.Cut()
+ cleanup_statclicks()
display_votes = initial(display_votes) //CIT CHANGE - obfuscated votes
remove_action_buttons()
+/datum/controller/subsystem/vote/proc/cleanup_statclicks()
+ for(var/choice in choice_statclicks)
+ qdel(choice_statclicks[choice])
+ choice_statclicks = list()
+
+/obj/effect/statclick/vote
+ name = "ERROR"
+ var/choice
+
+/obj/effect/statclick/vote/Click()
+ SSvote.submit_vote(choice)
+
+/obj/effect/statclick/vote/New(loc, choice, name)
+ src.choice = choice
+ src.name = name
+
/datum/controller/subsystem/vote/proc/get_result()
//get the highest number of votes
var/greatest_votes = 0
@@ -536,6 +581,12 @@ SUBSYSTEM_DEF(vote)
vp = CONFIG_GET(number/vote_period)
to_chat(world, "\n[text]\nType vote or click here to place your votes.\nYou have [DisplayTimeText(vp)] to vote.")
end_time = started_time+vp
+ // generate statclick list
+ cleanup_statclicks()
+ for(var/i in 1 to choices.len)
+ var/choice = choices[i]
+ choice_statclicks[choice] = new /obj/effect/statclick/vote(null, i, choice)
+ //
for(var/c in GLOB.clients)
SEND_SOUND(c, sound('sound/misc/server-ready.ogg'))
var/client/C = c
diff --git a/code/datums/armor.dm b/code/datums/armor.dm
index 85915395f8..88170541c6 100644
--- a/code/datums/armor.dm
+++ b/code/datums/armor.dm
@@ -1,9 +1,9 @@
-#define ARMORID "armor-[melee]-[bullet]-[laser]-[energy]-[bomb]-[bio]-[rad]-[fire]-[acid]-[magic]"
+#define ARMORID "armor-[melee]-[bullet]-[laser]-[energy]-[bomb]-[bio]-[rad]-[fire]-[acid]-[magic]-[wound]"
-/proc/getArmor(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0, magic = 0)
+/proc/getArmor(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0, magic = 0, wound = 0)
. = locate(ARMORID)
if (!.)
- . = new /datum/armor(melee, bullet, laser, energy, bomb, bio, rad, fire, acid, magic)
+ . = new /datum/armor(melee, bullet, laser, energy, bomb, bio, rad, fire, acid, magic, wound)
/datum/armor
datum_flags = DF_USE_TAG
@@ -17,8 +17,9 @@
var/fire
var/acid
var/magic
+ var/wound
-/datum/armor/New(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0, magic = 0)
+/datum/armor/New(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0, magic = 0, wound = 0)
src.melee = melee
src.bullet = bullet
src.laser = laser
@@ -29,15 +30,16 @@
src.fire = fire
src.acid = acid
src.magic = magic
+ src.wound = wound
tag = ARMORID
-/datum/armor/proc/modifyRating(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0, magic = 0)
- return getArmor(src.melee+melee, src.bullet+bullet, src.laser+laser, src.energy+energy, src.bomb+bomb, src.bio+bio, src.rad+rad, src.fire+fire, src.acid+acid, src.magic+magic)
+/datum/armor/proc/modifyRating(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0, magic = 0, wound = 0)
+ return getArmor(src.melee+melee, src.bullet+bullet, src.laser+laser, src.energy+energy, src.bomb+bomb, src.bio+bio, src.rad+rad, src.fire+fire, src.acid+acid, src.magic+magic, src.wound+wound)
/datum/armor/proc/modifyAllRatings(modifier = 0)
- return getArmor(melee+modifier, bullet+modifier, laser+modifier, energy+modifier, bomb+modifier, bio+modifier, rad+modifier, fire+modifier, acid+modifier, magic+modifier)
+ return getArmor(melee+modifier, bullet+modifier, laser+modifier, energy+modifier, bomb+modifier, bio+modifier, rad+modifier, fire+modifier, acid+modifier, magic+modifier, wound+modifier)
-/datum/armor/proc/setRating(melee, bullet, laser, energy, bomb, bio, rad, fire, acid, magic)
+/datum/armor/proc/setRating(melee, bullet, laser, energy, bomb, bio, rad, fire, acid, magic, wound)
return getArmor((isnull(melee) ? src.melee : melee),\
(isnull(bullet) ? src.bullet : bullet),\
(isnull(laser) ? src.laser : laser),\
@@ -47,19 +49,20 @@
(isnull(rad) ? src.rad : rad),\
(isnull(fire) ? src.fire : fire),\
(isnull(acid) ? src.acid : acid),\
- (isnull(magic) ? src.magic : magic))
+ (isnull(magic) ? src.magic : magic),\
+ (isnull(wound) ? src.wound : wound))
/datum/armor/proc/getRating(rating)
return vars[rating]
/datum/armor/proc/getList()
- return list("melee" = melee, "bullet" = bullet, "laser" = laser, "energy" = energy, "bomb" = bomb, "bio" = bio, "rad" = rad, "fire" = fire, "acid" = acid, "magic" = magic)
+ return list("melee" = melee, "bullet" = bullet, "laser" = laser, "energy" = energy, "bomb" = bomb, "bio" = bio, "rad" = rad, "fire" = fire, "acid" = acid, "magic" = magic, "wound" = wound)
/datum/armor/proc/attachArmor(datum/armor/AA)
- return getArmor(melee+AA.melee, bullet+AA.bullet, laser+AA.laser, energy+AA.energy, bomb+AA.bomb, bio+AA.bio, rad+AA.rad, fire+AA.fire, acid+AA.acid, magic+AA.magic)
+ return getArmor(melee+AA.melee, bullet+AA.bullet, laser+AA.laser, energy+AA.energy, bomb+AA.bomb, bio+AA.bio, rad+AA.rad, fire+AA.fire, acid+AA.acid, magic+AA.magic, wound+AA.wound)
/datum/armor/proc/detachArmor(datum/armor/AA)
- return getArmor(melee-AA.melee, bullet-AA.bullet, laser-AA.laser, energy-AA.energy, bomb-AA.bomb, bio-AA.bio, rad-AA.rad, fire-AA.fire, acid-AA.acid, magic-AA.magic)
+ return getArmor(melee-AA.melee, bullet-AA.bullet, laser-AA.laser, energy-AA.energy, bomb-AA.bomb, bio-AA.bio, rad-AA.rad, fire-AA.fire, acid-AA.acid, magic-AA.magic, wound-AA.wound)
/datum/armor/vv_edit_var(var_name, var_value)
if (var_name == NAMEOF(src, tag))
diff --git a/code/datums/beepsky_fashion.dm b/code/datums/beepsky_fashion.dm
new file mode 100644
index 0000000000..1156822c93
--- /dev/null
+++ b/code/datums/beepsky_fashion.dm
@@ -0,0 +1,221 @@
+//similar to dog_fashion, but for beepsky, who has far more refined fashion tastes
+/datum/beepsky_fashion
+ var/name //not setting the name and desc makes them go to the default
+ var/desc
+
+ var/icon_file = 'icons/mob/secbot_accessories.dmi' //we sell secbots and secbot accessories
+ var/obj_icon_state
+ var/obj_alpha
+ var/obj_color
+
+ var/list/stun_sounds //sound that replaces the stun attack when set
+ var/ignore_sound = FALSE //whether to ignore sounds entirely or not
+
+ //emotes (don't set them if you want the default value)
+ var/death_emote //what is said when beepsky dies
+ var/capture_one //what is said when cuffing someone
+ var/capture_two //what is said when cuffing someone, directly to the person being cuffed
+ var/infraction //the level of threat detected
+ var/taunt // beepsky pointing at a criminal
+ var/attack_one //text when attacking criminal
+ var/attack_two //text when attacking criminal, but directly to the criminal
+ var/patrol_emote //engaging patrol text
+ var/patrol_fail_emote //failing to engage patrol text
+ var/list/arrest_texts //first is for not-cuffing, second is for cuffing
+ var/arrest_emote //text stating that you're cuffing some criminal C with a threat of level X in location Y
+
+ //for reference, the following words are replaced when processed before speech:
+ //LOCATION = the location passed, if any (this is only used by arrest_emote)
+ //CRIMINAL = the name of the criminal (this is used by everything but patrol_emote and infraction)
+ //BOT = the name of the bot (this can be used on any of the emotes)
+ //THREAT_LEVEL = the level of the threat detected (can be used on arrest_emote and infraction)
+
+/datum/beepsky_fashion/proc/get_overlay(var/dir)
+ if(icon_file && obj_icon_state)
+ var/image/beepsky_overlay = image(icon_file, obj_icon_state, dir = dir)
+ beepsky_overlay.alpha = obj_alpha
+ beepsky_overlay.color = obj_color
+ return beepsky_overlay
+
+/datum/beepsky_fashion/proc/stun_attack(mob/living/carbon/C) //fired when beepsky does a stun attack with the fashion worn, for sounds/overlays/etc
+ return
+
+//actual fashions from here on out
+/datum/beepsky_fashion/wizard
+ obj_icon_state = "wizard"
+ name = "Archmage Beepsky"
+ desc = "A secbot stolen from the wizard federation."
+ death_emote = "BOT casts EI NATH on themselves!"
+ capture_one = "BOT is casting cable ties on CRIMINAL!"
+ capture_two = "BOT is casting cable ties on you!"
+ infraction = "Magical disturbance of magnitude THREAT_LEVEL detected!"
+ taunt = "BOT points his staff towards CRIMINAL!"
+ attack_one = "BOT casts magic missile on CRIMINAL!"
+ attack_two = "BOT casts magic missile on you!"
+ patrol_emote = "Beginning search for magical disturbances."
+ patrol_fail_emote = "Failure to find magical disturbances. Recallibrating."
+ arrest_emote = "ARREST_TYPE level THREAT_LEVEL magical practitioner CRIMINAL in LOCATION."
+ stun_sounds = list('sound/magic/lightningbolt.ogg',
+ 'sound/magic/fireball.ogg',
+ 'sound/weapons/zapbang.ogg',
+ 'sound/magic/knock.ogg',
+ 'sound/magic/fleshtostone.ogg',
+ 'sound/effects/magic.ogg',
+ 'sound/magic/disintegrate.ogg')
+
+/datum/beepsky_fashion/cowboy
+ obj_icon_state = "cowboy"
+ name = "Sheriff Beepsky"
+ desc = "The sheriff of this here station."
+ capture_one = "BOT is tying CRIMINAL up!"
+ capture_two = "BOT is tying you up!"
+ infraction = "Outlaws with a bounty of THREAT_LEVEL000 space dollars detected!"
+ taunt = "BOT aims his revolver towards CRIMINAL!"
+ attack_one = "BOT unloads his revolver onto CRIMINAL!"
+ attack_two = "BOT unloads his revolver onto you!"
+ patrol_emote = "Engaging bounty hunting protocols."
+ patrol_fail_emote = "Unable to find any bounties due to error. Rebooting."
+ arrest_emote = "ARREST_TYPE outlaw CRIMINAL with a bounty of THREAT_LEVEL000 in LOCATION."
+ stun_sounds = list('sound/weapons/Gunshot.ogg',
+ 'sound/weapons/Gunshot2.ogg',
+ 'sound/weapons/Gunshot3.ogg',
+ 'sound/weapons/Gunshot4.ogg')
+
+/datum/beepsky_fashion/chef
+ obj_icon_state = "chef"
+ name = "Chef Beepsky"
+ desc = "Cooking up the finest foods the station has ever seen."
+ death_emote = "Mamma-mia!"
+ infraction = "Grade THREAT_LEVEL prosciutto detected!"
+ taunt = "BOT glares at CRIMINAL."
+ attack_one = "BOT CQCs CRIMINAL!"
+ attack_two = "BOT CQCs you!"
+ patrol_emote = "Beginning search for the bad prosciutto."
+ patrol_fail_emote = "All prosciutto is stale. Rebooting."
+ arrest_texts = list("Frying", "Grilling") //any good secoff knows the difference
+ arrest_emote = "ARREST_TYPE grade THREAT_LEVEL prosciutto CRIMINAL in LOCATION."
+ stun_sounds = list('sound/weapons/cqchit1.ogg',
+ 'sound/weapons/cqchit2.ogg')
+
+/datum/beepsky_fashion/cat
+ obj_icon_state = "cat"
+ name = "OwOfficer Bweepskwee"
+ desc = "A beepsky unit with cat ears. Catgirl science has gone too far."
+ death_emote = "Nya!"
+ capture_one = "BOT is tying CRIMINAL up!!"
+ capture_two = "BOT is tying you up!"
+ infraction = "Wevel THREAT_LEVEL infwactwion awert!!!"
+ taunt = "BOT points at CRIMINAL and nyas!"
+ attack_one = "BOT shoves CRIMINAL onto a table!"
+ attack_two = "BOT shoves you onto a table!"
+ patrol_emote = "Enwgagwing patwol mwodies.."
+ patrol_fail_emote = "Unawbwle two stwawt patwollies. Nya."
+ arrest_texts = list("Dwetwaining", "Awwesting")
+ arrest_emote = "ARREST_TYPE wevel THREAT_LEVEL scwumbwag CRIMINAL in LOCATION. Nya."
+ ignore_sound = TRUE //we instead make the stunned person fire the nya emote
+
+/datum/beepsky_fashion/cat/stun_attack(var/mob/living/carbon/C) //makes a fake table under you on hit, makes cat people nya when hit
+ if(iscatperson(C))
+ C.emote("nya")
+ var/turf/target_turf = get_turf(C)
+ if(target_turf) //slams you on a fake table
+ playsound(src, 'sound/weapons/sonic_jackhammer.ogg', 50, 1)
+ var/obj/effect/overlay_holder = new(target_turf)
+ overlay_holder.name = "Catboy Table"
+ overlay_holder.desc = "Where bad catboys go."
+ var/image/table_overlay = image('icons/obj/smooth_structures/table.dmi', "table")
+ overlay_holder.add_overlay(table_overlay)
+ QDEL_IN(overlay_holder, 10)
+
+/datum/beepsky_fashion/cake //nothing else. it's just beepsky. with a cake on his head.
+ obj_icon_state = "cake"
+ name = "Cakesky"
+ desc = "It's a secbot, wearing a cake on his head!"
+
+/datum/beepsky_fashion/captain
+ obj_icon_state = "captain"
+ name = "Captainsky"
+ desc = "The real captain of this station."
+ capture_one = "BOT is lecturing CRIMINAL on why he is the captain!"
+ capture_two = "BOT is lecturing you on why he is the captain!"
+ infraction = "Level THREAT_LEVEL greytider detected."
+ attack_one = "BOT beats CRIMINAL with the chain of command!"
+ attack_two = "BOT beats you with the chain of command!"
+ patrol_emote = "Uselessness protocols engaged."
+ patrol_fail_emote = "Unit has been found as useless. Rebooting."
+ arrest_texts = list("Demoting", "Firing")
+ arrest_emote = "ARREST_TYPE level THREAT_LEVEL lesser crewmember CRIMINAL in LOCATION."
+ stun_sounds = list('sound/weapons/chainhit.ogg')
+
+/datum/beepsky_fashion/king
+ obj_icon_state = "king"
+ name = "King Beepsky"
+ desc = "He who has ascended to bare the right of king, sits atop the throne."
+ capture_one = "BOT is calling the guards onto CRIMINAL!"
+ capture_two = "BOT is calling the guards onto you!"
+ infraction = "Treason of level THREAT_LEVEL detected!"
+ attack_one = "BOT strikes CRIMINAL with his kingly authority!"
+ attack_two = "BOT strikes you with his kingly authority!"
+ patrol_emote = "Searching for peasants to beat up."
+ patrol_fail_emote = "Peasants are using dark magic. Recallibrating."
+ arrest_texts = list("Knighting", "Executing")
+ arrest_emote = "ARREST_TYPE level THREAT_LEVEL peasant CRIMINAL in LOCATION."
+ stun_sounds = list('sound/weapons/punch1.ogg',
+ 'sound/weapons/punch2.ogg',
+ 'sound/weapons/punch3.ogg',
+ 'sound/weapons/punch4.ogg')
+
+/datum/beepsky_fashion/pirate
+ obj_icon_state = "pirate"
+ name = "Beepsbeard the Pirate"
+ desc = "Sailor of the seven seas, all sea-faring bots fear the one known as Beepsbeard."
+ capture_one = "BOT is making CRIMINAL walk the plank!"
+ capture_two = "BOT is making you walk the plank!"
+ infraction = "Enemy vessel spotted with threat level THREAT_LEVEL!"
+ attack_one = "BOT strikes CRIMINAL with his cutlass!"
+ attack_two = "BOT strikes you with his cutlass!"
+ patrol_emote = "Searching for enemy vessels to board."
+ patrol_fail_emote = "No way to engage enemy vessels. Rebooting."
+ arrest_texts = list("Boarding", "Sinking")
+ arrest_emote = "ARREST_TYPE level THREAT_LEVEL vessel CRIMINAL in LOCATION."
+ stun_sounds = list('sound/weapons/bladeslice.ogg')
+
+/datum/beepsky_fashion/engineer
+ obj_icon_state = "engineer"
+ name = "Chief Engineer Beepsky"
+ desc = "He fixes criminals with a wrench to the face."
+ capture_one = "BOT is tying CRIMINAL up!"
+ capture_two = "BOT is tying you up!"
+ infraction = "Structural integrity issue spotted with threat level THREAT_LEVEL"
+ attack_one = "BOT strikes CRIMINAL with his wrench!"
+ attack_two = "BOT strikes you with his wrench!"
+ arrest_texts = list("Fixing", "Repairing")
+ arrest_emote = "ARREST_TYPE level THREAT_LEVEL structural issue in LOCATION"
+ stun_sounds = list('sound/weapons/genhit.ogg')
+
+/datum/beepsky_fashion/tophat
+ obj_icon_state = "tophat"
+ name = "Fancy Beepsky"
+ desc = "It's a secbot, wearing a top hat! How fancy."
+
+/datum/beepsky_fashion/fedora
+ obj_icon_state = "fedora"
+ name = "Fedorasky"
+ desc = "It's a secbot, wearing a fedora!"
+
+/datum/beepsky_fashion/sombrero
+ obj_icon_state = "sombrero"
+ name = "Sombrerosky"
+ desc = "A secbot wearing a sombrero. Truly, a hombre to all."
+
+/datum/beepsky_fashion/santa
+ obj_icon_state = "santa"
+ name = "Saint Beepsky"
+ desc = "Have you been a level 7 infraction this holiday season?"
+ capture_one = "BOT is tying CRIMINAL up with fairy lights!"
+ capture_two = "BOT is tying you up with fairy lights!"
+ infraction = "Level THREAT_LEVEL threat to holiday cheer spotted!"
+ attack_one = "BOT crushes CRIMINAL with their holiday spirit!"
+ attack_two = "BOT crushes you with their holiday spirit!"
+ arrest_emote = "ARREST_TYPE level THREAT_LEVEL threat to holiday cheer in LOCATION"
+
diff --git a/code/datums/brain_damage/magic.dm b/code/datums/brain_damage/magic.dm
index 249907a1b8..a00b341b82 100644
--- a/code/datums/brain_damage/magic.dm
+++ b/code/datums/brain_damage/magic.dm
@@ -5,6 +5,61 @@
/datum/brain_trauma/magic
resilience = TRAUMA_RESILIENCE_LOBOTOMY
+/datum/brain_trauma/magic/lumiphobia
+ name = "Lumiphobia"
+ desc = "Patient has an inexplicable adverse reaction to light."
+ scan_desc = "light hypersensitivity"
+ gain_text = "You feel a craving for darkness."
+ lose_text = "Light no longer bothers you."
+ var/next_damage_warning = 0
+
+/datum/brain_trauma/magic/lumiphobia/on_life()
+ ..()
+ var/turf/T = owner.loc
+ if(istype(T))
+ var/light_amount = T.get_lumcount()
+ if(light_amount > SHADOW_SPECIES_LIGHT_THRESHOLD) //if there's enough light, start dying
+ if(world.time > next_damage_warning)
+ to_chat(owner, "The light burns you!")
+ next_damage_warning = world.time + 100 //Avoid spamming
+ owner.take_overall_damage(0,3)
+
+/datum/brain_trauma/magic/poltergeist
+ name = "Poltergeist"
+ desc = "Patient appears to be targeted by a violent invisible entity."
+ scan_desc = "paranormal activity"
+ gain_text = "You feel a hateful presence close to you."
+ lose_text = "You feel the hateful presence fade away."
+
+/datum/brain_trauma/magic/poltergeist/on_life()
+ ..()
+ if(prob(4))
+ var/most_violent = -1 //So it can pick up items with 0 throwforce if there's nothing else
+ var/obj/item/throwing
+ for(var/obj/item/I in view(5, get_turf(owner)))
+ if(I.anchored)
+ continue
+ if(I.throwforce > most_violent)
+ most_violent = I.throwforce
+ throwing = I
+ if(throwing)
+ throwing.throw_at(owner, 8, 2)
+
+/datum/brain_trauma/magic/antimagic
+ name = "Athaumasia"
+ desc = "Patient is completely inert to magical forces."
+ scan_desc = "thaumic blank"
+ gain_text = "You realize that magic cannot be real."
+ lose_text = "You realize that magic might be real."
+
+/datum/brain_trauma/magic/antimagic/on_gain()
+ ADD_TRAIT(owner, TRAIT_ANTIMAGIC, TRAUMA_TRAIT)
+ ..()
+
+/datum/brain_trauma/magic/antimagic/on_lose()
+ REMOVE_TRAIT(owner, TRAIT_ANTIMAGIC, TRAUMA_TRAIT)
+ ..()
+
/datum/brain_trauma/magic/stalker
name = "Stalking Phantom"
desc = "Patient is stalked by a phantom only they can see."
@@ -39,7 +94,7 @@
if(get_dist(owner, stalker) <= 1)
playsound(owner, 'sound/magic/demon_attack1.ogg', 50)
owner.visible_message("[owner] is torn apart by invisible claws!", "Ghostly claws tear your body apart!")
- owner.take_bodypart_damage(rand(20, 45))
+ owner.take_bodypart_damage(rand(20, 45), wound_bonus=CANT_WOUND)
else if(prob(50))
stalker.forceMove(get_step_towards(stalker, owner))
if(get_dist(owner, stalker) <= 8)
diff --git a/code/datums/brain_damage/severe.dm b/code/datums/brain_damage/severe.dm
index cd8612fd19..3ba00d305b 100644
--- a/code/datums/brain_damage/severe.dm
+++ b/code/datums/brain_damage/severe.dm
@@ -119,8 +119,9 @@
/datum/brain_trauma/severe/paralysis/spinesnapped
random_gain = FALSE
+ clonable = FALSE
paralysis_type = "legs"
- resilience = TRAUMA_RESILIENCE_LOBOTOMY
+ resilience = TRAUMA_RESILIENCE_LOBOTOMY // It shouldn't fix severed spinal cords really, but there is no specific surgery for that yet.
/datum/brain_trauma/severe/narcolepsy
name = "Narcolepsy"
diff --git a/code/datums/brain_damage/special.dm b/code/datums/brain_damage/special.dm
index bc1f566f23..7cc5348a0a 100644
--- a/code/datums/brain_damage/special.dm
+++ b/code/datums/brain_damage/special.dm
@@ -103,8 +103,7 @@
. = ..()
QDEL_IN(src, 300)
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/effect/hallucination/simple/bluespace_stream/attack_hand(mob/user)
+/obj/effect/hallucination/simple/bluespace_stream/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(user != seer || !linked_to)
return
var/slip_in_message = pick("slides sideways in an odd way, and disappears", "jumps into an unseen dimension",\
diff --git a/code/datums/brain_damage/split_personality.dm b/code/datums/brain_damage/split_personality.dm
index f5e00208c5..6b84e1362d 100644
--- a/code/datums/brain_damage/split_personality.dm
+++ b/code/datums/brain_damage/split_personality.dm
@@ -123,7 +123,9 @@
trauma = _trauma
return ..()
-/mob/living/split_personality/Life()
+/mob/living/split_personality/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
if(QDELETED(body))
qdel(src) //in case trauma deletion doesn't already do it
@@ -132,8 +134,6 @@
trauma.switch_personalities()
qdel(trauma)
- ..()
-
/mob/living/split_personality/Login()
..()
to_chat(src, "As a split personality, you cannot do anything but observe. However, you will eventually gain control of your body, switching places with the current personality.")
diff --git a/code/datums/browser.dm b/code/datums/browser.dm
index 5b1df6cb68..96b2a2a294 100644
--- a/code/datums/browser.dm
+++ b/code/datums/browser.dm
@@ -97,20 +97,20 @@
[get_footer()]
"}
-/datum/browser/proc/open(use_onclose = 1)
+/datum/browser/proc/open(use_onclose = TRUE)
if(isnull(window_id)) //null check because this can potentially nuke goonchat
WARNING("Browser [title] tried to open with a null ID")
to_chat(user, "The [title] browser you tried to open failed a sanity check! Please report this on github!")
return
var/window_size = ""
- if (width && height)
+ if(width && height)
window_size = "size=[width]x[height];"
- if (stylesheets.len)
- send_asset_list(user, stylesheets, verify=FALSE)
- if (scripts.len)
- send_asset_list(user, scripts, verify=FALSE)
+ if(stylesheets.len)
+ send_asset_list(user, stylesheets)
+ if(scripts.len)
+ send_asset_list(user, scripts)
user << browse(get_content(), "window=[window_id];[window_size][window_options]")
- if (use_onclose)
+ if(use_onclose)
setup_onclose()
/datum/browser/proc/setup_onclose()
@@ -157,7 +157,7 @@
close()
//designed as a drop in replacement for alert(); functions the same. (outside of needing User specified)
-/proc/tgalert(var/mob/User, Message, Title, Button1="Ok", Button2, Button3, StealFocus = 1, Timeout = 6000)
+/proc/tgalert(mob/User, Message, Title, Button1="Ok", Button2, Button3, StealFocus = 1, Timeout = 6000)
if (!User)
User = usr
switch(askuser(User, Message, Title, Button1, Button2, Button3, StealFocus, Timeout))
diff --git a/code/datums/chatmessage.dm b/code/datums/chatmessage.dm
index 7a78e1d001..73d3e69ac4 100644
--- a/code/datums/chatmessage.dm
+++ b/code/datums/chatmessage.dm
@@ -114,7 +114,7 @@
// BYOND Bug #2563917
// Construct text
var/static/regex/html_metachars = new(@"&[A-Za-z]{1,7};", "g")
- var/complete_text = "[text]"
+ var/complete_text = "[owner.say_emphasis(text)]"
var/mheight = WXH_TO_HEIGHT(owned_by.MeasureText(replacetext(complete_text, html_metachars, "m"), null, CHAT_MESSAGE_WIDTH))
approx_lines = max(1, mheight / CHAT_MESSAGE_APPROX_LHEIGHT)
diff --git a/code/datums/cinematic.dm b/code/datums/cinematic.dm
index e229b25258..df2c15e9c8 100644
--- a/code/datums/cinematic.dm
+++ b/code/datums/cinematic.dm
@@ -30,7 +30,7 @@ GLOBAL_LIST_EMPTY(cinematics)
/datum/cinematic
var/id = CINEMATIC_DEFAULT
var/list/watching = list() //List of clients watching this
- var/list/locked = list() //Who had notransform set during the cinematic
+ var/list/locked = list() //Who had mob_transforming set during the cinematic
var/is_global = FALSE //Global cinematics will override mob-specific ones
var/obj/screen/cinematic/screen
var/datum/callback/special_callback //For special effects synced with animation (explosions after the countdown etc)
@@ -45,7 +45,7 @@ GLOBAL_LIST_EMPTY(cinematics)
GLOB.cinematics -= src
QDEL_NULL(screen)
for(var/mob/M in locked)
- M.notransform = FALSE
+ M.mob_transforming = FALSE
return ..()
/datum/cinematic/proc/play(watchers)
@@ -70,7 +70,7 @@ GLOBAL_LIST_EMPTY(cinematics)
for(var/mob/M in GLOB.mob_list)
if(M in watchers)
- M.notransform = TRUE //Should this be done for non-global cinematics or even at all ?
+ M.mob_transforming = TRUE //Should this be done for non-global cinematics or even at all ?
locked += M
//Close watcher ui's
SStgui.close_user_uis(M)
@@ -79,7 +79,7 @@ GLOBAL_LIST_EMPTY(cinematics)
M.client.screen += screen
else
if(is_global)
- M.notransform = TRUE
+ M.mob_transforming = TRUE
locked += M
//Actually play it
@@ -254,4 +254,4 @@ Nuke.Explosion()
Narsie()
-> Cinematic(CULT,world)
-*/
\ No newline at end of file
+*/
diff --git a/code/datums/components/_component.dm b/code/datums/components/_component.dm
index 7f7440daf4..9e4e16f813 100644
--- a/code/datums/components/_component.dm
+++ b/code/datums/components/_component.dm
@@ -38,8 +38,9 @@
parent = raw_args[1]
var/list/arguments = raw_args.Copy(2)
if(Initialize(arglist(arguments)) == COMPONENT_INCOMPATIBLE)
+ stack_trace("Incompatible [type] assigned to a [parent.type]! args: [json_encode(arguments)]")
qdel(src, TRUE, TRUE)
- CRASH("Incompatible [type] assigned to a [parent.type]! args: [json_encode(arguments)]")
+ return
_JoinParent(parent)
diff --git a/code/datums/components/butchering.dm b/code/datums/components/butchering.dm
index 441a161428..b5b8849155 100644
--- a/code/datums/components/butchering.dm
+++ b/code/datums/components/butchering.dm
@@ -2,7 +2,7 @@
var/speed = 80 //time in deciseconds taken to butcher something
var/effectiveness = 100 //percentage effectiveness; numbers above 100 yield extra drops
var/bonus_modifier = 0 //percentage increase to bonus item chance
- var/butcher_sound = 'sound/weapons/slice.ogg' //sound played when butchering
+ var/butcher_sound = 'sound/effects/butcher.ogg' //sound played when butchering
var/butchering_enabled = TRUE
var/can_be_blunt = FALSE
@@ -64,8 +64,11 @@
H.visible_message("[user] slits [H]'s throat!", \
"[user] slits your throat...")
log_combat(user, H, "finishes slicing the throat of")
- H.apply_damage(source.force, BRUTE, BODY_ZONE_HEAD)
- H.bleed_rate = clamp(H.bleed_rate + 20, 0, 30)
+ H.apply_damage(source.force, BRUTE, BODY_ZONE_HEAD, wound_bonus=CANT_WOUND) // easy tiger, we'll get to that in a sec
+ var/obj/item/bodypart/slit_throat = H.get_bodypart(BODY_ZONE_HEAD)
+ if(slit_throat)
+ var/datum/wound/brute/cut/critical/screaming_through_a_slit_throat = new
+ screaming_through_a_slit_throat.apply_wound(slit_throat)
H.apply_status_effect(/datum/status_effect/neck_slice)
/datum/component/butchering/proc/Butcher(mob/living/butcher, mob/living/meat)
diff --git a/code/datums/components/caltrop.dm b/code/datums/components/caltrop.dm
index 863d55ccab..d138cf1971 100644
--- a/code/datums/components/caltrop.dm
+++ b/code/datums/components/caltrop.dm
@@ -48,7 +48,7 @@
var/damage = rand(min_damage, max_damage)
if(HAS_TRAIT(H, TRAIT_LIGHT_STEP))
damage *= 0.75
- H.apply_damage(damage, BRUTE, picked_def_zone)
+ H.apply_damage(damage, BRUTE, picked_def_zone, wound_bonus = CANT_WOUND)
if(cooldown < world.time - 10) //cooldown to avoid message spam.
if(!H.incapacitated(ignore_restraints = TRUE))
diff --git a/code/datums/components/chasm.dm b/code/datums/components/chasm.dm
index c792cb4be9..0bb6c4a0af 100644
--- a/code/datums/components/chasm.dm
+++ b/code/datums/components/chasm.dm
@@ -109,7 +109,7 @@
AM.visible_message("[AM] falls into [parent]!", "[oblivion_message]")
if (isliving(AM))
var/mob/living/L = AM
- L.notransform = TRUE
+ L.mob_transforming = TRUE
L.Paralyze(200)
var/oldtransform = AM.transform
diff --git a/code/datums/components/crafting/crafting.dm b/code/datums/components/crafting/crafting.dm
new file mode 100644
index 0000000000..b9a1b5ec3b
--- /dev/null
+++ b/code/datums/components/crafting/crafting.dm
@@ -0,0 +1,463 @@
+/datum/component/personal_crafting/Initialize()
+ if(ismob(parent))
+ RegisterSignal(parent, COMSIG_MOB_CLIENT_LOGIN, .proc/create_mob_button)
+
+/datum/component/personal_crafting/proc/create_mob_button(mob/user, client/CL)
+ var/datum/hud/H = user.hud_used
+ var/obj/screen/craft/C = new()
+ C.icon = H.ui_style
+ H.static_inventory += C
+ CL.screen += C
+ RegisterSignal(C, COMSIG_CLICK, .proc/component_ui_interact)
+
+/datum/component/personal_crafting
+ var/busy
+ var/viewing_category = 1 //typical powergamer starting on the Weapons tab
+ var/viewing_subcategory = 1
+ var/list/categories = list(
+ CAT_WEAPONRY = list(
+ CAT_WEAPON,
+ CAT_AMMO,
+ ),
+ CAT_ROBOT = CAT_NONE,
+ CAT_MISC = list(
+ CAT_MISCELLANEOUS,
+ CAT_TOOL,
+ CAT_FURNITURE,
+ ),
+ CAT_PRIMAL = CAT_NONE,
+ CAT_FOOD = list(
+ CAT_BREAD,
+ CAT_BURGER,
+ CAT_CAKE,
+ CAT_DONUT,
+ CAT_EGG,
+ CAT_ICE,
+ CAT_MEAT,
+ CAT_MEXICAN,
+ CAT_MISCFOOD,
+ CAT_PASTRY,
+ CAT_PIE,
+ CAT_PIZZA,
+ CAT_SEAFOOD,
+ CAT_SALAD,
+ CAT_SANDWICH,
+ CAT_SOUP,
+ CAT_SPAGHETTI,
+ ),
+ CAT_DRINK = CAT_NONE,
+ CAT_CLOTHING = CAT_NONE,
+ )
+
+ var/cur_category = CAT_NONE
+ var/cur_subcategory = CAT_NONE
+ var/datum/action/innate/crafting/button
+ var/display_craftable_only = FALSE
+ var/display_compact = TRUE
+
+/* This is what procs do:
+ get_environment - gets a list of things accessable for crafting by user
+ get_surroundings - takes a list of things and makes a list of key-types to values-amounts of said type in the list
+ check_contents - takes a recipe and a key-type list and checks if said recipe can be done with available stuff
+ check_tools - takes recipe, a key-type list, and a user and checks if there are enough tools to do the stuff, checks bugs one level deep
+ construct_item - takes a recipe and a user, call all the checking procs, calls do_after, checks all the things again, calls del_reqs, creates result, calls CheckParts of said result with argument being list returned by deel_reqs
+ del_reqs - takes recipe and a user, loops over the recipes reqs var and tries to find everything in the list make by get_environment and delete it/add to parts list, then returns the said list
+*/
+
+/**
+ * Check that the contents of the recipe meet the requirements.
+ *
+ * user: The /mob that initated the crafting.
+ * R: The /datum/crafting_recipe being attempted.
+ * contents: List of items to search for R's reqs.
+ */
+/datum/component/personal_crafting/proc/check_contents(atom/a, datum/crafting_recipe/R, list/contents)
+ var/list/item_instances = contents["instances"]
+ contents = contents["other"]
+
+ var/list/requirements_list = list()
+
+ // Process all requirements
+ for(var/requirement_path in R.reqs)
+ // Check we have the appropriate amount available in the contents list
+ var/needed_amount = R.reqs[requirement_path]
+ for(var/content_item_path in contents)
+ // Right path and not blacklisted
+ if(!ispath(content_item_path, requirement_path) || R.blacklist.Find(content_item_path))
+ continue
+
+ needed_amount -= contents[content_item_path]
+ if(needed_amount <= 0)
+ break
+
+ if(needed_amount > 0)
+ return FALSE
+
+ // Store the instances of what we will use for R.check_requirements() for requirement_path
+ var/list/instances_list = list()
+ for(var/instance_path in item_instances)
+ if(ispath(instance_path, requirement_path))
+ instances_list += item_instances[instance_path]
+
+ requirements_list[requirement_path] = instances_list
+
+ for(var/requirement_path in R.chem_catalysts)
+ if(contents[requirement_path] < R.chem_catalysts[requirement_path])
+ return FALSE
+
+ return R.check_requirements(a, requirements_list)
+
+/datum/component/personal_crafting/proc/get_environment(atom/a, list/blacklist = null, radius_range = 1)
+ . = list()
+
+ if(!isturf(a.loc))
+ return
+
+ for(var/atom/movable/AM in range(radius_range, a))
+ if(AM.flags_1 & HOLOGRAM_1)
+ continue
+ . += AM
+
+/datum/component/personal_crafting/proc/get_surroundings(atom/a)
+ . = list()
+ .["tool_behaviour"] = list()
+ .["other"] = list()
+ .["instances"] = list()
+ for(var/obj/item/I in get_environment(a))
+ if(I.flags_1 & HOLOGRAM_1)
+ continue
+ if(.["instances"][I.type])
+ .["instances"][I.type] += I
+ else
+ .["instances"][I.type] = list(I)
+ if(istype(I, /obj/item/stack))
+ var/obj/item/stack/S = I
+ .["other"][I.type] += S.amount
+ else if(I.tool_behaviour)
+ .["tool_behaviour"] += I.tool_behaviour
+ .["other"][I.type] += 1
+ else
+ if(istype(I, /obj/item/reagent_containers))
+ var/obj/item/reagent_containers/RC = I
+ if(RC.is_drainable())
+ for(var/datum/reagent/A in RC.reagents.reagent_list)
+ .["other"][A.type] += A.volume
+ .["other"][I.type] += 1
+
+/datum/component/personal_crafting/proc/check_tools(atom/a, datum/crafting_recipe/R, list/contents)
+ if(!R.tools.len)
+ return TRUE
+ var/list/possible_tools = list()
+ var/list/present_qualities = list()
+ present_qualities |= contents["tool_behaviour"]
+ for(var/obj/item/I in a.contents)
+ if(istype(I, /obj/item/storage))
+ for(var/obj/item/SI in I.contents)
+ possible_tools += SI.type
+ if(SI.tool_behaviour)
+ present_qualities.Add(SI.tool_behaviour)
+
+ possible_tools += I.type
+
+ if(I.tool_behaviour)
+ present_qualities.Add(I.tool_behaviour)
+
+ possible_tools |= contents["other"]
+
+ main_loop:
+ for(var/A in R.tools)
+ if(A in present_qualities)
+ continue
+ else
+ for(var/I in possible_tools)
+ if(ispath(I, A))
+ continue main_loop
+ return FALSE
+ return TRUE
+
+/datum/component/personal_crafting/proc/construct_item(atom/a, datum/crafting_recipe/R)
+ var/list/contents = get_surroundings(a)
+ var/send_feedback = 1
+ if(check_contents(a, R, contents))
+ if(check_tools(a, R, contents))
+ //If we're a mob we'll try a do_after; non mobs will instead instantly construct the item
+ if(ismob(a) && !do_after(a, R.time, target = a))
+ return "."
+ contents = get_surroundings(a)
+ if(!check_contents(a, R, contents))
+ return ", missing component."
+ if(!check_tools(a, R, contents))
+ return ", missing tool."
+ var/list/parts = del_reqs(R, a)
+ var/atom/movable/I = new R.result (get_turf(a.loc))
+ I.CheckParts(parts, R)
+ if(send_feedback)
+ SSblackbox.record_feedback("tally", "object_crafted", 1, I.type)
+ return I //Send the item back to whatever called this proc so it can handle whatever it wants to do with the new item
+ return ", missing tool."
+ return ", missing component."
+
+/*Del reqs works like this:
+
+ Loop over reqs var of the recipe
+ Set var amt to the value current cycle req is pointing to, its amount of type we need to delete
+ Get var/surroundings list of things accessable to crafting by get_environment()
+ Check the type of the current cycle req
+ If its reagent then do a while loop, inside it try to locate() reagent containers, inside such containers try to locate needed reagent, if there isnt remove thing from surroundings
+ If there is enough reagent in the search result then delete the needed amount, create the same type of reagent with the same data var and put it into deletion list
+ If there isnt enough take all of that reagent from the container, put into deletion list, substract the amt var by the volume of reagent, remove the container from surroundings list and keep searching
+ While doing above stuff check deletion list if it already has such reagnet, if yes merge instead of adding second one
+ If its stack check if it has enough amount
+ If yes create new stack with the needed amount and put in into deletion list, substract taken amount from the stack
+ If no put all of the stack in the deletion list, substract its amount from amt and keep searching
+ While doing above stuff check deletion list if it already has such stack type, if yes try to merge them instead of adding new one
+ If its anything else just locate() in in the list in a while loop, each find --s the amt var and puts the found stuff in deletion loop
+
+ Then do a loop over parts var of the recipe
+ Do similar stuff to what we have done above, but now in deletion list, until the parts conditions are satisfied keep taking from the deletion list and putting it into parts list for return
+
+ After its done loop over deletion list and delete all the shit that wasnt taken by parts loop
+
+ del_reqs return the list of parts resulting object will receive as argument of CheckParts proc, on the atom level it will add them all to the contents, on all other levels it calls ..() and does whatever is needed afterwards but from contents list already
+*/
+
+/datum/component/personal_crafting/proc/del_reqs(datum/crafting_recipe/R, atom/a)
+ var/list/surroundings
+ var/list/Deletion = list()
+ . = list()
+ var/data
+ var/amt
+ main_loop:
+ for(var/A in R.reqs)
+ amt = R.reqs[A]
+ surroundings = get_environment(a, R.blacklist)
+ surroundings -= Deletion
+ if(ispath(A, /datum/reagent))
+ var/datum/reagent/RG = new A
+ var/datum/reagent/RGNT
+ while(amt > 0)
+ var/obj/item/reagent_containers/RC = locate() in surroundings
+ RG = RC.reagents.get_reagent(A)
+ if(RG)
+ if(!locate(RG.type) in Deletion)
+ Deletion += new RG.type()
+ if(RG.volume > amt)
+ RG.volume -= amt
+ data = RG.data
+ RC.reagents.conditional_update(RC)
+ RG = locate(RG.type) in Deletion
+ RG.volume = amt
+ RG.data += data
+ continue main_loop
+ else
+ surroundings -= RC
+ amt -= RG.volume
+ RC.reagents.reagent_list -= RG
+ RC.reagents.conditional_update(RC)
+ RGNT = locate(RG.type) in Deletion
+ RGNT.volume += RG.volume
+ RGNT.data += RG.data
+ qdel(RG)
+ RC.on_reagent_change()
+ else
+ surroundings -= RC
+ else if(ispath(A, /obj/item/stack))
+ var/obj/item/stack/S
+ var/obj/item/stack/SD
+ while(amt > 0)
+ S = locate(A) in surroundings
+ if(S.amount >= amt)
+ if(!locate(S.type) in Deletion)
+ SD = new S.type()
+ Deletion += SD
+ S.use(amt)
+ SD = locate(S.type) in Deletion
+ SD.amount += amt
+ continue main_loop
+ else
+ amt -= S.amount
+ if(!locate(S.type) in Deletion)
+ Deletion += S
+ else
+ data = S.amount
+ S = locate(S.type) in Deletion
+ S.add(data)
+ surroundings -= S
+ else
+ var/atom/movable/I
+ while(amt > 0)
+ I = locate(A) in surroundings
+ Deletion += I
+ surroundings -= I
+ amt--
+ var/list/partlist = list(R.parts.len)
+ for(var/M in R.parts)
+ partlist[M] = R.parts[M]
+ for(var/A in R.parts)
+ if(istype(A, /datum/reagent))
+ var/datum/reagent/RG = locate(A) in Deletion
+ if(RG.volume > partlist[A])
+ RG.volume = partlist[A]
+ . += RG
+ Deletion -= RG
+ continue
+ else if(istype(A, /obj/item/stack))
+ var/obj/item/stack/ST = locate(A) in Deletion
+ if(ST.amount > partlist[A])
+ ST.amount = partlist[A]
+ . += ST
+ Deletion -= ST
+ continue
+ else
+ while(partlist[A] > 0)
+ var/atom/movable/AM = locate(A) in Deletion
+ . += AM
+ Deletion -= AM
+ partlist[A] -= 1
+ while(Deletion.len)
+ var/DL = Deletion[Deletion.len]
+ Deletion.Cut(Deletion.len)
+ qdel(DL)
+
+/datum/component/personal_crafting/proc/component_ui_interact(obj/screen/craft/image, location, control, params, user)
+ if(user == parent)
+ ui_interact(user)
+
+//For the UI related things we're going to assume the user is a mob rather than typesetting it to an atom as the UI isn't generated if the parent is an atom
+/datum/component/personal_crafting/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.not_incapacitated_turf_state)
+ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ cur_category = categories[1]
+ if(islist(categories[cur_category]))
+ var/list/subcats = categories[cur_category]
+ cur_subcategory = subcats[1]
+ else
+ cur_subcategory = CAT_NONE
+ ui = new(user, src, ui_key, "PersonalCrafting", "Crafting Menu", 700, 800, master_ui, state)
+ ui.open()
+
+/datum/component/personal_crafting/ui_data(mob/user)
+ var/list/data = list()
+ data["busy"] = busy
+ data["category"] = cur_category
+ data["subcategory"] = cur_subcategory
+ data["display_craftable_only"] = display_craftable_only
+ data["display_compact"] = display_compact
+
+ var/list/surroundings = get_surroundings(user)
+ var/list/craftability = list()
+ for(var/rec in GLOB.crafting_recipes)
+ var/datum/crafting_recipe/R = rec
+
+ if(!R.always_availible && !(R.type in user?.mind?.learned_recipes)) //User doesn't actually know how to make this.
+ continue
+
+ if((R.category != cur_category) || (R.subcategory != cur_subcategory))
+ continue
+
+ craftability["[REF(R)]"] = check_contents(user, R, surroundings)
+
+ data["craftability"] = craftability
+ return data
+
+/datum/component/personal_crafting/ui_static_data(mob/user)
+ var/list/data = list()
+
+ var/list/crafting_recipes = list()
+ for(var/rec in GLOB.crafting_recipes)
+ var/datum/crafting_recipe/R = rec
+
+ if(R.name == "") //This is one of the invalid parents that sneaks in
+ continue
+
+ if(!R.always_availible && !(R.type in user?.mind?.learned_recipes)) //User doesn't actually know how to make this.
+ continue
+
+ if(isnull(crafting_recipes[R.category]))
+ crafting_recipes[R.category] = list()
+
+ if(R.subcategory == CAT_NONE)
+ crafting_recipes[R.category] += list(build_recipe_data(R))
+ else
+ if(isnull(crafting_recipes[R.category][R.subcategory]))
+ crafting_recipes[R.category][R.subcategory] = list()
+ crafting_recipes[R.category]["has_subcats"] = TRUE
+ crafting_recipes[R.category][R.subcategory] += list(build_recipe_data(R))
+
+ data["crafting_recipes"] = crafting_recipes
+ return data
+
+/datum/component/personal_crafting/ui_act(action, params)
+ if(..())
+ return
+ switch(action)
+ if("make")
+ var/mob/user = usr
+ var/datum/crafting_recipe/TR = locate(params["recipe"]) in GLOB.crafting_recipes
+ busy = TRUE
+ ui_interact(user)
+ var/atom/movable/result = construct_item(user, TR)
+ if(!istext(result)) //We made an item and didn't get a fail message
+ if(ismob(user) && isitem(result)) //In case the user is actually possessing a non mob like a machine
+ user.put_in_hands(result)
+ else
+ result.forceMove(user.drop_location())
+ to_chat(user, "[TR.name] constructed.")
+ else
+ to_chat(user, "Construction failed[result]")
+ busy = FALSE
+ if("toggle_recipes")
+ display_craftable_only = !display_craftable_only
+ . = TRUE
+ if("toggle_compact")
+ display_compact = !display_compact
+ . = TRUE
+ if("set_category")
+ if(!isnull(params["category"]))
+ cur_category = params["category"]
+ if(!isnull(params["subcategory"]))
+ if(params["subcategory"] == "0")
+ cur_subcategory = ""
+ else
+ cur_subcategory = params["subcategory"]
+ . = TRUE
+
+/datum/component/personal_crafting/proc/build_recipe_data(datum/crafting_recipe/R)
+ var/list/data = list()
+ data["name"] = R.name
+ data["ref"] = "[REF(R)]"
+ var/req_text = ""
+ var/tool_text = ""
+ var/catalyst_text = ""
+
+ for(var/a in R.reqs)
+ //We just need the name, so cheat-typecast to /atom for speed (even tho Reagents are /datum they DO have a "name" var)
+ //Also these are typepaths so sadly we can't just do "[a]"
+ var/atom/A = a
+ req_text += " [R.reqs[A]] [initial(A.name)],"
+ req_text = replacetext(req_text,",","",-1)
+ data["req_text"] = req_text
+
+ for(var/a in R.chem_catalysts)
+ var/atom/A = a //cheat-typecast
+ catalyst_text += " [R.chem_catalysts[A]] [initial(A.name)],"
+ catalyst_text = replacetext(catalyst_text,",","",-1)
+ data["catalyst_text"] = catalyst_text
+
+ for(var/a in R.tools)
+ if(ispath(a, /obj/item))
+ var/obj/item/b = a
+ tool_text += " [initial(b.name)],"
+ else
+ tool_text += " [a],"
+ tool_text = replacetext(tool_text,",","",-1)
+ data["tool_text"] = tool_text
+
+ return data
+
+//Mind helpers
+
+/datum/mind/proc/teach_crafting_recipe(R)
+ if(!learned_recipes)
+ learned_recipes = list()
+ learned_recipes |= R
diff --git a/code/datums/components/crafting/glassware/lens_crafting.dm b/code/datums/components/crafting/glassware/lens_crafting.dm
index 117df25a30..98fa242058 100644
--- a/code/datums/components/crafting/glassware/lens_crafting.dm
+++ b/code/datums/components/crafting/glassware/lens_crafting.dm
@@ -92,7 +92,7 @@
qdel(src)
/obj/item/glasswork/glasses
- name = "Hand Made Glasses"
- desc = "Hande made glasses that have not been polished at all making them useless. Selling them could still be worth a bit of credits."
+ name = "Handmade Glasses"
+ desc = "Handmade glasses that have not been polished at all making them useless. Selling them could still be worth a few credits."
icon = 'icons/obj/glass_ware.dmi'
icon_state = "frames_2"
\ No newline at end of file
diff --git a/code/datums/components/crafting/guncrafting.dm b/code/datums/components/crafting/guncrafting.dm
index 4626ef69d1..deab5e9b69 100644
--- a/code/datums/components/crafting/guncrafting.dm
+++ b/code/datums/components/crafting/guncrafting.dm
@@ -1,4 +1,4 @@
-k// PARTS //
+// PARTS //
/obj/item/weaponcrafting
icon = 'icons/obj/improvised.dmi'
@@ -8,61 +8,33 @@ k// PARTS //
custom_materials = list(/datum/material/wood = MINERAL_MATERIAL_AMOUNT * 6)
icon_state = "riflestock"
-/obj/item/weaponcrafting/durathread_string
- name = "durathread string"
- desc = "A long piece of durathread with some resemblance to cable coil."
+/obj/item/weaponcrafting/string
+ name = "wound thread"
+ desc = "A long piece of thread with some resemblance to cable coil."
icon_state = "durastring"
////////////////////////////////
-// KAT IMPROVISED WEAPON PARTS//
+// IMPROVISED WEAPON PARTS//
////////////////////////////////
/obj/item/weaponcrafting/improvised_parts
- name = "Eerie bunch of coloured dots."
- desc = "You feel the urge to report to Central that the parent type of guncrafting, which should never appear in this reality, has appeared. Whatever that means."
+ name = "Debug Improvised Gun Part"
+ desc = "A badly coded gun part. You should report coders if you see this."
icon = 'icons/obj/guns/gun_parts.dmi'
icon_state = "palette"
-// BARRELS
-
-/obj/item/weaponcrafting/improvised_parts/barrel_rifle
- name = "rifle barrel"
- desc = "A pipe with a diameter just the right size to fire 7.62 rounds out of."
- icon_state = "barrel_rifle"
-
-/obj/item/weaponcrafting/improvised_parts/barrel_shotgun
- name = "shotgun barrel"
- desc = "A twenty bore shotgun barrel."
- icon_state = "barrel_shotgun"
-
-/obj/item/weaponcrafting/improvised_parts/barrel_pistol
- name = "pistol barrel"
- desc = "A pipe with a small diameter and some holes finely cut into it. It fits .32 ACP bullets. Probably."
- icon_state = "barrel_pistol"
- w_class = WEIGHT_CLASS_SMALL
-
// RECEIVERS
/obj/item/weaponcrafting/improvised_parts/rifle_receiver
- name = "bolt action receiver"
- desc = "A crudely constructed receiver to create an improvised bolt-action breechloaded rifle. It's generic enough to modify to create other rifles, potentially."
+ name = "rifle receiver"
+ desc = "A crudely constructed receiver to create an improvised bolt-action breechloaded rifle." // removed some text implying that the item had more uses than it does
icon_state = "receiver_rifle"
w_class = WEIGHT_CLASS_SMALL
-/obj/item/weaponcrafting/improvised_parts/pistol_receiver
- name = "pistol receiver"
- desc = "A receiver to connect house and connects all the parts to make an improvised pistol."
- icon_state = "receiver_pistol"
- w_class = WEIGHT_CLASS_SMALL
-
-/obj/item/weaponcrafting/improvised_parts/laser_receiver
- name = "energy emitter assembly"
- desc = "A mixture of components haphazardly wired together to form an energy emitter."
- icon_state = "laser_assembly"
/obj/item/weaponcrafting/improvised_parts/shotgun_receiver
- name = "break-action assembly"
- desc = "An improvised receiver to create a break-action breechloaded shotgun. Parts of this are still useful if you want to make another type of shotgun, however."
+ name = "shotgun reciever"
+ desc = "An improvised receiver to create a break-action breechloaded shotgun." // removed some text implying that the item had more uses than it does
icon_state = "receiver_shotgun"
w_class = WEIGHT_CLASS_SMALL
@@ -78,15 +50,3 @@ k// PARTS //
name = "wooden firearm body"
desc = "A crudely fashioned wooden body to help keep higher calibre improvised weapons from blowing themselves apart."
icon_state = "wooden_body"
-
-/obj/item/weaponcrafting/improvised_parts/wooden_grip
- name = "wooden pistol grip"
- desc = "A nice wooden grip hollowed out for pistol magazines."
- icon_state = "wooden_pistolgrip"
- w_class = WEIGHT_CLASS_SMALL
-
-/obj/item/weaponcrafting/improvised_parts/makeshift_lens
- name = "makeshift focusing lens"
- desc = "A properly made lens made with actual glassworking tools would perform much better, but this will have to do."
- icon_state = "focusing_lens"
- w_class = WEIGHT_CLASS_TINY
diff --git a/code/datums/components/crafting/recipes/recipes_clothing.dm b/code/datums/components/crafting/recipes/recipes_clothing.dm
index 7a7379c834..2a24c0b451 100644
--- a/code/datums/components/crafting/recipes/recipes_clothing.dm
+++ b/code/datums/components/crafting/recipes/recipes_clothing.dm
@@ -263,6 +263,14 @@
time = 30
category = CAT_CLOTHING
+/datum/crafting_recipe/durathread_reinforcement_kit
+ name = "Durathread Reinforcement Kit"
+ result = /obj/item/armorkit
+ reqs = list(/obj/item/stack/sheet/durathread = 4)
+ tools = list(/obj/item/stack/sheet/mineral/titanium, TOOL_WIRECUTTER) // tough needle for a tough fabric
+ time = 40
+ category = CAT_CLOTHING
+
/datum/crafting_recipe/durathread_duffelbag
name = "Durathread Dufflebag"
result = /obj/item/storage/backpack/duffelbag/durathread
diff --git a/code/datums/components/crafting/recipes/recipes_misc.dm b/code/datums/components/crafting/recipes/recipes_misc.dm
index b076407efc..214c1b1427 100644
--- a/code/datums/components/crafting/recipes/recipes_misc.dm
+++ b/code/datums/components/crafting/recipes/recipes_misc.dm
@@ -92,7 +92,7 @@
time = 150
subcategory = CAT_MISCELLANEOUS
category = CAT_MISC
- always_availible = FALSE // Disabled til learned
+ always_availible = FALSE // Disabled until learned
/datum/crafting_recipe/bloodsucker/candelabrum
@@ -244,7 +244,7 @@
/datum/crafting_recipe/rcl
name = "Makeshift Rapid Cable Layer"
- result = /obj/item/twohanded/rcl/ghetto
+ result = /obj/item/rcl/ghetto
time = 40
tools = list(TOOL_WELDER, TOOL_SCREWDRIVER, TOOL_WRENCH)
reqs = list(/obj/item/stack/sheet/metal = 15)
@@ -324,6 +324,13 @@
result = /obj/item/toy/sword/cx
subcategory = CAT_MISCELLANEOUS
category = CAT_MISC
+
+/datum/crafting_recipe/catgirlplushie
+ name = "Catgirl Plushie"
+ reqs = list(/obj/item/toy/plush/hairball = 3)
+ result = /obj/item/toy/plush/catgirl
+ subcategory = CAT_MISCELLANEOUS
+ category = CAT_MISC
////////////
//Unsorted//
diff --git a/code/datums/components/crafting/recipes/recipes_primal.dm b/code/datums/components/crafting/recipes/recipes_primal.dm
index bb4f4ce6d5..aaae94df1d 100644
--- a/code/datums/components/crafting/recipes/recipes_primal.dm
+++ b/code/datums/components/crafting/recipes/recipes_primal.dm
@@ -50,7 +50,7 @@
/datum/crafting_recipe/bonespear
name = "Bone Spear"
- result = /obj/item/twohanded/bonespear
+ result = /obj/item/spear/bonespear
time = 30
reqs = list(/obj/item/stack/sheet/bone = 4,
/obj/item/stack/sheet/sinew = 1)
@@ -58,7 +58,7 @@
/datum/crafting_recipe/boneaxe
name = "Bone Axe"
- result = /obj/item/twohanded/fireaxe/boneaxe
+ result = /obj/item/fireaxe/boneaxe
time = 50
reqs = list(/obj/item/stack/sheet/bone = 6,
/obj/item/stack/sheet/sinew = 3)
@@ -74,20 +74,20 @@
/datum/crafting_recipe/headpike
name = "Spike Head (Glass Spear)"
time = 65
- reqs = list(/obj/item/twohanded/spear = 1,
+ reqs = list(/obj/item/spear = 1,
/obj/item/bodypart/head = 1)
parts = list(/obj/item/bodypart/head = 1,
- /obj/item/twohanded/spear = 1)
+ /obj/item/spear = 1)
result = /obj/structure/headpike
category = CAT_PRIMAL
/datum/crafting_recipe/headpikebone
name = "Spike Head (Bone Spear)"
time = 65
- reqs = list(/obj/item/twohanded/bonespear = 1,
+ reqs = list(/obj/item/spear/bonespear = 1,
/obj/item/bodypart/head = 1)
parts = list(/obj/item/bodypart/head = 1,
- /obj/item/twohanded/bonespear = 1)
+ /obj/item/spear/bonespear = 1)
result = /obj/structure/headpike/bone
category = CAT_PRIMAL
@@ -103,7 +103,7 @@
/datum/crafting_recipe/bone_bow
name = "Bone Bow"
result = /obj/item/gun/ballistic/bow/ashen
- time = 200
+ time = 120 // 80+120 = 200
always_availible = FALSE
reqs = list(/obj/item/stack/sheet/bone = 8,
/obj/item/stack/sheet/sinew = 4)
@@ -112,7 +112,7 @@
/datum/crafting_recipe/bow_tablet
name = "Sandstone Bow Making Manual"
result = /obj/item/book/granter/crafting_recipe/bone_bow
- time = 600 //Scribing
+ time = 200 //Scribing // don't care
always_availible = FALSE
reqs = list(/obj/item/stack/rods = 1,
/obj/item/stack/sheet/mineral/sandstone = 4)
diff --git a/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm b/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm
index 9d712ef059..ec8ea86d24 100644
--- a/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm
+++ b/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm
@@ -42,7 +42,7 @@
/datum/crafting_recipe/spear
name = "Spear"
- result = /obj/item/twohanded/spear
+ result = /obj/item/spear
reqs = list(/obj/item/restraints/handcuffs/cable = 1,
/obj/item/shard = 1,
/obj/item/stack/rods = 1)
@@ -110,7 +110,7 @@
/datum/crafting_recipe/chainsaw
name = "Chainsaw"
- result = /obj/item/twohanded/required/chainsaw
+ result = /obj/item/chainsaw
reqs = list(/obj/item/circular_saw = 1,
/obj/item/stack/cable_coil = 3,
/obj/item/stack/sheet/plasteel = 5)
@@ -141,7 +141,7 @@
result = /obj/item/bombcore/chemical
reqs = list(
/obj/item/stock_parts/matter_bin = 1,
- /obj/item/twohanded/required/gibtonite = 1,
+ /obj/item/gibtonite = 1,
/obj/item/grenade/chem_grenade = 2
)
parts = list(/obj/item/stock_parts/matter_bin = 1, /obj/item/grenade/chem_grenade = 2)
@@ -173,10 +173,10 @@
/datum/crafting_recipe/lance
name = "Explosive Lance (Grenade)"
- result = /obj/item/twohanded/spear
- reqs = list(/obj/item/twohanded/spear = 1,
+ result = /obj/item/spear
+ reqs = list(/obj/item/spear = 1,
/obj/item/grenade = 1)
- parts = list(/obj/item/twohanded/spear = 1,
+ parts = list(/obj/item/spear = 1,
/obj/item/grenade = 1)
time = 15
category = CAT_WEAPONRY
@@ -192,8 +192,8 @@
result = /obj/item/gun/ballistic/bow/pipe
reqs = list(/obj/item/pipe = 5,
/obj/item/stack/sheet/plastic = 15,
- /obj/item/weaponcrafting/durathread_string = 5)
- time = 450
+ /obj/item/weaponcrafting/string = 5)
+ time = 150
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
@@ -248,10 +248,10 @@
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
-/datum/crafting_recipe/ishotgun
+/datum/crafting_recipe/ishotgun // smaller and more versatile gun requires some better materials
name = "Improvised Shotgun"
result = /obj/item/gun/ballistic/revolver/doublebarrel/improvised
- reqs = list(/obj/item/weaponcrafting/improvised_parts/barrel_shotgun = 1,
+ reqs = list(/obj/item/pipe = 2, // putting a large amount of meaningless timegates by forcing people to turn base resources into upgraded resources kinda sucks
/obj/item/weaponcrafting/improvised_parts/shotgun_receiver = 1,
/obj/item/weaponcrafting/improvised_parts/trigger_assembly = 1,
/obj/item/weaponcrafting/improvised_parts/wooden_body = 1,
@@ -262,10 +262,10 @@
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
-/datum/crafting_recipe/irifle
+/datum/crafting_recipe/irifle // larger and less versatile gun, but a bit easier to make
name = "Improvised Rifle (7.62mm)"
result = /obj/item/gun/ballistic/shotgun/boltaction/improvised
- reqs = list(/obj/item/weaponcrafting/improvised_parts/barrel_rifle = 1,
+ reqs = list(/obj/item/pipe = 2, // above
/obj/item/weaponcrafting/improvised_parts/rifle_receiver = 1,
/obj/item/weaponcrafting/improvised_parts/trigger_assembly = 1,
/obj/item/weaponcrafting/improvised_parts/wooden_body = 1,
@@ -276,49 +276,6 @@
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
-/datum/crafting_recipe/ipistol
- name = "Improvised Pistol (.32)"
- result = /obj/item/gun/ballistic/automatic/pistol/improvised/nomag
- reqs = list(/obj/item/weaponcrafting/improvised_parts/barrel_pistol = 1,
- /obj/item/weaponcrafting/improvised_parts/pistol_receiver = 1,
- /obj/item/weaponcrafting/improvised_parts/trigger_assembly = 1,
- /obj/item/weaponcrafting/improvised_parts/wooden_grip = 1,
- /obj/item/stack/sheet/plastic = 15,
- /obj/item/stack/sheet/plasteel = 1)
- tools = list(TOOL_SCREWDRIVER, TOOL_WELDER, TOOL_WIRECUTTER)
- time = 100
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/ilaser
- name = "Improvised Energy Gun"
- result = /obj/item/gun/energy/e_gun/old/improvised
- reqs = list(/obj/item/weaponcrafting/improvised_parts/laser_receiver = 1,
- /obj/item/weaponcrafting/improvised_parts/trigger_assembly = 1,
- /obj/item/weaponcrafting/improvised_parts/makeshift_lens = 1,
- /obj/item/stock_parts/cell = 1,
- /obj/item/stack/sheet/metal = 10,
- /obj/item/stack/sheet/plasteel = 5,
- /obj/item/stack/cable_coil = 10)
- tools = list(TOOL_SCREWDRIVER)
- time = 100
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/ilaser/upgraded
- name = "Improvised Energy Gun Upgrade"
- result = /obj/item/gun/energy/e_gun/old/improvised/upgraded
- reqs = list(/obj/item/gun/energy/e_gun/old/improvised = 1,
- /obj/item/glasswork/glass_base/lens = 1,
- /obj/item/stock_parts/capacitor/quadratic = 2,
- /obj/item/stock_parts/micro_laser/ultra = 1,
- /obj/item/stock_parts/cell/bluespace = 1,
- /obj/item/stack/cable_coil = 5)
- tools = list(TOOL_SCREWDRIVER, TOOL_MULTITOOL)
- time = 100
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
//////////////////
///AMMO CRAFTING//
//////////////////
@@ -326,9 +283,9 @@
/datum/crafting_recipe/arrow
name = "Arrow"
result = /obj/item/ammo_casing/caseless/arrow/wood
- time = 30
+ time = 5 // these only do 15 damage
reqs = list(/obj/item/stack/sheet/mineral/wood = 1,
- /obj/item/stack/sheet/durathread = 1,
+ /obj/item/stack/sheet/cloth = 1,
/obj/item/stack/rods = 1) // 1 metal sheet = 2 rods = 2 arrows
category = CAT_WEAPONRY
subcategory = CAT_AMMO
@@ -336,7 +293,7 @@
/datum/crafting_recipe/bone_arrow
name = "Bone Arrow"
result = /obj/item/ammo_casing/caseless/arrow/bone
- time = 30
+ time = 5
always_availible = FALSE
reqs = list(/obj/item/stack/sheet/bone = 1,
/obj/item/stack/sheet/sinew = 1,
@@ -348,7 +305,7 @@
name = "Ashen Arrow"
result = /obj/item/ammo_casing/caseless/arrow/ash
tools = list(TOOL_WELDER)
- time = 30
+ time = 10 // 1.5 seconds minimum per actually worthwhile arrow excluding interface lag
always_availible = FALSE
reqs = list(/obj/item/ammo_casing/caseless/arrow/wood = 1)
category = CAT_WEAPONRY
@@ -442,92 +399,28 @@
category = CAT_WEAPONRY
subcategory = CAT_AMMO
-/datum/crafting_recipe/m32acp
- name = ".32ACP Empty Magazine"
- result = /obj/item/ammo_box/magazine/m32acp/empty
- reqs = list(/obj/item/stack/sheet/metal = 3,
- /obj/item/stack/sheet/plasteel = 1,
- /obj/item/stack/packageWrap = 1)
- tools = list(TOOL_WELDER,TOOL_SCREWDRIVER)
- time = 5
- category = CAT_WEAPONRY
- subcategory = CAT_AMMO
-
////////////////////
// PARTS CRAFTING //
////////////////////
-// BARRELS
-
-/datum/crafting_recipe/rifle_barrel
- name = "Improvised Rifle Barrel"
- result = /obj/item/weaponcrafting/improvised_parts/barrel_rifle
- reqs = list(/obj/item/pipe = 2)
- tools = list(TOOL_WELDER,TOOL_SAW)
- time = 150
- category = CAT_WEAPONRY
- subcategory = CAT_PARTS
-
-/datum/crafting_recipe/shotgun_barrel
- name = "Improvised Shotgun Barrel"
- result = /obj/item/weaponcrafting/improvised_parts/barrel_shotgun
- reqs = list(/obj/item/pipe = 2)
- tools = list(TOOL_WELDER,TOOL_SAW)
- time = 150
- category = CAT_WEAPONRY
- subcategory = CAT_PARTS
-
-/datum/crafting_recipe/pistol_barrel
- name = "Improvised Pistol Barrel"
- result = /obj/item/weaponcrafting/improvised_parts/barrel_pistol
- reqs = list(/obj/item/pipe = 1,
- /obj/item/stack/sheet/plasteel = 1)
- tools = list(TOOL_WELDER,TOOL_SAW)
- time = 150
- category = CAT_WEAPONRY
- subcategory = CAT_PARTS
-
// RECEIVERS
/datum/crafting_recipe/rifle_receiver
name = "Improvised Rifle Receiver"
result = /obj/item/weaponcrafting/improvised_parts/rifle_receiver
- reqs = list(/obj/item/stack/sheet/metal = 10,
- /obj/item/stack/sheet/plasteel = 1)
+ reqs = list(/obj/item/stack/sheet/metal = 15) // you can carry multiple shotguns
tools = list(TOOL_SCREWDRIVER, TOOL_WELDER)
- time = 50
+ time = 25
category = CAT_WEAPONRY
subcategory = CAT_PARTS
/datum/crafting_recipe/shotgun_receiver
name = "Improvised Shotgun Receiver"
result = /obj/item/weaponcrafting/improvised_parts/shotgun_receiver
- reqs = list(/obj/item/stack/sheet/metal = 10,
- /obj/item/stack/sheet/plasteel = 1)
- tools = list(TOOL_SCREWDRIVER, TOOL_WELDER) // Dual wielding has been removed, plasteel is a soft timesink to obtain for most to make mass production harder.
- time = 50
- category = CAT_WEAPONRY
- subcategory = CAT_PARTS
-
-/datum/crafting_recipe/pistol_receiver
- name = "Improvised Pistol Receiver"
- result = /obj/item/weaponcrafting/improvised_parts/pistol_receiver
- reqs = list(/obj/item/stack/sheet/metal = 5,
- /obj/item/stack/sheet/plasteel = 1)
- tools = list(TOOL_SCREWDRIVER, TOOL_WELDER, TOOL_SAW)
- time = 50
- category = CAT_WEAPONRY
- subcategory = CAT_PARTS
-
-/datum/crafting_recipe/laser_receiver
- name = "Energy Weapon Assembly"
- result = /obj/item/weaponcrafting/improvised_parts/laser_receiver
- reqs = list(/obj/item/stack/sheet/metal = 10,
- /obj/item/stock_parts/capacitor = 2,
- /obj/item/stock_parts/micro_laser = 1,
- /obj/item/assembly/prox_sensor = 1)
- tools = list(TOOL_SCREWDRIVER, TOOL_MULTITOOL, TOOL_WELDER) // Prox sensor and multitool for the circuit board, welder for extremely ghetto soldering.
- time = 150
+ reqs = list(/obj/item/stack/sheet/metal = 15,
+ /obj/item/stack/sheet/plasteel = 1) // requires access or hacking since shotgun is better
+ tools = list(TOOL_SCREWDRIVER, TOOL_WELDER)
+ time = 25
category = CAT_WEAPONRY
subcategory = CAT_PARTS
@@ -539,16 +432,6 @@
reqs = list(/obj/item/stack/sheet/metal = 3,
/obj/item/assembly/igniter = 1)
tools = list(TOOL_SCREWDRIVER, TOOL_WELDER)
- time = 150
- category = CAT_WEAPONRY
- subcategory = CAT_PARTS
-
-/datum/crafting_recipe/makeshift_lens
- name = "Makeshift Lens"
- result = /obj/item/weaponcrafting/improvised_parts/makeshift_lens
- reqs = list(/obj/item/stack/sheet/metal = 1,
- /obj/item/stack/sheet/glass = 2)
- tools = list(TOOL_WELDER) // Glassmaking lets you make non-makeshift lenses.
- time = 50
+ time = 25
category = CAT_WEAPONRY
subcategory = CAT_PARTS
diff --git a/code/datums/components/edible.dm b/code/datums/components/edible.dm
new file mode 100644
index 0000000000..dc2e490fe4
--- /dev/null
+++ b/code/datums/components/edible.dm
@@ -0,0 +1,245 @@
+/*!
+This component makes it possible to make things edible. What this means is that you can take a bite or force someone to take a bite (in the case of items).
+These items take a specific time to eat, and can do most of the things our original food items could.
+Behavior that's still missing from this component that original food items had that should either be put into seperate components or somewhere else:
+ Components:
+ Drying component (jerky etc)
+ Customizable component (custom pizzas etc)
+ Processable component (Slicing and cooking behavior essentialy, making it go from item A to B when conditions are met.)
+ Dunkable component (Dunking things into reagent containers to absorb a specific amount of reagents)
+ Misc:
+ Something for cakes (You can store things inside)
+*/
+/datum/component/edible
+ ///Amount of reagents taken per bite
+ var/bite_consumption = 2
+ ///Amount of bites taken so far
+ var/bitecount = 0
+ ///Flags for food
+ var/food_flags = NONE
+ ///Bitfield of the types of this food
+ var/foodtypes = NONE
+ ///Amount of seconds it takes to eat this food
+ var/eat_time = 30
+ ///Defines how much it lowers someones satiety (Need to eat, essentialy)
+ var/junkiness = 0
+ ///Message to send when eating
+ var/list/eatverbs
+ ///Callback to be ran for when you take a bite of something
+ var/datum/callback/after_eat
+ ///Last time we checked for food likes
+ var/last_check_time
+
+/datum/component/edible/Initialize(list/initial_reagents, food_flags = NONE, foodtypes = NONE, volume = 50, eat_time = 30, list/tastes, list/eatverbs = list("bite","chew","nibble","gnaw","gobble","chomp"), bite_consumption = 2, datum/callback/after_eat)
+ if(!isatom(parent))
+ return COMPONENT_INCOMPATIBLE
+
+ RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/examine)
+ RegisterSignal(parent, COMSIG_ATOM_ATTACK_ANIMAL, .proc/UseByAnimal)
+ if(isitem(parent))
+ RegisterSignal(parent, COMSIG_ITEM_ATTACK, .proc/UseFromHand)
+ else if(isturf(parent))
+ RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND, .proc/TryToEatTurf)
+
+ src.bite_consumption = bite_consumption
+ src.food_flags = food_flags
+ src.foodtypes = foodtypes
+ src.eat_time = eat_time
+ src.eatverbs = eatverbs
+ src.junkiness = junkiness
+ src.after_eat = after_eat
+
+ var/atom/owner = parent
+
+ if(!owner.reagents) //we don't want to override what's in the item if it possibly contains reagents already
+ owner.create_reagents(volume, INJECTABLE)
+
+ if(initial_reagents)
+ for(var/rid in initial_reagents)
+ var/amount = initial_reagents[rid]
+ if(tastes && tastes.len && (rid == /datum/reagent/consumable/nutriment || rid == /datum/reagent/consumable/nutriment/vitamin))
+ owner.reagents.add_reagent(rid, amount, tastes.Copy())
+ else
+ owner.reagents.add_reagent(rid, amount)
+
+/datum/component/edible/proc/examine(datum/source, mob/user, list/examine_list)
+ if(!(food_flags & FOOD_IN_CONTAINER))
+ switch (bitecount)
+ if (0)
+ return
+ if(1)
+ examine_list += "[parent] was bitten by someone!"
+ if(2,3)
+ examine_list += "[parent] was bitten [bitecount] times!"
+ else
+ examine_list += "[parent] was bitten multiple times!"
+
+/datum/component/edible/proc/UseFromHand(obj/item/source, mob/living/M, mob/living/user)
+ return TryToEat(M, user)
+
+/datum/component/edible/proc/TryToEatTurf(datum/source, mob/user)
+ return TryToEat(user, user)
+
+///All the checks for the act of eating itself and
+/datum/component/edible/proc/TryToEat(mob/living/eater, mob/living/feeder)
+
+ set waitfor = FALSE
+
+ var/atom/owner = parent
+
+ if(feeder.a_intent == INTENT_HARM)
+ return
+ if(!owner.reagents.total_volume)//Shouldn't be needed but it checks to see if it has anything left in it.
+ to_chat(feeder, "None of [owner] left, oh no!")
+ if(isturf(parent))
+ var/turf/T = parent
+ T.ScrapeAway(1, CHANGETURF_INHERIT_AIR)
+ else
+ qdel(parent)
+ return
+ if(!CanConsume(eater, feeder))
+ return
+ var/fullness = eater.nutrition + 10 //The theoretical fullness of the person eating if they were to eat this
+ for(var/datum/reagent/consumable/C in eater.reagents.reagent_list) //we add the nutrition value of what we're currently digesting
+ fullness += C.nutriment_factor * C.volume / C.metabolization_rate
+
+ . = COMPONENT_ITEM_NO_ATTACK //Point of no return I suppose
+
+ if(eater == feeder)//If you're eating it yourself.
+ if(!do_mob(feeder, eater, eat_time)) //Gotta pass the minimal eat time
+ return
+ var/eatverb = pick(eatverbs)
+ if(junkiness && eater.satiety < -150 && eater.nutrition > NUTRITION_LEVEL_STARVING + 50 && !HAS_TRAIT(eater, TRAIT_VORACIOUS))
+ to_chat(eater, "You don't feel like eating any more junk food at the moment!")
+ return
+ else if(fullness <= 50)
+ eater.visible_message("[eater] hungrily [eatverb]s \the [parent], gobbling it down!", "You hungrily [eatverb] \the [parent], gobbling it down!")
+ else if(fullness > 50 && fullness < 150)
+ eater.visible_message("[eater] hungrily [eatverb]s \the [parent].", "You hungrily [eatverb] \the [parent].")
+ else if(fullness > 150 && fullness < 500)
+ eater.visible_message("[eater] [eatverb]s \the [parent].", "You [eatverb] \the [parent].")
+ else if(fullness > 500 && fullness < 600)
+ eater.visible_message("[eater] unwillingly [eatverb]s a bit of \the [parent].", "You unwillingly [eatverb] a bit of \the [parent].")
+ else if(fullness > (600 * (1 + eater.overeatduration / 2000))) // The more you eat - the more you can eat
+ eater.visible_message("[eater] cannot force any more of \the [parent] to go down [eater.p_their()] throat!", "You cannot force any more of \the [parent] to go down your throat!")
+ return
+ else //If you're feeding it to someone else.
+ if(isbrain(eater))
+ to_chat(feeder, "[eater] doesn't seem to have a mouth!")
+ return
+ if(fullness <= (600 * (1 + eater.overeatduration / 1000)))
+ eater.visible_message("[feeder] attempts to feed [eater] [parent].", \
+ "[feeder] attempts to feed you [parent].")
+ else
+ eater.visible_message("[feeder] cannot force any more of [parent] down [eater]'s throat!", \
+ "[feeder] cannot force any more of [parent] down your throat!")
+ return
+ if(!do_mob(feeder, eater)) //Wait 3 seconds before you can feed
+ return
+
+ log_combat(feeder, eater, "fed", owner.reagents.log_list())
+ eater.visible_message("[feeder] forces [eater] to eat [parent]!", \
+ "[feeder] forces you to eat [parent]!")
+
+ TakeBite(eater, feeder)
+
+///This function lets the eater take a bite and transfers the reagents to the eater.
+/datum/component/edible/proc/TakeBite(mob/living/eater, mob/living/feeder)
+
+ var/atom/owner = parent
+
+ if(!owner?.reagents)
+ return FALSE
+ if(eater.satiety > -200)
+ eater.satiety -= junkiness
+ playsound(eater.loc,'sound/items/eatfood.ogg', rand(10,50), TRUE)
+ if(owner.reagents.total_volume)
+ SEND_SIGNAL(parent, COMSIG_FOOD_EATEN, eater, feeder)
+ var/fraction = min(bite_consumption / owner.reagents.total_volume, 1)
+ owner.reagents.reaction(eater, INGEST, fraction)
+ owner.reagents.trans_to(eater, bite_consumption)
+ bitecount++
+ On_Consume(eater)
+ checkLiked(fraction, eater)
+
+ //Invoke our after eat callback if it is valid
+ if(after_eat)
+ after_eat.Invoke(eater, feeder)
+
+ return TRUE
+
+///Checks whether or not the eater can actually consume the food
+/datum/component/edible/proc/CanConsume(mob/living/eater, mob/living/feeder)
+ if(!iscarbon(eater))
+ return FALSE
+ var/mob/living/carbon/C = eater
+ var/covered = ""
+ if(C.is_mouth_covered(head_only = 1))
+ covered = "headgear"
+ else if(C.is_mouth_covered(mask_only = 1))
+ covered = "mask"
+ if(covered)
+ var/who = (isnull(feeder) || eater == feeder) ? "your" : "[eater.p_their()]"
+ to_chat(feeder, "You have to remove [who] [covered] first!")
+ return FALSE
+ return TRUE
+
+///Check foodtypes to see if we should send a moodlet
+/datum/component/edible/proc/checkLiked(var/fraction, mob/M)
+ if(last_check_time + 50 > world.time)
+ return FALSE
+ if(!ishuman(M))
+ return FALSE
+ var/mob/living/carbon/human/H = M
+ if(HAS_TRAIT(H, TRAIT_AGEUSIA) && foodtypes & H.dna.species.toxic_food)
+ to_chat(H, "You don't feel so good...")
+ H.adjust_disgust(25 + 30 * fraction)
+ else
+ if(foodtypes & H.dna.species.toxic_food)
+ to_chat(H,"What the hell was that thing?!")
+ H.adjust_disgust(25 + 30 * fraction)
+ SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "toxic_food", /datum/mood_event/disgusting_food)
+ else if(foodtypes & H.dna.species.disliked_food)
+ to_chat(H,"That didn't taste very good...")
+ H.adjust_disgust(11 + 15 * fraction)
+ SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "gross_food", /datum/mood_event/gross_food)
+ else if(foodtypes & H.dna.species.liked_food)
+ to_chat(H,"I love this taste!")
+ H.adjust_disgust(-5 + -2.5 * fraction)
+ SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "fav_food", /datum/mood_event/favorite_food)
+ if((foodtypes & BREAKFAST) && world.time - SSticker.round_start_time < STOP_SERVING_BREAKFAST)
+ SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "breakfast", /datum/mood_event/breakfast)
+ last_check_time = world.time
+
+///Delete the item when it is fully eaten
+/datum/component/edible/proc/On_Consume(mob/living/eater)
+
+ var/atom/owner = parent
+
+ if(!eater)
+ return
+ if(!owner.reagents.total_volume)
+ if(isturf(parent))
+ var/turf/T = parent
+ T.ScrapeAway(1, CHANGETURF_INHERIT_AIR)
+ else
+ qdel(parent)
+
+///Ability to feed food to puppers
+/datum/component/edible/proc/UseByAnimal(datum/source, mob/user)
+
+ var/atom/owner = parent
+
+ if(!isdog(user))
+ return
+ var/mob/living/L = user
+ if(bitecount == 0 || prob(50))
+ L.emote("me", 1, "nibbles away at \the [parent]")
+ bitecount++
+ . = COMPONENT_ITEM_NO_ATTACK
+ L.taste(owner.reagents) // why should carbons get all the fun?
+ if(bitecount >= 5)
+ var/sattisfaction_text = pick("burps from enjoyment", "yaps for more", "woofs twice", "looks at the area where \the [parent] was")
+ if(sattisfaction_text)
+ L.emote("me", 1, "[sattisfaction_text]")
+ qdel(parent)
diff --git a/code/datums/components/embedded.dm b/code/datums/components/embedded.dm
new file mode 100644
index 0000000000..ce124646f4
--- /dev/null
+++ b/code/datums/components/embedded.dm
@@ -0,0 +1,363 @@
+/*
+ This component is responsible for handling individual instances of embedded objects. The embeddable element is what allows an item to be embeddable and stores its embedding stats,
+ and when it impacts and meets the requirements to stick into something, it instantiates an embedded component. Once the item falls out, the component is destroyed, while the
+ element survives to embed another day.
+
+ There are 2 different things that can be embedded presently: carbons, and closed turfs (see: walls)
+
+ - Carbon embedding has all the classical embedding behavior, and tracks more events and signals. The main behaviors and hooks to look for are:
+ -- Every process tick, there is a chance to randomly proc pain, controlled by pain_chance. There may also be a chance for the object to fall out randomly, per fall_chance
+ -- Every time the mob moves, there is a chance to proc jostling pain, controlled by jostle_chance (and only 50% as likely if the mob is walking or crawling)
+ -- Various signals hooking into carbon topic() and the embed removal surgery in order to handle removals.
+
+ - Turf embedding is much simpler. All we do here is draw an overlay of the item's inhand on the turf, hide the item, and create an HTML link in the turf's inspect
+ that allows you to rip the item out. There's nothing dynamic about this, so far less checks.
+
+
+ In addition, there are 2 cases of embedding: embedding, and sticking
+
+ - Embedding involves harmful and dangerous embeds, whether they cause brute damage, stamina damage, or a mix. This is the default behavior for embeddings, for when something is "pointy"
+
+ - Sticking occurs when an item should not cause any harm while embedding (imagine throwing a sticky ball of tape at someone, rather than a shuriken). An item is considered "sticky"
+ when it has 0 for both pain multiplier and jostle pain multiplier. It's a bit arbitrary, but fairly straightforward.
+
+ Stickables differ from embeds in the following ways:
+ -- Text descriptors use phrasing like "X is stuck to Y" rather than "X is embedded in Y"
+ -- There is no slicing sound on impact
+ -- All damage checks and bloodloss are skipped for carbons
+ -- Pointy objects create sparks when embedding into a turf
+
+*/
+
+
+/datum/component/embedded
+ dupe_mode = COMPONENT_DUPE_ALLOWED
+ var/obj/item/bodypart/limb
+ var/obj/item/weapon
+
+ // all of this stuff is explained in _DEFINES/combat.dm
+ var/embed_chance // not like we really need it once we're already stuck in but hey
+ var/fall_chance
+ var/pain_chance
+ var/pain_mult
+ var/impact_pain_mult
+ var/remove_pain_mult
+ var/rip_time
+ var/ignore_throwspeed_threshold
+ var/jostle_chance
+ var/jostle_pain_mult
+ var/pain_stam_pct
+ var/embed_chance_turf_mod
+
+ ///if both our pain multiplier and jostle pain multiplier are 0, we're harmless and can omit most of the damage related stuff
+ var/harmful
+ var/mutable_appearance/overlay
+
+/datum/component/embedded/Initialize(obj/item/I,
+ datum/thrownthing/throwingdatum,
+ obj/item/bodypart/part,
+ embed_chance = EMBED_CHANCE,
+ fall_chance = EMBEDDED_ITEM_FALLOUT,
+ pain_chance = EMBEDDED_PAIN_CHANCE,
+ pain_mult = EMBEDDED_PAIN_MULTIPLIER,
+ remove_pain_mult = EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER,
+ impact_pain_mult = EMBEDDED_IMPACT_PAIN_MULTIPLIER,
+ rip_time = EMBEDDED_UNSAFE_REMOVAL_TIME,
+ ignore_throwspeed_threshold = FALSE,
+ jostle_chance = EMBEDDED_JOSTLE_CHANCE,
+ jostle_pain_mult = EMBEDDED_JOSTLE_PAIN_MULTIPLIER,
+ pain_stam_pct = EMBEDDED_PAIN_STAM_PCT,
+ embed_chance_turf_mod = EMBED_CHANCE_TURF_MOD)
+
+ if((!iscarbon(parent) && !isclosedturf(parent)) || !isitem(I))
+ return COMPONENT_INCOMPATIBLE
+
+ if(part)
+ limb = part
+ src.embed_chance = embed_chance
+ src.fall_chance = fall_chance
+ src.pain_chance = pain_chance
+ src.pain_mult = pain_mult
+ src.remove_pain_mult = remove_pain_mult
+ src.rip_time = rip_time
+ src.impact_pain_mult = impact_pain_mult
+ src.ignore_throwspeed_threshold = ignore_throwspeed_threshold
+ src.jostle_chance = jostle_chance
+ src.jostle_pain_mult = jostle_pain_mult
+ src.pain_stam_pct = pain_stam_pct
+ src.embed_chance_turf_mod = embed_chance_turf_mod
+
+ src.weapon = I
+
+ if(!weapon.isEmbedHarmless())
+ harmful = TRUE
+
+ weapon.embedded(parent)
+
+ if(iscarbon(parent))
+ initCarbon()
+ else if(isclosedturf(parent))
+ initTurf(throwingdatum)
+
+/datum/component/embedded/RegisterWithParent()
+ if(iscarbon(parent))
+ RegisterSignal(parent, COMSIG_MOVABLE_MOVED, .proc/jostleCheck)
+ RegisterSignal(parent, COMSIG_CARBON_EMBED_RIP, .proc/ripOutCarbon)
+ RegisterSignal(parent, COMSIG_CARBON_EMBED_REMOVAL, .proc/safeRemoveCarbon)
+ else if(isclosedturf(parent))
+ RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/examineTurf)
+ RegisterSignal(parent, COMSIG_PARENT_QDELETING, .proc/itemMoved)
+
+/datum/component/embedded/UnregisterFromParent()
+ UnregisterSignal(parent, list(COMSIG_MOVABLE_MOVED, COMSIG_CARBON_EMBED_RIP, COMSIG_CARBON_EMBED_REMOVAL, COMSIG_PARENT_EXAMINE))
+
+/datum/component/embedded/process()
+ if(iscarbon(parent))
+ processCarbon()
+
+/datum/component/embedded/Destroy()
+ if(weapon)
+ UnregisterSignal(weapon, list(COMSIG_MOVABLE_MOVED, COMSIG_PARENT_QDELETING))
+ if(overlay)
+ var/atom/A = parent
+ A.cut_overlay(overlay, TRUE)
+ qdel(overlay)
+
+ return ..()
+
+////////////////////////////////////////
+/////////////HUMAN PROCS////////////////
+////////////////////////////////////////
+
+/// Set up an instance of embedding for a carbon. This is basically an extension of Initialize() so not much to say
+/datum/component/embedded/proc/initCarbon()
+ START_PROCESSING(SSdcs, src)
+ var/mob/living/carbon/victim = parent
+ if(!istype(limb))
+ limb = pick(victim.bodyparts)
+
+ limb.embedded_objects |= weapon // on the inside... on the inside...
+ weapon.forceMove(victim)
+ RegisterSignal(weapon, list(COMSIG_MOVABLE_MOVED, COMSIG_PARENT_QDELETING), .proc/byeItemCarbon)
+
+ if(harmful)
+ victim.visible_message("[weapon] embeds itself in [victim]'s [limb.name]!",ignored_mobs=victim)
+ to_chat(victim, "[weapon] embeds itself in your [limb.name]!")
+ victim.throw_alert("embeddedobject", /obj/screen/alert/embeddedobject)
+ playsound(victim,'sound/weapons/bladeslice.ogg', 40)
+ weapon.add_mob_blood(victim)//it embedded itself in you, of course it's bloody!
+ var/damage = weapon.w_class * impact_pain_mult
+ limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage, wound_bonus=-30, sharpness = TRUE)
+ SEND_SIGNAL(victim, COMSIG_ADD_MOOD_EVENT, "embedded", /datum/mood_event/embedded)
+ else
+ victim.visible_message("[weapon] sticks itself to [victim]'s [limb.name]!",ignored_mobs=victim)
+ to_chat(victim, "[weapon] sticks itself to your [limb.name]!")
+
+/// Called every time a carbon with a harmful embed moves, rolling a chance for the item to cause pain. The chance is halved if the carbon is crawling or walking.
+/datum/component/embedded/proc/jostleCheck()
+ var/mob/living/carbon/victim = parent
+
+ var/chance = jostle_chance
+ if(victim.m_intent == MOVE_INTENT_WALK || !(victim.mobility_flags & MOBILITY_STAND))
+ chance *= 0.5
+
+ if(harmful && prob(chance))
+ var/damage = weapon.w_class * jostle_pain_mult
+ limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage, wound_bonus = CANT_WOUND)
+ to_chat(victim, "[weapon] embedded in your [limb.name] jostles and stings!")
+
+
+/// Called when then item randomly falls out of a carbon. This handles the damage and descriptors, then calls safe_remove()
+/datum/component/embedded/proc/fallOutCarbon()
+ var/mob/living/carbon/victim = parent
+
+ if(harmful)
+ var/damage = weapon.w_class * remove_pain_mult
+ limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage, wound_bonus = CANT_WOUND)
+ victim.visible_message("[weapon] falls out of [victim.name]'s [limb.name]!", ignored_mobs=victim)
+ to_chat(victim, "[weapon] falls out of your [limb.name]!")
+ else
+ victim.visible_message("[weapon] falls off of [victim.name]'s [limb.name]!", ignored_mobs=victim)
+ to_chat(victim, "[weapon] falls off of your [limb.name]!")
+
+ safeRemoveCarbon()
+
+
+/// Called when a carbon with an object embedded/stuck to them inspects themselves and clicks the appropriate link to begin ripping the item out. This handles the ripping attempt, descriptors, and dealing damage, then calls safe_remove()
+/datum/component/embedded/proc/ripOutCarbon(datum/source, obj/item/I, obj/item/bodypart/limb)
+ if(I != weapon || src.limb != limb)
+ return
+
+ var/mob/living/carbon/victim = parent
+ var/time_taken = rip_time * weapon.w_class
+
+ victim.visible_message("[victim] attempts to remove [weapon] from [victim.p_their()] [limb.name].","You attempt to remove [weapon] from your [limb.name]... (It will take [DisplayTimeText(time_taken)].)")
+ if(do_after(victim, time_taken, target = victim))
+ if(!weapon || !limb || weapon.loc != victim || !(weapon in limb.embedded_objects))
+ qdel(src)
+ return
+
+ if(harmful)
+ var/damage = weapon.w_class * remove_pain_mult
+ limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage, sharpness=TRUE) //It hurts to rip it out, get surgery you dingus.
+ victim.emote("scream")
+ victim.visible_message("[victim] successfully rips [weapon] out of [victim.p_their()] [limb.name]!", "You successfully remove [weapon] from your [limb.name].")
+ else
+ victim.visible_message("[victim] successfully rips [weapon] off of [victim.p_their()] [limb.name]!", "You successfully remove [weapon] from your [limb.name].")
+
+ safeRemoveCarbon(TRUE)
+
+
+/// This proc handles the final step and actual removal of an embedded/stuck item from a carbon, whether or not it was actually removed safely.
+/// Pass TRUE for to_hands if we want it to go to the victim's hands when they pull it out
+/datum/component/embedded/proc/safeRemoveCarbon(to_hands)
+ var/mob/living/carbon/victim = parent
+ limb.embedded_objects -= weapon
+
+ UnregisterSignal(weapon, list(COMSIG_MOVABLE_MOVED, COMSIG_PARENT_QDELETING)) // have to unhook these here so they don't also register as having disappeared
+
+ if(!weapon)
+ if(!victim.has_embedded_objects())
+ victim.clear_alert("embeddedobject")
+ SEND_SIGNAL(victim, COMSIG_CLEAR_MOOD_EVENT, "embedded")
+ qdel(src)
+ return
+
+ if(weapon.unembedded()) // if it deleted itself
+ weapon = null
+ if(!victim.has_embedded_objects())
+ victim.clear_alert("embeddedobject")
+ SEND_SIGNAL(victim, COMSIG_CLEAR_MOOD_EVENT, "embedded")
+ qdel(src)
+ return
+
+ if(to_hands)
+ victim.put_in_hands(weapon)
+ else
+ weapon.forceMove(get_turf(victim))
+
+ if(!victim.has_embedded_objects())
+ victim.clear_alert("embeddedobject")
+ SEND_SIGNAL(victim, COMSIG_CLEAR_MOOD_EVENT, "embedded")
+ qdel(src)
+
+
+/// Something deleted or moved our weapon while it was embedded, how rude!
+/datum/component/embedded/proc/byeItemCarbon()
+ var/mob/living/carbon/victim = parent
+ limb.embedded_objects -= weapon
+ UnregisterSignal(weapon, list(COMSIG_MOVABLE_MOVED, COMSIG_PARENT_QDELETING))
+
+ if(victim)
+ to_chat(victim, "\The [weapon] that was embedded in your [limb.name] disappears!")
+ if(!victim.has_embedded_objects())
+ victim.clear_alert("embeddedobject")
+ SEND_SIGNAL(victim, COMSIG_CLEAR_MOOD_EVENT, "embedded")
+ weapon = null
+ qdel(src)
+
+
+/// Items embedded/stuck to carbons both check whether they randomly fall out (if applicable), as well as if the target mob and limb still exists.
+/// Items harmfully embedded in carbons have an additional check for random pain (if applicable)
+/datum/component/embedded/proc/processCarbon()
+ var/mob/living/carbon/victim = parent
+
+ if(!victim || !limb) // in case the victim and/or their limbs exploded (say, due to a sticky bomb)
+ weapon.forceMove(get_turf(weapon))
+ qdel(src)
+
+ if(victim.stat == DEAD)
+ return
+
+ var/damage = weapon.w_class * pain_mult
+ var/chance = pain_chance
+ if(pain_stam_pct && IS_STAMCRIT(victim)) //if it's a less-lethal embed, give them a break if they're already stamcritted
+ chance *= 0.3
+ damage *= 0.7
+
+ if(harmful && prob(chance))
+ limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage, wound_bonus = CANT_WOUND)
+ to_chat(victim, "[weapon] embedded in your [limb.name] hurts!")
+
+ if(prob(fall_chance))
+ fallOutCarbon()
+
+
+
+////////////////////////////////////////
+//////////////TURF PROCS////////////////
+////////////////////////////////////////
+
+/// Turfs are much lower maintenance, since we don't care if they're in pain, but since they don't bleed or scream, we draw an overlay to show their status.
+/// The only difference pointy/sticky items make here is text descriptors and pointy objects making a spark shower on impact.
+/datum/component/embedded/proc/initTurf(datum/thrownthing/throwingdatum)
+ var/turf/closed/hit = parent
+
+ // we can't store the item IN the turf (cause turfs are just kinda... there), so we fake it by making the item invisible and bailing if it moves due to a blast
+ weapon.forceMove(hit)
+ weapon.invisibility = INVISIBILITY_ABSTRACT
+ RegisterSignal(weapon, COMSIG_MOVABLE_MOVED, .proc/itemMoved)
+
+ var/pixelX = rand(-2, 2)
+ var/pixelY = rand(-1, 3) // bias this upwards since in-hands are usually on the lower end of the sprite
+
+ switch(throwingdatum.init_dir)
+ if(NORTH)
+ pixelY -= 2
+ if(SOUTH)
+ pixelY += 2
+ if(WEST)
+ pixelX += 2
+ if(EAST)
+ pixelX -= 2
+
+ if(throwingdatum.init_dir in list(NORTH, WEST, NORTHWEST, SOUTHWEST))
+ overlay = mutable_appearance(icon=weapon.righthand_file,icon_state=weapon.item_state)
+ else
+ overlay = mutable_appearance(icon=weapon.lefthand_file,icon_state=weapon.item_state)
+
+ var/matrix/M = matrix()
+ M.Translate(pixelX, pixelY)
+ overlay.transform = M
+ hit.add_overlay(overlay, TRUE)
+
+ if(harmful)
+ hit.visible_message("[weapon] embeds itself in [hit]!")
+ playsound(hit,'sound/weapons/bladeslice.ogg', 70)
+
+ var/datum/effect_system/spark_spread/sparks = new
+ sparks.set_up(1, 1, parent)
+ sparks.attach(parent)
+ sparks.start()
+ else
+ hit.visible_message("[weapon] sticks itself to [hit]!")
+
+
+/datum/component/embedded/proc/examineTurf(datum/source, mob/user, list/examine_list)
+ if(harmful)
+ examine_list += "\t There is \a [weapon] embedded in [parent]!"
+ else
+ examine_list += "\t There is \a [weapon] stuck to [parent]!"
+
+
+/// Someone is ripping out the item from the turf by hand
+/datum/component/embedded/Topic(datum/source, href_list)
+ var/mob/living/us = usr
+ if(in_range(us, parent) && locate(href_list["embedded_object"]) == weapon)
+ if(harmful)
+ us.visible_message("[us] begins unwedging [weapon] from [parent].", "You begin unwedging [weapon] from [parent]...")
+ else
+ us.visible_message("[us] begins unsticking [weapon] from [parent].", "You begin unsticking [weapon] from [parent]...")
+
+ if(do_after(us, 30, target = parent))
+ us.put_in_hands(weapon)
+ weapon.unembedded()
+ qdel(src)
+
+
+/// This proc handles if something knocked the invisible item loose from the turf somehow (probably an explosion). Just make it visible and say it fell loose, then get outta here.
+/datum/component/embedded/proc/itemMoved()
+ weapon.invisibility = initial(weapon.invisibility)
+ weapon.visible_message("[weapon] falls loose from [parent].")
+ weapon.unembedded()
+ qdel(src)
diff --git a/code/datums/components/fantasy/suffixes.dm b/code/datums/components/fantasy/suffixes.dm
index f32ca50595..59328b9bc9 100644
--- a/code/datums/components/fantasy/suffixes.dm
+++ b/code/datums/components/fantasy/suffixes.dm
@@ -144,7 +144,7 @@
var/obj/item/projectile/picked_projectiletype = pickweight(weighted_projectile_types)
var/obj/item/master = comp.parent
- comp.appliedComponents += master.AddComponent(/datum/component/shrapnel, picked_projectiletype)
+ comp.appliedComponents += master.AddComponent(/datum/component/mirv, picked_projectiletype)
return "[newName] of [initial(picked_projectiletype.name)] shrapnel"
/datum/fantasy_affix/strength
diff --git a/code/datums/components/fried.dm b/code/datums/components/fried.dm
new file mode 100644
index 0000000000..4e21962778
--- /dev/null
+++ b/code/datums/components/fried.dm
@@ -0,0 +1,107 @@
+/*!
+ This component essentially encapsulates frying and utilizes the edible component
+ This means fried items can work like regular ones, and generally the code is far less messy
+*/
+/datum/component/fried
+ var/fry_power //how powerfully was this item fried
+ var/atom/owner //the atom it is owned by
+ var/stored_name //name of the owner when the component was first added
+ var/frying_examine_text = "the coders messed frying code up, report this!"
+
+/datum/component/fried/Initialize(frying_power)
+ if(!isatom(parent))
+ return COMPONENT_INCOMPATIBLE
+
+ RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/examine)
+ RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, .proc/restore) //basically, unfry people who are being cleaned (badmemes fried someone)
+
+ fry_power = frying_power
+ owner = parent
+ stored_name = owner.name
+
+ setup_fried_item()
+
+//some stuff to do with the contents of fried junk
+GLOBAL_VAR_INIT(frying_hardmode, TRUE)
+GLOBAL_VAR_INIT(frying_bad_chem_add_volume, TRUE)
+GLOBAL_LIST_INIT(frying_bad_chems, list(
+/datum/reagent/toxin/bad_food = 1,
+/datum/reagent/toxin = 1,
+/datum/reagent/lithium = 1,
+/datum/reagent/mercury = 1,
+))
+
+/datum/component/fried/proc/examine(datum/source, mob/user, list/examine_list)
+ examine_list += "[parent] has been [frying_examine_text]"
+
+/datum/component/fried/proc/setup_fried_item() //sets the name, colour and examine text and edibility up
+ //first we do some checks depending on the type of item being fried
+ var/list/fried_tastes = list("crispy")
+ var/fried_foodtypes = FRIED
+ var/fried_junk = FALSE
+
+ if(!isfood(owner) && GLOB.frying_hardmode && GLOB.frying_bad_chems.len && !owner.reagents) //you fried some junk, it's not gonna taste great
+ fried_junk = TRUE
+ fried_foodtypes |= TOXIC // junk tastes toxic too
+ else
+ if(isfood(owner))
+ var/obj/item/reagent_containers/food/snacks/food_item = owner
+ fried_tastes += food_item.tastes
+ fried_foodtypes |= food_item.foodtype
+
+ var/fried_eat_time = 0
+ if(isturf(owner))
+ fried_eat_time = 30 //we want turfs to be eaten slowly
+
+ var/colour_priority = FIXED_COLOUR_PRIORITY
+ if(ismob(owner))
+ colour_priority = WASHABLE_COLOUR_PRIORITY //badmins fried someone and we want to let them wash the fry colour off
+ //lets heavily hint at how to undo their frying
+ to_chat(owner, "You've been coated in hot cooking oil! You should probably go wash it off at the showers.")
+ else
+ owner.AddComponent(/datum/component/edible, foodtypes = fried_tastes, tastes = fried_tastes, eat_time = fried_eat_time) //we don't want mobs to get the edible component
+
+ switch(fry_power)
+ if(0 to 15)
+ owner.name = "lightly fried [owner.name]"
+ owner.add_atom_colour(rgb(166,103,54), colour_priority)
+ frying_examine_text = "lightly fried"
+ if(16 to 49)
+ owner.name = "fried [owner.name]"
+ owner.add_atom_colour(rgb(103,63,24), colour_priority)
+ frying_examine_text = "moderately fried"
+ if(50 to 59)
+ owner.name = "deep fried [owner.name]"
+ owner.add_atom_colour(rgb(63,23,4), colour_priority)
+ frying_examine_text = "deeply fried"
+ else
+ owner.name = "the physical manifestation of fried foods"
+ owner.add_atom_colour(rgb(33,19,9), colour_priority)
+ frying_examine_text = "incomprehensibly fried to a crisp"
+
+ //adding the edible component gives it reagents meaning we can now add the bad frying reagents if it's junk
+ if(fried_junk && owner.reagents) //check again just incase
+ var/R = rand(1, GLOB.frying_bad_chems.len)
+ var/bad_chem = GLOB.frying_bad_chems[R]
+ var/bad_chem_amount = max(4,GLOB.frying_bad_chems[bad_chem] * (fry_power/12.5)) //4u of bad chem reached when deeply fried
+ owner.reagents.add_reagent(bad_chem, bad_chem_amount)
+
+/datum/component/fried/proc/restore_name() //restore somethings name
+ //we do string manipulation and not restoring their name to real_name because some things hide your real_name and we want to maintain that
+ if(copytext(owner.name,1,14) == "lightly fried ")
+ owner.name = copytext(owner.name,15)
+ else
+ if(copytext(owner.name,1,6) == "fried ")
+ owner.name = copytext(owner.name,7)
+ else
+ if(copytext(owner.name,1,11) == "deep fried ")
+ owner.name = copytext(owner.name, 12)
+ else
+ if(owner.name == "the physical manifestation of fried foods") //if the name is still this, their name hasn't changed, so we can safely restore their stored name
+ owner.name = stored_name
+
+/datum/component/fried/proc/restore() //restore a fried mob to being not-fried
+ if(ismob(owner))
+ //restore the name, the colour should wash off itself, and then remove the component
+ restore_name()
+ RemoveComponent()
diff --git a/code/datums/components/gps.dm b/code/datums/components/gps.dm
new file mode 100644
index 0000000000..200ec2b956
--- /dev/null
+++ b/code/datums/components/gps.dm
@@ -0,0 +1,153 @@
+///Global GPS_list. All GPS components get saved in here for easy reference.
+GLOBAL_LIST_EMPTY(GPS_list)
+///GPS component. Atoms that have this show up on gps. Pretty simple stuff.
+/datum/component/gps
+ var/gpstag = "COM0"
+ var/tracking = TRUE
+ var/emped = FALSE
+
+/datum/component/gps/Initialize(_gpstag = "COM0")
+ if(!isatom(parent))
+ return COMPONENT_INCOMPATIBLE
+ gpstag = _gpstag
+ GLOB.GPS_list += src
+
+/datum/component/gps/Destroy()
+ GLOB.GPS_list -= src
+ return ..()
+
+///GPS component subtype. Only gps/item's can be used to open the UI.
+/datum/component/gps/item
+ var/updating = TRUE //Automatic updating of GPS list. Can be set to manual by user.
+ var/global_mode = TRUE //If disabled, only GPS signals of the same Z level are shown
+
+/datum/component/gps/item/Initialize(_gpstag = "COM0", emp_proof = FALSE)
+ . = ..()
+ if(. == COMPONENT_INCOMPATIBLE || !isitem(parent))
+ return COMPONENT_INCOMPATIBLE
+ var/atom/A = parent
+ A.add_overlay("working")
+ A.name = "[initial(A.name)] ([gpstag])"
+ RegisterSignal(parent, COMSIG_ITEM_ATTACK_SELF, .proc/interact)
+ if(!emp_proof)
+ RegisterSignal(parent, COMSIG_ATOM_EMP_ACT, .proc/on_emp_act)
+ RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/on_examine)
+ RegisterSignal(parent, COMSIG_CLICK_ALT, .proc/on_AltClick)
+
+///Called on COMSIG_ITEM_ATTACK_SELF
+/datum/component/gps/item/proc/interact(datum/source, mob/user)
+ if(user)
+ ui_interact(user)
+
+///Called on COMSIG_PARENT_EXAMINE
+/datum/component/gps/item/proc/on_examine(datum/source, mob/user, list/examine_list)
+ examine_list += "Alt-click to switch it [tracking ? "off":"on"]."
+
+///Called on COMSIG_ATOM_EMP_ACT
+/datum/component/gps/item/proc/on_emp_act(datum/source, severity)
+ emped = TRUE
+ var/atom/A = parent
+ A.cut_overlay("working")
+ A.add_overlay("emp")
+ addtimer(CALLBACK(src, .proc/reboot), 300, TIMER_UNIQUE|TIMER_OVERRIDE) //if a new EMP happens, remove the old timer so it doesn't reactivate early
+ SStgui.close_uis(src) //Close the UI control if it is open.
+
+///Restarts the GPS after getting turned off by an EMP.
+/datum/component/gps/item/proc/reboot()
+ emped = FALSE
+ var/atom/A = parent
+ A.cut_overlay("emp")
+ A.add_overlay("working")
+
+///Calls toggletracking
+/datum/component/gps/item/proc/on_AltClick(datum/source, mob/user)
+ toggletracking(user)
+
+///Toggles the tracking for the gps
+/datum/component/gps/item/proc/toggletracking(mob/user)
+ if(!user.canUseTopic(parent, BE_CLOSE))
+ return //user not valid to use gps
+ if(emped)
+ to_chat(user, "It's busted!")
+ return
+ var/atom/A = parent
+ if(tracking)
+ A.cut_overlay("working")
+ to_chat(user, "[parent] is no longer tracking, or visible to other GPS devices.")
+ tracking = FALSE
+ else
+ A.add_overlay("working")
+ to_chat(user, "[parent] is now tracking, and visible to other GPS devices.")
+ tracking = TRUE
+
+/datum/component/gps/item/ui_interact(mob/user, ui_key = "gps", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) // Remember to use the appropriate state.
+ if(emped)
+ to_chat(user, "[parent] fizzles weakly.")
+ return
+ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ // Variable window height, depending on how many GPS units there are
+ // to show, clamped to relatively safe range.
+ var/gps_window_height = clamp(325 + GLOB.GPS_list.len * 14, 325, 700)
+ ui = new(user, src, ui_key, "Gps", "Global Positioning System", 470, gps_window_height, master_ui, state) //width, height
+ ui.open()
+
+ ui.set_autoupdate(state = updating)
+
+/datum/component/gps/item/ui_data(mob/user)
+ var/list/data = list()
+ data["power"] = tracking
+ data["tag"] = gpstag
+ data["updating"] = updating
+ data["globalmode"] = global_mode
+ if(!tracking || emped) //Do not bother scanning if the GPS is off or EMPed
+ return data
+
+ var/turf/curr = get_turf(parent)
+ data["currentArea"] = "[get_area_name(curr, TRUE)]"
+ data["currentCoords"] = "[curr.x], [curr.y], [curr.z]"
+
+ var/list/signals = list()
+ data["signals"] = list()
+
+ for(var/gps in GLOB.GPS_list)
+ var/datum/component/gps/G = gps
+ if(G.emped || !G.tracking || G == src)
+ continue
+ var/turf/pos = get_turf(G.parent)
+ if(!pos || !global_mode && pos.z != curr.z)
+ continue
+ var/list/signal = list()
+ signal["entrytag"] = G.gpstag //Name or 'tag' of the GPS
+ signal["coords"] = "[pos.x], [pos.y], [pos.z]"
+ if(pos.z == curr.z) //Distance/Direction calculations for same z-level only
+ signal["dist"] = max(get_dist(curr, pos), 0) //Distance between the src and remote GPS turfs
+ signal["degrees"] = round(Get_Angle(curr, pos)) //0-360 degree directional bearing, for more precision.
+ signals += list(signal) //Add this signal to the list of signals
+ data["signals"] = signals
+ return data
+
+/datum/component/gps/item/ui_act(action, params)
+ if(..())
+ return
+ switch(action)
+ if("rename")
+ var/atom/parentasatom = parent
+ var/a = stripped_input(usr, "Please enter desired tag.", parentasatom.name, gpstag, 20)
+
+ if (!a)
+ return
+
+ gpstag = a
+ . = TRUE
+ parentasatom.name = "global positioning system ([gpstag])"
+
+ if("power")
+ toggletracking(usr)
+ . = TRUE
+ if("updating")
+ updating = !updating
+ . = TRUE
+ if("globalmode")
+ global_mode = !global_mode
+ . = TRUE
diff --git a/code/datums/components/killerqueen.dm b/code/datums/components/killerqueen.dm
new file mode 100644
index 0000000000..1c660d0a87
--- /dev/null
+++ b/code/datums/components/killerqueen.dm
@@ -0,0 +1,91 @@
+/**
+ * KILLER QUEEN
+ *
+ * Simple contact bomb component
+ * Blows up the first person to touch it.
+ */
+/datum/component/killerqueen
+ can_transfer = TRUE
+ /// strength of explosion on the touch-er. 0 to disable. usually only used if the normal explosion is disabled (this is the default).
+ var/ex_strength = EXPLODE_HEAVY
+ /// callback to invoke with (parent, victim) before standard detonation - useful for losing a reference to this component or implementing custom behavior. return FALSE to prevent explosion.
+ var/datum/callback/pre_explode
+ /// callback to invoke with (parent) when deleting without an explosion
+ var/datum/callback/failure
+ /// did we explode
+ var/exploded = FALSE
+ /// examine message
+ var/examine_message
+ /// light explosion radius
+ var/light = 0
+ /// heavy explosion radius
+ var/heavy = 0
+ /// dev explosion radius
+ var/dev = 0
+ /// flame explosion radius
+ var/flame = 0
+ /// only triggered by living mobs
+ var/living_only = TRUE
+
+
+/datum/component/killerqueen/Initialize(ex_strength = EXPLODE_HEAVY, datum/callback/pre_explode, datum/callback/failure, examine_message, light = 0, heavy = 0, dev = 0, flame = 0, living_only = TRUE)
+ . = ..()
+ if(. & COMPONENT_INCOMPATIBLE)
+ return
+ if(!isatom(parent))
+ return COMPONENT_INCOMPATIBLE
+ src.ex_strength = ex_strength
+ src.pre_explode = pre_explode
+ src.failure = failure
+ src.examine_message = examine_message
+ src.light = light
+ src.heavy = heavy
+ src.dev = dev
+ src.flame = flame
+ src.living_only = living_only
+
+/datum/component/killerqueen/Destroy()
+ if(!exploded)
+ failure?.Invoke(parent)
+ return ..()
+
+/datum/component/killerqueen/RegisterWithParent()
+ . = ..()
+ RegisterSignal(parent, list(COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_ATTACK_PAW, COMSIG_ATOM_ATTACK_ANIMAL), .proc/touch_detonate)
+ RegisterSignal(parent, COMSIG_MOVABLE_BUMP, .proc/bump_detonate)
+ RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/attackby_detonate)
+ RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/on_examine)
+
+/datum/component/killerqueen/UnregisterFromParent()
+ . = ..()
+ UnregisterSignal(parent, list(COMSIG_ATOM_ATTACK_ANIMAL, COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_ATTACK_PAW,
+ COMSIG_MOVABLE_BUMP, COMSIG_PARENT_ATTACKBY, COMSIG_PARENT_EXAMINE))
+
+/datum/component/killerqueen/proc/attackby_detonate(datum/source, obj/item/I, mob/user)
+ detonate(user)
+
+/datum/component/killerqueen/proc/bump_detonate(datum/source, atom/A)
+ detonate(A)
+
+/datum/component/killerqueen/proc/touch_detonate(datum/source, mob/user)
+ detonate(user)
+
+/datum/component/killerqueen/proc/on_examine(datum/source, mob/examiner, list/examine_return)
+ if(examine_message)
+ examine_return += examine_message
+
+/datum/component/killerqueen/proc/detonate(atom/victim)
+ if(!isliving(victim) && living_only)
+ return
+ if(pre_explode && !pre_explode.Invoke(parent, victim))
+ return
+ if(ex_strength)
+ victim.ex_act(ex_strength)
+ if(light || heavy || dev || flame)
+ explosion(parent, dev, heavy, light, flame_range = flame)
+ else
+ var/turf/T = get_turf(parent)
+ playsound(T, 'sound/effects/explosion2.ogg', 200, 1)
+ new /obj/effect/temp_visual/explosion(T)
+ exploded = TRUE
+ qdel(src)
diff --git a/code/datums/components/material_container.dm b/code/datums/components/material_container.dm
index 51dc4ee8f7..7adc634621 100644
--- a/code/datums/components/material_container.dm
+++ b/code/datums/components/material_container.dm
@@ -105,7 +105,7 @@
/// Proc specifically for inserting items, returns the amount of materials entered.
/datum/component/material_container/proc/insert_item(obj/item/I, var/multiplier = 1, stack_amt)
- if(!I)
+ if(QDELETED(I))
return FALSE
multiplier = CEILING(multiplier, 0.01)
diff --git a/code/datums/components/shrapnel.dm b/code/datums/components/mirv.dm
similarity index 70%
rename from code/datums/components/shrapnel.dm
rename to code/datums/components/mirv.dm
index 4d1fe21b95..2a1663776c 100644
--- a/code/datums/components/shrapnel.dm
+++ b/code/datums/components/mirv.dm
@@ -1,36 +1,37 @@
-
-/datum/component/shrapnel
+/datum/component/mirv
var/projectile_type
var/radius // shoots a projectile for every turf on this radius from the hit target
var/override_projectile_range
-/datum/component/shrapnel/Initialize(projectile_type, radius=1, override_projectile_range)
- if(!isgun(parent) && !ismachinery(parent) && !isstructure(parent))
+/datum/component/mirv/Initialize(projectile_type, radius=1, override_projectile_range)
+ if(!isgun(parent) && !ismachinery(parent) && !isstructure(parent) && !isgrenade(parent))
return COMPONENT_INCOMPATIBLE
src.projectile_type = projectile_type
src.radius = radius
src.override_projectile_range = override_projectile_range
+ if(isgrenade(parent))
+ parent.AddComponent(/datum/component/pellet_cloud, projectile_type=projectile_type)
-/datum/component/shrapnel/RegisterWithParent()
+/datum/component/mirv/RegisterWithParent()
. = ..()
if(ismachinery(parent) || isstructure(parent) || isgun(parent)) // turrets, etc
RegisterSignal(parent, COMSIG_PROJECTILE_ON_HIT, .proc/projectile_hit)
-/datum/component/shrapnel/UnregisterFromParent()
+/datum/component/mirv/UnregisterFromParent()
. = ..()
UnregisterSignal(parent, list(COMSIG_PROJECTILE_ON_HIT))
-/datum/component/shrapnel/proc/projectile_hit(atom/fired_from, atom/movable/firer, atom/target, Angle)
+/datum/component/mirv/proc/projectile_hit(atom/fired_from, atom/movable/firer, atom/target, Angle)
do_shrapnel(firer, target)
-/datum/component/shrapnel/proc/do_shrapnel(mob/firer, atom/target)
+/datum/component/mirv/proc/do_shrapnel(mob/firer, atom/target)
if(radius < 1)
return
var/turf/target_turf = get_turf(target)
for(var/turf/shootat_turf in RANGE_TURFS(radius, target) - RANGE_TURFS(radius-1, target))
- var/obj/item/projectile/P = new projectile_type(target_turf)
+ var/obj/item/projectile/P = new projectile_type(target_turf)
//Shooting Code:
P.range = radius+1
if(override_projectile_range)
diff --git a/code/datums/components/omen.dm b/code/datums/components/omen.dm
new file mode 100644
index 0000000000..3ea7677710
--- /dev/null
+++ b/code/datums/components/omen.dm
@@ -0,0 +1,74 @@
+/**
+ * omen.dm: For when you want someone to have a really bad day
+ *
+ * When you attach an omen component to someone, they start running the risk of all sorts of bad environmental injuries, like nearby vending machines randomly falling on you,
+ * or hitting your head really hard when you slip and fall, or... well, for now those two are all I have. More will come.
+ *
+ * Omens are removed once the victim is either maimed by one of the possible injuries, or if they receive a blessing (read: bashing with a bible) from the chaplain.
+ */
+/datum/component/omen
+ dupe_mode = COMPONENT_DUPE_UNIQUE
+
+ /// Whatever's causing the omen, if there is one. Destroying the vessel won't stop the omen, but we destroy the vessel (if one exists) upon the omen ending
+ var/obj/vessel
+
+/datum/component/omen/Initialize(silent=FALSE, vessel)
+ if(!isliving(parent))
+ return COMPONENT_INCOMPATIBLE
+ var/mob/person = parent
+ if(!silent)
+ to_chat(person, "You get a bad feeling...")
+ src.vessel = vessel
+
+/datum/component/omen/Destroy(force, silent)
+ if(vessel)
+ vessel.visible_message("[vessel] burns up in a sinister flash, taking an evil energy with it...")
+ vessel = null
+ return ..()
+
+/datum/component/omen/RegisterWithParent()
+ RegisterSignal(parent, COMSIG_MOVABLE_MOVED, .proc/check_accident)
+ RegisterSignal(parent, COMSIG_LIVING_STATUS_KNOCKDOWN, .proc/check_slip)
+ RegisterSignal(parent, COMSIG_ADD_MOOD_EVENT, .proc/check_bless)
+
+/datum/component/omen/UnregisterFromParent()
+ UnregisterSignal(parent, list(COMSIG_LIVING_STATUS_KNOCKDOWN, COMSIG_MOVABLE_MOVED, COMSIG_ADD_MOOD_EVENT))
+
+/**
+ * check_accident() is called each step we take
+ *
+ * While we're walking around, roll to see if there's any environmental hazards (currently only vending machines) on one of the adjacent tiles we can trigger.
+ * We do the prob() at the beginning to A. add some tension for /when/ it will strike, and B. (more importantly) ameliorate the fact that we're checking up to 5 turfs's contents each time
+ */
+/datum/component/omen/proc/check_accident(atom/movable/our_guy)
+ if(!prob(15))
+ return
+ for(var/t in get_adjacent_open_turfs(our_guy))
+ var/turf/the_turf = t
+ for(var/obj/machinery/vending/darth_vendor in the_turf)
+ if(darth_vendor.tiltable)
+ darth_vendor.tilt(our_guy)
+ qdel(src)
+ return
+
+/// If we get knocked down, see if we have a really bad slip and bash our head hard
+/datum/component/omen/proc/check_slip(mob/living/our_guy, amount)
+ if(amount <= 0 || prob(50)) // 50% chance to bonk our head
+ return
+
+ var/obj/item/bodypart/the_head = our_guy.get_bodypart(BODY_ZONE_HEAD)
+ if(!the_head)
+ return
+
+ playsound(get_turf(our_guy), "sound/effects/tableheadsmash.ogg", 90, TRUE)
+ our_guy.visible_message("[our_guy] hits [our_guy.p_their()] head really badly falling down!", "You hit your head really badly falling down!")
+ the_head.receive_damage(75)
+ our_guy.adjustOrganLoss(ORGAN_SLOT_BRAIN, 100)
+ qdel(src)
+
+/// Hijack the mood system to see if we get the blessing mood event to cancel the omen
+/datum/component/omen/proc/check_bless(mob/living/our_guy, category)
+ if(category != "blessing")
+ return
+ to_chat(our_guy, "You feel a horrible omen lifted off your shoulders!")
+ qdel(src)
diff --git a/code/datums/components/pellet_cloud.dm b/code/datums/components/pellet_cloud.dm
new file mode 100644
index 0000000000..938d9f5f56
--- /dev/null
+++ b/code/datums/components/pellet_cloud.dm
@@ -0,0 +1,283 @@
+/*
+ * This component is used when you want to create a bunch of shrapnel or projectiles (say, shrapnel from a fragmentation grenade, or buckshot from a shotgun) from a central point,
+ * without necessarily printing a separate message for every single impact. This component should be instantiated right when you need it (like the moment of firing), then activated
+ * by signal.
+ *
+ * Pellet cloud currently works on two classes of sources: directed (ammo casings), and circular (grenades, landmines).
+ * -Directed: This means you're shooting multiple pellets, like buckshot. If an ammo casing is defined as having multiple pellets, it will automatically create a pellet cloud
+ * and call COMSIG_PELLET_CLOUD_INIT (see [/obj/item/ammo_casing/proc/fire_casing]). Thus, the only projectiles fired will be the ones fired here.
+ * The magnitude var controls how many pellets are created.
+ * -Circular: This results in a big spray of shrapnel flying all around the detonation point when the grenade fires COMSIG_GRENADE_PRIME or landmine triggers COMSIG_MINE_TRIGGERED.
+ * The magnitude var controls how big the detonation radius is (the bigger the magnitude, the more shrapnel is created). Grenades can be covered with bodies to reduce shrapnel output.
+ *
+ * Once all of the fired projectiles either hit a target or disappear due to ranging out/whatever else, we resolve the list of all the things we hit and print aggregate messages so we get
+ * one "You're hit by 6 buckshot pellets" vs 6x "You're hit by the buckshot blah blah" messages.
+ *
+ * Note that this is how all guns handle shooting ammo casings with multiple pellets, in case such a thing comes up.
+*/
+
+/datum/component/pellet_cloud
+ /// What's the projectile path of the shrapnel we're shooting?
+ var/projectile_type
+
+ /// How many shrapnel projectiles are we responsible for tracking? May be reduced for grenades if someone dives on top of it. Defined by ammo casing for casings, derived from magnitude otherwise
+ var/num_pellets
+ /// For grenades/landmines, how big is the radius of turfs we're targeting? Note this does not effect the projectiles range, only how many we generate
+ var/radius = 4
+
+ /// The list of pellets we're responsible for tracking, once these are all accounted for, we finalize.
+ var/list/pellets = list()
+ /// An associated list with the atom hit as the key and how many pellets they've eaten for the value, for printing aggregate messages
+ var/list/targets_hit = list()
+ /// For grenades, any /mob/living's the grenade is moved onto, see [/datum/component/pellet_cloud/proc/handle_martyrs()]
+ var/list/bodies
+ /// For grenades, tracking people who die covering a grenade for achievement purposes, see [/datum/component/pellet_cloud/proc/handle_martyrs()]
+ var/list/purple_hearts
+
+ /// For grenades, tracking how many pellets are removed due to martyrs and how many pellets are added due to the last person to touch it being on top of it
+ var/pellet_delta = 0
+ /// how many pellets ranged out without hitting anything
+ var/terminated
+ /// how many pellets impacted something
+ var/hits
+ /// If the parent tried deleting and we're not done yet, we send it to nullspace then delete it after
+ var/queued_delete = FALSE
+
+ /// for if we're an ammo casing being fired
+ var/mob/living/shooter
+
+/datum/component/pellet_cloud/Initialize(projectile_type=/obj/item/shrapnel, magnitude=5)
+ if(!isammocasing(parent) && !isgrenade(parent) && !islandmine(parent))
+ return COMPONENT_INCOMPATIBLE
+
+ if(magnitude < 1)
+ stack_trace("Invalid magnitude [magnitude] < 1 on pellet_cloud, parent: [parent]")
+ magnitude = 1
+
+ src.projectile_type = projectile_type
+
+ if(isammocasing(parent))
+ num_pellets = magnitude
+ else if(isgrenade(parent) || islandmine(parent))
+ radius = magnitude
+
+/datum/component/pellet_cloud/Destroy(force, silent)
+ purple_hearts = null
+ pellets = null
+ targets_hit = null
+ bodies = null
+ return ..()
+
+/datum/component/pellet_cloud/RegisterWithParent()
+ RegisterSignal(parent, COMSIG_PARENT_PREQDELETED, .proc/nullspace_parent)
+ if(isammocasing(parent))
+ RegisterSignal(parent, COMSIG_PELLET_CLOUD_INIT, .proc/create_casing_pellets)
+ else if(isgrenade(parent))
+ RegisterSignal(parent, COMSIG_GRENADE_ARMED, .proc/grenade_armed)
+ RegisterSignal(parent, COMSIG_GRENADE_PRIME, .proc/create_blast_pellets)
+ else if(islandmine(parent))
+ RegisterSignal(parent, COMSIG_MINE_TRIGGERED, .proc/create_blast_pellets)
+
+/datum/component/pellet_cloud/UnregisterFromParent()
+ UnregisterSignal(parent, list(COMSIG_PARENT_PREQDELETED, COMSIG_PELLET_CLOUD_INIT, COMSIG_GRENADE_PRIME, COMSIG_GRENADE_ARMED, COMSIG_MOVABLE_MOVED, COMSIG_MOVABLE_UNCROSSED, COMSIG_MINE_TRIGGERED, COMSIG_ITEM_DROPPED))
+
+/**
+ * create_casing_pellets() is for directed pellet clouds for ammo casings that have multiple pellets (buckshot and scatter lasers for instance)
+ *
+ * Honestly this is mostly just a rehash of [/obj/item/ammo_casing/proc/fire_casing()] for pellet counts > 1, except this lets us tamper with the pellets and hook onto them for tracking purposes.
+ * The arguments really don't matter, this proc is triggered by COMSIG_PELLET_CLOUD_INIT which is only for this really, it's just a big mess of the state vars we need for doing the stuff over here.
+ */
+/datum/component/pellet_cloud/proc/create_casing_pellets(obj/item/ammo_casing/shell, atom/target, mob/living/user, fired_from, randomspread, spread, zone_override, params, distro)
+ shooter = user
+ var/targloc = get_turf(target)
+ if(!zone_override)
+ zone_override = shooter.zone_selected
+
+ for(var/i in 1 to num_pellets)
+ shell.ready_proj(target, user, SUPPRESSED_VERY, zone_override, fired_from)
+ if(distro)
+ if(randomspread)
+ spread = round((rand() - 0.5) * distro)
+ else //Smart spread
+ spread = round((i / num_pellets - 0.5) * distro)
+
+ RegisterSignal(shell.BB, COMSIG_PROJECTILE_SELF_ON_HIT, .proc/pellet_hit)
+ RegisterSignal(shell.BB, list(COMSIG_PROJECTILE_RANGE_OUT, COMSIG_PARENT_QDELETING), .proc/pellet_range)
+ pellets += shell.BB
+ if(!shell.throw_proj(target, targloc, shooter, params, spread))
+ return
+ if(i != num_pellets)
+ shell.newshot()
+
+/**
+ * create_blast_pellets() is for when we have a central point we want to shred the surroundings of with a ring of shrapnel, namely frag grenades and landmines.
+ *
+ * Note that grenades have extra handling for someone throwing themselves/being thrown on top of it, while landmines do not (obviously, it's a landmine!). See [/datum/component/pellet_cloud/proc/handle_martyrs()]
+ */
+/datum/component/pellet_cloud/proc/create_blast_pellets(obj/O, mob/living/lanced_by)
+ var/atom/A = parent
+
+ if(isgrenade(parent)) // handle_martyrs can reduce the radius and thus the number of pellets we produce if someone dives on top of a frag grenade
+ handle_martyrs(lanced_by) // note that we can modify radius in this proc
+
+ if(radius < 1)
+ return
+
+ var/list/all_the_turfs_were_gonna_lacerate = RANGE_TURFS(radius, A) - RANGE_TURFS(radius-1, A)
+ num_pellets = all_the_turfs_were_gonna_lacerate.len + pellet_delta
+
+ for(var/T in all_the_turfs_were_gonna_lacerate)
+ var/turf/shootat_turf = T
+ pew(shootat_turf)
+
+/**
+ * handle_martyrs() is used for grenades that shoot shrapnel to check if anyone threw themselves/were thrown on top of the grenade, thus absorbing a good chunk of the shrapnel
+ *
+ * Between the time the grenade is armed and the actual detonation, we set var/list/bodies to the list of mobs currently on the new tile, as if the grenade landed on top of them, tracking if any of them move off the tile and removing them from the "under" list
+ * Once the grenade detonates, handle_martyrs() is called and gets all the new mobs on the tile, and add the ones not in var/list/bodies to var/list/martyrs
+ * We then iterate through the martyrs and reduce the shrapnel magnitude for each mob on top of it, shredding each of them with some of the shrapnel they helped absorb. This can snuff out all of the shrapnel if there's enough bodies
+ *
+ * Note we track anyone who's alive and client'd when they get shredded in var/list/purple_hearts, for achievement checking later
+ */
+/datum/component/pellet_cloud/proc/handle_martyrs(mob/living/lanced_by)
+ var/magnitude_absorbed
+ var/list/martyrs = list()
+
+ var/self_harm_radius_mult = 3
+
+ if(lanced_by && prob(60))
+ to_chat(lanced_by, "Your plan to whack someone with a grenade on a stick backfires on you, literally!")
+ self_harm_radius_mult = 1 // we'll still give the guy who got hit some extra shredding, but not 3*radius
+ pellet_delta += radius
+ for(var/i in 1 to radius)
+ pew(lanced_by) // thought you could be tricky and lance someone with no ill effects!!
+
+ for(var/mob/living/body in get_turf(parent))
+ if(body == shooter)
+ pellet_delta += radius * self_harm_radius_mult
+ for(var/i in 1 to radius * self_harm_radius_mult)
+ pew(body) // free shrapnel if it goes off in your hand, and it doesn't even count towards the absorbed. fun!
+ else if(!(body in bodies))
+ martyrs += body // promoted from a corpse to a hero
+
+ for(var/M in martyrs)
+ var/mob/living/martyr = M
+ if(radius > 4)
+ martyr.visible_message("[martyr] heroically covers \the [parent] with [martyr.p_their()] body, absorbing a load of the shrapnel!", "You heroically cover \the [parent] with your body, absorbing a load of the shrapnel!")
+ magnitude_absorbed += round(radius * 0.5)
+ else if(radius >= 2)
+ martyr.visible_message("[martyr] heroically covers \the [parent] with [martyr.p_their()] body, absorbing some of the shrapnel!", "You heroically cover \the [parent] with your body, absorbing some of the shrapnel!")
+ magnitude_absorbed += 2
+ else
+ martyr.visible_message("[martyr] heroically covers \the [parent] with [martyr.p_their()] body, snuffing out the shrapnel!", "You heroically cover \the [parent] with your body, snuffing out the shrapnel!")
+ magnitude_absorbed = radius
+
+ var/pellets_absorbed = (radius ** 2) - ((radius - magnitude_absorbed - 1) ** 2)
+ radius -= magnitude_absorbed
+ pellet_delta -= round(pellets_absorbed * 0.5)
+
+ if(martyr.stat != DEAD && martyr.client)
+ LAZYADD(purple_hearts, martyr)
+ RegisterSignal(martyr, COMSIG_PARENT_QDELETING, .proc/on_target_qdel, override=TRUE)
+
+ for(var/i in 1 to round(pellets_absorbed * 0.5))
+ pew(martyr)
+
+ if(radius < 1)
+ break
+
+///One of our pellets hit something, record what it was and check if we're done (terminated == num_pellets)
+/datum/component/pellet_cloud/proc/pellet_hit(obj/item/projectile/P, atom/movable/firer, atom/target, Angle)
+ pellets -= P
+ terminated++
+ hits++
+ targets_hit[target]++
+ if(targets_hit[target] == 1)
+ RegisterSignal(target, COMSIG_PARENT_QDELETING, .proc/on_target_qdel, override=TRUE)
+ UnregisterSignal(P, list(COMSIG_PARENT_QDELETING, COMSIG_PROJECTILE_RANGE_OUT, COMSIG_PROJECTILE_SELF_ON_HIT))
+ if(terminated == num_pellets)
+ finalize()
+
+///One of our pellets disappeared due to hitting their max range (or just somehow got qdel'd), remove it from our list and check if we're done (terminated == num_pellets)
+/datum/component/pellet_cloud/proc/pellet_range(obj/item/projectile/P)
+ pellets -= P
+ terminated++
+ UnregisterSignal(P, list(COMSIG_PARENT_QDELETING, COMSIG_PROJECTILE_RANGE_OUT, COMSIG_PROJECTILE_SELF_ON_HIT))
+ if(terminated == num_pellets)
+ finalize()
+
+/// Minor convenience function for creating each shrapnel piece with circle explosions, mostly stolen from the MIRV component
+/datum/component/pellet_cloud/proc/pew(atom/target, spread=0)
+ var/obj/item/projectile/P = new projectile_type(get_turf(parent))
+
+ //Shooting Code:
+ P.spread = spread
+ P.original = target
+ P.fired_from = parent
+ P.firer = parent // don't hit ourself that would be really annoying
+ P.permutated += parent // don't hit the target we hit already with the flak
+ P.suppressed = SUPPRESSED_VERY // set the projectiles to make no message so we can do our own aggregate message
+ P.preparePixelProjectile(target, parent)
+ RegisterSignal(P, COMSIG_PROJECTILE_SELF_ON_HIT, .proc/pellet_hit)
+ RegisterSignal(P, list(COMSIG_PROJECTILE_RANGE_OUT, COMSIG_PARENT_QDELETING), .proc/pellet_range)
+ pellets += P
+ P.fire()
+
+///All of our pellets are accounted for, time to go target by target and tell them how many things they got hit by.
+/datum/component/pellet_cloud/proc/finalize()
+ var/obj/item/projectile/P = projectile_type
+ var/proj_name = initial(P.name)
+
+ for(var/atom/target in targets_hit)
+ var/num_hits = targets_hit[target]
+ UnregisterSignal(target, COMSIG_PARENT_QDELETING)
+ if(num_hits > 1)
+ target.visible_message("[target] is hit by [num_hits] [proj_name]s!", null, null, COMBAT_MESSAGE_RANGE, target)
+ to_chat(target, "You're hit by [num_hits] [proj_name]s!")
+ else
+ target.visible_message("[target] is hit by a [proj_name]!", null, null, COMBAT_MESSAGE_RANGE, target)
+ to_chat(target, "You're hit by a [proj_name]!")
+
+ UnregisterSignal(parent, COMSIG_PARENT_PREQDELETED)
+ if(queued_delete)
+ qdel(parent)
+ qdel(src)
+
+/// Look alive, we're armed! Now we start watching to see if anyone's covering us
+/datum/component/pellet_cloud/proc/grenade_armed(obj/item/nade)
+ if(ismob(nade.loc))
+ shooter = nade.loc
+ LAZYINITLIST(bodies)
+ RegisterSignal(parent, COMSIG_ITEM_DROPPED, .proc/grenade_dropped)
+ RegisterSignal(parent, COMSIG_MOVABLE_MOVED, .proc/grenade_moved)
+ RegisterSignal(parent, COMSIG_MOVABLE_UNCROSSED, .proc/grenade_uncrossed)
+
+/// Someone dropped the grenade, so set them to the shooter in case they're on top of it when it goes off
+/datum/component/pellet_cloud/proc/grenade_dropped(obj/item/nade, mob/living/slick_willy)
+ shooter = slick_willy
+ grenade_moved()
+
+/// Our grenade has moved, reset var/list/bodies so we're "on top" of any mobs currently on the tile
+/datum/component/pellet_cloud/proc/grenade_moved()
+ LAZYCLEARLIST(bodies)
+ for(var/mob/living/L in get_turf(parent))
+ RegisterSignal(L, COMSIG_PARENT_QDELETING, .proc/on_target_qdel, override=TRUE)
+ bodies += L
+
+/// Someone who was originally "under" the grenade has moved off the tile and is now eligible for being a martyr and "covering" it
+/datum/component/pellet_cloud/proc/grenade_uncrossed(datum/source, atom/movable/AM)
+ bodies -= AM
+
+/// Our grenade or landmine or caseless shell or whatever tried deleting itself, so we intervene and nullspace it until we're done here
+/datum/component/pellet_cloud/proc/nullspace_parent()
+ var/atom/movable/AM = parent
+ AM.moveToNullspace()
+ queued_delete = TRUE
+ return TRUE
+
+/// Someone who was originally "under" the grenade has moved off the tile and is now eligible for being a martyr and "covering" it
+/datum/component/pellet_cloud/proc/on_target_qdel(atom/target)
+ UnregisterSignal(target, COMSIG_PARENT_QDELETING)
+ targets_hit -= target
+ bodies -= target
+ purple_hearts -= target
diff --git a/code/datums/components/radioactive.dm b/code/datums/components/radioactive.dm
index decc2dd65c..f12e8bf007 100644
--- a/code/datums/components/radioactive.dm
+++ b/code/datums/components/radioactive.dm
@@ -69,8 +69,9 @@
out += "[out ? " and it " : "[master] "]seems to be glowing a bit."
if(RAD_AMOUNT_HIGH to INFINITY) //At this level the object can contaminate other objects
out += "[out ? " and it " : "[master] "]hurts to look at."
- else
- out += "."
+ if(!LAZYLEN(out))
+ return
+ out += "."
examine_list += out.Join()
/datum/component/radioactive/proc/rad_attack(datum/source, atom/movable/target, mob/living/user)
diff --git a/code/datums/components/rotation.dm b/code/datums/components/rotation.dm
index f5da669c3a..129faabdb7 100644
--- a/code/datums/components/rotation.dm
+++ b/code/datums/components/rotation.dm
@@ -98,16 +98,16 @@
/datum/component/simple_rotation/proc/HandRot(datum/source, mob/user, rotation = default_rotation_direction)
if(can_be_rotated)
- if(!can_be_rotated.Invoke(user, default_rotation_direction))
+ if(!can_be_rotated.Invoke(user, rotation))
return
else
- if(!default_can_be_rotated(user, default_rotation_direction))
+ if(!default_can_be_rotated(user, rotation))
return
if(can_user_rotate)
- if(!can_user_rotate.Invoke(user, default_rotation_direction))
+ if(!can_user_rotate.Invoke(user, rotation))
return
else
- if(!default_can_user_rotate(user, default_rotation_direction))
+ if(!default_can_user_rotate(user, rotation))
return
BaseRot(user, rotation)
return TRUE
diff --git a/code/datums/components/spawner.dm b/code/datums/components/spawner.dm
index fe86b60375..27bf4a5986 100644
--- a/code/datums/components/spawner.dm
+++ b/code/datums/components/spawner.dm
@@ -8,6 +8,8 @@
var/list/faction = list("mining")
/datum/component/spawner/Initialize(_mob_types, _spawn_time, _faction, _spawn_text, _max_mobs)
+ if(!isatom(parent))
+ return COMPONENT_INCOMPATIBLE
if(_spawn_time)
spawn_time=_spawn_time
if(_mob_types)
@@ -19,20 +21,25 @@
if(_max_mobs)
max_mobs=_max_mobs
- RegisterSignal(parent, list(COMSIG_PARENT_QDELETING), .proc/stop_spawning)
+ RegisterSignal(parent, COMSIG_PARENT_QDELETING, .proc/stop_spawning)
+ RegisterSignal(parent, COMSIG_OBJ_ATTACK_GENERIC, .proc/on_attack_generic)
START_PROCESSING(SSprocessing, src)
/datum/component/spawner/process()
try_spawn_mob()
-
-/datum/component/spawner/proc/stop_spawning(force, hint)
+/datum/component/spawner/proc/stop_spawning(datum/source, force, hint)
STOP_PROCESSING(SSprocessing, src)
for(var/mob/living/simple_animal/L in spawned_mobs)
if(L.nest == src)
L.nest = null
spawned_mobs = null
+// Stopping clientless simple mobs' from indiscriminately bashing their own spawners due DestroySurroundings() et similars.
+/datum/component/spawner/proc/on_attack_generic(datum/source, mob/user, damage_amount, damage_type, damage_flag, sound_effect, armor_penetration)
+ if(!user.client && ((user.faction & faction) || (user in spawned_mobs)))
+ return COMPONENT_STOP_GENERIC_ATTACK
+
/datum/component/spawner/proc/try_spawn_mob()
var/atom/P = parent
if(spawned_mobs.len >= max_mobs)
diff --git a/code/datums/components/storage/concrete/bag_of_holding.dm b/code/datums/components/storage/concrete/bag_of_holding.dm
index 28b06b4867..e19edc89d8 100644
--- a/code/datums/components/storage/concrete/bag_of_holding.dm
+++ b/code/datums/components/storage/concrete/bag_of_holding.dm
@@ -34,3 +34,8 @@
qdel(A)
return
. = ..()
+
+/datum/component/storage/concrete/bluespace/bag_of_holding/can_be_inserted(obj/item/I, stop_messages = FALSE, mob/M)
+ if(I.GetComponent(/datum/component/storage/concrete/bluespace/bag_of_holding))
+ return TRUE
+ return ..()
diff --git a/code/datums/components/tackle.dm b/code/datums/components/tackle.dm
index 9a98953985..a5f9271f4b 100644
--- a/code/datums/components/tackle.dm
+++ b/code/datums/components/tackle.dm
@@ -62,6 +62,7 @@
///Store the thrownthing datum for later use
/datum/component/tackler/proc/registerTackle(mob/living/carbon/user, datum/thrownthing/TT)
tackle = TT
+ tackle.thrower = user
///See if we can tackle or not. If we can, leap!
/datum/component/tackler/proc/checkTackle(mob/living/carbon/user, atom/A, params)
@@ -206,7 +207,7 @@
user.set_resting(FALSE, TRUE, FALSE)
user.forceMove(get_turf(target))
target.adjustStaminaLoss(65)
- target.Paralyze(10)
+ target.Paralyze(10)
target.DefaultCombatKnockdown(20)
if(ishuman(target) && iscarbon(user))
target.grabbedby(user)
@@ -415,10 +416,10 @@
for(var/i = 0, i < speed, i++)
var/obj/item/shard/shard = new /obj/item/shard(get_turf(user))
//shard.embedding = list(embed_chance = 100, ignore_throwspeed_threshold = TRUE, impact_pain_mult=3, pain_chance=5)
- //shard.AddElement(/datum/element/embed, shard.embedding)
+ shard.updateEmbedding()
user.hitby(shard, skipcatch = TRUE, hitpush = FALSE)
- //shard.embedding = list()
- //shard.AddElement(/datum/element/embed, shard.embedding)
+ shard.embedding = list()
+ shard.updateEmbedding()
W.obj_destruction()
user.adjustStaminaLoss(10 * speed)
user.DefaultCombatKnockdown(40)
diff --git a/code/datums/components/twohanded.dm b/code/datums/components/twohanded.dm
new file mode 100644
index 0000000000..77a9a79bf4
--- /dev/null
+++ b/code/datums/components/twohanded.dm
@@ -0,0 +1,311 @@
+/**
+ * Two Handed Component
+ *
+ * When applied to an item it will make it two handed
+ *
+ */
+/datum/component/two_handed
+ dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS // Only one of the component can exist on an item
+ var/wielded = FALSE /// Are we holding the two handed item properly
+ var/force_multiplier = 0 /// The multiplier applied to force when wielded, does not work with force_wielded, and force_unwielded
+ var/force_wielded = 0 /// The force of the item when weilded
+ var/force_unwielded = 0 /// The force of the item when unweilded
+ var/wieldsound = FALSE /// Play sound when wielded
+ var/unwieldsound = FALSE /// Play sound when unwielded
+ var/attacksound = FALSE /// Play sound on attack when wielded
+ var/require_twohands = FALSE /// Does it have to be held in both hands
+ var/icon_wielded = FALSE /// The icon that will be used when wielded
+ var/obj/item/offhand/offhand_item = null /// Reference to the offhand created for the item
+ var/sharpened_increase = 0 /// The amount of increase recived from sharpening the item
+
+/**
+ * Two Handed component
+ *
+ * vars:
+ * * require_twohands (optional) Does the item need both hands to be carried
+ * * wieldsound (optional) The sound to play when wielded
+ * * unwieldsound (optional) The sound to play when unwielded
+ * * attacksound (optional) The sound to play when wielded and attacking
+ * * force_multiplier (optional) The force multiplier when wielded, do not use with force_wielded, and force_unwielded
+ * * force_wielded (optional) The force setting when the item is wielded, do not use with force_multiplier
+ * * force_unwielded (optional) The force setting when the item is unwielded, do not use with force_multiplier
+ * * icon_wielded (optional) The icon to be used when wielded
+ */
+/datum/component/two_handed/Initialize(require_twohands=FALSE, wieldsound=FALSE, unwieldsound=FALSE, attacksound=FALSE, \
+ force_multiplier=0, force_wielded=0, force_unwielded=0, icon_wielded=FALSE)
+ if(!isitem(parent))
+ return COMPONENT_INCOMPATIBLE
+
+ src.require_twohands = require_twohands
+ src.wieldsound = wieldsound
+ src.unwieldsound = unwieldsound
+ src.attacksound = attacksound
+ src.force_multiplier = force_multiplier
+ src.force_wielded = force_wielded
+ src.force_unwielded = force_unwielded
+ src.icon_wielded = icon_wielded
+
+// Inherit the new values passed to the component
+/datum/component/two_handed/InheritComponent(datum/component/two_handed/new_comp, original, require_twohands, wieldsound, unwieldsound, \
+ force_multiplier, force_wielded, force_unwielded, icon_wielded)
+ if(!original)
+ return
+ if(require_twohands)
+ src.require_twohands = require_twohands
+ if(wieldsound)
+ src.wieldsound = wieldsound
+ if(unwieldsound)
+ src.unwieldsound = unwieldsound
+ if(attacksound)
+ src.attacksound = attacksound
+ if(force_multiplier)
+ src.force_multiplier = force_multiplier
+ if(force_wielded)
+ src.force_wielded = force_wielded
+ if(force_unwielded)
+ src.force_unwielded = force_unwielded
+ if(icon_wielded)
+ src.icon_wielded = icon_wielded
+
+// register signals withthe parent item
+/datum/component/two_handed/RegisterWithParent()
+ RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, .proc/on_equip)
+ RegisterSignal(parent, COMSIG_ITEM_DROPPED, .proc/on_drop)
+ RegisterSignal(parent, COMSIG_ITEM_ATTACK_SELF, .proc/on_attack_self)
+ RegisterSignal(parent, COMSIG_ITEM_ATTACK, .proc/on_attack)
+ RegisterSignal(parent, COMSIG_ATOM_UPDATE_ICON, .proc/on_update_icon)
+ RegisterSignal(parent, COMSIG_MOVABLE_MOVED, .proc/on_moved)
+ RegisterSignal(parent, COMSIG_ITEM_SHARPEN_ACT, .proc/on_sharpen)
+
+// Remove all siginals registered to the parent item
+/datum/component/two_handed/UnregisterFromParent()
+ UnregisterSignal(parent, list(COMSIG_ITEM_EQUIPPED,
+ COMSIG_ITEM_DROPPED,
+ COMSIG_ITEM_ATTACK_SELF,
+ COMSIG_ITEM_ATTACK,
+ COMSIG_ATOM_UPDATE_ICON,
+ COMSIG_MOVABLE_MOVED,
+ COMSIG_ITEM_SHARPEN_ACT))
+
+/// Triggered on equip of the item containing the component
+/datum/component/two_handed/proc/on_equip(datum/source, mob/user, slot)
+ if(require_twohands && slot == SLOT_HANDS) // force equip the item
+ wield(user)
+ if(!user.is_holding(parent) && wielded && !require_twohands)
+ unwield(user)
+
+/// Triggered on drop of item containing the component
+/datum/component/two_handed/proc/on_drop(datum/source, mob/user)
+ if(require_twohands)
+ unwield(user, show_message=TRUE)
+ if(wielded)
+ unwield(user)
+ if(source == offhand_item && !QDELETED(src))
+ qdel(src)
+
+/// Triggered on attack self of the item containing the component
+/datum/component/two_handed/proc/on_attack_self(datum/source, mob/user)
+ if(wielded)
+ unwield(user)
+ else
+ wield(user)
+
+/**
+ * Wield the two handed item in both hands
+ *
+ * vars:
+ * * user The mob/living/carbon that is wielding the item
+ */
+/datum/component/two_handed/proc/wield(mob/living/carbon/user)
+ if(wielded)
+ return
+ if(ismonkey(user))
+ to_chat(user, "It's too heavy for you to wield fully.")
+ return
+ if(user.get_inactive_held_item())
+ if(require_twohands)
+ to_chat(user, "[parent] is too cumbersome to carry in one hand!")
+ user.dropItemToGround(parent, force=TRUE)
+ else
+ to_chat(user, "You need your other hand to be empty!")
+ return
+ if(user.get_num_arms() < 2)
+ if(require_twohands)
+ user.dropItemToGround(parent, force=TRUE)
+ to_chat(user, "You don't have enough intact hands.")
+ return
+
+ // wield update status
+ if(SEND_SIGNAL(parent, COMSIG_TWOHANDED_WIELD, user) & COMPONENT_TWOHANDED_BLOCK_WIELD)
+ return // blocked wield from item
+ wielded = TRUE
+ RegisterSignal(user, COMSIG_MOB_SWAP_HANDS, .proc/on_swap_hands)
+
+ // update item stats and name
+ var/obj/item/parent_item = parent
+ if(force_multiplier)
+ parent_item.force *= force_multiplier
+ else if(force_wielded)
+ parent_item.force = force_wielded
+ if(sharpened_increase)
+ parent_item.force += sharpened_increase
+ parent_item.name = "[parent_item.name] (Wielded)"
+ parent_item.update_icon()
+
+ if(iscyborg(user))
+ to_chat(user, "You dedicate your module to [parent].")
+ else
+ to_chat(user, "You grab [parent] with both hands.")
+
+ // Play sound if one is set
+ if(wieldsound)
+ playsound(parent_item.loc, wieldsound, 50, TRUE)
+
+ // Let's reserve the other hand
+ offhand_item = new(user)
+ offhand_item.name = "[parent_item.name] - offhand"
+ offhand_item.desc = "Your second grip on [parent_item]."
+ offhand_item.wielded = TRUE
+ RegisterSignal(offhand_item, COMSIG_ITEM_DROPPED, .proc/on_drop)
+ user.put_in_inactive_hand(offhand_item)
+
+/**
+ * Unwield the two handed item
+ *
+ * vars:
+ * * user The mob/living/carbon that is unwielding the item
+ * * show_message (option) show a message to chat on unwield
+ */
+/datum/component/two_handed/proc/unwield(mob/living/carbon/user, show_message=TRUE)
+ if(!wielded || !user)
+ return
+
+ // wield update status
+ wielded = FALSE
+ UnregisterSignal(user, COMSIG_MOB_SWAP_HANDS)
+ SEND_SIGNAL(parent, COMSIG_TWOHANDED_UNWIELD, user)
+
+ // update item stats
+ var/obj/item/parent_item = parent
+ if(sharpened_increase)
+ parent_item.force -= sharpened_increase
+ if(force_multiplier)
+ parent_item.force /= force_multiplier
+ else if(force_unwielded)
+ parent_item.force = force_unwielded
+
+ // update the items name to remove the wielded status
+ var/sf = findtext(parent_item.name, " (Wielded)", -10) // 10 == length(" (Wielded)")
+ if(sf)
+ parent_item.name = copytext(parent_item.name, 1, sf)
+ else
+ parent_item.name = "[initial(parent_item.name)]"
+
+ // Update icons
+ parent_item.update_icon()
+ if(user.get_item_by_slot(ITEM_SLOT_BACK) == parent)
+ user.update_inv_back()
+ else
+ user.update_inv_hands()
+
+ // if the item requires two handed drop the item on unwield
+ if(require_twohands)
+ user.dropItemToGround(parent, force=TRUE)
+
+ // Show message if requested
+ if(show_message)
+ if(iscyborg(user))
+ to_chat(user, "You free up your module.")
+ else if(require_twohands)
+ to_chat(user, "You drop [parent].")
+ else
+ to_chat(user, "You are now carrying [parent] with one hand.")
+
+ // Play sound if set
+ if(unwieldsound)
+ playsound(parent_item.loc, unwieldsound, 50, TRUE)
+
+ // Remove the object in the offhand
+ if(offhand_item)
+ UnregisterSignal(offhand_item, COMSIG_ITEM_DROPPED)
+ qdel(offhand_item)
+ // Clear any old refrence to an item that should be gone now
+ offhand_item = null
+
+/**
+ * on_attack triggers on attack with the parent item
+ */
+/datum/component/two_handed/proc/on_attack(obj/item/source, mob/living/target, mob/living/user)
+ if(wielded && attacksound)
+ var/obj/item/parent_item = parent
+ playsound(parent_item.loc, attacksound, 50, TRUE)
+
+/**
+ * on_update_icon triggers on call to update parent items icon
+ *
+ * Updates the icon using icon_wielded if set
+ */
+/datum/component/two_handed/proc/on_update_icon(datum/source)
+ if(icon_wielded && wielded)
+ var/obj/item/parent_item = parent
+ if(parent_item)
+ parent_item.icon_state = icon_wielded
+ return COMSIG_ATOM_NO_UPDATE_ICON_STATE
+
+/**
+ * on_moved Triggers on item moved
+ */
+/datum/component/two_handed/proc/on_moved(datum/source, mob/user, dir)
+ unwield(user)
+
+/**
+ * on_swap_hands Triggers on swapping hands, blocks swap if the other hand is busy
+ */
+/datum/component/two_handed/proc/on_swap_hands(mob/user, obj/item/held_item)
+ if(!held_item)
+ return
+ if(held_item == parent)
+ return COMPONENT_BLOCK_SWAP
+
+/**
+ * on_sharpen Triggers on usage of a sharpening stone on the item
+ */
+/datum/component/two_handed/proc/on_sharpen(obj/item/item, amount, max_amount)
+ if(!item)
+ return COMPONENT_BLOCK_SHARPEN_BLOCKED
+ if(sharpened_increase)
+ return COMPONENT_BLOCK_SHARPEN_ALREADY
+ var/wielded_val = 0
+ if(force_multiplier)
+ var/obj/item/parent_item = parent
+ if(wielded)
+ wielded_val = parent_item.force
+ else
+ wielded_val = parent_item.force * force_multiplier
+ else
+ wielded_val = force_wielded
+ if(wielded_val > max_amount)
+ return COMPONENT_BLOCK_SHARPEN_MAXED
+ sharpened_increase = min(amount, (max_amount - wielded_val))
+ return COMPONENT_BLOCK_SHARPEN_APPLIED
+
+/**
+ * The offhand dummy item for two handed items
+ *
+ */
+/obj/item/offhand
+ name = "offhand"
+ icon_state = "offhand"
+ w_class = WEIGHT_CLASS_HUGE
+ item_flags = ABSTRACT
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
+ var/wielded = FALSE // Off Hand tracking of wielded status
+
+/obj/item/offhand/Destroy()
+ wielded = FALSE
+ return ..()
+
+/obj/item/offhand/equipped(mob/user, slot)
+ . = ..()
+ if(wielded && !user.is_holding(src) && !QDELETED(src))
+ qdel(src)
diff --git a/code/datums/components/uplink.dm b/code/datums/components/uplink.dm
index dde8961482..c7bbe01b2f 100644
--- a/code/datums/components/uplink.dm
+++ b/code/datums/components/uplink.dm
@@ -24,16 +24,17 @@ GLOBAL_LIST_EMPTY(uplinks)
var/unlock_note
var/unlock_code
var/failsafe_code
- var/datum/ui_state/checkstate
var/compact_mode = FALSE
var/debug = FALSE
var/saved_player_population = 0
var/list/filters = list()
+
/datum/component/uplink/Initialize(_owner, _lockable = TRUE, _enabled = FALSE, datum/game_mode/_gamemode, starting_tc = 20, datum/ui_state/_checkstate, datum/traitor_class/traitor_class)
if(!isitem(parent))
return COMPONENT_INCOMPATIBLE
+
RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/OnAttackBy)
RegisterSignal(parent, COMSIG_ITEM_ATTACK_SELF, .proc/interact)
if(istype(parent, /obj/item/implant))
@@ -65,7 +66,6 @@ GLOBAL_LIST_EMPTY(uplinks)
active = _enabled
gamemode = _gamemode
telecrystals = starting_tc
- checkstate = _checkstate
if(!lockable)
active = TRUE
locked = FALSE
@@ -102,6 +102,15 @@ GLOBAL_LIST_EMPTY(uplinks)
return //no hitting everyone/everything just to try to slot tcs in!
if(istype(I, /obj/item/stack/telecrystal))
LoadTC(user, I)
+ if(active)
+ if(I.GetComponent(/datum/component/uplink))
+ var/datum/component/uplink/hidden_uplink = I.GetComponent(/datum/component/uplink)
+ var/amt = hidden_uplink.telecrystals
+ hidden_uplink.telecrystals -= amt
+ src.telecrystals += amt
+ to_chat(user, "You connect the [I] to your uplink, siphoning [amt] telecrystals before quickly undoing the connection.")
+ else
+ return
for(var/category in uplink_items)
for(var/item in uplink_items[category])
var/datum/uplink_item/UI = uplink_items[category][item]
@@ -136,13 +145,13 @@ GLOBAL_LIST_EMPTY(uplinks)
/datum/component/uplink/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.inventory_state)
- state = checkstate ? checkstate : state
active = TRUE
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
- ui = new(user, src, ui_key, "uplink", name, 620, 580, master_ui, state)
- ui.set_autoupdate(FALSE) // This UI is only ever opened by one person, and never is updated outside of user input.
- ui.set_style("syndicate")
+ ui = new(user, src, ui_key, "Uplink", name, 620, 580, master_ui, state)
+ // This UI is only ever opened by one person,
+ // and never is updated outside of user input.
+ ui.set_autoupdate(FALSE)
ui.open()
/datum/component/uplink/ui_host(mob/user)
@@ -157,8 +166,7 @@ GLOBAL_LIST_EMPTY(uplinks)
var/list/data = list()
data["telecrystals"] = telecrystals
data["lockable"] = lockable
- data["compact_mode"] = compact_mode
-
+ data["compactMode"] = compact_mode
return data
/datum/component/uplink/ui_static_data(mob/user)
@@ -192,21 +200,16 @@ GLOBAL_LIST_EMPTY(uplinks)
/datum/component/uplink/ui_act(action, params)
if(!active)
return
-
switch(action)
if("buy")
- var/item = params["item"]
-
+ var/item_name = params["name"]
var/list/buyable_items = list()
for(var/category in uplink_items)
buyable_items += uplink_items[category]
-
- if(item in buyable_items)
- var/datum/uplink_item/I = buyable_items[item]
- //check to make sure people cannot buy items when the player pop is below the requirement
- if(GLOB.joined_player_list.len >= I.player_minimum)
- MakePurchase(usr, I)
- . = TRUE
+ if(item_name in buyable_items)
+ var/datum/uplink_item/I = buyable_items[item_name]
+ MakePurchase(usr, I)
+ return TRUE
if("lock")
active = FALSE
locked = TRUE
@@ -215,9 +218,10 @@ GLOBAL_LIST_EMPTY(uplinks)
SStgui.close_uis(src)
if("select")
selected_cat = params["category"]
+ return TRUE
if("compact_toggle")
compact_mode = !compact_mode
- return TRUE
+ return TRUE
/datum/component/uplink/proc/MakePurchase(mob/user, datum/uplink_item/U)
if(!istype(U))
@@ -262,12 +266,12 @@ GLOBAL_LIST_EMPTY(uplinks)
var/obj/item/pda/master = parent
if(trim(lowertext(new_ring_text)) != trim(lowertext(unlock_code)))
if(trim(lowertext(new_ring_text)) == trim(lowertext(failsafe_code)))
- failsafe()
+ failsafe(user)
return COMPONENT_STOP_RINGTONE_CHANGE
return
locked = FALSE
interact(null, user)
- to_chat(user, "The PDA softly beeps.")
+ to_chat(user, "The PDA softly beeps.")
user << browse(null, "window=pda")
master.mode = 0
return COMPONENT_STOP_RINGTONE_CHANGE
@@ -279,7 +283,7 @@ GLOBAL_LIST_EMPTY(uplinks)
var/frequency = arguments[1]
if(frequency != unlock_code)
if(frequency == failsafe_code)
- failsafe()
+ failsafe(master.loc)
return
locked = FALSE
if(ismob(master.loc))
@@ -316,11 +320,13 @@ GLOBAL_LIST_EMPTY(uplinks)
else if(istype(parent,/obj/item/pen))
return rand(1, 360)
-/datum/component/uplink/proc/failsafe()
+/datum/component/uplink/proc/failsafe(mob/living/carbon/user)
if(!parent)
return
var/turf/T = get_turf(parent)
if(!T)
return
+ message_admins("[ADMIN_LOOKUPFLW(user)] has triggered an uplink failsafe explosion at [AREACOORD(T)] The owner of the uplink was [ADMIN_LOOKUPFLW(owner)].")
+ log_game("[key_name(user)] triggered an uplink failsafe explosion. The owner of the uplink was [key_name(owner)].")
explosion(T,1,2,3)
qdel(parent) //Alternatively could brick the uplink.
diff --git a/code/datums/components/wet_floor.dm b/code/datums/components/wet_floor.dm
index 0fbbcd59b0..e2c3cbff86 100644
--- a/code/datums/components/wet_floor.dm
+++ b/code/datums/components/wet_floor.dm
@@ -121,7 +121,7 @@
if(-INFINITY to T0C)
add_wet(TURF_WET_ICE, max_time_left()) //Water freezes into ice!
if(T0C to T0C + 100)
- decrease = ((T.air.temperature - T0C) / SSwet_floors.temperature_coeff) * (diff / SSwet_floors.time_ratio)
+ decrease = ((T.air.return_temperature() - T0C) / SSwet_floors.temperature_coeff) * (diff / SSwet_floors.time_ratio)
if(T0C + 100 to INFINITY)
decrease = INFINITY
decrease = max(0, decrease)
diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm
index 84ea6b6458..cf942f077f 100644
--- a/code/datums/datacore.dm
+++ b/code/datums/datacore.dm
@@ -78,10 +78,12 @@
/datum/datacore/proc/manifest()
for(var/mob/dead/new_player/N in GLOB.player_list)
+ if(!N?.client)
+ continue
if(N.new_character)
log_manifest(N.ckey,N.new_character.mind,N.new_character)
if(ishuman(N.new_character))
- manifest_inject(N.new_character, N.client)
+ manifest_inject(N.new_character, N.client, N.client.prefs)
CHECK_TICK
/datum/datacore/proc/manifest_modify(name, assignment)
@@ -197,7 +199,7 @@
return dat
-/datum/datacore/proc/manifest_inject(mob/living/carbon/human/H, client/C)
+/datum/datacore/proc/manifest_inject(mob/living/carbon/human/H, client/C, datum/preferences/prefs)
set waitfor = FALSE
var/static/list/show_directions = list(SOUTH, WEST)
if(H.mind && (H.mind.assigned_role != H.mind.special_role))
@@ -260,7 +262,7 @@
M.fields["alg_d"] = "No allergies have been detected in this patient."
M.fields["cdi"] = "None"
M.fields["cdi_d"] = "No diseases have been diagnosed at the moment."
- M.fields["notes"] = H.get_trait_string(medical)
+ M.fields["notes"] = "Trait information as of shift start: [H.get_trait_string(medical)] [prefs.medical_records]"
medical += M
//Security Record
@@ -270,7 +272,7 @@
S.fields["criminal"] = "None"
S.fields["mi_crim"] = list()
S.fields["ma_crim"] = list()
- S.fields["notes"] = "No notes."
+ S.fields["notes"] = prefs.security_records || "No notes."
security += S
//Locked Record
diff --git a/code/datums/datum.dm b/code/datums/datum.dm
index 6202ac444e..7756cfd906 100644
--- a/code/datums/datum.dm
+++ b/code/datums/datum.dm
@@ -39,6 +39,9 @@
/// A weak reference to another datum
var/datum/weakref/weak_reference
+ ///Lazy associative list of currently active cooldowns.
+ var/list/cooldowns
+
#ifdef TESTING
var/running_find_references
var/last_find_references = 0
@@ -201,3 +204,34 @@
qdel(D)
else
return returned
+
+/**
+ * Callback called by a timer to end an associative-list-indexed cooldown.
+ *
+ * Arguments:
+ * * source - datum storing the cooldown
+ * * index - string index storing the cooldown on the cooldowns associative list
+ *
+ * This sends a signal reporting the cooldown end.
+ */
+/proc/end_cooldown(datum/source, index)
+ if(QDELETED(source))
+ return
+ SEND_SIGNAL(source, COMSIG_CD_STOP(index))
+ TIMER_COOLDOWN_END(source, index)
+
+
+/**
+ * Proc used by stoppable timers to end a cooldown before the time has ran out.
+ *
+ * Arguments:
+ * * source - datum storing the cooldown
+ * * index - string index storing the cooldown on the cooldowns associative list
+ *
+ * This sends a signal reporting the cooldown end, passing the time left as an argument.
+ */
+/proc/reset_cooldown(datum/source, index)
+ if(QDELETED(source))
+ return
+ SEND_SIGNAL(source, COMSIG_CD_RESET(index), S_TIMER_COOLDOWN_TIMELEFT(source, index))
+ TIMER_COOLDOWN_END(source, index)
diff --git a/code/datums/diseases/advance/symptoms/flesh_eating.dm b/code/datums/diseases/advance/symptoms/flesh_eating.dm
index 774d97202e..0fad819e8e 100644
--- a/code/datums/diseases/advance/symptoms/flesh_eating.dm
+++ b/code/datums/diseases/advance/symptoms/flesh_eating.dm
@@ -64,7 +64,8 @@ Bonus
if(bleed)
if(ishuman(M))
var/mob/living/carbon/human/H = M
- H.bleed_rate += 5 * power
+ var/obj/item/bodypart/random_part = pick(H.bodyparts)
+ random_part.generic_bleedstacks += 5 * power
return 1
/*
diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm
index 787704e848..2fc853500d 100644
--- a/code/datums/diseases/advance/symptoms/heal.dm
+++ b/code/datums/diseases/advance/symptoms/heal.dm
@@ -404,7 +404,7 @@
if(M.loc)
environment = M.loc.return_air()
if(environment)
- plasmamount = environment.gases[/datum/gas/plasma]
+ plasmamount = environment.get_moles(/datum/gas/plasma)
if(plasmamount && plasmamount > GLOB.meta_gas_visibility[/datum/gas/plasma]) //if there's enough plasma in the air to see
. += power * 0.5
if(M.reagents.has_reagent(/datum/reagent/toxin/plasma))
diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm
index 1bb927aa12..e90eededd9 100644
--- a/code/datums/diseases/transformation.dm
+++ b/code/datums/diseases/transformation.dm
@@ -20,11 +20,11 @@
/datum/disease/transformation/Copy()
var/datum/disease/transformation/D = ..()
- D.stage1 = stage1.Copy()
- D.stage2 = stage2.Copy()
- D.stage3 = stage3.Copy()
- D.stage4 = stage4.Copy()
- D.stage5 = stage5.Copy()
+ D.stage1 = stage1?.Copy()
+ D.stage2 = stage2?.Copy()
+ D.stage3 = stage3?.Copy()
+ D.stage4 = stage4?.Copy()
+ D.stage5 = stage5?.Copy()
D.new_form = D.new_form
return D
@@ -52,9 +52,9 @@
to_chat(affected_mob, pick(stage5))
if(QDELETED(affected_mob))
return
- if(affected_mob.notransform)
+ if(affected_mob.mob_transforming)
return
- affected_mob.notransform = 1
+ affected_mob.mob_transforming = 1
for(var/obj/item/W in affected_mob.get_equipped_items(TRUE))
affected_mob.dropItemToGround(W)
for(var/obj/item/I in affected_mob.held_items)
diff --git a/code/datums/dna.dm b/code/datums/dna.dm
index ed5104e296..8d80bc3f36 100644
--- a/code/datums/dna.dm
+++ b/code/datums/dna.dm
@@ -15,6 +15,7 @@
var/mob/living/holder
var/delete_species = TRUE //Set to FALSE when a body is scanned by a cloner to fix #38875
var/mutation_index[DNA_MUTATION_BLOCKS] //List of which mutations this carbon has and its assigned block
+ var/default_mutation_genes[DNA_MUTATION_BLOCKS] //List of the default genes from this mutation to allow DNA Scanner highlighting
var/stability = 100
var/scrambled = FALSE //Did we take something like mutagen? In that case we cant get our genes scanned to instantly cheese all the powers.
var/skin_tone_override //because custom skin tones are not found in the skin_tones global list.
@@ -58,6 +59,7 @@
H.give_genitals(TRUE)//This gives the body the genitals of this DNA. Used for any transformations based on DNA
if(transfer_SE)
destination.dna.mutation_index = mutation_index
+ destination.dna.default_mutation_genes = default_mutation_genes
destination.dna.update_body_size(old_size)
@@ -66,6 +68,7 @@
/datum/dna/proc/copy_dna(datum/dna/new_dna)
new_dna.unique_enzymes = unique_enzymes
new_dna.mutation_index = mutation_index
+ new_dna.default_mutation_genes = default_mutation_genes
new_dna.uni_identity = uni_identity
new_dna.blood_type = blood_type
new_dna.skin_tone_override = skin_tone_override
@@ -128,9 +131,9 @@
L[DNA_FACIAL_HAIR_COLOR_BLOCK] = sanitize_hexcolor(H.facial_hair_color)
L[DNA_SKIN_TONE_BLOCK] = construct_block(GLOB.skin_tones.Find(H.skin_tone), GLOB.skin_tones.len)
L[DNA_EYE_COLOR_BLOCK] = sanitize_hexcolor(H.eye_color)
- L[DNA_COLOR_ONE_BLOCK] = sanitize_hexcolor(features["mcolor"])
- L[DNA_COLOR_TWO_BLOCK] = sanitize_hexcolor(features["mcolor2"])
- L[DNA_COLOR_THREE_BLOCK] = sanitize_hexcolor(features["mcolor3"])
+ L[DNA_COLOR_ONE_BLOCK] = sanitize_hexcolor(features["mcolor"], 6)
+ L[DNA_COLOR_TWO_BLOCK] = sanitize_hexcolor(features["mcolor2"], 6)
+ L[DNA_COLOR_THREE_BLOCK] = sanitize_hexcolor(features["mcolor3"], 6)
if(!GLOB.mam_tails_list.len)
init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_tails, GLOB.mam_tails_list)
L[DNA_MUTANTTAIL_BLOCK] = construct_block(GLOB.mam_tails_list.Find(features["mam_tail"]), GLOB.mam_tails_list.len)
@@ -160,15 +163,18 @@
if(!LAZYLEN(mutations_temp))
return
mutation_index.Cut()
+ default_mutation_genes.Cut()
shuffle_inplace(mutations_temp)
if(ismonkey(holder))
mutations |= new RACEMUT(MUT_NORMAL)
mutation_index[RACEMUT] = GET_SEQUENCE(RACEMUT)
else
mutation_index[RACEMUT] = create_sequence(RACEMUT, FALSE)
+ default_mutation_genes[RACEMUT] = mutation_index[RACEMUT]
for(var/i in 2 to DNA_MUTATION_BLOCKS)
var/datum/mutation/human/M = mutations_temp[i]
- mutation_index[M.type] = create_sequence(M.type, FALSE,M.difficulty)
+ mutation_index[M.type] = create_sequence(M.type, FALSE, M.difficulty)
+ default_mutation_genes[M.type] = mutation_index[M.type]
shuffle_inplace(mutation_index)
//Used to generate original gene sequences for every mutation
@@ -233,11 +239,11 @@
if(DNA_HAIR_STYLE_BLOCK)
setblock(uni_identity, blocknumber, construct_block(GLOB.hair_styles_list.Find(H.hair_style), GLOB.hair_styles_list.len))
if(DNA_COLOR_ONE_BLOCK)
- sanitize_hexcolor(features["mcolor"])
+ sanitize_hexcolor(features["mcolor"], 6)
if(DNA_COLOR_TWO_BLOCK)
- sanitize_hexcolor(features["mcolor2"])
+ sanitize_hexcolor(features["mcolor2"], 6)
if(DNA_COLOR_THREE_BLOCK)
- sanitize_hexcolor(features["mcolor3"])
+ sanitize_hexcolor(features["mcolor3"], 6)
if(DNA_MUTANTTAIL_BLOCK)
construct_block(GLOB.mam_tails_list.Find(features["mam_tail"]), GLOB.mam_tails_list.len)
if(DNA_MUTANTEAR_BLOCK)
@@ -389,7 +395,7 @@
return dna
-/mob/living/carbon/human/proc/hardset_dna(ui, list/mutation_index, newreal_name, newblood_type, datum/species/mrace, newfeatures)
+/mob/living/carbon/human/proc/hardset_dna(ui, list/mutation_index, newreal_name, newblood_type, datum/species/mrace, newfeatures, list/default_mutation_genes)
if(newreal_name)
real_name = newreal_name
@@ -414,6 +420,10 @@
if(LAZYLEN(mutation_index))
dna.mutation_index = mutation_index.Copy()
+ if(LAZYLEN(default_mutation_genes))
+ dna.default_mutation_genes = default_mutation_genes.Copy()
+ else
+ dna.default_mutation_genes = mutation_index.Copy()
domutcheck()
SEND_SIGNAL(src, COMSIG_HUMAN_HARDSET_DNA, ui, mutation_index, newreal_name, newblood_type, mrace, newfeatures)
@@ -505,8 +515,11 @@
. = TRUE
if(on)
mutation_index[HM.type] = GET_SEQUENCE(HM.type)
+ default_mutation_genes[HM.type] = mutation_index[HM.type]
else if(GET_SEQUENCE(HM.type) == mutation_index[HM.type])
mutation_index[HM.type] = create_sequence(HM.type, FALSE, HM.difficulty)
+ default_mutation_genes[HM.type] = mutation_index[HM.type]
+
/datum/dna/proc/activate_mutation(mutation) //note that this returns a boolean and not a new mob
if(!mutation)
@@ -678,7 +691,7 @@
holder.update_transform()
var/danger = CONFIG_GET(number/threshold_body_size_slowdown)
if(features["body_size"] < danger)
- var/slowdown = 1 + round(danger/features["body_size"], 0.1) * CONFIG_GET(number/body_size_slowdown_multiplier)
+ var/slowdown = (1 - round(features["body_size"] / danger, 0.1)) * CONFIG_GET(number/body_size_slowdown_multiplier)
holder.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/small_stride, TRUE, slowdown)
else if(old_size < danger)
holder.remove_movespeed_modifier(/datum/movespeed_modifier/small_stride)
diff --git a/code/datums/dog_fashion.dm b/code/datums/dog_fashion.dm
index 744f57c391..2e80feac67 100644
--- a/code/datums/dog_fashion.dm
+++ b/code/datums/dog_fashion.dm
@@ -38,7 +38,6 @@
corgI.color = obj_color
return corgI
-
/datum/dog_fashion/head
icon_file = 'icons/mob/corgi_head.dmi'
@@ -53,7 +52,6 @@
name = "Sous chef REAL_NAME"
desc = "Your food will be taste-tested. All of it."
-
/datum/dog_fashion/head/captain
name = "Captain REAL_NAME"
desc = "Probably better than the last captain."
diff --git a/code/datums/elements/_element.dm b/code/datums/elements/_element.dm
index f74dcd0b6e..a147325170 100644
--- a/code/datums/elements/_element.dm
+++ b/code/datums/elements/_element.dm
@@ -19,11 +19,13 @@
SHOULD_CALL_PARENT(1)
if(type == /datum/element)
return ELEMENT_INCOMPATIBLE
+ SEND_SIGNAL(target, COMSIG_ELEMENT_ATTACH, src)
if(element_flags & ELEMENT_DETACH)
RegisterSignal(target, COMSIG_PARENT_QDELETING, .proc/Detach, override = TRUE)
/// Deactivates the functionality defines by the element on the given datum
/datum/element/proc/Detach(datum/source, force)
+ SEND_SIGNAL(source, COMSIG_ELEMENT_DETACH, src)
SHOULD_CALL_PARENT(1)
UnregisterSignal(source, COMSIG_PARENT_QDELETING)
diff --git a/code/datums/elements/beauty.dm b/code/datums/elements/beauty.dm
index 8acfda73e1..8895026967 100644
--- a/code/datums/elements/beauty.dm
+++ b/code/datums/elements/beauty.dm
@@ -8,8 +8,11 @@
if(. == ELEMENT_INCOMPATIBLE || !isatom(target) || isarea(target))
return ELEMENT_INCOMPATIBLE
beauty = beautyamount
- RegisterSignal(target, COMSIG_ENTER_AREA, .proc/enter_area)
- RegisterSignal(target, COMSIG_EXIT_AREA, .proc/exit_area)
+
+ if(ismovable(target))
+ RegisterSignal(target, COMSIG_ENTER_AREA, .proc/enter_area)
+ RegisterSignal(target, COMSIG_EXIT_AREA, .proc/exit_area)
+
var/area/A = get_area(target)
if(A)
enter_area(null, A)
diff --git a/code/datums/elements/embed.dm b/code/datums/elements/embed.dm
new file mode 100644
index 0000000000..8a7acde9cb
--- /dev/null
+++ b/code/datums/elements/embed.dm
@@ -0,0 +1,227 @@
+/*
+ The presence of this element allows an item (or a projectile carrying an item) to embed itself in a human or turf when it is thrown into a target (whether by hand, gun, or explosive wave) with either
+ at least 4 throwspeed (EMBED_THROWSPEED_THRESHOLD) or ignore_throwspeed_threshold set to TRUE. Items meant to be used as shrapnel for projectiles should have ignore_throwspeed_threshold set to true.
+
+ Whether we're dealing with a direct /obj/item (throwing a knife at someone) or an /obj/projectile with a shrapnel_type, how we handle things plays out the same, with one extra step separating them.
+ Items simply make their COMSIG_MOVABLE_IMPACT or COMSIG_MOVABLE_IMPACT_ZONE check (against a closed turf or a carbon, respectively), while projectiles check on COMSIG_PROJECTILE_SELF_ON_HIT.
+ Upon a projectile hitting a valid target, it spawns whatever type of payload it has defined, then has that try to embed itself in the target on its own.
+
+ Otherwise non-embeddable or stickable items can be made embeddable/stickable through wizard events/sticky tape/admin memes.
+*/
+
+#define STANDARD_WALL_HARDNESS 40
+
+/datum/element/embed
+ element_flags = ELEMENT_BESPOKE
+ id_arg_index = 2
+ var/initialized = FALSE /// whether we can skip assigning all the vars (since these are bespoke elements, we don't have to reset the vars every time we attach to something, we already know what we are!)
+
+ // all of this stuff is explained in _DEFINES/combat.dm
+ var/embed_chance
+ var/fall_chance
+ var/pain_chance
+ var/pain_mult
+ var/remove_pain_mult
+ var/impact_pain_mult
+ var/rip_time
+ var/ignore_throwspeed_threshold
+ var/jostle_chance
+ var/jostle_pain_mult
+ var/pain_stam_pct
+ var/payload_type
+ var/embed_chance_turf_mod
+
+/datum/element/embed/Attach(datum/target, embed_chance, fall_chance, pain_chance, pain_mult, remove_pain_mult, impact_pain_mult, rip_time, ignore_throwspeed_threshold, jostle_chance, jostle_pain_mult, pain_stam_pct, embed_chance_turf_mod, projectile_payload=/obj/item/shard)
+ . = ..()
+
+ if(!isitem(target) && !isprojectile(target))
+ return ELEMENT_INCOMPATIBLE
+
+ if(isitem(target))
+ RegisterSignal(target, COMSIG_MOVABLE_IMPACT_ZONE, .proc/checkEmbedMob)
+ RegisterSignal(target, COMSIG_MOVABLE_IMPACT, .proc/checkEmbedOther)
+ RegisterSignal(target, COMSIG_ELEMENT_ATTACH, .proc/severancePackage)
+ RegisterSignal(target, COMSIG_PARENT_EXAMINE, .proc/examined)
+ RegisterSignal(target, COMSIG_EMBED_TRY_FORCE, .proc/tryForceEmbed)
+ RegisterSignal(target, COMSIG_ITEM_DISABLE_EMBED, .proc/detachFromWeapon)
+ if(!initialized)
+ src.embed_chance = embed_chance
+ src.fall_chance = fall_chance
+ src.pain_chance = pain_chance
+ src.pain_mult = pain_mult
+ src.remove_pain_mult = remove_pain_mult
+ src.rip_time = rip_time
+ src.impact_pain_mult = impact_pain_mult
+ src.ignore_throwspeed_threshold = ignore_throwspeed_threshold
+ src.jostle_chance = jostle_chance
+ src.jostle_pain_mult = jostle_pain_mult
+ src.pain_stam_pct = pain_stam_pct
+ src.embed_chance_turf_mod = embed_chance_turf_mod
+ initialized = TRUE
+ else
+ payload_type = projectile_payload
+ RegisterSignal(target, COMSIG_PROJECTILE_SELF_ON_HIT, .proc/checkEmbedProjectile)
+
+
+/datum/element/embed/Detach(obj/target)
+ . = ..()
+ if(isitem(target))
+ UnregisterSignal(target, list(COMSIG_MOVABLE_IMPACT_ZONE, COMSIG_ELEMENT_ATTACH, COMSIG_MOVABLE_IMPACT, COMSIG_PARENT_EXAMINE, COMSIG_EMBED_TRY_FORCE, COMSIG_ITEM_DISABLE_EMBED))
+ else
+ UnregisterSignal(target, list(COMSIG_PROJECTILE_SELF_ON_HIT))
+
+
+/// Checking to see if we're gonna embed into a human
+/datum/element/embed/proc/checkEmbedMob(obj/item/weapon, mob/living/carbon/victim, hit_zone, datum/thrownthing/throwingdatum, blocked = FALSE, forced = FALSE)
+ if(blocked || !istype(victim) || HAS_TRAIT(victim, TRAIT_PIERCEIMMUNE))
+ return
+
+ var/actual_chance = embed_chance
+
+ if(!weapon.isEmbedHarmless()) // all the armor in the world won't save you from a kick me sign
+ var/armor = max(victim.run_armor_check(hit_zone, "bullet", silent=TRUE), victim.run_armor_check(hit_zone, "bomb", silent=TRUE)) // we'll be nice and take the better of bullet and bomb armor
+
+ if(armor) // we only care about armor penetration if there's actually armor to penetrate
+ var/pen_mod = -armor + weapon.armour_penetration // even a little bit of armor can make a big difference for shrapnel with large negative armor pen
+ actual_chance += pen_mod // doing the armor pen as a separate calc just in case this ever gets expanded on
+ if(actual_chance <= 0)
+ victim.visible_message("[weapon] bounces off [victim]'s armor!", "[weapon] bounces off your armor!", vision_distance = COMBAT_MESSAGE_RANGE)
+ return
+
+ var/roll_embed = prob(actual_chance)
+ var/pass = forced || ((((throwingdatum ? throwingdatum.speed : weapon.throw_speed) >= EMBED_THROWSPEED_THRESHOLD) || ignore_throwspeed_threshold) && roll_embed && (!HAS_TRAIT(victim, TRAIT_AUTO_CATCH_ITEM) || victim.incapacitated() || victim.get_active_held_item()))
+ if(!pass)
+ return
+
+ var/obj/item/bodypart/limb = victim.get_bodypart(hit_zone) || pick(victim.bodyparts)
+ victim.AddComponent(/datum/component/embedded,\
+ weapon,\
+ throwingdatum,\
+ part = limb,\
+ embed_chance = embed_chance,\
+ fall_chance = fall_chance,\
+ pain_chance = pain_chance,\
+ pain_mult = pain_mult,\
+ remove_pain_mult = remove_pain_mult,\
+ rip_time = rip_time,\
+ ignore_throwspeed_threshold = ignore_throwspeed_threshold,\
+ jostle_chance = jostle_chance,\
+ jostle_pain_mult = jostle_pain_mult,\
+ pain_stam_pct = pain_stam_pct,\
+ embed_chance_turf_mod = embed_chance_turf_mod)
+
+ return TRUE
+
+/// We need the hit_zone if we're embedding into a human, so this proc only handles if we're embedding into a turf
+/datum/element/embed/proc/checkEmbedOther(obj/item/weapon, turf/closed/hit, datum/thrownthing/throwingdatum, forced=FALSE)
+ if(!istype(hit))
+ return
+
+ var/chance = embed_chance + embed_chance_turf_mod
+ if(iswallturf(hit))
+ var/turf/closed/wall/W = hit
+ chance += 2 * (W.hardness - STANDARD_WALL_HARDNESS)
+
+ if(!forced && chance <= 0 || embed_chance_turf_mod <= -100)
+ return
+
+ var/pass = ((((throwingdatum ? throwingdatum.speed : weapon.throw_speed) >= EMBED_THROWSPEED_THRESHOLD) || ignore_throwspeed_threshold) && prob(chance))
+ if(!pass)
+ return
+
+ hit.AddComponent(/datum/component/embedded,\
+ weapon,\
+ throwingdatum,\
+ embed_chance = embed_chance,\
+ fall_chance = fall_chance,\
+ pain_chance = pain_chance,\
+ pain_mult = pain_mult,\
+ remove_pain_mult = remove_pain_mult,\
+ rip_time = rip_time,\
+ ignore_throwspeed_threshold = ignore_throwspeed_threshold,\
+ jostle_chance = jostle_chance,\
+ jostle_pain_mult = jostle_pain_mult,\
+ pain_stam_pct = pain_stam_pct,\
+ embed_chance_turf_mod = embed_chance_turf_mod)
+
+ return TRUE
+
+///A different embed element has been attached, so we'll detach and let them handle things
+/datum/element/embed/proc/severancePackage(obj/item/weapon, datum/element/E)
+ if(istype(E, /datum/element/embed))
+ Detach(weapon)
+
+///If we don't want to be embeddable anymore (deactivating an e-dagger for instance)
+/datum/element/embed/proc/detachFromWeapon(obj/weapon)
+ Detach(weapon)
+
+///Someone inspected our embeddable item
+/datum/element/embed/proc/examined(obj/item/I, mob/user, list/examine_list)
+ if(I.isEmbedHarmless())
+ examine_list += "[I] feels sticky, and could probably get stuck to someone if thrown properly!"
+ else
+ examine_list += "[I] has a fine point, and could probably embed in someone if thrown properly!"
+
+/**
+ * checkEmbedProjectile() is what we get when a projectile with a defined shrapnel_type impacts a target.
+ *
+ * If we hit a valid target (carbon or closed turf), we create the shrapnel_type object and immediately call tryEmbed() on it, targeting what we impacted. That will lead
+ * it to call tryForceEmbed() on its own embed element (it's out of our hands here, our projectile is done), where it will run through all the checks it needs to.
+ */
+/datum/element/embed/proc/checkEmbedProjectile(obj/item/projectile/P, atom/movable/firer, atom/hit, angle, hit_zone)
+ if(!iscarbon(hit) && !isclosedturf(hit))
+ Detach(P)
+ return // we don't care
+
+ var/obj/item/payload = new payload_type(get_turf(hit))
+ var/did_embed
+ if(iscarbon(hit))
+ var/mob/living/carbon/C = hit
+ var/obj/item/bodypart/limb
+ limb = C.get_bodypart(hit_zone)
+ if(!limb)
+ limb = C.get_bodypart()
+ did_embed = payload.tryEmbed(limb)
+ else
+ did_embed = payload.tryEmbed(hit)
+
+ if(!did_embed)
+ payload.failedEmbed()
+ Detach(P)
+
+/**
+ * tryForceEmbed() is called here when we fire COMSIG_EMBED_TRY_FORCE from [/obj/item/proc/tryEmbed]. Mostly, this means we're a piece of shrapnel from a projectile that just impacted something, and we're trying to embed in it.
+ *
+ * The reason for this extra mucking about is avoiding having to do an extra hitby(), and annoying the target by impacting them once with the projectile, then again with the shrapnel (which likely represents said bullet), and possibly
+ * AGAIN if we actually embed. This way, we save on at least one message. Runs the standard embed checks on the mob/turf.
+ *
+ * Arguments:
+ * * I- what we're trying to embed, obviously
+ * * target- what we're trying to shish-kabob, either a bodypart, a carbon, or a closed turf
+ * * hit_zone- if our target is a carbon, try to hit them in this zone, if we don't have one, pick a random one. If our target is a bodypart, we already know where we're hitting.
+ * * forced- if we want this to succeed 100%
+ */
+/datum/element/embed/proc/tryForceEmbed(obj/item/I, atom/target, hit_zone, forced=FALSE)
+ var/obj/item/bodypart/limb
+ var/mob/living/carbon/C
+ var/turf/closed/T
+
+ if(!forced && !prob(embed_chance))
+ return
+
+ if(iscarbon(target))
+ C = target
+ if(!hit_zone)
+ limb = pick(C.bodyparts)
+ hit_zone = limb.body_zone
+ else if(isbodypart(target))
+ limb = target
+ hit_zone = limb.body_zone
+ C = limb.owner
+ else if(isclosedturf(target))
+ T = target
+
+ if(C)
+ return checkEmbedMob(I, C, hit_zone, forced=TRUE)
+ else if(T)
+ return checkEmbedOther(I, T, forced=TRUE)
diff --git a/code/datums/elements/flavor_text.dm b/code/datums/elements/flavor_text.dm
index 92251861ed..3562345d26 100644
--- a/code/datums/elements/flavor_text.dm
+++ b/code/datums/elements/flavor_text.dm
@@ -82,9 +82,10 @@ GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code
return
if(href_list["show_flavor"])
var/atom/target = locate(href_list["show_flavor"])
+ var/mob/living/L = target
var/text = texts_by_atom[target]
if(text)
- usr << browse("[target.name][replacetext(texts_by_atom[target], "\n", " ")]", "window=[target.name];size=500x200")
+ usr << browse("[isliving(target) ? L.get_visible_name() : target.name][replacetext(texts_by_atom[target], "\n", " ")]", "window=[isliving(target) ? L.get_visible_name() : target.name];size=500x200")
onclose(usr, "[target.name]")
return TRUE
diff --git a/code/datums/embedding_behavior.dm b/code/datums/embedding_behavior.dm
deleted file mode 100644
index a261ea48c6..0000000000
--- a/code/datums/embedding_behavior.dm
+++ /dev/null
@@ -1,53 +0,0 @@
-#define EMBEDID "embed-[embed_chance]-[embedded_fall_chance]-[embedded_pain_chance]-[embedded_pain_multiplier]-[embedded_fall_pain_multiplier]-[embedded_impact_pain_multiplier]-[embedded_unsafe_removal_pain_multiplier]-[embedded_unsafe_removal_time]"
-
-/proc/getEmbeddingBehavior(embed_chance = EMBED_CHANCE,
- embedded_fall_chance = EMBEDDED_ITEM_FALLOUT,
- embedded_pain_chance = EMBEDDED_PAIN_CHANCE,
- embedded_pain_multiplier = EMBEDDED_PAIN_MULTIPLIER,
- embedded_fall_pain_multiplier = EMBEDDED_FALL_PAIN_MULTIPLIER,
- embedded_impact_pain_multiplier = EMBEDDED_IMPACT_PAIN_MULTIPLIER,
- embedded_unsafe_removal_pain_multiplier = EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER,
- embedded_unsafe_removal_time = EMBEDDED_UNSAFE_REMOVAL_TIME)
- . = locate(EMBEDID)
- if (!.)
- . = new /datum/embedding_behavior(embed_chance, embedded_fall_chance, embedded_pain_chance, embedded_pain_multiplier, embedded_fall_pain_multiplier, embedded_impact_pain_multiplier, embedded_unsafe_removal_pain_multiplier, embedded_unsafe_removal_time)
-
-/datum/embedding_behavior
- var/embed_chance
- var/embedded_fall_chance
- var/embedded_pain_chance
- var/embedded_pain_multiplier //The coefficient of multiplication for the damage this item does while embedded (this*w_class)
- var/embedded_fall_pain_multiplier //The coefficient of multiplication for the damage this item does when falling out of a limb (this*w_class)
- var/embedded_impact_pain_multiplier //The coefficient of multiplication for the damage this item does when first embedded (this*w_class)
- var/embedded_unsafe_removal_pain_multiplier //The coefficient of multiplication for the damage removing this without surgery causes (this*w_class)
- var/embedded_unsafe_removal_time //A time in ticks, multiplied by the w_class.
-
-/datum/embedding_behavior/New(embed_chance = EMBED_CHANCE,
- embedded_fall_chance = EMBEDDED_ITEM_FALLOUT,
- embedded_pain_chance = EMBEDDED_PAIN_CHANCE,
- embedded_pain_multiplier = EMBEDDED_PAIN_MULTIPLIER,
- embedded_fall_pain_multiplier = EMBEDDED_FALL_PAIN_MULTIPLIER,
- embedded_impact_pain_multiplier = EMBEDDED_IMPACT_PAIN_MULTIPLIER,
- embedded_unsafe_removal_pain_multiplier = EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER,
- embedded_unsafe_removal_time = EMBEDDED_UNSAFE_REMOVAL_TIME)
- src.embed_chance = embed_chance
- src.embedded_fall_chance = embedded_fall_chance
- src.embedded_pain_chance = embedded_pain_chance
- src.embedded_pain_multiplier = embedded_pain_multiplier
- src.embedded_fall_pain_multiplier = embedded_fall_pain_multiplier
- src.embedded_impact_pain_multiplier = embedded_impact_pain_multiplier
- src.embedded_unsafe_removal_pain_multiplier = embedded_unsafe_removal_pain_multiplier
- src.embedded_unsafe_removal_time = embedded_unsafe_removal_time
- tag = EMBEDID
-
-/datum/embedding_behavior/proc/setRating(embed_chance, embedded_fall_chance, embedded_pain_chance, embedded_pain_multiplier, embedded_fall_pain_multiplier, embedded_impact_pain_multiplier, embedded_unsafe_removal_pain_multiplier, embedded_unsafe_removal_time)
- return getEmbeddingBehavior((isnull(embed_chance) ? src.embed_chance : embed_chance),\
- (isnull(embedded_fall_chance) ? src.embedded_fall_chance : embedded_fall_chance),\
- (isnull(embedded_pain_chance) ? src.embedded_pain_chance : embedded_pain_chance),\
- (isnull(embedded_pain_multiplier) ? src.embedded_pain_multiplier : embedded_pain_multiplier),\
- (isnull(embedded_fall_pain_multiplier) ? src.embedded_fall_pain_multiplier : embedded_fall_pain_multiplier),\
- (isnull(embedded_impact_pain_multiplier) ? src.embedded_impact_pain_multiplier : embedded_impact_pain_multiplier),\
- (isnull(embedded_unsafe_removal_pain_multiplier) ? src.embedded_unsafe_removal_pain_multiplier : embedded_unsafe_removal_pain_multiplier),\
- (isnull(embedded_unsafe_removal_time) ? src.embedded_unsafe_removal_time : embedded_unsafe_removal_time))
-
-#undef EMBEDID
diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm
index c46a03a986..5e9371f754 100644
--- a/code/datums/helper_datums/teleport.dm
+++ b/code/datums/helper_datums/teleport.dm
@@ -117,9 +117,8 @@
continue
var/datum/gas_mixture/A = F.air
- var/list/A_gases = A.gases
var/trace_gases
- for(var/id in A_gases)
+ for(var/id in A.get_gases())
if(id in GLOB.hardcoded_gases)
continue
trace_gases = TRUE
@@ -128,15 +127,15 @@
// Can most things breathe?
if(trace_gases)
continue
- if(A_gases[/datum/gas/oxygen] <= 16)
+ if(A.get_moles(/datum/gas/oxygen) < 16)
continue
- if(A_gases[/datum/gas/plasma])
+ if(A.get_moles(/datum/gas/plasma))
continue
- if(A_gases[/datum/gas/carbon_dioxide] >= 10)
+ if(A.get_moles(/datum/gas/carbon_dioxide) >= 10)
continue
// Aim for goldilocks temperatures and pressure
- if((A.temperature <= 270) || (A.temperature >= 360))
+ if((A.return_temperature() <= 270) || (A.return_temperature() >= 360))
continue
var/pressure = A.return_pressure()
if((pressure <= 20) || (pressure >= 550))
diff --git a/code/datums/http.dm b/code/datums/http.dm
new file mode 100644
index 0000000000..2a9b53f131
--- /dev/null
+++ b/code/datums/http.dm
@@ -0,0 +1,74 @@
+/datum/http_request
+ var/id
+ var/in_progress = FALSE
+
+ var/method
+ var/body
+ var/headers
+ var/url
+
+ var/_raw_response
+
+/datum/http_request/proc/prepare(method, url, body = "", list/headers)
+ if (!length(headers))
+ headers = ""
+ else
+ headers = json_encode(headers)
+
+ src.method = method
+ src.url = url
+ src.body = body
+ src.headers = headers
+
+/datum/http_request/proc/execute_blocking()
+ _raw_response = rustg_http_request_blocking(method, url, body, headers)
+
+/datum/http_request/proc/begin_async()
+ if (in_progress)
+ CRASH("Attempted to re-use a request object.")
+
+ id = rustg_http_request_async(method, url, body, headers)
+
+ if (isnull(text2num(id)))
+ stack_trace("Proc error: [id]")
+ _raw_response = "Proc error: [id]"
+ else
+ in_progress = TRUE
+
+/datum/http_request/proc/is_complete()
+ if (isnull(id))
+ return TRUE
+
+ if (!in_progress)
+ return TRUE
+
+ var/r = rustg_http_check_request(id)
+
+ if (r == RUSTG_JOB_NO_RESULTS_YET)
+ return FALSE
+ else
+ _raw_response = r
+ in_progress = FALSE
+ return TRUE
+
+/datum/http_request/proc/into_response()
+ var/datum/http_response/R = new()
+
+ try
+ var/list/L = json_decode(_raw_response)
+ R.status_code = L["status_code"]
+ R.headers = L["headers"]
+ R.body = L["body"]
+ catch
+ R.errored = TRUE
+ R.error = _raw_response
+
+ return R
+
+/datum/http_response
+ var/status_code
+ var/body
+ var/list/headers
+
+ var/errored = FALSE
+ var/error
diff --git a/code/datums/hud.dm b/code/datums/hud.dm
index 6b6fcb9691..c1811fb9b3 100644
--- a/code/datums/hud.dm
+++ b/code/datums/hud.dm
@@ -27,7 +27,8 @@ GLOBAL_LIST_INIT(huds, list(
ANTAG_HUD_SOULLESS = new/datum/atom_hud/antag/hidden(),
ANTAG_HUD_CLOCKWORK = new/datum/atom_hud/antag(),
ANTAG_HUD_BROTHER = new/datum/atom_hud/antag/hidden(),
- ANTAG_HUD_BLOODSUCKER = new/datum/atom_hud/antag/bloodsucker()
+ ANTAG_HUD_BLOODSUCKER = new/datum/atom_hud/antag/bloodsucker(),
+ ANTAG_HUD_FUGITIVE = new/datum/atom_hud/antag()
))
/datum/atom_hud
diff --git a/code/datums/looping_sounds/_looping_sound.dm b/code/datums/looping_sounds/_looping_sound.dm
index bafb6fbf0e..8bee4f3d1c 100644
--- a/code/datums/looping_sounds/_looping_sound.dm
+++ b/code/datums/looping_sounds/_looping_sound.dm
@@ -23,10 +23,14 @@
var/end_sound
var/chance
var/volume = 100
+ var/vary = FALSE
var/max_loops
var/direct
+ var/extra_range = 0
+ var/falloff
var/timerid
+ var/init_timerid
/datum/looping_sound/New(list/_output_atoms=list(), start_immediately=FALSE, _direct=FALSE)
if(!mid_sounds)
@@ -47,13 +51,16 @@
/datum/looping_sound/proc/start(atom/add_thing)
if(add_thing)
output_atoms |= add_thing
- if(timerid)
+ if(timerid || init_timerid)
return
on_start()
/datum/looping_sound/proc/stop(atom/remove_thing)
if(remove_thing)
output_atoms -= remove_thing
+ if(init_timerid)
+ deltimer(init_timerid)
+ init_timerid = null
if(!timerid)
return
on_stop()
@@ -80,7 +87,7 @@
if(direct)
SEND_SOUND(thing, S)
else
- playsound(thing, S, volume)
+ playsound(thing, S, volume, vary, extra_range, falloff)
/datum/looping_sound/proc/get_sound(starttime, _mid_sounds)
. = _mid_sounds || mid_sounds
@@ -92,7 +99,7 @@
if(start_sound)
play(start_sound)
start_wait = start_length
- addtimer(CALLBACK(src, .proc/sound_loop), start_wait, TIMER_CLIENT_TIME)
+ init_timerid = addtimer(CALLBACK(src, .proc/sound_loop), start_wait, TIMER_CLIENT_TIME | TIMER_STOPPABLE)
/datum/looping_sound/proc/on_stop()
if(end_sound)
diff --git a/code/datums/martial/_martial.dm b/code/datums/martial/_martial.dm
index 8241f685d7..1581323f89 100644
--- a/code/datums/martial/_martial.dm
+++ b/code/datums/martial/_martial.dm
@@ -44,11 +44,11 @@
//Here we roll for our damage to be added into the damage var in the various attack procs. This is changed depending on whether we are in combat mode, lying down, or if our target is in combat mode.
var/damage = rand(A.dna.species.punchdamagelow, A.dna.species.punchdamagehigh)
if(SEND_SIGNAL(D, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_INACTIVE))
- damage *= 1.5
+ damage *= 1.2
if(!CHECK_MOBILITY(A, MOBILITY_STAND))
- damage *= 0.5
+ damage *= 0.7
if(SEND_SIGNAL(A, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_INACTIVE))
- damage *= 0.25
+ damage *= 0.8
return damage
/datum/martial_art/proc/teach(mob/living/carbon/human/H, make_temporary = FALSE)
diff --git a/code/datums/martial/boxing.dm b/code/datums/martial/boxing.dm
index e3c7726d61..4682595aec 100644
--- a/code/datums/martial/boxing.dm
+++ b/code/datums/martial/boxing.dm
@@ -58,12 +58,10 @@
var/datum/martial_art/boxing/style = new
/obj/item/clothing/gloves/boxing/equipped(mob/user, slot)
- if(!ishuman(user))
- return
- if(slot == SLOT_GLOVES)
+ . = ..()
+ if(ishuman(user) && slot == SLOT_GLOVES)
var/mob/living/carbon/human/H = user
style.teach(H,TRUE)
- return
/obj/item/clothing/gloves/boxing/dropped(mob/user)
. = ..()
diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm
index 50438d9d8d..3691b2fccc 100644
--- a/code/datums/martial/krav_maga.dm
+++ b/code/datums/martial/krav_maga.dm
@@ -196,9 +196,8 @@
var/datum/martial_art/krav_maga/style = new
/obj/item/clothing/gloves/krav_maga/equipped(mob/user, slot)
- if(!ishuman(user))
- return
- if(slot == SLOT_GLOVES)
+ . = ..()
+ if(ishuman(user) && slot == SLOT_GLOVES)
var/mob/living/carbon/human/H = user
style.teach(H,1)
@@ -224,8 +223,8 @@
/obj/item/clothing/gloves/krav_maga/combatglovesplus
name = "combat gloves plus"
desc = "These tactical gloves are fireproof and shock resistant, and using nanochip technology it teaches you the powers of krav maga."
- icon_state = "combat"
- item_state = "blackgloves"
+ icon_state = "fightglovesblack"
+ item_state = "fightglovesblack"
siemens_coefficient = 0
permeability_coefficient = 0.05
strip_delay = 80
diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm
index 82ddd90b42..7d884344f1 100644
--- a/code/datums/martial/sleeping_carp.dm
+++ b/code/datums/martial/sleeping_carp.dm
@@ -44,7 +44,7 @@
else
playsound(get_turf(D), 'sound/weapons/punch1.ogg', 25, TRUE, -1)
log_combat(A, D, "strong punched (Sleeping Carp)")//so as to not double up on logging
- D.apply_damage((damage + 15) + crit_damage, BRUTE, affecting)
+ D.apply_damage((damage + 15) + crit_damage, BRUTE, affecting, wound_bonus = CANT_WOUND)
return TRUE
///Crashing Wave Kick: Harm Disarm combo, throws people seven tiles backwards
@@ -56,7 +56,7 @@
playsound(get_turf(A), 'sound/effects/hit_kick.ogg', 50, TRUE, -1)
var/atom/throw_target = get_edge_target_turf(D, A.dir)
D.throw_at(throw_target, 7, 14, A)
- D.apply_damage(damage, BRUTE, BODY_ZONE_CHEST)
+ D.apply_damage(damage, BRUTE, BODY_ZONE_CHEST, wound_bonus = CANT_WOUND, wound_bonus = CANT_WOUND)
log_combat(A, D, "launchkicked (Sleeping Carp)")
return TRUE
@@ -66,14 +66,14 @@
A.do_attack_animation(D, ATTACK_EFFECT_KICK)
playsound(get_turf(A), 'sound/effects/hit_kick.ogg', 50, TRUE, -1)
if((D.mobility_flags & MOBILITY_STAND))
- D.apply_damage(damage, BRUTE, BODY_ZONE_HEAD)
+ D.apply_damage(damage, BRUTE, BODY_ZONE_HEAD, wound_bonus = CANT_WOUND)
D.DefaultCombatKnockdown(50, override_hardstun = 0.01, override_stamdmg = 0)
- D.apply_damage(damage + 35, STAMINA, BODY_ZONE_HEAD) //A cit specific change form the tg port to really punish anyone who tries to stand up
+ D.apply_damage(damage + 35, STAMINA, BODY_ZONE_HEAD, wound_bonus = CANT_WOUND) //A cit specific change form the tg port to really punish anyone who tries to stand up
D.visible_message("[A] kicks [D] in the head, sending them face first into the floor!", \
"You are kicked in the head by [A], sending you crashing to the floor!", "You hear a sickening sound of flesh hitting flesh!", COMBAT_MESSAGE_RANGE, A)
else
- D.apply_damage(damage*0.5, BRUTE, BODY_ZONE_HEAD)
- D.apply_damage(damage + 35, STAMINA, BODY_ZONE_HEAD)
+ D.apply_damage(damage*0.5, BRUTE, BODY_ZONE_HEAD, wound_bonus = CANT_WOUND)
+ D.apply_damage(damage + 35, STAMINA, BODY_ZONE_HEAD, wound_bonus = CANT_WOUND)
D.drop_all_held_items()
D.visible_message("[A] kicks [D] in the head!", \
"You are kicked in the head by [A]!", "You hear a sickening sound of flesh hitting flesh!", COMBAT_MESSAGE_RANGE, A)
@@ -99,7 +99,7 @@
D.visible_message("[A] [atk_verb]s [D]!", \
"[A] [atk_verb]s you!", null, null, A)
to_chat(A, "You [atk_verb] [D]!")
- D.apply_damage(damage, BRUTE, affecting)
+ D.apply_damage(damage, BRUTE, affecting, wound_bonus = CANT_WOUND)
playsound(get_turf(D), 'sound/weapons/punch1.ogg', 25, TRUE, -1)
if(CHECK_MOBILITY(D, MOBILITY_STAND) && damage >= stunthreshold)
to_chat(D, "You stumble and fall!")
@@ -180,14 +180,12 @@
to_chat(usr, "Keelhaul: Harm Grab. Kick opponents to the floor. Against prone targets, deal additional stamina damage and disarm them.")
to_chat(usr, "In addition, your body has become incredibly resilient to most forms of attack. Weapons cannot readily pierce your hardened skin, and you are highly resistant to stuns and knockdowns, and can block all projectiles in Throw Mode. However, you are not invincible, and sustained damage will take it's toll. Avoid heat at all costs!")
-/obj/item/twohanded/bostaff
+/obj/item/staff/bostaff
name = "bo staff"
desc = "A long, tall staff made of polished wood. Traditionally used in ancient old-Earth martial arts. Can be wielded to both kill and incapacitate."
force = 10
w_class = WEIGHT_CLASS_BULKY
slot_flags = ITEM_SLOT_BACK
- force_unwielded = 10
- force_wielded = 24
throwforce = 20
throw_speed = 2
attack_verb = list("smashed", "slammed", "whacked", "thwacked")
@@ -196,11 +194,29 @@
lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi'
block_chance = 50
+ var/wielded = FALSE // track wielded status on item
-/obj/item/twohanded/bostaff/update_icon_state()
- icon_state = "bostaff[wielded]"
+/obj/item/staff/bostaff/Initialize()
+ . = ..()
+ RegisterSignal(src, COMSIG_TWOHANDED_WIELD, .proc/on_wield)
+ RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, .proc/on_unwield)
-/obj/item/twohanded/bostaff/attack(mob/target, mob/living/user)
+/obj/item/staff/bostaff/ComponentInitialize()
+ . = ..()
+ AddComponent(/datum/component/two_handed, force_unwielded=10, force_wielded=24, icon_wielded="bostaff1")
+
+/// triggered on wield of two handed item
+/obj/item/staff/bostaff/proc/on_wield(obj/item/source, mob/user)
+ wielded = TRUE
+
+/// triggered on unwield of two handed item
+/obj/item/staff/bostaff/proc/on_unwield(obj/item/source, mob/user)
+ wielded = FALSE
+
+/obj/item/staff/bostaff/update_icon_state()
+ icon_state = "bostaff0"
+
+/obj/item/staff/bostaff/attack(mob/target, mob/living/user)
add_fingerprint(user)
if((HAS_TRAIT(user, TRAIT_CLUMSY)) && prob(50))
to_chat(user, "You club yourself over the head with [src].")
@@ -249,7 +265,7 @@
else
return ..()
-/obj/item/twohanded/bostaff/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return)
+/obj/item/staff/bostaff/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return)
if(!wielded)
return BLOCK_NONE
return ..()
diff --git a/code/datums/martial/wrestling.dm b/code/datums/martial/wrestling.dm
index 87fcf78964..8dc1afba81 100644
--- a/code/datums/martial/wrestling.dm
+++ b/code/datums/martial/wrestling.dm
@@ -215,11 +215,17 @@
/datum/martial_art/wrestling/proc/FlipAnimation(mob/living/carbon/human/D)
set waitfor = FALSE
+ var/transform_before
+ var/laying_before
if (D)
+ transform_before = D.transform
+ laying_before = D.lying
animate(D, transform = matrix(180, MATRIX_ROTATE), time = 1, loop = 0)
sleep(15)
if (D)
- animate(D, transform = null, time = 1, loop = 0)
+ if(transform_before && laying_before == D.lying) //animate calls sleep so this should be fine and stop a bug with transforms
+ D.transform = transform_before
+ animate(D, transform = null, time = 1, loop = 0)
/datum/martial_art/wrestling/proc/slam(mob/living/carbon/human/A, mob/living/carbon/human/D)
if(!D)
@@ -377,7 +383,7 @@
var/turf/ST = null
var/falling = 0
var/damage = damage_roll(A,D)
-
+
for (var/obj/O in oview(1, A))
if (O.density == 1)
if (O == A)
@@ -415,11 +421,17 @@
to_chat(A, "You can't drop onto [D] from here!")
return FALSE
+ var/transform_before
+ var/laying_before
if(A)
+ transform_before = A.transform
+ laying_before = A.lying
animate(A, transform = matrix(90, MATRIX_ROTATE), time = 1, loop = 0)
sleep(10)
if(A)
- animate(A, transform = null, time = 1, loop = 0)
+ if(transform_before && laying_before == A.lying) //if they suddenly dropped to the floor between this period, don't revert their animation
+ animate(A, transform = null, time = 1, loop = 0)
+ A.transform = transform_before
A.forceMove(D.loc)
@@ -472,12 +484,10 @@
var/datum/martial_art/wrestling/style = new
/obj/item/storage/belt/champion/wrestling/equipped(mob/user, slot)
- if(!ishuman(user))
- return
- if(slot == SLOT_BELT)
+ . = ..()
+ if(ishuman(user) && slot == SLOT_BELT)
var/mob/living/carbon/human/H = user
style.teach(H,1)
- return
/obj/item/storage/belt/champion/wrestling/dropped(mob/user)
. = ..()
diff --git a/code/datums/materials/_material.dm b/code/datums/materials/_material.dm
index 1a8ce755e1..5148aab4ac 100644
--- a/code/datums/materials/_material.dm
+++ b/code/datums/materials/_material.dm
@@ -6,8 +6,6 @@ Simple datum which is instanced once per type and is used for every object of sa
/datum/material
var/name = "material"
var/desc = "its..stuff."
- ///Var that's mostly used by science machines to identify specific materials, should most likely be phased out at some point
- var/id = "mat"
///Base color of the material, is used for greyscale. Item isn't changed in color if this is null.
var/color
///Base alpha of the material, is used for greyscale icons.
@@ -26,6 +24,20 @@ Simple datum which is instanced once per type and is used for every object of sa
var/armor_modifiers = list("melee" = 1, "bullet" = 1, "laser" = 1, "energy" = 1, "bomb" = 1, "bio" = 1, "rad" = 1, "fire" = 1, "acid" = 1)
///How beautiful is this material per unit?
var/beauty_modifier = 0
+ ///Can be used to override the sound items make, lets add some SLOSHing.
+ var/item_sound_override
+ ///Can be used to override the stepsound a turf makes. MORE SLOOOSH
+ var/turf_sound_override
+ ///what texture icon state to overlay
+ var/texture_layer_icon_state
+ ///a cached filter for the texture icon
+ var/cached_texture_filter
+
+/datum/material/New()
+ . = ..()
+ if(texture_layer_icon_state)
+ var/texture_icon = icon('icons/materials/composite.dmi', texture_layer_icon_state)
+ cached_texture_filter = filter(type="layer", icon=texture_icon, blend_mode = BLEND_INSET_OVERLAY)
///This proc is called when the material is added to an object.
/datum/material/proc/on_applied(atom/source, amount, material_flags)
@@ -34,16 +46,27 @@ Simple datum which is instanced once per type and is used for every object of sa
source.add_atom_colour(color, FIXED_COLOUR_PRIORITY)
if(alpha)
source.alpha = alpha
+ if(texture_layer_icon_state)
+ ADD_KEEP_TOGETHER(source, MATERIAL_SOURCE(src))
+ source.filters += cached_texture_filter
if(material_flags & MATERIAL_ADD_PREFIX)
source.name = "[name] [source.name]"
- if(istype(source, /obj)) //objs
- on_applied_obj(source, amount, material_flags)
-
if(beauty_modifier)
addtimer(CALLBACK(source, /datum.proc/_AddElement, list(/datum/element/beauty, beauty_modifier * amount)), 0)
+ if(istype(source, /obj)) //objs
+ on_applied_obj(source, amount, material_flags)
+
+ else if(isturf(source, /turf)) //turfs
+ on_applied_turf(source, amount, material_flags)
+
+ source.mat_update_desc(src)
+
+///This proc is called when a material updates an object's description
+/atom/proc/mat_update_desc(/datum/material/mat)
+ return
///This proc is called when the material is added to an object specifically.
/datum/material/proc/on_applied_obj(var/obj/o, amount, material_flags)
if(material_flags & MATERIAL_AFFECT_STATISTICS)
@@ -61,6 +84,24 @@ Simple datum which is instanced once per type and is used for every object of sa
for(var/i in current_armor)
temp_armor_list[i] = current_armor[i] * armor_modifiers[i]
o.armor = getArmor(arglist(temp_armor_list))
+ if(!isitem(o))
+ return
+ var/obj/item/I = o
+ if(!item_sound_override)
+ return
+ I.hitsound = item_sound_override
+ I.usesound = item_sound_override
+ I.throwhitsound = item_sound_override
+
+/datum/material/proc/on_applied_turf(var/turf/T, amount, material_flags)
+ if(isopenturf(T))
+ if(!turf_sound_override)
+ return
+ var/turf/open/O = T
+ O.footstep = turf_sound_override
+ O.barefootstep = turf_sound_override
+ O.clawfootstep = turf_sound_override
+ O.heavyfootstep = turf_sound_override
///This proc is called when the material is removed from an object.
/datum/material/proc/on_removed(atom/source, material_flags)
@@ -68,6 +109,9 @@ Simple datum which is instanced once per type and is used for every object of sa
if(color)
source.remove_atom_colour(FIXED_COLOUR_PRIORITY, color)
source.alpha = initial(source.alpha)
+ if(texture_layer_icon_state)
+ source.filters -= cached_texture_filter
+ REMOVE_KEEP_TOGETHER(source, MATERIAL_SOURCE(src))
if(material_flags & MATERIAL_ADD_PREFIX)
source.name = initial(source.name)
@@ -75,10 +119,16 @@ Simple datum which is instanced once per type and is used for every object of sa
if(istype(source, /obj)) //objs
on_removed_obj(source, material_flags)
+ else if(istype(source, /turf)) //turfs
+ on_removed_turf(source, material_flags)
+
///This proc is called when the material is removed from an object specifically.
-/datum/material/proc/on_removed_obj(var/obj/o, amount, material_flags)
+/datum/material/proc/on_removed_obj(obj/o, material_flags)
if(material_flags & MATERIAL_AFFECT_STATISTICS)
var/new_max_integrity = initial(o.max_integrity)
o.modify_max_integrity(new_max_integrity)
o.force = initial(o.force)
o.throwforce = initial(o.throwforce)
+
+/datum/material/proc/on_removed_turf(turf/T, material_flags)
+ return
diff --git a/code/datums/materials/basemats.dm b/code/datums/materials/basemats.dm
index d4921a04d2..721af65449 100644
--- a/code/datums/materials/basemats.dm
+++ b/code/datums/materials/basemats.dm
@@ -1,21 +1,19 @@
///Has no special properties.
/datum/material/iron
name = "iron"
- id = "iron"
desc = "Common iron ore often found in sedimentary and igneous layers of the crust."
color = "#878687"
- categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE)
+ categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE)
sheet_type = /obj/item/stack/sheet/metal
value_per_unit = 0.0025
///Breaks extremely easily but is transparent.
/datum/material/glass
name = "glass"
- id = "glass"
desc = "Glass forged by melting sand."
color = "#88cdf1"
alpha = 150
- categories = list(MAT_CATEGORY_RIGID = TRUE)
+ categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE)
integrity_modifier = 0.1
sheet_type = /obj/item/stack/sheet/glass
value_per_unit = 0.0025
@@ -30,10 +28,9 @@ Unless you know what you're doing, only use the first three numbers. They're in
///Has no special properties. Could be good against vampires in the future perhaps.
/datum/material/silver
name = "silver"
- id = "silver"
desc = "Silver"
color = list(255/255, 284/255, 302/255,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0)
- categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE)
+ categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE)
sheet_type = /obj/item/stack/sheet/mineral/silver
value_per_unit = 0.025
beauty_modifier = 0.075
@@ -41,11 +38,10 @@ Unless you know what you're doing, only use the first three numbers. They're in
///Slight force increase
/datum/material/gold
name = "gold"
- id = "gold"
desc = "Gold"
color = list(340/255, 240/255, 50/255,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0) //gold is shiny, but not as bright as bananium
strength_modifier = 1.2
- categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE)
+ categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE)
sheet_type = /obj/item/stack/sheet/mineral/gold
value_per_unit = 0.0625
beauty_modifier = 0.15
@@ -54,11 +50,10 @@ Unless you know what you're doing, only use the first three numbers. They're in
///Has no special properties
/datum/material/diamond
name = "diamond"
- id = "diamond"
desc = "Highly pressurized carbon"
color = list(48/255, 272/255, 301/255,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0)
alpha = 132
- categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE)
+ categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE)
sheet_type = /obj/item/stack/sheet/mineral/diamond
value_per_unit = 0.25
beauty_modifier = 0.3
@@ -67,10 +62,9 @@ Unless you know what you're doing, only use the first three numbers. They're in
///Is slightly radioactive
/datum/material/uranium
name = "uranium"
- id = "uranium"
desc = "Uranium"
color = rgb(48, 237, 26)
- categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE)
+ categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE)
sheet_type = /obj/item/stack/sheet/mineral/uranium
value_per_unit = 0.05
beauty_modifier = 0.3 //It shines so beautiful
@@ -88,10 +82,9 @@ Unless you know what you're doing, only use the first three numbers. They're in
///Adds firestacks on hit (Still needs support to turn into gas on destruction)
/datum/material/plasma
name = "plasma"
- id = "plasma"
desc = "Isn't plasma a state of matter? Oh whatever."
color = list(298/255, 46/255, 352/255,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0)
- categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE)
+ categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE)
sheet_type = /obj/item/stack/sheet/mineral/plasma
value_per_unit = 0.1
beauty_modifier = 0.15
@@ -111,7 +104,6 @@ Unless you know what you're doing, only use the first three numbers. They're in
///Can cause bluespace effects on use. (Teleportation) (Not yet implemented)
/datum/material/bluespace
name = "bluespace crystal"
- id = "bluespace_crystal"
desc = "Crystals with bluespace properties"
color = list(119/255, 217/255, 396/255,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0)
alpha = 200
@@ -123,10 +115,9 @@ Unless you know what you're doing, only use the first three numbers. They're in
///Honks and slips
/datum/material/bananium
name = "bananium"
- id = "bananium"
desc = "Material with hilarious properties"
color = list(460/255, 464/255, 0, 0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0) //obnoxiously bright yellow
- categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE)
+ categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE)
sheet_type = /obj/item/stack/sheet/mineral/bananium
value_per_unit = 0.5
beauty_modifier = 0.5
@@ -146,11 +137,10 @@ Unless you know what you're doing, only use the first three numbers. They're in
///Mediocre force increase
/datum/material/titanium
name = "titanium"
- id = "titanium"
desc = "Titanium"
color = "#b3c0c7"
strength_modifier = 1.3
- categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE)
+ categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE)
sheet_type = /obj/item/stack/sheet/mineral/titanium
value_per_unit = 0.0625
beauty_modifier = 0.05
@@ -158,11 +148,10 @@ Unless you know what you're doing, only use the first three numbers. They're in
/datum/material/runite
name = "runite"
- id = "runite"
desc = "Runite"
color = "#3F9995"
strength_modifier = 1.3
- categories = list(MAT_CATEGORY_RIGID = TRUE)
+ categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE)
sheet_type = /obj/item/stack/sheet/mineral/runite
beauty_modifier = 0.5
armor_modifiers = list("melee" = 1.35, "bullet" = 2, "laser" = 0.5, "energy" = 1.25, "bomb" = 1.25, "bio" = 1, "rad" = 1, "fire" = 1.4, "acid" = 1) //rune is weak against magic lasers but strong against bullets. This is the combat triangle.
@@ -170,7 +159,6 @@ Unless you know what you're doing, only use the first three numbers. They're in
///Force decrease
/datum/material/plastic
name = "plastic"
- id = "plastic"
desc = "Plastic"
color = "#caccd9"
strength_modifier = 0.85
@@ -182,7 +170,6 @@ Unless you know what you're doing, only use the first three numbers. They're in
///Force decrease and mushy sound effect. (Not yet implemented)
/datum/material/biomass
name = "biomass"
- id = "biomass"
desc = "Organic matter"
color = "#735b4d"
strength_modifier = 0.8
@@ -190,12 +177,11 @@ Unless you know what you're doing, only use the first three numbers. They're in
/datum/material/wood
name = "wood"
- id = "wood"
desc = "Flexible, durable, but flamable. Hard to come across in space."
color = "#bb8e53"
strength_modifier = 0.5
sheet_type = /obj/item/stack/sheet/mineral/wood
- categories = list(MAT_CATEGORY_RIGID = TRUE)
+ categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE)
value_per_unit = 0.06
beauty_modifier = 0.1
armor_modifiers = list("melee" = 1.1, "bullet" = 1.1, "laser" = 0.4, "energy" = 0.4, "bomb" = 1, "bio" = 0.2, "rad" = 0, "fire" = 0, "acid" = 0.3)
@@ -215,11 +201,10 @@ Unless you know what you're doing, only use the first three numbers. They're in
///Stronk force increase
/datum/material/adamantine
name = "adamantine"
- id = "adamantine"
desc = "A powerful material made out of magic, I mean science!"
color = "#6d7e8e"
strength_modifier = 1.5
- categories = list(MAT_CATEGORY_RIGID = TRUE)
+ categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE)
sheet_type = /obj/item/stack/sheet/mineral/adamantine
value_per_unit = 0.25
beauty_modifier = 0.4
@@ -228,10 +213,9 @@ Unless you know what you're doing, only use the first three numbers. They're in
///RPG Magic. (Admin only)
/datum/material/mythril
name = "mythril"
- id = "mythril"
desc = "How this even exists is byond me"
color = "#f2d5d7"
- categories = list(MAT_CATEGORY_RIGID = TRUE)
+ categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE)
sheet_type = /obj/item/stack/sheet/mineral/mythril
value_per_unit = 0.75
beauty_modifier = 0.5
@@ -246,3 +230,134 @@ Unless you know what you're doing, only use the first three numbers. They're in
. = ..()
if(istype(source, /obj/item))
qdel(source.GetComponent(/datum/component/fantasy))
+
+//I don't like sand. It's coarse, and rough, and irritating, and it gets everywhere.
+/datum/material/sand
+ name = "sand"
+ desc = "You know, it's amazing just how structurally sound sand can be."
+ color = "#EDC9AF"
+ categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE)
+ sheet_type = /obj/item/stack/sheet/sandblock
+ value_per_unit = 0.001
+ strength_modifier = 0.5
+ integrity_modifier = 0.1
+ armor_modifiers = list("melee" = 0.25, "bullet" = 0.25, "laser" = 1.25, "energy" = 0.25, "bomb" = 0.25, "bio" = 0.25, "rad" = 1.5, "fire" = 1.5, "acid" = 1.5)
+ beauty_modifier = 0.25
+ turf_sound_override = FOOTSTEP_SAND
+ texture_layer_icon_state = "sand"
+
+//And now for our lavaland dwelling friends, sand, but in stone form! Truly revolutionary.
+/datum/material/sandstone
+ name = "sandstone"
+ desc = "Bialtaakid 'ant taerif ma hdha."
+ color = "#B77D31"
+ categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE)
+ sheet_type = /obj/item/stack/sheet/mineral/sandstone
+ value_per_unit = 0.0025
+ armor_modifiers = list("melee" = 0.5, "bullet" = 0.5, "laser" = 1.25, "energy" = 0.5, "bomb" = 0.5, "bio" = 0.25, "rad" = 1.5, "fire" = 1.5, "acid" = 1.5)
+ beauty_modifier = 0.3
+ turf_sound_override = FOOTSTEP_WOOD
+ texture_layer_icon_state = "brick"
+
+/datum/material/snow
+ name = "snow"
+ desc = "There's no business like snow business."
+ color = "#FFFFFF"
+ categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE)
+ sheet_type = /obj/item/stack/sheet/mineral/snow
+ value_per_unit = 0.0025
+ armor_modifiers = list("melee" = 0.25, "bullet" = 0.25, "laser" = 0.25, "energy" = 0.25, "bomb" = 0.25, "bio" = 0.25, "rad" = 1.5, "fire" = 0.25, "acid" = 1.5)
+ beauty_modifier = 0.3
+ turf_sound_override = FOOTSTEP_SAND
+ texture_layer_icon_state = "sand"
+
+/datum/material/runedmetal
+ name = "runed metal"
+ desc = "Mir'ntrath barhah Nar'sie."
+ color = "#3C3434"
+ categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE)
+ sheet_type = /obj/item/stack/sheet/runed_metal
+ value_per_unit = 0.75
+ armor_modifiers = list("melee" = 1.2, "bullet" = 1.2, "laser" = 1, "energy" = 1, "bomb" = 1.2, "bio" = 1.2, "rad" = 1.5, "fire" = 1.5, "acid" = 1.5)
+ beauty_modifier = -0.15
+ texture_layer_icon_state = "runed"
+
+/datum/material/bronze
+ name = "bronze"
+ desc = "Clock Cult? Never heard of it."
+ color = "#92661A"
+ categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE)
+ sheet_type = /obj/item/stack/tile/bronze
+ value_per_unit = 0.025
+ armor_modifiers = list("melee" = 1, "bullet" = 1, "laser" = 1, "energy" = 1, "bomb" = 1, "bio" = 1, "rad" = 1.5, "fire" = 1.5, "acid" = 1.5)
+ beauty_modifier = 0.2
+
+/datum/material/paper
+ name = "paper"
+ desc = "Ten thousand folds of pure starchy power."
+ color = "#E5DCD5"
+ categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE)
+ sheet_type = /obj/item/stack/sheet/paperframes
+ value_per_unit = 0.0025
+ armor_modifiers = list("melee" = 0.1, "bullet" = 0.1, "laser" = 0.1, "energy" = 0.1, "bomb" = 0.1, "bio" = 0.1, "rad" = 1.5, "fire" = 0, "acid" = 1.5)
+ beauty_modifier = 0.3
+ turf_sound_override = FOOTSTEP_SAND
+ texture_layer_icon_state = "paper"
+
+/datum/material/paper/on_applied_obj(obj/source, amount, material_flags)
+ . = ..()
+ if(material_flags & MATERIAL_AFFECT_STATISTICS)
+ var/obj/paper = source
+ paper.resistance_flags |= FLAMMABLE
+ paper.obj_flags |= UNIQUE_RENAME
+
+/datum/material/paper/on_removed_obj(obj/source, material_flags)
+ if(material_flags & MATERIAL_AFFECT_STATISTICS)
+ var/obj/paper = source
+ paper.resistance_flags &= ~FLAMMABLE
+ return ..()
+
+/datum/material/cardboard
+ name = "cardboard"
+ desc = "They say cardboard is used by hobos to make incredible things."
+ color = "#5F625C"
+ categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE)
+ sheet_type = /obj/item/stack/sheet/cardboard
+ value_per_unit = 0.003
+ armor_modifiers = list("melee" = 0.25, "bullet" = 0.25, "laser" = 0.25, "energy" = 0.25, "bomb" = 0.25, "bio" = 0.25, "rad" = 1.5, "fire" = 0, "acid" = 1.5)
+ beauty_modifier = -0.1
+
+/datum/material/cardboard/on_applied_obj(obj/source, amount, material_flags)
+ . = ..()
+ if(material_flags & MATERIAL_AFFECT_STATISTICS)
+ var/obj/cardboard = source
+ cardboard.resistance_flags |= FLAMMABLE
+ cardboard.obj_flags |= UNIQUE_RENAME
+
+/datum/material/cardboard/on_removed_obj(obj/source, material_flags)
+ if(material_flags & MATERIAL_AFFECT_STATISTICS)
+ var/obj/cardboard = source
+ cardboard.resistance_flags &= ~FLAMMABLE
+ return ..()
+
+/datum/material/bone
+ name = "bone"
+ desc = "Man, building with this will make you the coolest caveman on the block."
+ color = "#e3dac9"
+ categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE)
+ sheet_type = /obj/item/stack/sheet/bone
+ value_per_unit = 0.05
+ armor_modifiers = list("melee" = 1.2, "bullet" = 0.75, "laser" = 0.75, "energy" = 1.2, "bomb" = 1, "bio" = 1, "rad" = 1.5, "fire" = 1.5, "acid" = 1.5)
+ beauty_modifier = -0.2
+
+/datum/material/bamboo
+ name = "bamboo"
+ desc = "If it's good enough for pandas, it's good enough for you."
+ color = "#339933"
+ categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE)
+ sheet_type = /obj/item/stack/sheet/mineral/bamboo
+ value_per_unit = 0.0025
+ armor_modifiers = list("melee" = 0.5, "bullet" = 0.5, "laser" = 0.5, "energy" = 0.5, "bomb" = 0.5, "bio" = 0.51, "rad" = 1.5, "fire" = 0.5, "acid" = 1.5)
+ beauty_modifier = 0.2
+ turf_sound_override = FOOTSTEP_WOOD
+ texture_layer_icon_state = "bamboo"
diff --git a/code/datums/materials/meat.dm b/code/datums/materials/meat.dm
new file mode 100644
index 0000000000..14a373f2d2
--- /dev/null
+++ b/code/datums/materials/meat.dm
@@ -0,0 +1,32 @@
+///It's gross, gets the name of it's owner, and is all kinds of fucked up
+/datum/material/meat
+ name = "meat"
+ desc = "Meat"
+ color = rgb(214, 67, 67)
+ categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE)
+ sheet_type = /obj/item/stack/sheet/meat
+ value_per_unit = 0.05
+ beauty_modifier = -0.3
+ strength_modifier = 0.7
+ armor_modifiers = list("melee" = 0.3, "bullet" = 0.3, "laser" = 1.2, "energy" = 1.2, "bomb" = 0.3, "bio" = 0, "rad" = 0.7, "fire" = 1, "acid" = 1)
+ item_sound_override = 'sound/effects/meatslap.ogg'
+ turf_sound_override = FOOTSTEP_MEAT
+ texture_layer_icon_state = "meat"
+
+/datum/material/meat/on_removed(atom/source, material_flags)
+ . = ..()
+ qdel(source.GetComponent(/datum/component/edible))
+
+/datum/material/meat/on_applied_obj(obj/O, amount, material_flags)
+ . = ..()
+ O.obj_flags |= UNIQUE_RENAME //So you can name it after the person its made from, a depressing comprimise.
+ make_edible(O, amount, material_flags)
+
+/datum/material/meat/on_applied_turf(turf/T, amount, material_flags)
+ . = ..()
+ make_edible(T, amount, material_flags)
+
+/datum/material/meat/proc/make_edible(atom/source, amount, material_flags)
+ var/nutriment_count = 3 * (amount / MINERAL_MATERIAL_AMOUNT)
+ var/oil_count = 2 * (amount / MINERAL_MATERIAL_AMOUNT)
+ source.AddComponent(/datum/component/edible, list(/datum/reagent/consumable/nutriment = nutriment_count, /datum/reagent/consumable/cooking_oil = oil_count), null, RAW | MEAT | GROSS, null, 30, list("Fleshy"))
diff --git a/code/datums/materials/pizza.dm b/code/datums/materials/pizza.dm
new file mode 100644
index 0000000000..2a9542234f
--- /dev/null
+++ b/code/datums/materials/pizza.dm
@@ -0,0 +1,30 @@
+/datum/material/pizza
+ name = "pizza"
+ desc = "~Jamme, jamme, n'coppa, jamme ja! Jamme, jamme, n'coppa jamme ja, funi-culi funi-cala funi-culi funi-cala!! Jamme jamme ja funiculi funicula!~"
+ color = "#FF9F23"
+ categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE)
+ sheet_type = /obj/item/stack/sheet/pizza
+ value_per_unit = 0.05
+ beauty_modifier = 0.1
+ strength_modifier = 0.7
+ armor_modifiers = list("melee" = 0.3, "bullet" = 0.3, "laser" = 1.2, "energy" = 1.2, "bomb" = 0.3, "bio" = 0, "rad" = 0.7, "fire" = 1, "acid" = 1)
+ item_sound_override = 'sound/effects/meatslap.ogg'
+ turf_sound_override = FOOTSTEP_MEAT
+ texture_layer_icon_state = "pizza"
+
+/datum/material/pizza/on_removed(atom/source, material_flags)
+ . = ..()
+ qdel(source.GetComponent(/datum/component/edible))
+
+/datum/material/pizza/on_applied_obj(obj/O, amount, material_flags)
+ . = ..()
+ make_edible(O, amount, material_flags)
+
+/datum/material/pizza/on_applied_turf(turf/T, amount, material_flags)
+ . = ..()
+ make_edible(T, amount, material_flags)
+
+/datum/material/pizza/proc/make_edible(atom/source, amount, material_flags)
+ var/nutriment_count = 3 * (amount / MINERAL_MATERIAL_AMOUNT)
+ var/oil_count = 2 * (amount / MINERAL_MATERIAL_AMOUNT)
+ source.AddComponent(/datum/component/edible, list(/datum/reagent/consumable/nutriment = nutriment_count, /datum/reagent/consumable/cooking_oil = oil_count), null, GRAIN | MEAT | DAIRY | VEGETABLES, null, 30, list("crust", "tomato", "cheese", "meat"))
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index 2a6835cc23..cb99fdc5a3 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -66,8 +66,11 @@
/// Our skill holder.
var/datum/skill_holder/skill_holder
+ ///What character we spawned in as- either at roundstart or latejoin, so we know for persistent scars if we ended as the same person or not
+ var/mob/original_character
+
/datum/mind/New(var/key)
- skill_holder = new()
+ skill_holder = new(src)
src.key = key
soulOwner = src
martial_art = default_martial_art
@@ -124,6 +127,8 @@
transfer_martial_arts(new_character)
if(active || force_key_move)
new_character.key = key //now transfer the key to link the client to our new body
+ if(new_character.client)
+ LAZYCLEARLIST(new_character.client.recent_examines)
current.update_atom_languages()
//CIT CHANGE - makes arousal update when transfering bodies
diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm
index f5692c297a..787d6375a7 100644
--- a/code/datums/mood_events/generic_negative_events.dm
+++ b/code/datums/mood_events/generic_negative_events.dm
@@ -77,10 +77,14 @@
description = "Pull it out!\n"
mood_change = -7
-/datum/mood_event/table
- description = "Someone threw me on a table!\n"
- mood_change = -2
- timeout = 2 MINUTES
+/datum/mood_event/table_limbsmash
+ description = "That fucking table, man that hurts...\n"
+ mood_change = -3
+ timeout = 3 MINUTES
+
+/datum/mood_event/table_limbsmash/add_effects(obj/item/bodypart/banged_limb)
+ if(banged_limb)
+ description = "My fucking [banged_limb.name], man that hurts...\n"
/datum/mood_event/table/add_effects()
if(ishuman(owner))
@@ -270,3 +274,13 @@
description = "I've produced better art than that from my ass.\n"
mood_change = -2
timeout = 1200
+
+/datum/mood_event/tripped
+ description = "I can't believe I fell for the oldest trick in the book!\n"
+ mood_change = -6
+ timeout = 2 MINUTES
+
+/datum/mood_event/untied
+ description = "I hate when my shoes come untied!\n"
+ mood_change = -3
+ timeout = 1 MINUTES
diff --git a/code/datums/mood_events/generic_positive_events.dm b/code/datums/mood_events/generic_positive_events.dm
index 95177f6869..8f98917ed3 100644
--- a/code/datums/mood_events/generic_positive_events.dm
+++ b/code/datums/mood_events/generic_positive_events.dm
@@ -196,3 +196,7 @@
description = "That work of art was so great it made me believe in the goodness of humanity. Says a lot in a place like this.\n"
mood_change = 4
timeout = 4 MINUTES
+
+/datum/mood_event/cleared_stomach
+ description = "Feels nice to get that out of the way!\n"
+ mood_change = 3
diff --git a/code/datums/mutations/_mutations.dm b/code/datums/mutations/_mutations.dm
index db739c5100..fb5f6ed5f6 100644
--- a/code/datums/mutations/_mutations.dm
+++ b/code/datums/mutations/_mutations.dm
@@ -42,6 +42,7 @@
var/synchronizer_coeff = -1 //makes the mutation hurt the user less
var/power_coeff = -1 //boosts mutation strength
var/energy_coeff = -1 //lowers mutation cooldown
+ var/list/valid_chrom_list = list() //List of strings of valid chromosomes this mutation can accept.
/datum/mutation/human/New(class_ = MUT_OTHER, timer, datum/mutation/human/copymut)
. = ..()
@@ -90,7 +91,7 @@
/datum/mutation/human/proc/get_visual_indicator()
return
-/datum/mutation/human/proc/on_attack_hand(atom/target, proximity)
+/datum/mutation/human/proc/on_attack_hand(atom/target, proximity, act_intent, unarmed_attack_flags)
return
/datum/mutation/human/proc/on_ranged_attack(atom/target, mouseparams)
@@ -167,6 +168,7 @@
energy_coeff = HM.energy_coeff
mutadone_proof = HM.mutadone_proof
can_chromosome = HM.can_chromosome
+ valid_chrom_list = HM.valid_chrom_list
/datum/mutation/human/proc/remove_chromosome()
stabilizer_coeff = initial(stabilizer_coeff)
@@ -192,3 +194,23 @@
power.panel = "Genetic"
owner.AddSpell(power)
return TRUE
+
+// Runs through all the coefficients and uses this to determine which chromosomes the
+// mutation can take. Stores these as text strings in a list.
+/datum/mutation/human/proc/update_valid_chromosome_list()
+ valid_chrom_list.Cut()
+
+ if(can_chromosome == CHROMOSOME_NEVER)
+ valid_chrom_list += "none"
+ return
+
+ valid_chrom_list += "Reinforcement"
+
+ if(stabilizer_coeff != -1)
+ valid_chrom_list += "Stabilizer"
+ if(synchronizer_coeff != -1)
+ valid_chrom_list += "Synchronizer"
+ if(power_coeff != -1)
+ valid_chrom_list += "Power"
+ if(energy_coeff != -1)
+ valid_chrom_list += "Energetic"
diff --git a/code/datums/mutations/actions.dm b/code/datums/mutations/actions.dm
index e933e02c15..7e6d567cfa 100644
--- a/code/datums/mutations/actions.dm
+++ b/code/datums/mutations/actions.dm
@@ -42,6 +42,7 @@
school = "evocation"
charge_max = 600
clothes_req = NONE
+ antimagic_allowed = TRUE
range = 20
base_icon_state = "fireball"
action_icon_state = "fireball0"
@@ -122,6 +123,7 @@
desc = "A rare genome that attracts odd forces not usually observed. May sometimes pull you in randomly."
school = "evocation"
clothes_req = NONE
+ antimagic_allowed = TRUE
charge_max = 600
invocation = "DOOOOOOOOOOOOOOOOOOOOM!!!"
invocation_type = "shout"
@@ -155,6 +157,7 @@
dropmessage = "You let the electricity from your hand dissipate."
hand_path = /obj/item/melee/touch_attack/shock
charge_max = 400
+ antimagic_allowed = TRUE
clothes_req = NONE
action_icon_state = "zap"
@@ -212,6 +215,7 @@
desc = "Get a scent off of the item you're currently holding to track it. With an empty hand, you'll track the scent you've remembered."
charge_max = 100
clothes_req = NONE
+ antimagic_allowed = TRUE
range = -1
include_user = TRUE
action_icon_state = "nose"
@@ -222,9 +226,8 @@
/obj/effect/proc_holder/spell/targeted/olfaction/cast(list/targets, mob/living/user = usr)
//can we sniff? is there miasma in the air?
var/datum/gas_mixture/air = user.loc.return_air()
- var/list/cached_gases = air.gases
- if(cached_gases[/datum/gas/miasma])
+ if(air.get_moles(/datum/gas/miasma))
user.adjust_disgust(sensitivity * 45)
to_chat(user, "With your overly sensitive nose, you get a whiff of stench and feel sick! Try moving to a cleaner area!")
return
@@ -290,6 +293,7 @@
name = "Drop a limb"
desc = "Concentrate to make a random limb pop right off your body."
clothes_req = NONE
+ antimagic_allowed = TRUE
charge_max = 100
action_icon_state = "autotomy"
@@ -327,6 +331,7 @@
name = "Lay Web"
desc = "Drops a web. Only you will be able to traverse your web easily, making it pretty good for keeping you safe."
clothes_req = NONE
+ antimagic_allowed = TRUE
charge_max = 4 SECONDS //the same time to lay a web
action_icon = 'icons/mob/actions/actions_genetic.dmi'
action_icon_state = "lay_web"
@@ -368,6 +373,7 @@
name = "Launch spike"
desc = "Shoot your tongue out in the direction you're facing, embedding it and dealing damage until they remove it."
clothes_req = NONE
+ antimagic_allowed = TRUE
charge_max = 100
action_icon = 'icons/mob/actions/actions_genetic.dmi'
action_icon_state = "spike"
@@ -406,6 +412,8 @@
w_class = WEIGHT_CLASS_SMALL
sharpness = IS_SHARP
var/mob/living/carbon/human/fired_by
+ /// if we missed our target
+ var/missed = TRUE
/obj/item/hardened_spike/Initialize(mapload, firedby)
. = ..()
@@ -413,13 +421,12 @@
addtimer(CALLBACK(src, .proc/checkembedded), 5 SECONDS)
/obj/item/hardened_spike/proc/checkembedded()
- if(ishuman(loc))
- var/mob/living/carbon/human/embedtest = loc
- for(var/l in embedtest.bodyparts)
- var/obj/item/bodypart/limb = l
- if(src in limb.embedded_objects)
- return limb
- unembedded()
+ if(missed)
+ unembedded()
+
+/obj/item/hardened_spike/embedded(atom/target)
+ if(isbodypart(target))
+ missed = FALSE
/obj/item/hardened_spike/unembedded()
var/turf/T = get_turf(src)
@@ -490,11 +497,7 @@
var/obj/item/bodypart/L = spikey.checkembedded()
- L.embedded_objects -= spikey
//this is where it would deal damage, if it transfers chems it removes itself so no damage
spikey.forceMove(get_turf(L))
transfered.visible_message("[spikey] falls out of [transfered]!")
- if(!transfered.has_embedded_objects())
- transfered.clear_alert("embeddedobject")
- SEND_SIGNAL(transfered, COMSIG_CLEAR_MOOD_EVENT, "embedded")
- spikey.unembedded()
+
diff --git a/code/datums/mutations/hulk.dm b/code/datums/mutations/hulk.dm
index 4f8cd6b25e..bc7b9171a8 100644
--- a/code/datums/mutations/hulk.dm
+++ b/code/datums/mutations/hulk.dm
@@ -19,9 +19,13 @@
SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "hulk", /datum/mood_event/hulk)
RegisterSignal(owner, COMSIG_MOB_SAY, .proc/handle_speech)
-/datum/mutation/human/hulk/on_attack_hand(atom/target, proximity)
- if(proximity) //no telekinetic hulk attack
- return target.attack_hulk(owner)
+/datum/mutation/human/hulk/on_attack_hand(atom/target, proximity, act_intent, unarmed_attack_flags)
+ if(proximity && (act_intent == INTENT_HARM)) //no telekinetic hulk attack
+ if(!owner.CheckActionCooldown(CLICK_CD_MELEE))
+ return INTERRUPT_UNARMED_ATTACK | NO_AUTO_CLICKDELAY_HANDLING
+ owner.DelayNextAction()
+ target.attack_hulk(owner)
+ return INTERRUPT_UNARMED_ATTACK | NO_AUTO_CLICKDELAY_HANDLING
/datum/mutation/human/hulk/on_life()
if(owner.health < 0)
diff --git a/code/datums/mutations/speech.dm b/code/datums/mutations/speech.dm
index d4db7e34c2..531837e583 100644
--- a/code/datums/mutations/speech.dm
+++ b/code/datums/mutations/speech.dm
@@ -14,7 +14,7 @@
/datum/mutation/human/wacky
name = "Wacky"
- desc = "Unknown."
+ desc = "Unknown."
quality = MINOR_NEGATIVE
text_gain_indication = "You feel an off sensation in your voicebox."
text_lose_indication = "The off sensation passes."
diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm
index 1f041f82d2..d6b73f96ed 100644
--- a/code/datums/shuttles.dm
+++ b/code/datums/shuttles.dm
@@ -104,6 +104,9 @@
rack.AddComponent(/datum/component/magnetic_catch)
//Whatever special stuff you want
+/datum/map_template/shuttle/proc/post_load(obj/docking_port/mobile/M)
+ return
+
/datum/map_template/shuttle/proc/on_bought()
return
@@ -162,6 +165,10 @@
port_id = "pirate"
can_be_bought = FALSE
+/datum/map_template/shuttle/hunter
+ port_id = "hunter"
+ can_be_bought = FALSE
+
/datum/map_template/shuttle/ruin //For random shuttles in ruins
port_id = "ruin"
can_be_bought = FALSE
@@ -458,6 +465,10 @@
suffix = "whiteship_pod"
name = "Salvage Pod"
+/datum/map_template/shuttle/whiteship/cog
+ suffix = "cog"
+ name = "NT Prisoner Transport"
+
/datum/map_template/shuttle/cargo/box
suffix = "box"
name = "supply shuttle (Box)"
@@ -613,3 +624,15 @@
/datum/map_template/shuttle/snowdin/excavation
suffix = "excavation"
name = "Snowdin Excavation Elevator"
+
+/datum/map_template/shuttle/hunter/space_cop
+ suffix = "space_cop"
+ name = "Police Spacevan"
+
+/datum/map_template/shuttle/hunter/russian
+ suffix = "russian"
+ name = "Russian Cargo Ship"
+
+/datum/map_template/shuttle/hunter/bounty
+ suffix = "bounty"
+ name = "Bounty Hunter Ship"
diff --git a/code/datums/skills/_check_skills.dm b/code/datums/skills/_check_skills.dm
index a94c7c95ba..41939dbee3 100644
--- a/code/datums/skills/_check_skills.dm
+++ b/code/datums/skills/_check_skills.dm
@@ -11,6 +11,66 @@
if(!mind.skill_holder)
to_chat(usr, "How do you check the skills of [(usr == src)? "yourself when you are" : "something"] without the capability for skills? (PROBABLY A BUG, PRESS F1.)")
return
- var/datum/browser/B = new(usr, "skilldisplay_[REF(src)]", "Skills of [src]")
- B.set_content(mind.skill_html_readout())
- B.open()
+
+ mind.skill_holder.ui_interact(src)
+
+/datum/skill_holder/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.always_state)
+ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "SkillPanel", "[owner.name]'s Skills", 620, 580, master_ui, state)
+ ui.set_autoupdate(FALSE) // This UI is only ever opened by one person, and never is updated outside of user input.
+ ui.open()
+ else if(need_static_data_update)
+ update_static_data(user)
+ need_static_data_update = FALSE
+
+/datum/skill_holder/ui_static_data(mob/user)
+ . = list()
+ .["skills"] = list()
+ for(var/path in GLOB.skill_datums)
+ var/datum/skill/S = GLOB.skill_datums[path]
+ var/list/dat = S.get_skill_data(src)
+ if(islist(dat["modifiers"]))
+ dat["modifiers"] = jointext(dat["modifiers"], ", ")
+ dat["percent_base"] = (dat["value_base"] / dat["max_value"])
+ dat["percent_mod"] = (dat["value_mod"] / dat["max_value"])
+ .["skills"] += list(dat)
+
+/datum/skill_holder/ui_data(mob/user)
+ . = list()
+ .["playername"] = owner.name
+ .["see_skill_mods"] = see_skill_mods
+ .["admin"] = check_rights(R_DEBUG, FALSE)
+
+/datum/skill_holder/ui_act(action, params)
+ . = ..()
+ if(.)
+ return
+ switch(action)
+ if("toggle_mods")
+ see_skill_mods = !see_skill_mods
+ return TRUE
+ if ("adj_exp")
+ if(!check_rights(R_DEBUG))
+ return
+ var/skill = text2path(params["skill"])
+ var/number = input("Please insert the amount of experience/progress you'd like to add/subtract:") as num|null
+ if (number)
+ owner.set_skill_value(skill, owner.get_skill_value(skill, FALSE) + number)
+ return TRUE
+ if ("set_exp")
+ if(!check_rights(R_DEBUG))
+ return
+ var/skill = text2path(params["skill"])
+ var/number = input("Please insert the number you want to set the player's exp/progress to:") as num|null
+ if (!isnull(number))
+ owner.set_skill_value(skill, number)
+ return TRUE
+ if ("set_lvl")
+ if(!check_rights(R_DEBUG))
+ return
+ var/datum/skill/level/S = GLOB.skill_datums[text2path(params["skill"])]
+ var/number = input("Please insert a whole number between 0[S.associative ? " ([S.unskilled_tier])" : ""] and [S.max_levels][S.associative ? " ([S.levels[S.max_levels]])" : ""] corresponding to the level you'd like to set the player to.") as num|null
+ if (number >= 0 && number <= S.max_levels)
+ owner.set_skill_value(S.type, S.get_skill_level_value(number))
+ return TRUE
diff --git a/code/datums/skills/_skill.dm b/code/datums/skills/_skill.dm
index 571a8274d8..eecf416b1b 100644
--- a/code/datums/skills/_skill.dm
+++ b/code/datums/skills/_skill.dm
@@ -8,6 +8,7 @@ GLOBAL_LIST_INIT_TYPED(skill_datums, /datum/skill, init_skill_datums())
continue
S = new path
.[S.type] = S
+ . = sortTim(., /proc/cmp_skill_categories, TRUE)
/**
* Skill datums
@@ -32,8 +33,14 @@ GLOBAL_LIST_INIT_TYPED(skill_datums, /datum/skill, init_skill_datums())
var/base_multiplier = 1
/// Value added to the base multiplier depending on overall competency compared to maximum value/level.
var/competency_multiplier = 1
+ /// Experience gain multiplier gained from using items.
+ var/item_skill_gain_multi = 1
+ /// Skill gain quantisation
+ var/skill_gain_quantisation = 0.1
/// A list of ways this skill can affect or be affected through actions and skill modifiers.
var/list/skill_traits = list(SKILL_SANITY, SKILL_INTELLIGENCE)
+ /// Index of this skill in the UI
+ var/ui_category = SKILL_UI_CAT_MISC
/**
* Ensures what someone's setting as a value for this skill is valid.
@@ -57,10 +64,28 @@ GLOBAL_LIST_INIT_TYPED(skill_datums, /datum/skill, init_skill_datums())
return new_value > existing
/**
- * Standard value "render"
+ * Get a list of data used in the skill panel menu.
*/
-/datum/skill/proc/standard_render_value(value, level)
- return value
+/datum/skill/proc/get_skill_data(datum/skill_holder/H)
+ var/skill_value = H.owner.get_skill_value(type, FALSE)
+ . = list(
+ "name" = name,
+ "desc" = desc,
+ "path" = type,
+ "value_base" = skill_value,
+ "value_mod" = skill_value,
+ "modifiers" = "None",
+ "max_value" = 1 //To avoid division by zero later on.
+ )
+ var/list/mods = LAZYACCESS(H.skill_value_mods, type)
+ if(mods)
+ var/list/mod_names = list()
+ for(var/k in mods)
+ var/datum/skill_modifier/M = GLOB.skill_modifiers[k]
+ mod_names |= M.name
+ skill_value = M.apply_modifier(skill_value, type, H, MODIFIER_TARGET_VALUE)
+ .["value_mod"] = skill_value
+ .["modifiers"] = mod_names //Will be jointext()'d later.
// Just saying, the choice to use different sub-parent-types is to force coders to resolve issues as I won't be implementing custom procs to grab skill levels in a certain context.
// Aka: So people don't forget to change checks if they change a skill's progression type.
@@ -71,10 +96,12 @@ GLOBAL_LIST_INIT_TYPED(skill_datums, /datum/skill, init_skill_datums())
competency_thresholds = list(THRESHOLD_COMPETENT = FALSE, THRESHOLD_EXPERT = TRUE, THRESHOLD_MASTER = TRUE)
/datum/skill/binary/sanitize_value(new_value)
- return new_value? TRUE : FALSE
+ return new_value >= 1 ? TRUE : FALSE
-/datum/skill/binary/standard_render_value(value, level)
- return value? "Yes" : "No"
+/datum/skill/binary/get_skill_data(datum/skill_holder/H)
+ . = ..()
+ .["base_readout"] = .["value_base"] ? "Learned: Yes" : "Learned: No"
+ .["mod_readout"] = .["value_mod"] ? "Learned: Yes" : "Learned: No"
/datum/skill/numerical
abstract_type = /datum/skill/numerical
@@ -84,14 +111,19 @@ GLOBAL_LIST_INIT_TYPED(skill_datums, /datum/skill, init_skill_datums())
var/max_value = 100
/// Min value of this skill
var/min_value = 0
- /// Display as a percent in standard_render_value?
- var/display_as_percent = FALSE
+
+/datum/skill/numerical/New()
+ ..()
+ skill_gain_quantisation = item_skill_gain_multi = item_skill_gain_multi * (max_value - min_value) * STD_NUM_SKILL_ITEM_GAIN_MULTI
/datum/skill/numerical/sanitize_value(new_value)
return clamp(new_value, min_value, max_value)
-/datum/skill/numerical/standard_render_value(value, level)
- return display_as_percent? "[round(value/max_value/100, 0.01)]%" : "[value] / [max_value]"
+/datum/skill/numerical/get_skill_data(datum/skill_holder/H)
+ . = ..()
+ .["base_readout"] = "Skill Progress: \[[.["value_base"]] / [max_value]\]"
+ .["mod_readout"] = "Skill Progress: \[[.["value_mod"]] / [max_value]\]"
+ .["max_value"] = max_value
/datum/skill/enum
abstract_type = /datum/skill/enum
@@ -123,13 +155,7 @@ GLOBAL_LIST_INIT_TYPED(skill_datums, /datum/skill, init_skill_datums())
var/max_assoc = ""
var/max_assoc_start = 1
for(var/lvl in 1 to max_levels)
- var/value
- switch(level_up_method)
- if(STANDARD_LEVEL_UP)
- value = XP_LEVEL(standard_xp_lvl_up, xp_lvl_multiplier, lvl)
- if(DWARFY_LEVEL_UP)
- value = DORF_XP_LEVEL(standard_xp_lvl_up, xp_lvl_multiplier, lvl)
- value = round(value, 1)
+ var/value = round(get_skill_level_value(lvl), 1)
if(!associative)
levels += value
continue
@@ -167,8 +193,13 @@ GLOBAL_LIST_INIT_TYPED(skill_datums, /datum/skill, init_skill_datums())
else if(. < 0)
to_chat(M.current, "I feel like I've become worse at [name]!")
-/datum/skill/level/standard_render_value(value, level)
- var/current_lvl = associative ? (!level ? unskilled_tier : levels[level]) : level
+/datum/skill/level/get_skill_data(datum/skill_holder/H)
+ . = ..()
+ var/skill_value_base = .["value_base"]
+ var/skill_value_mod = .["value_mod"]
+ .["level_based"] = TRUE
+
+ var/level = LAZYACCESS(H.skill_levels, type) || 0
var/current_lvl_xp_sum = 0
if(level)
current_lvl_xp_sum = associative ? levels[levels[level]] : levels[level]
@@ -176,8 +207,50 @@ GLOBAL_LIST_INIT_TYPED(skill_datums, /datum/skill, init_skill_datums())
var/next_lvl_xp = associative ? levels[levels[next_index]] : levels[next_index]
if(next_lvl_xp > current_lvl_xp_sum)
next_lvl_xp -= current_lvl_xp_sum
+ .["lvl_base_num"] = .["lvl_mod_num"] = level
+ .["lvl_base"] = .["lvl_mod"] = associative ? (!level ? unskilled_tier : levels[level]) : level
+ .["base_style"] = .["mod_style"] = "font-weight:bold; color:hsl([(level+1)*(350/max_levels+1)], 50%, 50%)"
+ .["xp_next_lvl_base"] = .["xp_next_lvl_mod"] = "\[[skill_value_base - current_lvl_xp_sum]/[next_lvl_xp]\]"
- return "[associative ? current_lvl : "Lvl. [current_lvl]"] ([value - current_lvl_xp_sum]/[next_lvl_xp])[level == max_levels ? " \[MAX!\]" : ""]"
+ .["max_lvl"] = max_levels
+ var/max_value = associative ? levels[levels[max_levels]] : levels[max_levels]
+ .["max_value"] = max_value
+
+ .["base_readout"] = "Overall Skill Progress: \[[skill_value_base]/[max_value]\]"
+ .["mod_readout"] = "Overall Skill Progress: \[[skill_value_mod]/[max_value]\]"
+
+ var/list/mods = LAZYACCESS(H.skill_level_mods, type)
+ if(mods) //I'm not proud of doing the same-ish process twice a row but here we go.
+ var/list/mod_names = .["modifiers"]
+ if(!mod_names)
+ .["modifiers"] = mod_names = list()
+ for(var/k in mods)
+ var/datum/skill_modifier/M = GLOB.skill_modifiers[k]
+ mod_names |= M.name
+ level = M.apply_modifier(level, type, H, MODIFIER_TARGET_LEVEL)
+
+ if(level)
+ current_lvl_xp_sum = associative ? levels[levels[level]] : levels[level]
+ else
+ current_lvl_xp_sum = 0
+ next_index = min(max_levels, level+1)
+ next_lvl_xp = associative ? levels[levels[next_index]] : levels[next_index]
+ if(next_lvl_xp > current_lvl_xp_sum)
+ next_lvl_xp -= current_lvl_xp_sum
+ .["lvl_mod_num"] = level
+ .["lvl_mod"] = associative ? (!level ? unskilled_tier : levels[level]) : level
+ .["mod_style"] = "font-weight:bold; color:hsl([(level+1)*(300/(max_levels+1))], 50%, 50%)"
+ .["xp_next_lvl_mod"] = "\[[skill_value_mod - current_lvl_xp_sum]/[next_lvl_xp]\]"
+
+/**
+ * Gets the base value required to reach a level specified by the 'num' arg.
+ */
+/datum/skill/level/proc/get_skill_level_value(num)
+ switch(level_up_method)
+ if(STANDARD_LEVEL_UP)
+ . = XP_LEVEL(standard_xp_lvl_up, xp_lvl_multiplier, num)
+ if(DWARFY_LEVEL_UP)
+ . = DORF_XP_LEVEL(standard_xp_lvl_up, xp_lvl_multiplier, num)
/datum/skill/level/job
abstract_type = /datum/skill/level/job
diff --git a/code/datums/skills/_skill_holder.dm b/code/datums/skills/_skill_holder.dm
index 0a5c4f8f58..73748417c3 100644
--- a/code/datums/skills/_skill_holder.dm
+++ b/code/datums/skills/_skill_holder.dm
@@ -20,6 +20,18 @@
var/list/original_values
var/list/original_affinities
var/list/original_levels
+ /// The mind datum this skill is associated with, only used for the check_skills UI
+ var/datum/mind/owner
+ /// For UI updates.
+ var/need_static_data_update = TRUE
+ /// Whether modifiers and final skill values or only base values are displayed.
+ var/see_skill_mods = TRUE
+ /// The current selected skill category.
+ var/selected_category
+
+/datum/skill_holder/New(owner)
+ ..()
+ src.owner = owner
/**
* Grabs the value of a skill.
@@ -82,6 +94,7 @@
if(!isnull(value))
LAZYINITLIST(skill_holder.skills)
S.set_skill_value(skill_holder, value, src, silent)
+ skill_holder.need_static_data_update = TRUE
return TRUE
return FALSE
@@ -107,11 +120,9 @@
CRASH("You cannot auto increment a non numerical(experience skill!")
var/current = get_skill_value(skill, FALSE)
var/affinity = get_skill_affinity(skill)
- var/target_value = current + (value * affinity)
- if(maximum)
- target_value = min(target_value, maximum)
- if(target_value == maximum) //no more experience to gain, early return.
- return
+ var/target_value = round(current + (value * affinity), S.skill_gain_quantisation)
+ if(maximum && target_value >= maximum) //no more experience to gain, early return.
+ return
boost_skill_value_to(skill, target_value, silent, current)
/**
@@ -183,18 +194,3 @@
divisor++
if(divisor)
. = modifier_is_multiplier ? value*(sum/divisor) : value/(sum/divisor)
-
-/**
- * Generates a HTML readout of our skills.
- * Port to tgui-next when?
- */
-/datum/mind/proc/skill_html_readout()
- var/list/out = list("
"
- return out.Join("")
diff --git a/code/datums/skills/_skill_modifier.dm b/code/datums/skills/_skill_modifier.dm
index a28cf3aebd..c38cbf23c6 100644
--- a/code/datums/skills/_skill_modifier.dm
+++ b/code/datums/skills/_skill_modifier.dm
@@ -7,6 +7,8 @@ GLOBAL_LIST_EMPTY(potential_mods_per_skill)
* and cause lots of edge cases. These are fairly simple overall... make a subtype though, don't use this one.
*/
/datum/skill_modifier
+ /// Name and description of the skill modifier, used in the UI
+ var/name = "???"
/// flags for this skill modifier.
var/modifier_flags = NONE
/// target skills, can be a specific skill typepath or a list of skill traits.
@@ -110,6 +112,7 @@ GLOBAL_LIST_EMPTY(potential_mods_per_skill)
if(M.modifier_flags & MODIFIER_SKILL_LEVEL)
ADD_MOD_STEP(skill_holder.skill_level_mods, path, skill_holder.original_levels, get_skill_level(path, FALSE))
LAZYSET(skill_holder.all_current_skill_modifiers, id, TRUE)
+ skill_holder.need_static_data_update = TRUE
if(M.modifier_flags & MODIFIER_SKILL_BODYBOUND)
M.RegisterSignal(src, COMSIG_MIND_TRANSFER, /datum/skill_modifier.proc/on_mind_transfer)
@@ -141,6 +144,7 @@ GLOBAL_LIST_EMPTY(potential_mods_per_skill)
if(M.modifier_flags & MODIFIER_SKILL_LEVEL && skill_holder.skill_level_mods)
REMOVE_MOD_STEP(skill_holder.skill_level_mods, path, skill_holder.original_levels)
LAZYREMOVE(skill_holder.all_current_skill_modifiers, id)
+ skill_holder.need_static_data_update = TRUE
if(!mind_transfer && M.modifier_flags & MODIFIER_SKILL_BODYBOUND)
M.UnregisterSignal(src, COMSIG_MIND_TRANSFER)
@@ -165,11 +169,7 @@ GLOBAL_LIST_EMPTY(potential_mods_per_skill)
var/datum/skill/S = GLOB.skill_datums[skillpath]
if(method == MODIFIER_TARGET_VALUE && S.progression_type == SKILL_PROGRESSION_LEVEL)
var/datum/skill/level/L = S
- switch(L.level_up_method)
- if(STANDARD_LEVEL_UP)
- mod = XP_LEVEL(L.standard_xp_lvl_up, L.xp_lvl_multiplier, S.competency_thresholds[mod])
- if(DWARFY_LEVEL_UP)
- mod = DORF_XP_LEVEL(L.standard_xp_lvl_up, L.xp_lvl_multiplier, S.competency_thresholds[mod])
+ mod = L.get_skill_level_value(L.competency_thresholds[mod])
else
mod = S.competency_thresholds[mod]
diff --git a/code/datums/skills/engineering.dm b/code/datums/skills/engineering.dm
index db7b33450c..1226664953 100644
--- a/code/datums/skills/engineering.dm
+++ b/code/datums/skills/engineering.dm
@@ -1,5 +1,6 @@
/datum/skill/level/job/wiring
name = "Wiring"
- desc = "How proficient and knowledged you are at wiring beyond laying cables on the floor."
+ desc = "How proficient and knowledged you are at wiring beyond making post-futuristic wire art."
name_color = COLOR_PALE_ORANGE
skill_traits = list(SKILL_SANITY, SKILL_INTELLIGENCE, SKILL_USE_TOOL, SKILL_TRAINING_TOOL)
+ ui_category = SKILL_UI_CAT_ENG
diff --git a/code/datums/skills/medical.dm b/code/datums/skills/medical.dm
index 404c141157..4cf10c4c96 100644
--- a/code/datums/skills/medical.dm
+++ b/code/datums/skills/medical.dm
@@ -1,5 +1,6 @@
/datum/skill/numerical/surgery
name = "Surgery"
- desc = "How proficient you are at doing surgery."
+ desc = "How proficient you are at performing surgical procedures."
name_color = COLOR_PALE_BLUE_GRAY
competency_multiplier = 1.5 // 60% surgery speed up at max value of 100, considering the base multiplier.
+ ui_category = SKILL_UI_CAT_MED
diff --git a/code/datums/skills/modifiers/job.dm b/code/datums/skills/modifiers/job.dm
index 7d79ae89b3..e989ab11e3 100644
--- a/code/datums/skills/modifiers/job.dm
+++ b/code/datums/skills/modifiers/job.dm
@@ -1,6 +1,7 @@
/// Jobbie skill modifiers.
/datum/skill_modifier/job
+ name = "Job Training"
modifier_flags = MODIFIER_SKILL_VALUE|MODIFIER_SKILL_VIRTUE|MODIFIER_SKILL_ORIGIN_DIFF
priority = MODIFIER_SKILL_PRIORITY_MAX
@@ -23,7 +24,7 @@
modifier_flags = MODIFIER_SKILL_VALUE|MODIFIER_SKILL_LEVEL|MODIFIER_SKILL_VIRTUE|MODIFIER_SKILL_ORIGIN_DIFF
level_mod = JOB_SKILL_TRAINED
-/datum/skill_modifier/job/level/New(id)
+/datum/skill_modifier/job/level/New(id, register = FALSE)
if(level_mod)
value_mod = GET_STANDARD_LVL(level_mod)
..()
diff --git a/code/datums/skills/modifiers/mood.dm b/code/datums/skills/modifiers/mood.dm
index 30f24afcc4..a22b75d5b5 100644
--- a/code/datums/skills/modifiers/mood.dm
+++ b/code/datums/skills/modifiers/mood.dm
@@ -1,8 +1,10 @@
/datum/skill_modifier/bad_mood
+ name = "Mood (Dejected)"
modifier_flags = MODIFIER_SKILL_VALUE|MODIFIER_SKILL_LEVEL|MODIFIER_SKILL_MULT|MODIFIER_SKILL_BODYBOUND
target_skills = list(SKILL_SANITY)
/datum/skill_modifier/great_mood
+ name = "Mood (Elated)"
modifier_flags = MODIFIER_SKILL_AFFINITY|MODIFIER_SKILL_MULT|MODIFIER_SKILL_BODYBOUND
target_skills = list(SKILL_SANITY)
affinity_mod = 1.2
diff --git a/code/datums/skills/modifiers/organs.dm b/code/datums/skills/modifiers/organs.dm
index 13ebaf0658..313604f6b2 100644
--- a/code/datums/skills/modifiers/organs.dm
+++ b/code/datums/skills/modifiers/organs.dm
@@ -1,4 +1,5 @@
/datum/skill_modifier/brain_damage
+ name = "Brain Damage"
target_skills = list(SKILL_INTELLIGENCE)
modifier_flags = MODIFIER_SKILL_VALUE|MODIFIER_SKILL_AFFINITY|MODIFIER_SKILL_LEVEL|MODIFIER_SKILL_MULT|MODIFIER_SKILL_BODYBOUND
value_mod = 0.85
@@ -6,6 +7,7 @@
affinity_mod = 0.85
/datum/skill_modifier/heavy_brain_damage
+ name = "Brain Damage (Severe)"
target_skills = list(SKILL_INTELLIGENCE)
modifier_flags = MODIFIER_SKILL_VALUE|MODIFIER_SKILL_AFFINITY|MODIFIER_SKILL_LEVEL|MODIFIER_SKILL_BODYBOUND|MODIFIER_SKILL_HANDICAP|MODIFIER_USE_THRESHOLDS
priority = MODIFIER_SKILL_PRIORITY_LOW
diff --git a/code/datums/spawners_menu.dm b/code/datums/spawners_menu.dm
index 1adcb6fde6..d66445b8a1 100644
--- a/code/datums/spawners_menu.dm
+++ b/code/datums/spawners_menu.dm
@@ -9,7 +9,7 @@
/datum/spawners_menu/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.observer_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
- ui = new(user, src, ui_key, "spawners_menu", "Spawners Menu", 700, 600, master_ui, state)
+ ui = new(user, src, ui_key, "SpawnersMenu", "Spawners Menu", 700, 600, master_ui, state)
ui.open()
/datum/spawners_menu/ui_data(mob/user)
diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm
index e080e597a3..179ed765c5 100644
--- a/code/datums/status_effects/buffs.dm
+++ b/code/datums/status_effects/buffs.dm
@@ -441,6 +441,10 @@
owner.adjustBruteLoss(-10, FALSE)
owner.adjustFireLoss(-5, FALSE)
owner.adjustOxyLoss(-10)
+ if(!iscarbon(owner))
+ return
+ var/mob/living/carbon/C = owner
+ QDEL_LIST(C.all_scars)
/obj/screen/alert/status_effect/fleshmend
name = "Fleshmend"
diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm
index b976ac0fc8..407047410b 100644
--- a/code/datums/status_effects/debuffs.dm
+++ b/code/datums/status_effects/debuffs.dm
@@ -81,11 +81,11 @@
owner.adjustStaminaLoss(-0.5) //reduce stamina loss by 0.5 per tick, 10 per 2 seconds
if(human_owner && human_owner.drunkenness)
human_owner.drunkenness *= 0.997 //reduce drunkenness by 0.3% per tick, 6% per 2 seconds
- if(prob(20))
- if(carbon_owner)
- carbon_owner.handle_dreams()
- if(prob(10) && owner.health > owner.crit_threshold)
- owner.emote("snore")
+ if(carbon_owner && !carbon_owner.dreaming && prob(2))
+ carbon_owner.dream()
+ // 2% per second, tick interval is in deciseconds
+ if(prob((tick_interval+1) * 0.2) && owner.health > owner.crit_threshold)
+ owner.emote("snore")
/datum/status_effect/staggered
id = "staggered"
@@ -97,6 +97,21 @@
duration = set_duration
return ..()
+/datum/status_effect/off_balance
+ id = "offbalance"
+ alert_type = null
+
+/datum/status_effect/off_balance/on_creation(mob/living/new_owner, set_duration)
+ if(isnum(set_duration))
+ duration = set_duration
+ return ..()
+
+/datum/status_effect/off_balance/on_remove()
+ var/active_item = owner.get_active_held_item()
+ if(is_type_in_typecache(active_item, GLOB.shove_disarming_types))
+ owner.visible_message("[owner.name] regains their grip on \the [active_item]!", "You regain your grip on \the [active_item]", null, COMBAT_MESSAGE_RANGE)
+ return ..()
+
/obj/screen/alert/status_effect/asleep
name = "Asleep"
desc = "You've fallen asleep. Wait a bit and you should wake up. Unless you don't, considering how helpless you are."
@@ -144,7 +159,6 @@
id = "tased"
alert_type = null
var/movespeed_mod = /datum/movespeed_modifier/status_effect/tased
- var/nextmove_modifier = 1
var/stamdmg_per_ds = 0 //a 20 duration would do 20 stamdmg, disablers do 24 or something
var/last_tick = 0 //fastprocess processing speed is a goddamn sham, don't trust it.
@@ -173,13 +187,9 @@
C.adjustStaminaLoss(max(0, stamdmg_per_ds * diff)) //if you really want to try to stamcrit someone with a taser alone, you can, but it'll take time and good timing.
last_tick = world.time
-/datum/status_effect/electrode/nextmove_modifier() //why is this a proc. its no big deal since this doesnt get called often at all but literally w h y
- return nextmove_modifier
-
/datum/status_effect/electrode/no_combat_mode
id = "tased_strong"
movespeed_mod = /datum/movespeed_modifier/status_effect/tased/no_combat_mode
- nextmove_modifier = 2
blocks_combatmode = TRUE
stamdmg_per_ds = 1
@@ -365,9 +375,9 @@
status_type = STATUS_EFFECT_REPLACE
alert_type = null
var/mutable_appearance/marked_underlay
- var/obj/item/twohanded/kinetic_crusher/hammer_synced
+ var/obj/item/kinetic_crusher/hammer_synced
-/datum/status_effect/crusher_mark/on_creation(mob/living/new_owner, obj/item/twohanded/kinetic_crusher/new_hammer_synced)
+/datum/status_effect/crusher_mark/on_creation(mob/living/new_owner, obj/item/kinetic_crusher/new_hammer_synced)
. = ..()
if(.)
hammer_synced = new_hammer_synced
@@ -430,10 +440,19 @@
/datum/status_effect/neck_slice/tick()
var/mob/living/carbon/human/H = owner
- if(H.stat == DEAD || H.bleed_rate <= 8)
+ var/obj/item/bodypart/throat = H.get_bodypart(BODY_ZONE_HEAD)
+ if(H.stat == DEAD || !throat)
H.remove_status_effect(/datum/status_effect/neck_slice)
if(prob(10))
H.emote(pick("gasp", "gag", "choke"))
+ var/still_bleeding = FALSE
+ for(var/thing in throat.wounds)
+ var/datum/wound/W = thing
+ if(W.wound_type == WOUND_LIST_CUT && W.severity > WOUND_SEVERITY_MODERATE)
+ still_bleeding = TRUE
+ break
+ if(!still_bleeding)
+ H.remove_status_effect(/datum/status_effect/neck_slice)
/mob/living/proc/apply_necropolis_curse(set_curse, duration = 10 MINUTES)
var/datum/status_effect/necropolis_curse/C = has_status_effect(STATUS_EFFECT_NECROPOLIS_CURSE)
@@ -711,8 +730,9 @@ datum/status_effect/pacify
if(hearing_args[HEARING_SPEAKER] == owner)
return
var/mob/living/carbon/C = owner
+ var/hypnomsg = uncostumize_say(hearing_args[HEARING_RAW_MESSAGE], hearing_args[HEARING_MESSAGE_MODE])
C.cure_trauma_type(/datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY) //clear previous hypnosis
- addtimer(CALLBACK(C, /mob/living/carbon.proc/gain_trauma, /datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY, hearing_args[HEARING_RAW_MESSAGE]), 10)
+ addtimer(CALLBACK(C, /mob/living/carbon.proc/gain_trauma, /datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY, hypnomsg), 10)
addtimer(CALLBACK(C, /mob/living.proc/Stun, 60, TRUE, TRUE), 15) //Take some time to think about it
qdel(src)
@@ -795,3 +815,44 @@ datum/status_effect/pacify
name = "Genetic Breakdown"
desc = "I don't feel so good. Your body can't handle the mutations! You have one minute to remove your mutations, or you will be met with a horrible fate."
icon_state = "dna_melt"
+
+/datum/status_effect/fake_virus
+ id = "fake_virus"
+ duration = 1800//3 minutes
+ status_type = STATUS_EFFECT_REPLACE
+ tick_interval = 1
+ alert_type = null
+ var/msg_stage = 0//so you dont get the most intense messages immediately
+
+/datum/status_effect/fake_virus/tick()
+ var/fake_msg = ""
+ var/fake_emote = ""
+ switch(msg_stage)
+ if(0 to 300)
+ if(prob(1))
+ fake_msg = pick("[pick("Your head hurts.", "Your head pounds.")]",
+ "[pick("You're having difficulty breathing.", "Your breathing becomes heavy.")]",
+ "[pick("You feel dizzy.", "Your head spins.")]",
+ "[pick("You swallow excess mucus.", "You lightly cough.")]",
+ "[pick("Your head hurts.", "Your mind blanks for a moment.")]",
+ "[pick("Your throat hurts.", "You clear your throat.")]")
+ if(301 to 600)
+ if(prob(2))
+ fake_msg = pick("[pick("Your head hurts a lot.", "Your head pounds incessantly.")]",
+ "[pick("Your windpipe feels like a straw.", "Your breathing becomes tremendously difficult.")]",
+ "You feel very [pick("dizzy","woozy","faint")].",
+ "[pick("You hear a ringing in your ear.", "Your ears pop.")]",
+ "You nod off for a moment.")
+ else
+ if(prob(3))
+ if(prob(50))// coin flip to throw a message or an emote
+ fake_msg = pick("[pick("Your head hurts!", "You feel a burning knife inside your brain!", "A wave of pain fills your head!")]",
+ "[pick("Your lungs hurt!", "It hurts to breathe!")]",
+ "[pick("You feel nauseated.", "You feel like you're going to throw up!")]")
+ else
+ fake_emote = pick("cough", "sniff", "sneeze")
+ if(fake_emote)
+ owner.emote(fake_emote)
+ else if(fake_msg)
+ to_chat(owner, fake_msg)
+ msg_stage++
diff --git a/code/datums/status_effects/status_effect.dm b/code/datums/status_effects/status_effect.dm
index 33c8384d72..461ae9c65d 100644
--- a/code/datums/status_effects/status_effect.dm
+++ b/code/datums/status_effects/status_effect.dm
@@ -6,6 +6,7 @@
var/id = "effect" //Used for screen alerts.
var/duration = -1 //How long the status effect lasts in DECISECONDS. Enter -1 for an effect that never ends unless removed through some means.
var/tick_interval = 10 //How many deciseconds between ticks, approximately. Leave at 10 for every second.
+ var/next_tick //The scheduled time for the next tick.
var/mob/living/owner //The mob affected by the status effect.
var/on_remove_on_mob_delete = FALSE //if we call on_remove() when the mob is deleted
var/examine_text //If defined, this text will appear when the mob is examined - to use he, she etc. use "SUBJECTPRONOUN" and replace it in the examines themselves
@@ -31,7 +32,7 @@
return
if(duration != -1)
duration = world.time + duration
- tick_interval = world.time + tick_interval
+ next_tick = world.time + tick_interval
if(alert_type)
var/obj/screen/alert/status_effect/A = owner.throw_alert(id, alert_type)
A.attached_effect = src //so the alert can reference us, if it needs to
@@ -52,9 +53,9 @@
if(!owner)
qdel(src)
return
- if(tick_interval < world.time)
+ if(next_tick < world.time)
tick()
- tick_interval = world.time + initial(tick_interval)
+ next_tick = world.time + tick_interval
if(duration != -1 && duration < world.time)
qdel(src)
@@ -89,13 +90,12 @@
return
duration = world.time + original_duration
-//clickdelay/nextmove modifiers!
-/datum/status_effect/proc/nextmove_modifier()
+/**
+ * Multiplied to clickdelays
+ */
+/datum/status_effect/proc/action_cooldown_mod()
return 1
-/datum/status_effect/proc/nextmove_adjust()
- return 0
-
////////////////
// ALERT HOOK //
////////////////
@@ -221,7 +221,7 @@
threshold_crossed = FALSE //resets threshold effect if we fall below threshold so threshold effect can trigger again
on_threshold_drop()
if(stacks_added > 0)
- tick_interval += delay_before_decay //refreshes time until decay
+ next_tick += delay_before_decay //refreshes time until decay
stacks = min(stacks, max_stacks)
status_overlay.icon_state = "[overlay_state][stacks]"
status_underlay.icon_state = "[underlay_state][stacks]"
@@ -278,3 +278,7 @@
/datum/status_effect/grouped/before_remove(source)
sources -= source
return !length(sources)
+
+//do_after modifier!
+/datum/status_effect/proc/interact_speed_modifier()
+ return 1
diff --git a/code/datums/status_effects/wound_effects.dm b/code/datums/status_effects/wound_effects.dm
new file mode 100644
index 0000000000..91440d36de
--- /dev/null
+++ b/code/datums/status_effects/wound_effects.dm
@@ -0,0 +1,188 @@
+
+// The shattered remnants of your broken limbs fill you with determination!
+/obj/screen/alert/status_effect/determined
+ name = "Determined"
+ desc = "The serious wounds you've sustained have put your body into fight-or-flight mode! Now's the time to look for an exit!"
+ icon_state = "regenerative_core"
+
+/datum/status_effect/determined
+ id = "determined"
+ alert_type = /obj/screen/alert/status_effect/determined
+
+/datum/status_effect/determined/on_apply()
+ . = ..()
+ owner.visible_message("[owner] grits [owner.p_their()] teeth in pain!", "Your senses sharpen as your body tenses up from the wounds you've sustained!", vision_distance=COMBAT_MESSAGE_RANGE)
+
+/datum/status_effect/determined/on_remove()
+ owner.visible_message("[owner]'s body slackens noticeably!", "Your adrenaline rush dies off, and the pain from your wounds come aching back in...", vision_distance=COMBAT_MESSAGE_RANGE)
+ return ..()
+
+/datum/status_effect/limp
+ id = "limp"
+ status_type = STATUS_EFFECT_REPLACE
+ tick_interval = 10
+ alert_type = /obj/screen/alert/status_effect/limp
+ var/msg_stage = 0//so you dont get the most intense messages immediately
+ /// The left leg of the limping person
+ var/obj/item/bodypart/l_leg/left
+ /// The right leg of the limping person
+ var/obj/item/bodypart/r_leg/right
+ /// Which leg we're limping with next
+ var/obj/item/bodypart/next_leg
+ /// How many deciseconds we limp for on the left leg
+ var/slowdown_left = 0
+ /// How many deciseconds we limp for on the right leg
+ var/slowdown_right = 0
+
+/datum/status_effect/limp/on_apply()
+ if(!iscarbon(owner))
+ return FALSE
+ var/mob/living/carbon/C = owner
+ left = C.get_bodypart(BODY_ZONE_L_LEG)
+ right = C.get_bodypart(BODY_ZONE_R_LEG)
+ update_limp()
+ RegisterSignal(C, COMSIG_MOVABLE_MOVED, .proc/check_step)
+ RegisterSignal(C, list(COMSIG_CARBON_GAIN_WOUND, COMSIG_CARBON_LOSE_WOUND, COMSIG_CARBON_ATTACH_LIMB, COMSIG_CARBON_REMOVE_LIMB), .proc/update_limp)
+ return ..()
+
+/datum/status_effect/limp/on_remove()
+ UnregisterSignal(owner, list(COMSIG_MOVABLE_MOVED, COMSIG_CARBON_GAIN_WOUND, COMSIG_CARBON_LOSE_WOUND, COMSIG_CARBON_ATTACH_LIMB, COMSIG_CARBON_REMOVE_LIMB))
+ return ..()
+
+/obj/screen/alert/status_effect/limp
+ name = "Limping"
+ desc = "One or more of your legs has been wounded, slowing down steps with that leg! Get it fixed, or at least splinted!"
+
+/datum/status_effect/limp/proc/check_step(mob/whocares, OldLoc, Dir, forced)
+ if(!owner.client || !(owner.mobility_flags & MOBILITY_STAND) || !owner.has_gravity() || (owner.movement_type & FLYING) || forced)
+ return
+ var/determined_mod = 1
+ if(owner.has_status_effect(STATUS_EFFECT_DETERMINED))
+ determined_mod = 0.25
+ if(next_leg == left)
+ owner.client.move_delay += slowdown_left * determined_mod
+ next_leg = right
+ else
+ owner.client.move_delay += slowdown_right * determined_mod
+ next_leg = left
+
+/datum/status_effect/limp/proc/update_limp()
+ var/mob/living/carbon/C = owner
+ left = C.get_bodypart(BODY_ZONE_L_LEG)
+ right = C.get_bodypart(BODY_ZONE_R_LEG)
+
+ if(!left && !right)
+ C.remove_status_effect(src)
+ return
+
+ slowdown_left = 0
+ slowdown_right = 0
+
+ if(left)
+ for(var/thing in left.wounds)
+ var/datum/wound/W = thing
+ slowdown_left += W.limp_slowdown
+
+ if(right)
+ for(var/thing in right.wounds)
+ var/datum/wound/W = thing
+ slowdown_right += W.limp_slowdown
+
+ // this handles losing your leg with the limp and the other one being in good shape as well
+ if(!slowdown_left && !slowdown_right)
+ C.remove_status_effect(src)
+ return
+
+
+/////////////////////////
+//////// WOUNDS /////////
+/////////////////////////
+
+// wound alert
+/obj/screen/alert/status_effect/wound
+ name = "Wounded"
+ desc = "Your body has sustained serious damage, click here to inspect yourself."
+
+/obj/screen/alert/status_effect/wound/Click()
+ var/mob/living/carbon/C = usr
+ C.check_self_for_injuries()
+
+// wound status effect base
+/datum/status_effect/wound
+ id = "wound"
+ status_type = STATUS_EFFECT_MULTIPLE
+ var/obj/item/bodypart/linked_limb
+ var/datum/wound/linked_wound
+ alert_type = NONE
+
+/datum/status_effect/wound/on_creation(mob/living/new_owner, incoming_wound)
+ . = ..()
+ var/datum/wound/W = incoming_wound
+ linked_wound = W
+ linked_limb = linked_wound.limb
+
+/datum/status_effect/wound/on_remove()
+ linked_wound = null
+ linked_limb = null
+ UnregisterSignal(owner, COMSIG_CARBON_LOSE_WOUND)
+ return ..()
+
+/datum/status_effect/wound/on_apply()
+ if(!iscarbon(owner))
+ return FALSE
+ RegisterSignal(owner, COMSIG_CARBON_LOSE_WOUND, .proc/check_remove)
+ return ..()
+
+/// check if the wound getting removed is the wound we're tied to
+/datum/status_effect/wound/proc/check_remove(mob/living/L, datum/wound/W)
+ if(W == linked_wound)
+ qdel(src)
+
+
+// bones
+/datum/status_effect/wound/bone
+
+/datum/status_effect/wound/bone/interact_speed_modifier()
+ var/mob/living/carbon/C = owner
+
+ if(C.get_active_hand() == linked_limb)
+ to_chat(C, "The [lowertext(linked_wound)] in your [linked_limb.name] slows your progress!")
+ return linked_wound.interaction_efficiency_penalty
+
+ return 1
+
+/datum/status_effect/wound/bone/action_cooldown_mod()
+ var/mob/living/carbon/C = owner
+
+ if(C.get_active_hand() == linked_limb)
+ return linked_wound.interaction_efficiency_penalty
+
+ return 1
+
+/datum/status_effect/wound/bone/moderate
+ id = "disjoint"
+/datum/status_effect/wound/bone/severe
+ id = "hairline"
+
+/datum/status_effect/wound/bone/critical
+ id = "compound"
+
+// cuts
+/datum/status_effect/wound/cut/moderate
+ id = "abrasion"
+
+/datum/status_effect/wound/cut/severe
+ id = "laceration"
+
+/datum/status_effect/wound/cut/critical
+ id = "avulsion"
+
+// burns
+/datum/status_effect/wound/burn/moderate
+ id = "seconddeg"
+
+/datum/status_effect/wound/burn/severe
+ id = "thirddeg"
+
+/datum/status_effect/wound/burn/critical
+ id = "fourthdeg"
diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm
index 9c2128163f..87126ae28f 100644
--- a/code/datums/traits/negative.dm
+++ b/code/datums/traits/negative.dm
@@ -56,7 +56,7 @@ GLOBAL_LIST_EMPTY(family_heirlooms)
if("Medical Doctor")
heirloom_type = /obj/item/healthanalyzer/advanced
if("Paramedic")
- heirloom_type = pick(/obj/item/clothing/neck/stethoscope, /obj/item/bodybag)
+ heirloom_type = /obj/item/lighter
if("Station Engineer")
heirloom_type = /obj/item/wirecutters/brass
if("Atmospheric Technician")
@@ -314,6 +314,13 @@ GLOBAL_LIST_EMPTY(family_heirlooms)
medical_record_text = "Patient is usually anxious in social encounters and prefers to avoid them."
var/dumb_thing = TRUE
+/datum/quirk/social_anxiety/add()
+ RegisterSignal(quirk_holder, COMSIG_MOB_EYECONTACT, .proc/eye_contact)
+ RegisterSignal(quirk_holder, COMSIG_MOB_EXAMINATE, .proc/looks_at_floor)
+
+/datum/quirk/social_anxiety/remove()
+ UnregisterSignal(quirk_holder, list(COMSIG_MOB_EYECONTACT, COMSIG_MOB_EXAMINATE))
+
/datum/quirk/social_anxiety/on_process()
var/nearby_people = 0
for(var/mob/living/carbon/human/H in oview(3, quirk_holder))
@@ -330,6 +337,45 @@ GLOBAL_LIST_EMPTY(family_heirlooms)
dumb_thing = FALSE //only once per life
if(prob(1))
new/obj/item/reagent_containers/food/snacks/pastatomato(get_turf(H)) //now that's what I call spaghetti code
+// small chance to make eye contact with inanimate objects/mindless mobs because of nerves
+
+
+
+/datum/quirk/social_anxiety/proc/looks_at_floor(datum/source, atom/A)
+ var/mob/living/mind_check = A
+ if(prob(85) || (istype(mind_check) && mind_check.mind))
+ return
+
+ addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, quirk_holder, "You make eye contact with [A]."), 3)
+
+/datum/quirk/social_anxiety/proc/eye_contact(datum/source, mob/living/other_mob, triggering_examiner)
+ if(prob(75))
+ return
+ var/msg
+ if(triggering_examiner)
+ msg = "You make eye contact with [other_mob], "
+ else
+ msg = "[other_mob] makes eye contact with you, "
+
+ switch(rand(1,3))
+ if(1)
+ quirk_holder.Jitter(10)
+ msg += "causing you to start fidgeting!"
+ if(2)
+ quirk_holder.stuttering = max(3, quirk_holder.stuttering)
+ msg += "causing you to start stuttering!"
+ if(3)
+ quirk_holder.Stun(2 SECONDS)
+ msg += "causing you to freeze up!"
+
+ SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "anxiety_eyecontact", /datum/mood_event/anxiety_eyecontact)
+ addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, quirk_holder, "[msg]"), 3) // so the examine signal has time to fire and this will print after
+ return COMSIG_BLOCK_EYECONTACT
+
+/datum/mood_event/anxiety_eyecontact
+ description = "Sometimes eye contact makes me so nervous...\n"
+ mood_change = -5
+ timeout = 3 MINUTES
/datum/quirk/phobia
name = "Phobia"
@@ -406,3 +452,21 @@ GLOBAL_LIST_EMPTY(family_heirlooms)
mob_trait = TRAIT_COLDBLOODED
gain_text = "You feel cold-blooded."
lose_text = "You feel more warm-blooded."
+
+/datum/quirk/monophobia
+ name = "Monophobia"
+ desc = "You will become increasingly stressed when not in company of others, triggering panic reactions ranging from sickness to heart attacks."
+ value = -3 // Might change it to 4.
+ gain_text = "You feel really lonely..."
+ lose_text = "You feel like you could be safe on your own."
+ medical_record_text = "Patient feels sick and distressed when not around other people, leading to potentially lethal levels of stress."
+
+/datum/quirk/monophobia/post_add()
+ . = ..()
+ var/mob/living/carbon/human/H = quirk_holder
+ H.gain_trauma(/datum/brain_trauma/severe/monophobia, TRAUMA_RESILIENCE_ABSOLUTE)
+
+/datum/quirk/monophobia/remove()
+ . = ..()
+ var/mob/living/carbon/human/H = quirk_holder
+ H?.cure_trauma_type(/datum/brain_trauma/severe/monophobia, TRAUMA_RESILIENCE_ABSOLUTE)
diff --git a/code/datums/traits/neutral.dm b/code/datums/traits/neutral.dm
index 4b039aa1b5..e92564a3b4 100644
--- a/code/datums/traits/neutral.dm
+++ b/code/datums/traits/neutral.dm
@@ -122,3 +122,19 @@
if(H)
var/datum/species/species = H.dna.species
species.disliked_food &= ~ALCOHOL
+
+/datum/quirk/longtimer
+ name = "Longtimer"
+ desc = "You've been around for a long time and seen more than your fair share of action, suffering some pretty nasty scars along the way. For whatever reason, you've declined to get them removed or augmented."
+ value = 0
+ gain_text = "Your body has seen better days."
+ lose_text = "Your sins may wash away, but those scars are here to stay..."
+ medical_record_text = "Patient has withstood significant physical trauma and declined plastic surgery procedures to heal scarring."
+ /// the minimum amount of scars we can generate
+ var/min_scars = 3
+ /// the maximum amount of scars we can generate
+ var/max_scars = 7
+
+/datum/quirk/longtimer/on_spawn()
+ var/mob/living/carbon/C = quirk_holder
+ C.generate_fake_scars(rand(min_scars, max_scars))
diff --git a/code/datums/wires/_wires.dm b/code/datums/wires/_wires.dm
index 11e7e12bd8..75bd4f5c17 100644
--- a/code/datums/wires/_wires.dm
+++ b/code/datums/wires/_wires.dm
@@ -242,8 +242,8 @@
/datum/wires/ui_interact(mob/user, ui_key = "wires", datum/tgui/ui = null, force_open = FALSE, \
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.physical_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
- if(!ui)
- ui = new(user, src, ui_key, "wires", "[holder.name] Wires", 350, 150 + wires.len * 30, master_ui, state)
+ if (!ui)
+ ui = new(user, src, ui_key, "Wires", "[holder.name] Wires", 350, 150 + wires.len * 30, master_ui, state)
ui.open()
/datum/wires/ui_data(mob/user)
diff --git a/code/datums/wires/explosive.dm b/code/datums/wires/explosive.dm
index dc4db9e85d..25493f2e30 100644
--- a/code/datums/wires/explosive.dm
+++ b/code/datums/wires/explosive.dm
@@ -75,8 +75,8 @@
/datum/wires/explosive/gibtonite
- holder_type = /obj/item/twohanded/required/gibtonite
+ holder_type = /obj/item/gibtonite
/datum/wires/explosive/gibtonite/explode()
- var/obj/item/twohanded/required/gibtonite/P = holder
+ var/obj/item/gibtonite/P = holder
P.GibtoniteReaction(null, 2)
\ No newline at end of file
diff --git a/code/datums/world_topic.dm b/code/datums/world_topic.dm
index 30699d36f4..261e423640 100644
--- a/code/datums/world_topic.dm
+++ b/code/datums/world_topic.dm
@@ -74,6 +74,25 @@
for(var/client/C in GLOB.clients)
C.AnnouncePR(final_composed)
+/datum/world_topic/auto_bunker_passthrough
+ keyword = "auto_bunker_override"
+ require_comms_key = TRUE
+
+/datum/world_topic/auto_bunker_passthrough/Run(list/input)
+ if(!CONFIG_GET(flag/allow_cross_server_bunker_override))
+ return "Function Disabled"
+ var/ckeytobypass = input["ckey"]
+ var/is_new_ckey = !(ckey(ckeytobypass) in GLOB.bunker_passthrough)
+ var/sender = input["source"] || "UNKNOWN"
+ GLOB.bunker_passthrough |= ckey(ckeytobypass)
+ GLOB.bunker_passthrough[ckey(ckeytobypass)] = world.realtime
+ SSpersistence.SavePanicBunker() //we can do this every time, it's okay
+ if(!is_new_ckey)
+ log_admin("AUTO BUNKER: [ckeytobypass] given access (incoming comms from [sender]).")
+ message_admins("AUTO BUNKER: [ckeytobypass] given access (incoming comms from [sender]).")
+ send2irc("Panic Bunker", "AUTO BUNKER: [ckeytobypass] given access (incoming comms from [sender]).")
+ return "Success"
+
/datum/world_topic/ahelp_relay
keyword = "Ahelp"
require_comms_key = TRUE
diff --git a/code/datums/wounds/_scars.dm b/code/datums/wounds/_scars.dm
new file mode 100644
index 0000000000..bfbaab835e
--- /dev/null
+++ b/code/datums/wounds/_scars.dm
@@ -0,0 +1,134 @@
+/**
+ * scars are cosmetic datums that are assigned to bodyparts once they recover from wounds. Each wound type and severity have their own descriptions for what the scars
+ * look like, and then each body part has a list of "specific locations" like your elbow or wrist or wherever the scar can appear, to make it more interesting than "right arm"
+ *
+ *
+ * Arguments:
+ * *
+ */
+/datum/scar
+ var/obj/item/bodypart/limb
+ var/mob/living/carbon/victim
+ var/severity
+ var/description
+ var/precise_location
+
+ /// Scars from the longtimer quirk are "fake" and won't be saved with persistent scarring, since it makes you spawn with a lot by default
+ var/fake=FALSE
+
+ /// How many tiles away someone can see this scar, goes up with severity. Clothes covering this limb will decrease visibility by 1 each, except for the head/face which is a binary "is mask obscuring face" check
+ var/visibility = 2
+ /// Whether this scar can actually be covered up by clothing
+ var/coverable = TRUE
+ /// What zones this scar can be applied to
+ var/list/applicable_zones = list(BODY_ZONE_CHEST, BODY_ZONE_HEAD, BODY_ZONE_L_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_ARM, BODY_ZONE_R_LEG)
+
+/datum/scar/Destroy(force, ...)
+ if(limb)
+ LAZYREMOVE(limb.scars, src)
+ if(victim)
+ LAZYREMOVE(victim.all_scars, src)
+ . = ..()
+
+/**
+ * generate() is used to actually fill out the info for a scar, according to the limb and wound it is provided.
+ *
+ * After creating a scar, call this on it while targeting the scarred bodypart with a given wound to apply the scar.
+ *
+ * Arguments:
+ * * BP- The bodypart being targeted
+ * * W- The wound being used to generate the severity and description info
+ * * add_to_scars- Should always be TRUE unless you're just storing a scar for later usage, like how cuts want to store a scar for the highest severity of cut, rather than the severity when the wound is fully healed (probably demoted to moderate)
+ */
+/datum/scar/proc/generate(obj/item/bodypart/BP, datum/wound/W, add_to_scars=TRUE)
+ if(!(BP.body_zone in applicable_zones))
+ qdel(src)
+ return
+ limb = BP
+ severity = W.severity
+ if(limb.owner)
+ victim = limb.owner
+ if(add_to_scars)
+ LAZYADD(limb.scars, src)
+ if(victim)
+ LAZYADD(victim.all_scars, src)
+
+ description = pick(W.scarring_descriptions)
+ precise_location = pick(limb.specific_locations)
+ switch(W.severity)
+ if(WOUND_SEVERITY_MODERATE)
+ visibility = 2
+ if(WOUND_SEVERITY_SEVERE)
+ visibility = 3
+ if(WOUND_SEVERITY_CRITICAL)
+ visibility = 5
+
+/// Used when we finalize a scar from a healing cut
+/datum/scar/proc/lazy_attach(obj/item/bodypart/BP, datum/wound/W)
+ LAZYADD(BP.scars, src)
+ if(BP.owner)
+ victim = BP.owner
+ LAZYADD(victim.all_scars, src)
+
+/// Used to "load" a persistent scar
+/datum/scar/proc/load(obj/item/bodypart/BP, description, specific_location, severity=WOUND_SEVERITY_SEVERE)
+ if(!(BP.body_zone in applicable_zones))
+ qdel(src)
+ return
+ limb = BP
+ src.severity = severity
+ LAZYADD(limb.scars, src)
+ if(BP.owner)
+ victim = BP.owner
+ LAZYADD(victim.all_scars, src)
+ src.description = description
+ precise_location = specific_location
+ switch(severity)
+ if(WOUND_SEVERITY_MODERATE)
+ visibility = 2
+ if(WOUND_SEVERITY_SEVERE)
+ visibility = 3
+ if(WOUND_SEVERITY_CRITICAL)
+ visibility = 5
+ return TRUE
+
+/// What will show up in examine_more() if this scar is visible
+/datum/scar/proc/get_examine_description(mob/viewer)
+ if(!victim || !is_visible(viewer))
+ return
+
+ var/msg = "[victim.p_they(TRUE)] [victim.p_have()] [description] on [victim.p_their()] [precise_location]."
+ switch(severity)
+ if(WOUND_SEVERITY_MODERATE)
+ msg = "[msg]"
+ if(WOUND_SEVERITY_SEVERE)
+ msg = "[msg]"
+ if(WOUND_SEVERITY_CRITICAL)
+ msg = "[msg]"
+ return "\t[msg]"
+
+/// Whether a scar can currently be seen by the viewer
+/datum/scar/proc/is_visible(mob/viewer)
+ if(!victim || !viewer)
+ return
+ if(get_dist(viewer, victim) > visibility)
+ return
+
+ if(!ishuman(victim) || isobserver(viewer) || victim == viewer)
+ return TRUE
+
+ var/mob/living/carbon/human/H = victim
+ if(istype(limb, /obj/item/bodypart/head))
+ if((H.wear_mask && (H.wear_mask.flags_inv & HIDEFACE)) || (H.head && (H.head.flags_inv & HIDEFACE)))
+ return FALSE
+ else if(limb.scars_covered_by_clothes)
+ var/num_covers = LAZYLEN(H.clothingonpart(limb))
+ if(num_covers + get_dist(viewer, victim) >= visibility)
+ return FALSE
+
+ return TRUE
+
+/// Used to format a scar to safe in preferences for persistent scars
+/datum/scar/proc/format()
+ if(!fake)
+ return "[limb.body_zone]|[description]|[precise_location]|[severity]"
diff --git a/code/datums/wounds/_wounds.dm b/code/datums/wounds/_wounds.dm
new file mode 100644
index 0000000000..b1ba49b7ab
--- /dev/null
+++ b/code/datums/wounds/_wounds.dm
@@ -0,0 +1,318 @@
+/*
+ Wounds are specific medical complications that can arise and be applied to (currently) carbons, with a focus on humans. All of the code for and related to this is heavily WIP,
+ and the documentation will be slanted towards explaining what each part/piece is leading up to, until such a time as I finish the core implementations. The original design doc
+ can be found at https://hackmd.io/@Ryll/r1lb4SOwU
+
+ Wounds are datums that operate like a mix of diseases, brain traumas, and components, and are applied to a /obj/item/bodypart (preferably attached to a carbon) when they take large spikes of damage
+ or under other certain conditions (thrown hard against a wall, sustained exposure to plasma fire, etc). Wounds are categorized by the three following criteria:
+ 1. Severity: Either MODERATE, SEVERE, or CRITICAL. See the hackmd for more details
+ 2. Viable zones: What body parts the wound is applicable to. Generic wounds like broken bones and severe burns can apply to every zone, but you may want to add special wounds for certain limbs
+ like a twisted ankle for legs only, or open air exposure of the organs for particularly gruesome chest wounds. Wounds should be able to function for every zone they are marked viable for.
+ 3. Damage type: Currently either BRUTE or BURN. Again, see the hackmd for a breakdown of my plans for each type.
+
+ When a body part suffers enough damage to get a wound, the severity (determined by a roll or something, worse damage leading to worse wounds), affected limb, and damage type sustained are factored into
+ deciding what specific wound will be applied. I'd like to have a few different types of wounds for at least some of the choices, but I'm just doing rough generals for now. Expect polishing
+*/
+
+/datum/wound
+ /// What it's named
+ var/name = "ouchie"
+ /// The description shown on the scanners
+ var/desc = ""
+ /// The basic treatment suggested by health analyzers
+ var/treat_text = ""
+ /// What the limb looks like on a cursory examine
+ var/examine_desc = "is badly hurt"
+
+ /// needed for "your arm has a compound fracture" vs "your arm has some third degree burns"
+ var/a_or_from = "a"
+ /// The visible message when this happens
+ var/occur_text = ""
+ /// This sound will be played upon the wound being applied
+ var/sound_effect
+
+ /// Either WOUND_SEVERITY_TRIVIAL (meme wounds like stubbed toe), WOUND_SEVERITY_MODERATE, WOUND_SEVERITY_SEVERE, or WOUND_SEVERITY_CRITICAL (or maybe WOUND_SEVERITY_LOSS)
+ var/severity = WOUND_SEVERITY_MODERATE
+ /// The list of wounds it belongs in, WOUND_LIST_BONE, WOUND_LIST_CUT, or WOUND_LIST_BURN
+ var/wound_type
+
+ /// What body zones can we affect
+ var/list/viable_zones = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
+ /// Who owns the body part that we're wounding
+ var/mob/living/carbon/victim = null
+ /// If we only work on organics (everything right now)
+ var/organic_only = TRUE
+ /// The bodypart we're parented to
+ var/obj/item/bodypart/limb = null
+
+ /// Specific items such as bandages or sutures that can try directly treating this wound
+ var/list/treatable_by
+ /// Specific items such as bandages or sutures that can try directly treating this wound only if the user has the victim in an aggressive grab or higher
+ var/list/treatable_by_grabbed
+ /// Tools with the specified tool flag will also be able to try directly treating this wound
+ var/treatable_tool
+ /// Set to TRUE if we don't give a shit about the patient's comfort and are allowed to just use any random sharp thing on this wound. Will require an aggressive grab or more to perform
+ var/treatable_sharp
+ /// How long it will take to treat this wound with a standard effective tool, assuming it doesn't need surgery
+ var/base_treat_time = 5 SECONDS
+
+ /// Using this limb in a do_after interaction will multiply the length by this duration (arms)
+ var/interaction_efficiency_penalty = 1
+ /// Incoming damage on this limb will be multiplied by this, to simulate tenderness and vulnerability (mostly burns).
+ var/damage_mulitplier_penalty = 1
+ /// If set and this wound is applied to a leg, we take this many deciseconds extra per step on this leg
+ var/limp_slowdown
+ /// How much we're contributing to this limb's bleed_rate
+ var/blood_flow
+
+ /// The minimum we need to roll on [/obj/item/bodypart/proc/check_wounding()] to begin suffering this wound, see check_wounding_mods() for more
+ var/threshold_minimum
+ /// How much having this wound will add to all future check_wounding() rolls on this limb, to allow progression to worse injuries with repeated damage
+ var/threshold_penalty
+ /// If we need to process each life tick
+ var/processes = FALSE
+
+ /// If TRUE and an item that can treat multiple different types of coexisting wounds (gauze can be used to splint broken bones, staunch bleeding, and cover burns), we get first dibs if we come up first for it, then become nonpriority.
+ /// Otherwise, if no untreated wound claims the item, we cycle through the non priority wounds and pick a random one who can use that item.
+ var/treat_priority = FALSE
+
+ /// If having this wound makes currently makes the parent bodypart unusable
+ var/disabling
+
+ /// What status effect we assign on application
+ var/status_effect_type
+ /// The status effect we're linked to
+ var/datum/status_effect/linked_status_effect
+ /// If we're operating on this wound and it gets healed, we'll nix the surgery too
+ var/datum/surgery/attached_surgery
+ /// if you're a lazy git and just throw them in cryo, the wound will go away after accumulating severity * 25 power
+ var/cryo_progress
+
+ /// What kind of scars this wound will create description wise once healed
+ var/list/scarring_descriptions = list("general disfigurement")
+ /// If we've already tried scarring while removing (since remove_wound calls qdel, and qdel calls remove wound, .....) TODO: make this cleaner
+ var/already_scarred = FALSE
+ /// If we forced this wound through badmin smite, we won't count it towards the round totals
+ var/from_smite
+
+/datum/wound/Destroy()
+ if(attached_surgery)
+ QDEL_NULL(attached_surgery)
+ if(limb?.wounds && (src in limb.wounds)) // destroy can call remove_wound() and remove_wound() calls qdel, so we check to make sure there's anything to remove first
+ remove_wound()
+ limb = null
+ victim = null
+ return ..()
+
+/**
+ * apply_wound() is used once a wound type is instantiated to assign it to a bodypart, and actually come into play.
+ *
+ *
+ * Arguments:
+ * * L: The bodypart we're wounding, we don't care about the person, we can get them through the limb
+ * * silent: Not actually necessary I don't think, was originally used for demoting wounds so they wouldn't make new messages, but I believe old_wound took over that, I may remove this shortly
+ * * old_wound: If our new wound is a replacement for one of the same time (promotion or demotion), we can reference the old one just before it's removed to copy over necessary vars
+ * * smited- If this is a smite, we don't care about this wound for stat tracking purposes (not yet implemented)
+ */
+/datum/wound/proc/apply_wound(obj/item/bodypart/L, silent = FALSE, datum/wound/old_wound = null, smited = FALSE)
+ if(!istype(L) || !L.owner || !(L.body_zone in viable_zones) || isalien(L.owner))
+ qdel(src)
+ return
+
+ if(ishuman(L.owner))
+ var/mob/living/carbon/human/H = L.owner
+ if(organic_only && ((NOBLOOD in H.dna.species.species_traits) || !L.is_organic_limb()))
+ qdel(src)
+ return
+
+ // we accept promotions and demotions, but no point in redundancy. This should have already been checked wherever the wound was rolled and applied for (see: bodypart damage code), but we do an extra check
+ // in case we ever directly add wounds
+ for(var/i in L.wounds)
+ var/datum/wound/preexisting_wound = i
+ if((preexisting_wound.type == type) && (preexisting_wound != old_wound))
+ qdel(src)
+ return
+
+ victim = L.owner
+ limb = L
+ LAZYADD(victim.all_wounds, src)
+ LAZYADD(limb.wounds, src)
+ limb.update_wounds()
+ if(status_effect_type)
+ linked_status_effect = victim.apply_status_effect(status_effect_type, src)
+ SEND_SIGNAL(victim, COMSIG_CARBON_GAIN_WOUND, src, limb)
+ if(!victim.alerts["wound"]) // only one alert is shared between all of the wounds
+ victim.throw_alert("wound", /obj/screen/alert/status_effect/wound)
+
+ var/demoted
+ if(old_wound)
+ demoted = (severity <= old_wound.severity)
+
+ if(severity == WOUND_SEVERITY_TRIVIAL)
+ return
+
+ if(!(silent || demoted))
+ var/msg = "[victim]'s [limb.name] [occur_text]!"
+ var/vis_dist = COMBAT_MESSAGE_RANGE
+
+ if(severity != WOUND_SEVERITY_MODERATE)
+ msg = "[msg]"
+ vis_dist = DEFAULT_MESSAGE_RANGE
+
+ victim.visible_message(msg, "Your [limb.name] [occur_text]!", vision_distance = vis_dist)
+ if(sound_effect)
+ playsound(L.owner, sound_effect, 60 + 20 * severity, TRUE)
+
+ if(!demoted)
+ wound_injury(old_wound)
+ second_wind()
+
+/// Remove the wound from whatever it's afflicting, and cleans up whateverstatus effects it had or modifiers it had on interaction times. ignore_limb is used for detachments where we only want to forget the victim
+/datum/wound/proc/remove_wound(ignore_limb, replaced = FALSE)
+ //TODO: have better way to tell if we're getting removed without replacement (full heal) scar stuff
+ if(limb && !already_scarred && !replaced)
+ already_scarred = TRUE
+ var/datum/scar/new_scar = new
+ new_scar.generate(limb, src)
+ if(victim)
+ LAZYREMOVE(victim.all_wounds, src)
+ if(!victim.all_wounds)
+ victim.clear_alert("wound")
+ SEND_SIGNAL(victim, COMSIG_CARBON_LOSE_WOUND, src, limb)
+ if(limb && !ignore_limb)
+ LAZYREMOVE(limb.wounds, src)
+ limb.update_wounds()
+
+/**
+ * replace_wound() is used when you want to replace the current wound with a new wound, presumably of the same category, just of a different severity (either up or down counts)
+ *
+ * This proc actually instantiates the new wound based off the specific type path passed, then returns the new instantiated wound datum.
+ *
+ * Arguments:
+ * * new_type- The TYPE PATH of the wound you want to replace this, like /datum/wound/brute/cut/severe
+ * * smited- If this is a smite, we don't care about this wound for stat tracking purposes (not yet implemented)
+ */
+/datum/wound/proc/replace_wound(new_type, smited = FALSE)
+ var/datum/wound/new_wound = new new_type
+ already_scarred = TRUE
+ remove_wound(replaced=TRUE)
+ new_wound.apply_wound(limb, old_wound = src, smited = smited)
+ qdel(src)
+ return new_wound
+
+/// The immediate negative effects faced as a result of the wound
+/datum/wound/proc/wound_injury(datum/wound/old_wound = null)
+ return
+
+/// Additional beneficial effects when the wound is gained, in case you want to give a temporary boost to allow the victim to try an escape or last stand
+/datum/wound/proc/second_wind()
+
+ switch(severity)
+ if(WOUND_SEVERITY_MODERATE)
+ victim.reagents.add_reagent(/datum/reagent/determination, WOUND_DETERMINATION_MODERATE)
+ if(WOUND_SEVERITY_SEVERE)
+ victim.reagents.add_reagent(/datum/reagent/determination, WOUND_DETERMINATION_SEVERE)
+ if(WOUND_SEVERITY_CRITICAL)
+ victim.reagents.add_reagent(/datum/reagent/determination, WOUND_DETERMINATION_CRITICAL)
+
+/**
+ * try_treating() is an intercept run from [/mob/living/carbon/attackby()] right after surgeries but before anything else. Return TRUE here if the item is something that is relevant to treatment to take over the interaction.
+ *
+ * This proc leads into [/datum/wound/proc/treat()] and probably shouldn't be added onto in children types. You can specify what items or tools you want to be intercepted
+ * with var/list/treatable_by and var/treatable_tool, then if an item fulfills one of those requirements and our wound claims it first, it goes over to treat() and treat_self().
+ *
+ * Arguments:
+ * * I: The item we're trying to use
+ * * user: The mob trying to use it on us
+ */
+/datum/wound/proc/try_treating(obj/item/I, mob/user)
+ // first we weed out if we're not dealing with our wound's bodypart, or if it might be an attack
+ if(!I || limb.body_zone != user.zone_selected || (I.force && user.a_intent != INTENT_HELP))
+ return FALSE
+
+ var/allowed = FALSE
+
+ // check if we have a valid treatable tool (or, if cauteries are allowed, if we have something hot)
+ if((I.tool_behaviour == treatable_tool) || (treatable_tool == TOOL_CAUTERY && I.get_temperature()))
+ allowed = TRUE
+ // failing that, see if we're aggro grabbing them and if we have an item that works for aggro grabs only
+ else if(user.pulling == victim && user.grab_state >= GRAB_AGGRESSIVE && check_grab_treatments(I, user))
+ allowed = TRUE
+ // failing THAT, we check if we have a generally allowed item
+ else
+ for(var/allowed_type in treatable_by)
+ if(istype(I, allowed_type))
+ allowed = TRUE
+ break
+
+ // if none of those apply, we return false to avoid interrupting
+ if(!allowed)
+ return FALSE
+
+ // now that we've determined we have a valid attempt at treating, we can stomp on their dreams if we're already interacting with the patient
+ if(INTERACTING_WITH(user, victim))
+ to_chat(user, "You're already interacting with [victim]!")
+ return TRUE
+
+ // lastly, treat them
+ treat(I, user)
+ return TRUE
+
+/// Return TRUE if we have an item that can only be used while aggro grabbed (unhanded aggro grab treatments go in [/datum/wound/proc/try_handling()]). Treatment is still is handled in [/datum/wound/proc/treat()]
+/datum/wound/proc/check_grab_treatments(obj/item/I, mob/user)
+ return FALSE
+
+/// Like try_treating() but for unhanded interactions from humans, used by joint dislocations for manual bodypart chiropractice for example.
+/datum/wound/proc/try_handling(mob/living/carbon/human/user)
+ return FALSE
+
+/// Someone is using something that might be used for treating the wound on this limb
+/datum/wound/proc/treat(obj/item/I, mob/user)
+ return
+
+/// If var/processing is TRUE, this is run on each life tick
+/datum/wound/proc/handle_process()
+ return
+
+/// For use in do_after callback checks
+/datum/wound/proc/still_exists()
+ return (!QDELETED(src) && limb)
+
+/// When our parent bodypart is hurt
+/datum/wound/proc/receive_damage(wounding_type, wounding_dmg, wound_bonus)
+ return
+
+/// Called from cryoxadone and pyroxadone when they're proc'ing. Wounds will slowly be fixed separately from other methods when these are in effect. crappy name but eh
+/datum/wound/proc/on_xadone(power)
+ cryo_progress += power
+ if(cryo_progress > 33 * severity)
+ qdel(src)
+
+/// Called when we're crushed in an airlock or firedoor, for one of the improvised joint dislocation fixes
+/datum/wound/proc/crush()
+ return
+
+/**
+ * get_examine_description() is used in carbon/examine and human/examine to show the status of this wound. Useful if you need to show some status like the wound being splinted or bandaged.
+ *
+ * Return the full string line you want to show, note that we're already dealing with the 'warning' span at this point, and that \n is already appended for you in the place this is called from
+ *
+ * Arguments:
+ * * mob/user: The user examining the wound's owner, if that matters
+ */
+/datum/wound/proc/get_examine_description(mob/user)
+ return "[victim.p_their(TRUE)] [limb.name] [examine_desc]!"
+
+/datum/wound/proc/get_scanner_description(mob/user)
+ return "Type: [name]\nSeverity: [severity_text()]\nDescription: [desc]\nRecommended Treatment: [treat_text]"
+
+/datum/wound/proc/severity_text()
+ switch(severity)
+ if(WOUND_SEVERITY_TRIVIAL)
+ return "Trivial"
+ if(WOUND_SEVERITY_MODERATE)
+ return "Moderate"
+ if(WOUND_SEVERITY_SEVERE)
+ return "Severe"
+ if(WOUND_SEVERITY_CRITICAL)
+ return "Critical"
diff --git a/code/datums/wounds/bones.dm b/code/datums/wounds/bones.dm
new file mode 100644
index 0000000000..80d922cba3
--- /dev/null
+++ b/code/datums/wounds/bones.dm
@@ -0,0 +1,453 @@
+
+/*
+ Bones
+*/
+// TODO: well, a lot really, but i'd kill to get overlays and a bonebreaking effect like Blitz: The League, similar to electric shock skeletons
+
+/*
+ Base definition
+*/
+/datum/wound/brute/bone
+ sound_effect = 'sound/effects/crack1.ogg'
+ wound_type = WOUND_LIST_BONE
+
+ /// The item we're currently splinted with, if there is one
+ var/obj/item/stack/splinted
+
+ /// Have we been taped?
+ var/taped
+ /// Have we been bone gel'd?
+ var/gelled
+ /// If we did the gel + surgical tape healing method for fractures, how many regen points we need
+ var/regen_points_needed
+ /// Our current counter for gel + surgical tape regeneration
+ var/regen_points_current
+ /// If we suffer severe head booboos, we can get brain traumas tied to them
+ var/datum/brain_trauma/active_trauma
+ /// What brain trauma group, if any, we can draw from for head wounds
+ var/brain_trauma_group
+ /// If we deal brain traumas, when is the next one due?
+ var/next_trauma_cycle
+ /// How long do we wait +/- 20% for the next trauma?
+ var/trauma_cycle_cooldown
+ /// If this is a chest wound and this is set, we have this chance to cough up blood when hit in the chest
+ var/chance_internal_bleeding = 0
+
+/*
+ Overwriting of base procs
+*/
+/datum/wound/brute/bone/wound_injury(datum/wound/old_wound = null)
+ if(limb.body_zone == BODY_ZONE_HEAD && brain_trauma_group)
+ processes = TRUE
+ active_trauma = victim.gain_trauma_type(brain_trauma_group, TRAUMA_RESILIENCE_WOUND)
+ next_trauma_cycle = world.time + (rand(100-WOUND_BONE_HEAD_TIME_VARIANCE, 100+WOUND_BONE_HEAD_TIME_VARIANCE) * 0.01 * trauma_cycle_cooldown)
+
+ RegisterSignal(victim, COMSIG_HUMAN_EARLY_UNARMED_ATTACK, .proc/attack_with_hurt_hand)
+ if(limb.held_index && victim.get_item_for_held_index(limb.held_index) && (disabling || prob(30 * severity)))
+ var/obj/item/I = victim.get_item_for_held_index(limb.held_index)
+ if(istype(I, /obj/item/offhand))
+ I = victim.get_inactive_held_item()
+
+ if(I && victim.dropItemToGround(I))
+ victim.visible_message("[victim] drops [I] in shock!", "The force on your [limb.name] causes you to drop [I]!", vision_distance=COMBAT_MESSAGE_RANGE)
+
+ update_inefficiencies()
+
+/datum/wound/brute/bone/remove_wound(ignore_limb, replaced)
+ limp_slowdown = 0
+ QDEL_NULL(active_trauma)
+ if(victim)
+ UnregisterSignal(victim, COMSIG_HUMAN_EARLY_UNARMED_ATTACK)
+ return ..()
+
+/datum/wound/brute/bone/handle_process()
+ . = ..()
+ if(limb.body_zone == BODY_ZONE_HEAD && brain_trauma_group && world.time > next_trauma_cycle)
+ if(active_trauma)
+ QDEL_NULL(active_trauma)
+ else
+ active_trauma = victim.gain_trauma_type(brain_trauma_group, TRAUMA_RESILIENCE_WOUND)
+ next_trauma_cycle = world.time + (rand(100-WOUND_BONE_HEAD_TIME_VARIANCE, 100+WOUND_BONE_HEAD_TIME_VARIANCE) * 0.01 * trauma_cycle_cooldown)
+
+ if(!regen_points_needed)
+ return
+
+ regen_points_current++
+ if(prob(severity * 2))
+ victim.take_bodypart_damage(rand(2, severity * 2), stamina=rand(2, severity * 2.5), wound_bonus=CANT_WOUND)
+ if(prob(33))
+ to_chat(victim, "You feel a sharp pain in your body as your bones are reforming!")
+
+ if(regen_points_current > regen_points_needed)
+ if(!victim || !limb)
+ qdel(src)
+ return
+ to_chat(victim, "Your [limb.name] has recovered from your fracture!")
+ remove_wound()
+
+/// If we're a human who's punching something with a broken arm, we might hurt ourselves doing so
+/datum/wound/brute/bone/proc/attack_with_hurt_hand(mob/M, atom/target, proximity)
+ if(victim.get_active_hand() != limb || victim.a_intent == INTENT_HELP || !ismob(target) || severity <= WOUND_SEVERITY_MODERATE)
+ return
+
+ // With a severe or critical wound, you have a 15% or 30% chance to proc pain on hit
+ if(prob((severity - 1) * 15))
+ // And you have a 70% or 50% chance to actually land the blow, respectively
+ if(prob(70 - 20 * (severity - 1)))
+ to_chat(victim, "The fracture in your [limb.name] shoots with pain as you strike [target]!")
+ limb.receive_damage(brute=rand(1,5))
+ else
+ victim.visible_message("[victim] weakly strikes [target] with [victim.p_their()] broken [limb.name], recoiling from pain!", \
+ "You fail to strike [target] as the fracture in your [limb.name] lights up in unbearable pain!", vision_distance=COMBAT_MESSAGE_RANGE)
+ victim.emote("scream")
+ victim.Stun(0.5 SECONDS)
+ limb.receive_damage(brute=rand(3,7))
+ return COMPONENT_NO_ATTACK_HAND
+
+/datum/wound/brute/bone/receive_damage(wounding_type, wounding_dmg, wound_bonus)
+ if(!victim)
+ return
+
+ if(limb.body_zone == BODY_ZONE_CHEST && victim.blood_volume && prob(chance_internal_bleeding + wounding_dmg))
+ var/blood_bled = rand(1, wounding_dmg * (severity == WOUND_SEVERITY_CRITICAL ? 2 : 1.5)) // 12 brute toolbox can cause up to 18/24 bleeding with a severe/critical chest wound
+ switch(blood_bled)
+ if(1 to 6)
+ victim.bleed(blood_bled, TRUE)
+ if(7 to 13)
+ victim.visible_message("[victim] coughs up a bit of blood from the blow to [victim.p_their()] chest.", "You cough up a bit of blood from the blow to your chest.")
+ victim.bleed(blood_bled, TRUE)
+ if(14 to 19)
+ victim.visible_message("[victim] spits out a string of blood from the blow to [victim.p_their()] chest!", "You spit out a string of blood from the blow to your chest!")
+ new /obj/effect/temp_visual/dir_setting/bloodsplatter(victim.loc, victim.dir)
+ victim.bleed(blood_bled)
+ if(20 to INFINITY)
+ victim.visible_message("[victim] chokes up a spray of blood from the blow to [victim.p_their()] chest!", "You choke up on a spray of blood from the blow to your chest!")
+ victim.bleed(blood_bled)
+ new /obj/effect/temp_visual/dir_setting/bloodsplatter(victim.loc, victim.dir)
+ victim.add_splatter_floor(get_step(victim.loc, victim.dir))
+
+ if(!(wounding_type in list(WOUND_SHARP, WOUND_BURN)) || !splinted || wound_bonus == CANT_WOUND)
+ return
+
+ splinted.take_damage(wounding_dmg, damage_type = (wounding_type == WOUND_SHARP ? BRUTE : BURN), sound_effect = FALSE)
+ if(QDELETED(splinted))
+ var/destroyed_verb = (wounding_type == WOUND_SHARP ? "torn" : "burned")
+ victim.visible_message("The splint securing [victim]'s [limb.name] is [destroyed_verb] away!", "The splint securing your [limb.name] is [destroyed_verb] away!", vision_distance=COMBAT_MESSAGE_RANGE)
+ splinted = null
+ treat_priority = TRUE
+ update_inefficiencies()
+
+
+/datum/wound/brute/bone/get_examine_description(mob/user)
+ if(!splinted && !gelled && !taped)
+ return ..()
+
+ var/msg = ""
+ if(!splinted)
+ msg = "[victim.p_their(TRUE)] [limb.name] [examine_desc]"
+ else
+ var/splint_condition = ""
+ // how much life we have left in these bandages
+ switch(splinted.obj_integrity / splinted.max_integrity * 100)
+ if(0 to 25)
+ splint_condition = "just barely "
+ if(25 to 50)
+ splint_condition = "loosely "
+ if(50 to 75)
+ splint_condition = "mostly "
+ if(75 to INFINITY)
+ splint_condition = "tightly "
+
+ msg = "[victim.p_their(TRUE)] [limb.name] is [splint_condition] fastened in a splint of [splinted.name]"
+
+ if(taped)
+ msg += ", and appears to be reforming itself under some surgical tape!"
+ else if(gelled)
+ msg += ", with fizzing flecks of blue bone gel sparking off the bone!"
+ else
+ msg += "!"
+ return "[msg]"
+
+/*
+ New common procs for /datum/wound/brute/bone/
+*/
+
+/datum/wound/brute/bone/proc/update_inefficiencies()
+ if(limb.body_zone in list(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG))
+ if(splinted)
+ limp_slowdown = initial(limp_slowdown) * splinted.splint_factor
+ else
+ limp_slowdown = initial(limp_slowdown)
+ victim.apply_status_effect(STATUS_EFFECT_LIMP)
+ else if(limb.body_zone in list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM))
+ if(splinted)
+ interaction_efficiency_penalty = 1 + ((interaction_efficiency_penalty - 1) * splinted.splint_factor)
+ else
+ interaction_efficiency_penalty = interaction_efficiency_penalty
+
+ if(initial(disabling) && splinted)
+ disabling = FALSE
+ else if(initial(disabling))
+ disabling = TRUE
+
+ limb.update_wounds()
+
+/*
+ BEWARE OF REDUNDANCY AHEAD THAT I MUST PARE DOWN
+*/
+
+/datum/wound/brute/bone/proc/splint(obj/item/stack/I, mob/user)
+ if(splinted && splinted.splint_factor >= I.splint_factor)
+ to_chat(user, "The splint already on [user == victim ? "your" : "[victim]'s"] [limb.name] is better than you can do with [I].")
+ return
+
+ user.visible_message("[user] begins splinting [victim]'s [limb.name] with [I].", "You begin splinting [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...")
+
+ if(!do_after(user, base_treat_time * (user == victim ? 1.5 : 1), target = victim, extra_checks=CALLBACK(src, .proc/still_exists)))
+ return
+
+ user.visible_message("[user] finishes splinting [victim]'s [limb.name]!", "You finish splinting [user == victim ? "your" : "[victim]'s"] [limb.name]!")
+ treat_priority = FALSE
+ splinted = new I.type(limb)
+ splinted.amount = 1
+ I.use(1)
+ update_inefficiencies()
+
+/*
+ Moderate (Joint Dislocation)
+*/
+
+/datum/wound/brute/bone/moderate
+ name = "Joint Dislocation"
+ desc = "Patient's bone has been unset from socket, causing pain and reduced motor function."
+ treat_text = "Recommended application of bonesetter to affected limb, though manual relocation by applying an aggressive grab to the patient and helpfully interacting with afflicted limb may suffice."
+ examine_desc = "is awkwardly jammed out of place"
+ occur_text = "jerks violently and becomes unseated"
+ severity = WOUND_SEVERITY_MODERATE
+ viable_zones = list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
+ interaction_efficiency_penalty = 1.5
+ limp_slowdown = 3
+ threshold_minimum = 35
+ threshold_penalty = 15
+ treatable_tool = TOOL_BONESET
+ status_effect_type = /datum/status_effect/wound/bone/moderate
+ scarring_descriptions = list("light discoloring", "a slight blue tint")
+
+/datum/wound/brute/bone/moderate/crush()
+ if(prob(33))
+ victim.visible_message("[victim]'s dislocated [limb.name] pops back into place!", "Your dislocated [limb.name] pops back into place! Ow!")
+ remove_wound()
+
+/datum/wound/brute/bone/moderate/try_handling(mob/living/carbon/human/user)
+ if(user.pulling != victim || user.zone_selected != limb.body_zone || user.a_intent == INTENT_GRAB)
+ return FALSE
+
+ if(user.grab_state == GRAB_PASSIVE)
+ to_chat(user, "You must have [victim] in an aggressive grab to manipulate [victim.p_their()] [lowertext(name)]!")
+ return TRUE
+
+ if(user.grab_state >= GRAB_AGGRESSIVE)
+ user.visible_message("[user] begins twisting and straining [victim]'s dislocated [limb.name]!", "You begin twisting and straining [victim]'s dislocated [limb.name]...", ignored_mobs=victim)
+ to_chat(victim, "[user] begins twisting and straining your dislocated [limb.name]!")
+ if(user.a_intent == INTENT_HELP)
+ chiropractice(user)
+ else
+ malpractice(user)
+ return TRUE
+
+/// If someone is snapping our dislocated joint back into place by hand with an aggro grab and help intent
+/datum/wound/brute/bone/moderate/proc/chiropractice(mob/living/carbon/human/user)
+ var/time = base_treat_time
+
+ if(!do_after(user, time, target=victim, extra_checks = CALLBACK(src, .proc/still_exists)))
+ return
+
+ if(prob(65))
+ user.visible_message("[user] snaps [victim]'s dislocated [limb.name] back into place!", "You snap [victim]'s dislocated [limb.name] back into place!", ignored_mobs=victim)
+ to_chat(victim, "[user] snaps your dislocated [limb.name] back into place!")
+ victim.emote("scream")
+ limb.receive_damage(brute=20, wound_bonus=CANT_WOUND)
+ qdel(src)
+ else
+ user.visible_message("[user] wrenches [victim]'s dislocated [limb.name] around painfully!", "You wrench [victim]'s dislocated [limb.name] around painfully!", ignored_mobs=victim)
+ to_chat(victim, "[user] wrenches your dislocated [limb.name] around painfully!")
+ limb.receive_damage(brute=10, wound_bonus=CANT_WOUND)
+ chiropractice(user)
+
+/// If someone is snapping our dislocated joint into a fracture by hand with an aggro grab and harm or disarm intent
+/datum/wound/brute/bone/moderate/proc/malpractice(mob/living/carbon/human/user)
+ var/time = base_treat_time
+
+ if(!do_after(user, time, target=victim, extra_checks = CALLBACK(src, .proc/still_exists)))
+ return
+
+ if(prob(65))
+ user.visible_message("[user] snaps [victim]'s dislocated [limb.name] with a sickening crack!", "You snap [victim]'s dislocated [limb.name] with a sickening crack!", ignored_mobs=victim)
+ to_chat(victim, "[user] snaps your dislocated [limb.name] with a sickening crack!")
+ victim.emote("scream")
+ limb.receive_damage(brute=25, wound_bonus=30)
+ else
+ user.visible_message("[user] wrenches [victim]'s dislocated [limb.name] around painfully!", "You wrench [victim]'s dislocated [limb.name] around painfully!", ignored_mobs=victim)
+ to_chat(victim, "[user] wrenches your dislocated [limb.name] around painfully!")
+ limb.receive_damage(brute=10, wound_bonus=CANT_WOUND)
+ malpractice(user)
+
+
+/datum/wound/brute/bone/moderate/treat(obj/item/I, mob/user)
+ if(victim == user)
+ victim.visible_message("[user] begins resetting [victim.p_their()] [limb.name] with [I].", "You begin resetting your [limb.name] with [I]...")
+ else
+ user.visible_message("[user] begins resetting [victim]'s [limb.name] with [I].", "You begin resetting [victim]'s [limb.name] with [I]...")
+
+ if(!do_after(user, base_treat_time * (user == victim ? 1.5 : 1), target = victim, extra_checks=CALLBACK(src, .proc/still_exists)))
+ return
+
+ if(victim == user)
+ limb.receive_damage(brute=15, wound_bonus=CANT_WOUND)
+ victim.visible_message("[user] finishes resetting [victim.p_their()] [limb.name]!", "You reset your [limb.name]!")
+ else
+ limb.receive_damage(brute=10, wound_bonus=CANT_WOUND)
+ user.visible_message("[user] finishes resetting [victim]'s [limb.name]!", "You finish resetting [victim]'s [limb.name]!", victim)
+ to_chat(victim, "[user] resets your [limb.name]!")
+
+ victim.emote("scream")
+ qdel(src)
+
+/*
+ Severe (Hairline Fracture)
+*/
+
+/datum/wound/brute/bone/severe
+ name = "Hairline Fracture"
+ desc = "Patient's bone has suffered a crack in the foundation, causing serious pain and reduced limb functionality."
+ treat_text = "Recommended light surgical application of bone gel, though splinting will prevent worsening situation."
+ examine_desc = "appears bruised and grotesquely swollen"
+
+ occur_text = "sprays chips of bone and develops a nasty looking bruise"
+ severity = WOUND_SEVERITY_SEVERE
+ interaction_efficiency_penalty = 2
+ limp_slowdown = 6
+ threshold_minimum = 60
+ threshold_penalty = 30
+ treatable_by = list(/obj/item/stack/sticky_tape/surgical, /obj/item/stack/medical/gauze, /obj/item/stack/medical/bone_gel)
+ status_effect_type = /datum/status_effect/wound/bone/severe
+ treat_priority = TRUE
+ scarring_descriptions = list("a faded, fist-sized bruise", "a vaguely triangular peel scar")
+ brain_trauma_group = BRAIN_TRAUMA_MILD
+ trauma_cycle_cooldown = 1.5 MINUTES
+ chance_internal_bleeding = 40
+
+/datum/wound/brute/bone/critical
+ name = "Compound Fracture"
+ desc = "Patient's bones have suffered multiple gruesome fractures, causing significant pain and near uselessness of limb."
+ treat_text = "Immediate binding of affected limb, followed by surgical intervention ASAP."
+ examine_desc = "has a cracked bone sticking out of it"
+ occur_text = "cracks apart, exposing broken bones to open air"
+ severity = WOUND_SEVERITY_CRITICAL
+ interaction_efficiency_penalty = 4
+ limp_slowdown = 9
+ sound_effect = 'sound/effects/crack2.ogg'
+ threshold_minimum = 115
+ threshold_penalty = 50
+ disabling = TRUE
+ treatable_by = list(/obj/item/stack/sticky_tape/surgical, /obj/item/stack/medical/gauze, /obj/item/stack/medical/bone_gel)
+ status_effect_type = /datum/status_effect/wound/bone/critical
+ treat_priority = TRUE
+ scarring_descriptions = list("a section of janky skin lines and badly healed scars", "a large patch of uneven skin tone", "a cluster of calluses")
+ brain_trauma_group = BRAIN_TRAUMA_SEVERE
+ trauma_cycle_cooldown = 2.5 MINUTES
+ chance_internal_bleeding = 60
+
+// doesn't make much sense for "a" bone to stick out of your head
+/datum/wound/brute/bone/critical/apply_wound(obj/item/bodypart/L, silent, datum/wound/old_wound, smited)
+ if(L.body_zone == BODY_ZONE_HEAD)
+ occur_text = "splits open, exposing a bare, cracked skull through the flesh and blood"
+ examine_desc = "has an unsettling indent, with bits of skull poking out"
+ . = ..()
+
+/// if someone is using bone gel on our wound
+/datum/wound/brute/bone/proc/gel(obj/item/stack/medical/bone_gel/I, mob/user)
+ if(gelled)
+ to_chat(user, "[user == victim ? "Your" : "[victim]'s"] [limb.name] is already coated with bone gel!")
+ return
+
+ user.visible_message("[user] begins hastily applying [I] to [victim]'s' [limb.name]...", "You begin hastily applying [I] to [user == victim ? "your" : "[victim]'s"] [limb.name], disregarding the warning label...")
+
+ if(!do_after(user, base_treat_time * 1.5 * (user == victim ? 1.5 : 1), target = victim, extra_checks=CALLBACK(src, .proc/still_exists)))
+ return
+
+ I.use(1)
+ victim.emote("scream")
+ if(user != victim)
+ user.visible_message("[user] finishes applying [I] to [victim]'s [limb.name], emitting a fizzing noise!", "You finish applying [I] to [victim]'s [limb.name]!", ignored_mobs=victim)
+ to_chat(victim, "[user] finishes applying [I] to your [limb.name], and you can feel the bones exploding with pain as they begin melting and reforming!")
+ else
+ var/painkiller_bonus = 0
+ if(victim.drunkenness)
+ painkiller_bonus += 5
+ if(victim.reagents && victim.reagents.has_reagent(/datum/reagent/medicine/morphine))
+ painkiller_bonus += 10
+ if(victim.reagents && victim.reagents.has_reagent(/datum/reagent/determination))
+ painkiller_bonus += 5
+
+ if(prob(25 + (20 * (severity - 2)) - painkiller_bonus)) // 25%/45% chance to fail self-applying with severe and critical wounds, modded by painkillers
+ victim.visible_message("[victim] fails to finish applying [I] to [victim.p_their()] [limb.name], passing out from the pain!", "You black out from the pain of applying [I] to your [limb.name] before you can finish!")
+ victim.AdjustUnconscious(5 SECONDS)
+ return
+ victim.visible_message("[victim] finishes applying [I] to [victim.p_their()] [limb.name], grimacing from the pain!", "You finish applying [I] to your [limb.name], and your bones explode in pain!")
+
+ limb.receive_damage(30, stamina=100, wound_bonus=CANT_WOUND)
+ if(!gelled)
+ gelled = TRUE
+
+/// if someone is using surgical tape on our wound
+/datum/wound/brute/bone/proc/tape(obj/item/stack/sticky_tape/surgical/I, mob/user)
+ if(!gelled)
+ to_chat(user, "[user == victim ? "Your" : "[victim]'s"] [limb.name] must be coated with bone gel to perform this emergency operation!")
+ return
+ if(taped)
+ to_chat(user, "[user == victim ? "Your" : "[victim]'s"] [limb.name] is already wrapped in [I.name] and reforming!")
+ return
+
+ user.visible_message("[user] begins applying [I] to [victim]'s' [limb.name]...", "You begin applying [I] to [user == victim ? "your" : "[victim]'s"] [limb.name]...")
+
+ if(!do_after(user, base_treat_time * (user == victim ? 1.5 : 1), target = victim, extra_checks=CALLBACK(src, .proc/still_exists)))
+ return
+
+ regen_points_current = 0
+ regen_points_needed = 30 SECONDS * (user == victim ? 1.5 : 1) * (severity - 1)
+ I.use(1)
+ if(user != victim)
+ user.visible_message("[user] finishes applying [I] to [victim]'s [limb.name], emitting a fizzing noise!", "You finish applying [I] to [victim]'s [limb.name]!", ignored_mobs=victim)
+ to_chat(victim, "[user] finishes applying [I] to your [limb.name], you immediately begin to feel your bones start to reform!")
+ else
+ victim.visible_message("[victim] finishes applying [I] to [victim.p_their()] [limb.name], !", "You finish applying [I] to your [limb.name], and you immediately begin to feel your bones start to reform!")
+
+ taped = TRUE
+ processes = TRUE
+
+/datum/wound/brute/bone/treat(obj/item/I, mob/user)
+ if(istype(I, /obj/item/stack/medical/bone_gel))
+ gel(I, user)
+ else if(istype(I, /obj/item/stack/sticky_tape/surgical))
+ tape(I, user)
+ else if(istype(I, /obj/item/stack/medical/gauze))
+ splint(I, user)
+
+/datum/wound/brute/bone/get_scanner_description(mob/user)
+ . = ..()
+
+ . += "
"
+
+ if(!gelled)
+ . += "Alternative Treatment: Apply bone gel directly to injured limb, then apply surgical tape to begin bone regeneration. This is both excruciatingly painful and slow, and only recommended in dire circumstances.\n"
+ else if(!taped)
+ . += "Continue Alternative Treatment: Apply surgical tape directly to injured limb to begin bone regeneration. Note, this is both excruciatingly painful and slow.\n"
+ else
+ . += "Note: Bone regeneration in effect. Bone is [round((regen_points_current*100)/regen_points_needed,0.1)]% regenerated.\n"
+
+ if(limb.body_zone == BODY_ZONE_HEAD)
+ . += "Cranial Trauma Detected: Patient will suffer random bouts of [severity == WOUND_SEVERITY_SEVERE ? "mild" : "severe"] brain traumas until bone is repaired."
+ else if(limb.body_zone == BODY_ZONE_CHEST && victim.blood_volume)
+ . += "Ribcage Trauma Detected: Further trauma to chest is likely to worsen internal bleeding until bone is repaired."
+ . += "
"
diff --git a/code/datums/wounds/burns.dm b/code/datums/wounds/burns.dm
new file mode 100644
index 0000000000..6a6629a0c9
--- /dev/null
+++ b/code/datums/wounds/burns.dm
@@ -0,0 +1,323 @@
+
+
+
+// TODO: well, a lot really, but specifically I want to add potential fusing of clothing/equipment on the affected area, and limb infections, though those may go in body part code
+/datum/wound/burn
+ a_or_from = "from"
+ wound_type = WOUND_LIST_BURN
+ processes = TRUE
+ sound_effect = 'sound/effects/sizzle1.ogg'
+
+ treatable_by = list(/obj/item/stack/medical/gauze, /obj/item/stack/medical/ointment, /obj/item/stack/medical/mesh) // sterilizer and alcohol will require reagent treatments, coming soon
+
+ // Flesh damage vars
+ /// How much damage to our flesh we currently have. Once both this and infestation reach 0, the wound is considered healed
+ var/flesh_damage = 5
+ /// Our current counter for how much flesh regeneration we have stacked from regenerative mesh/synthflesh/whatever, decrements each tick and lowers flesh_damage
+ var/flesh_healing = 0
+
+ // Infestation vars (only for severe and critical)
+ /// How quickly infection breeds on this burn if we don't have disinfectant
+ var/infestation_rate = 0
+ /// Our current level of infection
+ var/infestation = 0
+ /// Our current level of sanitization/anti-infection, from disinfectants/alcohol/UV lights. While positive, totally pauses and slowly reverses infestation effects each tick
+ var/sanitization = 0
+
+ /// Once we reach infestation beyond WOUND_INFESTATION_SEPSIS, we get this many warnings before the limb is completely paralyzed (you'd have to ignore a really bad burn for a really long time for this to happen)
+ var/strikes_to_lose_limb = 3
+
+ /// The current bandage we have for this wound (maybe move bandages to the limb?)
+ var/obj/item/stack/current_bandage
+
+/datum/wound/burn/handle_process()
+ . = ..()
+ if(strikes_to_lose_limb == 0)
+ victim.adjustToxLoss(0.5)
+ if(prob(1))
+ victim.visible_message("The infection on the remnants of [victim]'s [limb.name] shift and bubble nauseatingly!", "You can feel the infection on the remnants of your [limb.name] coursing through your veins!")
+ return
+
+ if(victim.reagents)
+ if(victim.reagents.has_reagent(/datum/reagent/medicine/spaceacillin))
+ sanitization += 0.9
+ if(victim.reagents.has_reagent(/datum/reagent/space_cleaner/sterilizine/))
+ sanitization += 0.9
+ if(victim.reagents.has_reagent(/datum/reagent/medicine/mine_salve))
+ sanitization += 0.3
+ flesh_healing += 0.5
+
+ if(current_bandage)
+ current_bandage.absorption_capacity -= WOUND_BURN_SANITIZATION_RATE
+ if(current_bandage.absorption_capacity <= 0)
+ victim.visible_message("Pus soaks through \the [current_bandage] on [victim]'s [limb.name].", "Pus soaks through \the [current_bandage] on your [limb.name].", vision_distance=COMBAT_MESSAGE_RANGE)
+ QDEL_NULL(current_bandage)
+ treat_priority = TRUE
+
+ if(flesh_healing > 0)
+ var/bandage_factor = (current_bandage ? current_bandage.splint_factor : 1)
+ flesh_damage = max(0, flesh_damage - 1)
+ flesh_healing = max(0, flesh_healing - bandage_factor) // good bandages multiply the length of flesh healing
+
+ // here's the check to see if we're cleared up
+ if((flesh_damage <= 0) && (infestation <= 1))
+ to_chat(victim, "The burns on your [limb.name] have cleared up!")
+ qdel(src)
+ return
+
+ // sanitization is checked after the clearing check but before the rest, because we freeze the effects of infection while we have sanitization
+ if(sanitization > 0)
+ var/bandage_factor = (current_bandage ? current_bandage.splint_factor : 1)
+ infestation = max(0, infestation - WOUND_BURN_SANITIZATION_RATE)
+ sanitization = max(0, sanitization - (WOUND_BURN_SANITIZATION_RATE * bandage_factor))
+ return
+
+ infestation += infestation_rate
+
+ switch(infestation)
+ if(0 to WOUND_INFECTION_MODERATE)
+ if(WOUND_INFECTION_MODERATE to WOUND_INFECTION_SEVERE)
+ if(prob(30))
+ victim.adjustToxLoss(0.2)
+ if(prob(6))
+ to_chat(victim, "The blisters on your [limb.name] ooze a strange pus...")
+ if(WOUND_INFECTION_SEVERE to WOUND_INFECTION_CRITICAL)
+ if(!disabling && prob(2))
+ to_chat(victim, "Your [limb.name] completely locks up, as you struggle for control against the infection!")
+ disabling = TRUE
+ else if(disabling && prob(8))
+ to_chat(victim, "You regain sensation in your [limb.name], but it's still in terrible shape!")
+ disabling = FALSE
+ else if(prob(20))
+ victim.adjustToxLoss(0.5)
+ if(WOUND_INFECTION_CRITICAL to WOUND_INFECTION_SEPTIC)
+ if(!disabling && prob(3))
+ to_chat(victim, "You suddenly lose all sensation of the festering infection in your [limb.name]!")
+ disabling = TRUE
+ else if(disabling && prob(3))
+ to_chat(victim, "You can barely feel your [limb.name] again, and you have to strain to retain motor control!")
+ disabling = FALSE
+ else if(prob(1))
+ to_chat(victim, "You contemplate life without your [limb.name]...")
+ victim.adjustToxLoss(0.75)
+ else if(prob(4))
+ victim.adjustToxLoss(1)
+ if(WOUND_INFECTION_SEPTIC to INFINITY)
+ if(prob(infestation))
+ switch(strikes_to_lose_limb)
+ if(3 to INFINITY)
+ to_chat(victim, "The skin on your [limb.name] is literally dripping off, you feel awful!")
+ if(2)
+ to_chat(victim, "The infection in your [limb.name] is literally dripping off, you feel horrible!")
+ if(1)
+ to_chat(victim, "Infection has just about completely claimed your [limb.name]!")
+ if(0)
+ to_chat(victim, "The last of the nerve endings in your [limb.name] wither away, as the infection completely paralyzes your joint connector.")
+ threshold_penalty = 120 // piss easy to destroy
+ var/datum/brain_trauma/severe/paralysis/sepsis = new (limb.body_zone)
+ victim.gain_trauma(sepsis)
+ strikes_to_lose_limb--
+
+/datum/wound/burn/get_examine_description(mob/user)
+ if(strikes_to_lose_limb <= 0)
+ return "[victim.p_their(TRUE)] [limb.name] is completely dead and unrecognizable as organic."
+
+ var/condition = ""
+ if(current_bandage)
+ var/bandage_condition
+ switch(current_bandage.absorption_capacity)
+ if(0 to 1.25)
+ bandage_condition = "nearly ruined "
+ if(1.25 to 2.75)
+ bandage_condition = "badly worn "
+ if(2.75 to 4)
+ bandage_condition = "slightly pus-stained "
+ if(4 to INFINITY)
+ bandage_condition = "clean "
+
+ condition += " underneath a dressing of [bandage_condition] [current_bandage.name]"
+ else
+ switch(infestation)
+ if(WOUND_INFECTION_MODERATE to WOUND_INFECTION_SEVERE)
+ condition += ", with small spots of discoloration along the nearby veins!"
+ if(WOUND_INFECTION_SEVERE to WOUND_INFECTION_CRITICAL)
+ condition += ", with dark clouds spreading outwards under the skin!"
+ if(WOUND_INFECTION_CRITICAL to WOUND_INFECTION_SEPTIC)
+ condition += ", with streaks of rotten infection pulsating outward!"
+ if(WOUND_INFECTION_SEPTIC to INFINITY)
+ return "[victim.p_their(TRUE)] [limb.name] is a mess of char and rot, skin literally dripping off the bone with infection!"
+ else
+ condition += "!"
+
+ return "[victim.p_their(TRUE)] [limb.name] [examine_desc][condition]"
+
+/datum/wound/burn/get_scanner_description(mob/user)
+ if(strikes_to_lose_limb == 0)
+ var/oopsie = "Type: [name]\nSeverity: [severity_text()]"
+ oopsie += "
Infection Level: The infection is total. The bodypart is lost. Amputate or augment limb immediately.
"
+ return oopsie
+
+ . = ..()
+ . += "
"
+
+ if(infestation <= sanitization && flesh_damage <= flesh_healing)
+ . += "No further treatment required: Burns will heal shortly."
+ else
+ switch(infestation)
+ if(WOUND_INFECTION_MODERATE to WOUND_INFECTION_SEVERE)
+ . += "Infection Level: Moderate\n"
+ if(WOUND_INFECTION_SEVERE to WOUND_INFECTION_CRITICAL)
+ . += "Infection Level: Severe\n"
+ if(WOUND_INFECTION_CRITICAL to WOUND_INFECTION_SEPTIC)
+ . += "Infection Level: CRITICAL\n"
+ if(WOUND_INFECTION_SEPTIC to INFINITY)
+ . += "Infection Level: LOSS IMMINENT\n"
+ if(infestation > sanitization)
+ . += "\tSurgical debridement, antiobiotics/sterilizers, or regenerative mesh will rid infection. Paramedic UV penlights are also effective.\n"
+
+ if(flesh_damage > 0)
+ . += "Flesh damage detected: Please apply ointment or regenerative mesh to allow recovery.\n"
+ . += "
"
+
+/*
+ new burn common procs
+*/
+
+/// if someone is using ointment on our burns
+/datum/wound/burn/proc/ointment(obj/item/stack/medical/ointment/I, mob/user)
+ user.visible_message("[user] begins applying [I] to [victim]'s [limb.name]...", "You begin applying [I] to [user == victim ? "your" : "[victim]'s"] [limb.name]...")
+ if(!do_after(user, (user == victim ? I.self_delay : I.other_delay), target = victim))
+ return
+
+ limb.heal_damage(I.heal_brute, I.heal_burn)
+ user.visible_message("[user] applies [I] to [victim].", "You apply [I] to [user == victim ? "your" : "[victim]'s"] [limb.name].")
+ I.use(1)
+ sanitization += I.sanitization
+ flesh_healing += I.flesh_regeneration
+
+ if((infestation <= 0 || sanitization >= infestation) && (flesh_damage <= 0 || flesh_healing > flesh_damage))
+ to_chat(user, "You've done all you can with [I], now you must wait for the flesh on [victim]'s [limb.name] to recover.")
+ else
+ try_treating(I, user)
+
+/// for use in the burn dressing surgery since we don't want to make them do another do_after obviously
+/datum/wound/burn/proc/force_bandage(obj/item/stack/medical/gauze/I, mob/user)
+ QDEL_NULL(current_bandage)
+ current_bandage = new I.type(limb)
+ current_bandage.amount = 1
+ treat_priority = FALSE
+ sanitization += I.sanitization
+ I.use(1)
+
+/// if someone is wrapping gauze on our burns
+/datum/wound/burn/proc/bandage(obj/item/stack/medical/gauze/I, mob/user)
+ if(current_bandage)
+ if(current_bandage.absorption_capacity > I.absorption_capacity + 1)
+ to_chat(user, "The [current_bandage] on [victim]'s [limb.name] is still in better condition than your [I.name]!")
+ return
+ user.visible_message("[user] begins to redress the burns on [victim]'s [limb.name] with [I]...", "You begin redressing the burns on [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...")
+ else
+ user.visible_message("[user] begins to dress the burns on [victim]'s [limb.name] with [I]...", "You begin dressing the burns on [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...")
+
+ if(!do_after(user, (user == victim ? I.self_delay : I.other_delay), target=victim, extra_checks = CALLBACK(src, .proc/still_exists)))
+ return
+
+ user.visible_message("[user] applies [I] to [victim].", "You apply [I] to [user == victim ? "your" : "[victim]'s"] [limb.name].")
+ QDEL_NULL(current_bandage)
+ current_bandage = new I.type(limb)
+ current_bandage.amount = 1
+ treat_priority = FALSE
+ sanitization += I.sanitization
+ I.use(1)
+
+/// if someone is using mesh on our burns
+/datum/wound/burn/proc/mesh(obj/item/stack/medical/mesh/I, mob/user)
+ user.visible_message("[user] begins wrapping [victim]'s [limb.name] with [I]...", "You begin wrapping [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...")
+ if(!do_after(user, (user == victim ? I.self_delay : I.other_delay), target=victim, extra_checks = CALLBACK(src, .proc/still_exists)))
+ return
+
+ limb.heal_damage(I.heal_brute, I.heal_burn)
+ user.visible_message("[user] applies [I] to [victim].", "You apply [I] to [user == victim ? "your" : "[victim]'s"] [limb.name].")
+ I.use(1)
+ sanitization += I.sanitization
+ flesh_healing += I.flesh_regeneration
+
+ if(sanitization >= infestation && flesh_healing > flesh_damage)
+ to_chat(user, "You've done all you can with [I], now you must wait for the flesh on [victim]'s [limb.name] to recover.")
+ else
+ try_treating(I, user)
+
+/// Paramedic UV penlights
+/datum/wound/burn/proc/uv(obj/item/flashlight/pen/paramedic/I, mob/user)
+ if(I.uv_cooldown > world.time)
+ to_chat(user, "[I] is still recharging!")
+ return
+ if(infestation <= 0 || infestation < sanitization)
+ to_chat(user, "There's no infection to treat on [victim]'s [limb.name]!")
+ return
+
+ user.visible_message("[user] flashes the burns on [victim]'s [limb] with [I].", "You flash the burns on [user == victim ? "your" : "[victim]'s"] [limb.name] with [I].", vision_distance=COMBAT_MESSAGE_RANGE)
+ sanitization += I.uv_power
+ I.uv_cooldown = world.time + I.uv_cooldown_length
+
+/datum/wound/burn/treat(obj/item/I, mob/user)
+ if(istype(I, /obj/item/stack/medical/gauze))
+ bandage(I, user)
+ else if(istype(I, /obj/item/stack/medical/ointment))
+ ointment(I, user)
+ else if(istype(I, /obj/item/stack/medical/mesh))
+ mesh(I, user)
+ else if(istype(I, /obj/item/flashlight/pen/paramedic))
+ uv(I, user)
+
+/// basic support for instabitaluri/synthflesh healing flesh damage, more chem support in the future
+/datum/wound/burn/proc/regenerate_flesh(amount)
+ flesh_healing += amount * 0.5 // 20u patch will heal 10 flesh standard
+
+// we don't even care about first degree burns, straight to second
+/datum/wound/burn/moderate
+ name = "Second Degree Burns"
+ desc = "Patient is suffering considerable burns with mild skin penetration, weakening limb integrity and increased burning sensations."
+ treat_text = "Recommended application of topical ointment or regenerative mesh to affected region."
+ examine_desc = "is badly burned and breaking out in blisters"
+ occur_text = "breaks out with violent red burns"
+ severity = WOUND_SEVERITY_MODERATE
+ damage_mulitplier_penalty = 1.1
+ threshold_minimum = 40
+ threshold_penalty = 30 // burns cause significant decrease in limb integrity compared to other wounds
+ status_effect_type = /datum/status_effect/wound/burn/moderate
+ flesh_damage = 5
+ scarring_descriptions = list("small amoeba-shaped skinmarks", "a faded streak of depressed skin")
+
+/datum/wound/burn/severe
+ name = "Third Degree Burns"
+ desc = "Patient is suffering extreme burns with full skin penetration, creating serious risk of infection and greatly reduced limb integrity."
+ treat_text = "Recommended immediate disinfection and excision of any infected skin, followed by bandaging and ointment."
+ examine_desc = "appears seriously charred, with aggressive red splotches"
+ occur_text = "chars rapidly, exposing ruined tissue and spreading angry red burns"
+ severity = WOUND_SEVERITY_SEVERE
+ damage_mulitplier_penalty = 1.2
+ threshold_minimum = 80
+ threshold_penalty = 40
+ status_effect_type = /datum/status_effect/wound/burn/severe
+ treatable_by = list(/obj/item/flashlight/pen/paramedic, /obj/item/stack/medical/gauze, /obj/item/stack/medical/ointment, /obj/item/stack/medical/mesh)
+ infestation_rate = 0.05 // appx 13 minutes to reach sepsis without any treatment
+ flesh_damage = 12.5
+ scarring_descriptions = list("a large, jagged patch of faded skin", "random spots of shiny, smooth skin", "spots of taut, leathery skin")
+
+/datum/wound/burn/critical
+ name = "Catastrophic Burns"
+ desc = "Patient is suffering near complete loss of tissue and significantly charred muscle and bone, creating life-threatening risk of infection and negligible limb integrity."
+ treat_text = "Immediate surgical debriding of any infected skin, followed by potent tissue regeneration formula and bandaging."
+ examine_desc = "is a ruined mess of blanched bone, melted fat, and charred tissue"
+ occur_text = "vaporizes as flesh, bone, and fat melt together in a horrifying mess"
+ severity = WOUND_SEVERITY_CRITICAL
+ damage_mulitplier_penalty = 1.3
+ sound_effect = 'sound/effects/sizzle2.ogg'
+ threshold_minimum = 140
+ threshold_penalty = 80
+ status_effect_type = /datum/status_effect/wound/burn/critical
+ treatable_by = list(/obj/item/flashlight/pen/paramedic, /obj/item/stack/medical/gauze, /obj/item/stack/medical/ointment, /obj/item/stack/medical/mesh)
+ infestation_rate = 0.15 // appx 4.33 minutes to reach sepsis without any treatment
+ flesh_damage = 20
+ scarring_descriptions = list("massive, disfiguring keloid scars", "several long streaks of badly discolored and malformed skin", "unmistakeable splotches of dead tissue from serious burns")
diff --git a/code/datums/wounds/cuts.dm b/code/datums/wounds/cuts.dm
new file mode 100644
index 0000000000..59ce286884
--- /dev/null
+++ b/code/datums/wounds/cuts.dm
@@ -0,0 +1,314 @@
+
+/*
+ Cuts
+*/
+
+/datum/wound/brute/cut
+ sound_effect = 'sound/weapons/slice.ogg'
+ processes = TRUE
+ wound_type = WOUND_LIST_CUT
+ treatable_by = list(/obj/item/stack/medical/suture, /obj/item/stack/medical/gauze)
+ treatable_by_grabbed = list(/obj/item/gun/energy/laser)
+ treatable_tool = TOOL_CAUTERY
+ treat_priority = TRUE
+ base_treat_time = 3 SECONDS
+
+ /// How much blood we start losing when this wound is first applied
+ var/initial_flow
+ /// When we have less than this amount of flow, either from treatment or clotting, we demote to a lower cut or are healed of the wound
+ var/minimum_flow
+ /// How fast our blood flow will naturally decrease per tick, not only do larger cuts bleed more faster, they clot slower
+ var/clot_rate
+
+ /// Once the blood flow drops below minimum_flow, we demote it to this type of wound. If there's none, we're all better
+ var/demotes_to
+
+ /// How much staunching per type (cautery, suturing, bandaging) you can have before that type is no longer effective for this cut NOT IMPLEMENTED
+ var/max_per_type
+ /// The maximum flow we've had so far
+ var/highest_flow
+ /// How much flow we've already cauterized
+ var/cauterized
+ /// How much flow we've already sutured
+ var/sutured
+
+ /// The current bandage we have for this wound (maybe move bandages to the limb?)
+ var/obj/item/stack/current_bandage
+ /// A bad system I'm using to track the worst scar we earned (since we can demote, we want the biggest our wound has been, not what it was when it was cured (probably moderate))
+ var/datum/scar/highest_scar
+
+/datum/wound/brute/cut/wound_injury(datum/wound/brute/cut/old_wound = null)
+ blood_flow = initial_flow
+ if(old_wound)
+ blood_flow = max(old_wound.blood_flow, initial_flow)
+ if(old_wound.severity > severity && old_wound.highest_scar)
+ highest_scar = old_wound.highest_scar
+ old_wound.highest_scar = null
+ if(old_wound.current_bandage)
+ current_bandage = old_wound.current_bandage
+ old_wound.current_bandage = null
+
+ if(!highest_scar)
+ highest_scar = new
+ highest_scar.generate(limb, src, add_to_scars=FALSE)
+
+/datum/wound/brute/cut/remove_wound(ignore_limb, replaced)
+ if(!replaced && highest_scar)
+ already_scarred = TRUE
+ highest_scar.lazy_attach(limb)
+ return ..()
+
+/datum/wound/brute/cut/get_examine_description(mob/user)
+ if(!current_bandage)
+ return ..()
+
+ var/bandage_condition = ""
+ // how much life we have left in these bandages
+ switch(current_bandage.absorption_capacity)
+ if(0 to 1.25)
+ bandage_condition = "nearly ruined "
+ if(1.25 to 2.75)
+ bandage_condition = "badly worn "
+ if(2.75 to 4)
+ bandage_condition = "slightly bloodied "
+ if(4 to INFINITY)
+ bandage_condition = "clean "
+ return "The cuts on [victim.p_their()] [limb.name] are wrapped with [bandage_condition] [current_bandage.name]!"
+
+/datum/wound/brute/cut/receive_damage(wounding_type, wounding_dmg, wound_bonus)
+ if(victim.stat != DEAD && wounding_type == WOUND_SHARP) // can't stab dead bodies to make it bleed faster this way
+ blood_flow += 0.05 * wounding_dmg
+
+/datum/wound/brute/cut/handle_process()
+ blood_flow = min(blood_flow, WOUND_CUT_MAX_BLOODFLOW)
+
+ if(victim.reagents && victim.reagents.has_reagent(/datum/reagent/toxin/heparin))
+ blood_flow += 0.5 // old herapin used to just add +2 bleed stacks per tick, this adds 0.5 bleed flow to all open cuts which is probably even stronger as long as you can cut them first
+ else if(victim.reagents && victim.reagents.has_reagent(/datum/reagent/medicine/coagulant))
+ blood_flow -= 0.25
+
+ if(current_bandage)
+ if(clot_rate > 0)
+ blood_flow -= clot_rate
+ blood_flow -= current_bandage.absorption_rate
+ current_bandage.absorption_capacity -= current_bandage.absorption_rate
+ if(current_bandage.absorption_capacity < 0)
+ victim.visible_message("Blood soaks through \the [current_bandage] on [victim]'s [limb.name].", "Blood soaks through \the [current_bandage] on your [limb.name].", vision_distance=COMBAT_MESSAGE_RANGE)
+ QDEL_NULL(current_bandage)
+ treat_priority = TRUE
+ else
+ blood_flow -= clot_rate
+
+ if(blood_flow > highest_flow)
+ highest_flow = blood_flow
+
+ if(blood_flow < minimum_flow)
+ if(demotes_to)
+ replace_wound(demotes_to)
+ else
+ to_chat(victim, "The cut on your [limb.name] has stopped bleeding!")
+ qdel(src)
+
+/* BEWARE, THE BELOW NONSENSE IS MADNESS. bones.dm looks more like what I have in mind and is sufficiently clean, don't pay attention to this messiness */
+
+/datum/wound/brute/cut/check_grab_treatments(obj/item/I, mob/user)
+ if(istype(I, /obj/item/gun/energy/laser))
+ return TRUE
+
+/datum/wound/brute/cut/treat(obj/item/I, mob/user)
+ if(istype(I, /obj/item/gun/energy/laser))
+ las_cauterize(I, user)
+ else if(I.tool_behaviour == TOOL_CAUTERY || I.get_temperature() > 300)
+ tool_cauterize(I, user)
+ else if(istype(I, /obj/item/stack/medical/gauze))
+ bandage(I, user)
+ else if(istype(I, /obj/item/stack/medical/suture))
+ suture(I, user)
+
+/datum/wound/brute/cut/try_handling(mob/living/carbon/human/user)
+ if(user.pulling != victim || user.zone_selected != limb.body_zone || user.a_intent == INTENT_GRAB)
+ return FALSE
+
+ if(!iscatperson(user))
+ return FALSE
+
+ if(!(user.client?.prefs.vore_flags & LICKABLE))
+ return FALSE
+
+ lick_wounds(user)
+ return TRUE
+
+/// if a felinid is licking this cut to reduce bleeding
+/datum/wound/brute/cut/proc/lick_wounds(mob/living/carbon/human/user)
+ if(INTERACTING_WITH(user, victim))
+ to_chat(user, "You're already interacting with [victim]!")
+ return
+
+ user.visible_message("[user] begins licking the wounds on [victim]'s [limb.name].", "You begin licking the wounds on [victim]'s [limb.name]...", ignored_mobs=victim)
+ to_chat(victim, "[user] begins to lick the wounds on your [limb.name].[user] licks the wounds on [victim]'s [limb.name].", "You lick some of the wounds on [victim]'s [limb.name]", ignored_mobs=victim)
+ to_chat(victim, "[user] licks the wounds on your [limb.name]! minimum_flow)
+ try_handling(user)
+ else if(demotes_to)
+ to_chat(user, "You successfully lower the severity of [victim]'s cuts.")
+
+/datum/wound/brute/cut/on_xadone(power)
+ . = ..()
+ blood_flow -= 0.03 * power // i think it's like a minimum of 3 power, so .09 blood_flow reduction per tick is pretty good for 0 effort
+
+/// If someone's putting a laser gun up to our cut to cauterize it
+/datum/wound/brute/cut/proc/las_cauterize(obj/item/gun/energy/laser/lasgun, mob/user)
+ var/self_penalty_mult = (user == victim ? 1.25 : 1)
+ user.visible_message("[user] begins aiming [lasgun] directly at [victim]'s [limb.name]...", "You begin aiming [lasgun] directly at [user == victim ? "your" : "[victim]'s"] [limb.name]...")
+ if(!do_after(user, base_treat_time * self_penalty_mult, target=victim, extra_checks = CALLBACK(src, .proc/still_exists)))
+ return
+ var/damage = lasgun.chambered.BB.damage
+ lasgun.chambered.BB.wound_bonus -= 30
+ lasgun.chambered.BB.damage *= self_penalty_mult
+ if(!lasgun.process_fire(victim, victim, TRUE, null, limb.body_zone))
+ return
+ victim.emote("scream")
+ blood_flow -= damage / (5 * self_penalty_mult) // 20 / 5 = 4 bloodflow removed, p good
+ cauterized += damage / (5 * self_penalty_mult)
+ victim.visible_message("The cuts on [victim]'s [limb.name] scar over!")
+
+/// If someone is using either a cautery tool or something with heat to cauterize this cut
+/datum/wound/brute/cut/proc/tool_cauterize(obj/item/I, mob/user)
+ var/self_penalty_mult = (user == victim ? 1.5 : 1)
+ user.visible_message("[user] begins cauterizing [victim]'s [limb.name] with [I]...", "You begin cauterizing [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...")
+ if(!do_after(user, base_treat_time * self_penalty_mult, target=victim, extra_checks = CALLBACK(src, .proc/still_exists)))
+ return
+
+ user.visible_message("[user] cauterizes some of the bleeding on [victim].", "You cauterize some of the bleeding on [victim].")
+ limb.receive_damage(burn = 2 + severity, wound_bonus = CANT_WOUND)
+ if(prob(30))
+ victim.emote("scream")
+ var/blood_cauterized = (0.6 / self_penalty_mult)
+ blood_flow -= blood_cauterized
+ cauterized += blood_cauterized
+
+ if(blood_flow > minimum_flow)
+ try_treating(I, user)
+ else if(demotes_to)
+ to_chat(user, "You successfully lower the severity of [user == victim ? "your" : "[victim]'s"] cuts.")
+
+/// If someone is using a suture to close this cut
+/datum/wound/brute/cut/proc/suture(obj/item/stack/medical/suture/I, mob/user)
+ var/self_penalty_mult = (user == victim ? 1.4 : 1)
+ user.visible_message("[user] begins stitching [victim]'s [limb.name] with [I]...", "You begin stitching [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...")
+ if(!do_after(user, base_treat_time * self_penalty_mult, target=victim, extra_checks = CALLBACK(src, .proc/still_exists)))
+ return
+ user.visible_message("[user] stitches up some of the bleeding on [victim].", "You stitch up some of the bleeding on [user == victim ? "yourself" : "[victim]"].")
+ var/blood_sutured = I.stop_bleeding / self_penalty_mult
+ blood_flow -= blood_sutured
+ sutured += blood_sutured
+ limb.heal_damage(I.heal_brute, I.heal_burn)
+
+ if(blood_flow > minimum_flow)
+ try_treating(I, user)
+ else if(demotes_to)
+ to_chat(user, "You successfully lower the severity of [user == victim ? "your" : "[victim]'s"] cuts.")
+
+/// If someone is using gauze on this cut
+/datum/wound/brute/cut/proc/bandage(obj/item/stack/I, mob/user)
+ if(current_bandage)
+ if(current_bandage.absorption_capacity > I.absorption_capacity + 1)
+ to_chat(user, "The [current_bandage] on [victim]'s [limb.name] is still in better condition than your [I.name]!")
+ return
+ else
+ user.visible_message("[user] begins rewrapping the cuts on [victim]'s [limb.name] with [I]...", "You begin rewrapping the cuts on [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...")
+ else
+ user.visible_message("[user] begins wrapping the cuts on [victim]'s [limb.name] with [I]...", "You begin wrapping the cuts on [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...")
+ if(!do_after(user, base_treat_time, target=victim, extra_checks = CALLBACK(src, .proc/still_exists)))
+ return
+
+ user.visible_message("[user] applies [I] to [victim]'s [limb.name].", "You bandage some of the bleeding on [user == victim ? "yourself" : "[victim]"].")
+ QDEL_NULL(current_bandage)
+ current_bandage = new I.type(limb)
+ current_bandage.amount = 1
+ treat_priority = FALSE
+ I.use(1)
+
+
+/datum/wound/brute/cut/moderate
+ name = "Rough Abrasion"
+ desc = "Patient's skin has been badly scraped, generating moderate blood loss."
+ treat_text = "Application of clean bandages or first-aid grade sutures, followed by food and rest."
+ examine_desc = "has an open cut"
+ occur_text = "is cut open, slowly leaking blood"
+ sound_effect = 'sound/effects/blood1.ogg'
+ severity = WOUND_SEVERITY_MODERATE
+ initial_flow = 2
+ minimum_flow = 0.5
+ max_per_type = 3
+ clot_rate = 0.15
+ threshold_minimum = 20
+ threshold_penalty = 10
+ status_effect_type = /datum/status_effect/wound/cut/moderate
+ scarring_descriptions = list("light, faded lines", "minor cut marks", "a small faded slit", "a series of small scars")
+
+/datum/wound/brute/cut/severe
+ name = "Open Laceration"
+ desc = "Patient's skin is ripped clean open, allowing significant blood loss."
+ treat_text = "Speedy application of first-aid grade sutures and clean bandages, followed by vitals monitoring to ensure recovery."
+ examine_desc = "has a severe cut"
+ occur_text = "is ripped open, veins spurting blood"
+ sound_effect = 'sound/effects/blood2.ogg'
+ severity = WOUND_SEVERITY_SEVERE
+ initial_flow = 3.25
+ minimum_flow = 2.75
+ clot_rate = 0.07
+ max_per_type = 4
+ threshold_minimum = 50
+ threshold_penalty = 25
+ demotes_to = /datum/wound/brute/cut/moderate
+ status_effect_type = /datum/status_effect/wound/cut/severe
+ scarring_descriptions = list("a twisted line of faded gashes", "a gnarled sickle-shaped slice scar", "a long-faded puncture wound")
+
+/datum/wound/brute/cut/critical
+ name = "Weeping Avulsion"
+ desc = "Patient's skin is completely torn open, along with significant loss of tissue. Extreme blood loss will lead to quick death without intervention."
+ treat_text = "Immediate bandaging and either suturing or cauterization, followed by supervised resanguination."
+ examine_desc = "is spurting blood at an alarming rate"
+ occur_text = "is torn open, spraying blood wildly"
+ sound_effect = 'sound/effects/blood3.ogg'
+ severity = WOUND_SEVERITY_CRITICAL
+ initial_flow = 4.25
+ minimum_flow = 4
+ clot_rate = -0.05 // critical cuts actively get worse instead of better
+ max_per_type = 5
+ threshold_minimum = 80
+ threshold_penalty = 40
+ demotes_to = /datum/wound/brute/cut/severe
+ status_effect_type = /datum/status_effect/wound/cut/critical
+ scarring_descriptions = list("a winding path of very badly healed scar tissue", "a series of peaks and valleys along a gruesome line of cut scar tissue", "a grotesque snake of indentations and stitching scars")
+
+// TODO: see about moving dismemberment over to this, i'll have to add judging dismembering power/wound potential wrt item size i guess
+/datum/wound/brute/cut/loss
+ name = "Dismembered"
+ desc = "oof ouch!!"
+ occur_text = "is violently dismembered!"
+ sound_effect = 'sound/effects/dismember.ogg'
+ viable_zones = list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
+ severity = WOUND_SEVERITY_LOSS
+ threshold_minimum = 180
+ status_effect_type = null
+
+/datum/wound/brute/cut/loss/apply_wound(obj/item/bodypart/L, silent, datum/wound/brute/cut/old_wound, smited = FALSE)
+ if(!L.dismemberable)
+ qdel(src)
+ return
+
+ L.dismember()
+ qdel(src)
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index dabbe93bec..f87f7a757c 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -516,7 +516,7 @@ GLOBAL_LIST_EMPTY(teleportlocs)
used_environ += amount
-/area/Entered(atom/movable/M)
+/area/Entered(atom/movable/M, atom/OldLoc)
set waitfor = FALSE
SEND_SIGNAL(src, COMSIG_AREA_ENTERED, M)
SEND_SIGNAL(M, COMSIG_ENTER_AREA, src) //The atom that enters the area
@@ -524,6 +524,11 @@ GLOBAL_LIST_EMPTY(teleportlocs)
return
var/mob/living/L = M
+ var/turf/oldTurf = get_turf(OldLoc)
+ var/area/A = oldTurf?.loc
+ if(A && (A.has_gravity != has_gravity))
+ L.update_gravity(L.mob_has_gravity())
+
if(!L.ckey)
return
diff --git a/code/game/area/areas/shuttles.dm b/code/game/area/areas/shuttles.dm
index cec0067e4b..43ea487894 100644
--- a/code/game/area/areas/shuttles.dm
+++ b/code/game/area/areas/shuttles.dm
@@ -93,6 +93,13 @@
/area/shuttle/abandoned/pod
name = "Abandoned Ship Pod"
+////////////////////////////Bounty Hunter Shuttles////////////////////////////
+/area/shuttle/hunter
+ name = "Hunter Shuttle"
+ dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
+ blob_allowed = FALSE
+ canSmoothWithAreas = /area/shuttle/hunter
+
////////////////////////////Single-area shuttles////////////////////////////
/area/shuttle/transit
@@ -103,6 +110,10 @@
/area/shuttle/custom
name = "Custom player shuttle"
+/area/shuttle/custom/powered
+ name = "Custom Powered player shuttle"
+ requires_power = FALSE
+
/area/shuttle/arrival
name = "Arrival Shuttle"
unique = TRUE // SSjob refers to this area for latejoiners
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 5875334ed6..de9df3a23e 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -8,6 +8,13 @@
var/interaction_flags_atom = NONE
var/datum/reagents/reagents = null
+ var/flags_ricochet = NONE
+
+ ///When a projectile tries to ricochet off this atom, the projectile ricochet chance is multiplied by this
+ var/ricochet_chance_mod = 1
+ ///When a projectile ricochets off this atom, it deals the normal damage * this modifier to this atom
+ var/ricochet_damage_mod = 0.33
+
//This atom's HUD (med/sec, etc) images. Associative list.
var/list/image/hud_list = null
//HUD images that this atom can provide.
@@ -41,6 +48,7 @@
var/rad_insulation = RAD_NO_INSULATION
///The custom materials this atom is made of, used by a lot of things like furniture, walls, and floors (if I finish the functionality, that is.)
+ ///The list referenced by this var can be shared by multiple objects and should not be directly modified. Instead, use [set_custom_materials][/atom/proc/set_custom_materials].
var/list/custom_materials
///Bitfield for how the atom handles materials.
var/material_flags = NONE
@@ -62,6 +70,9 @@
/// A luminescence-shifted value of the last color calculated for chatmessage overlays
var/chat_color_darkened
+ ///Mobs that are currently do_after'ing this atom, to be cleared from on Destroy()
+ var/list/targeted_by
+
/atom/New(loc, ...)
//atom creation method that preloads variables at creation
if(GLOB.use_preloader && (src.type == GLOB._preloader.target_path))//in case the instanciated atom is creating other atoms in New()
@@ -93,6 +104,8 @@
stack_trace("Warning: [src]([type]) initialized multiple times!")
flags_1 |= INITIALIZED_1
+ if(loc)
+ SEND_SIGNAL(loc, COMSIG_ATOM_CREATED, src) /// Sends a signal that the new atom `src`, has been created at `loc`
//atom color stuff
if(color)
add_atom_colour(color, FIXED_COLOUR_PRIORITY)
@@ -107,11 +120,8 @@
if (canSmoothWith)
canSmoothWith = typelist("canSmoothWith", canSmoothWith)
- var/temp_list = list()
- for(var/i in custom_materials)
- temp_list[SSmaterials.GetMaterialRef(i)] = custom_materials[i] //Get the proper instanced version
- custom_materials = null //Null the list to prepare for applying the materials properly
- set_custom_materials(temp_list)
+ // apply materials properly from the default custom_materials value
+ set_custom_materials(custom_materials)
ComponentInitialize()
@@ -137,6 +147,11 @@
LAZYCLEARLIST(overlays)
LAZYCLEARLIST(priority_overlays)
+ for(var/i in targeted_by)
+ var/mob/M = i
+ LAZYREMOVE(M.do_afters, src)
+ targeted_by = null
+
QDEL_NULL(light)
return ..()
@@ -148,11 +163,20 @@
/atom/proc/check_projectile_ricochet(obj/item/projectile/P)
return (flags_1 & DEFAULT_RICOCHET_1)? PROJECTILE_RICOCHET_YES : PROJECTILE_RICOCHET_NO
-/**
- * Handle a projectile ricochet. Return TRUE if we did something to the projectile like reflecting it/whatnot.
- */
-/atom/proc/handle_projectile_ricochet(obj/item/projectile/P)
- return FALSE
+/atom/proc/handle_ricochet(obj/item/projectile/P)
+ var/turf/p_turf = get_turf(P)
+ var/face_direction = get_dir(src, p_turf)
+ var/face_angle = dir2angle(face_direction)
+ var/incidence_s = GET_ANGLE_OF_INCIDENCE(face_angle, (P.Angle + 180))
+ var/a_incidence_s = abs(incidence_s)
+ if(a_incidence_s > 90 && a_incidence_s < 270)
+ return FALSE
+ if((P.flag in list("bullet", "bomb")) && P.ricochet_incidence_leeway)
+ if((a_incidence_s < 90 && a_incidence_s < 90 - P.ricochet_incidence_leeway) || (a_incidence_s > 270 && a_incidence_s -270 > P.ricochet_incidence_leeway))
+ return
+ var/new_angle_s = SIMPLIFY_DEGREES(face_angle + incidence_s)
+ P.setAngle(new_angle_s)
+ return TRUE
/atom/proc/CanPass(atom/movable/mover, turf/target)
return !density
@@ -203,7 +227,7 @@
/atom/proc/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE)
SEND_SIGNAL(src, COMSIG_ATOM_HULK_ATTACK, user)
if(does_attack_animation)
- user.changeNext_move(CLICK_CD_MELEE)
+ user.DelayNextAction(CLICK_CD_MELEE)
log_combat(user, src, "punched", "hulk powers")
user.do_attack_animation(src, ATTACK_EFFECT_SMASH)
@@ -352,6 +376,20 @@
SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user, .)
+/**
+ * Called when a mob examines (shift click or verb) this atom twice (or more) within EXAMINE_MORE_TIME (default 1.5 seconds)
+ *
+ * This is where you can put extra information on something that may be superfluous or not important in critical gameplay
+ * moments, while allowing people to manually double-examine to take a closer look
+ *
+ * Produces a signal [COMSIG_PARENT_EXAMINE_MORE]
+ */
+/atom/proc/examine_more(mob/user)
+ . = list()
+ SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE_MORE, user, .)
+ if(!LAZYLEN(.)) // lol ..length
+ return list("You examine [src] closer, but find nothing of interest...")
+
/// Updates the icon of the atom
/atom/proc/update_icon()
// I expect we're going to need more return flags and options in this proc
@@ -422,7 +460,7 @@
var/blood_id = get_blood_id()
if(!(blood_id in GLOB.blood_reagent_types))
return
- return list("ANIMAL DNA" = "Y-")
+ return list("color" = BLOOD_COLOR_HUMAN, "ANIMAL DNA" = "Y-")
/mob/living/carbon/get_blood_dna_list()
var/blood_id = get_blood_id()
@@ -430,13 +468,15 @@
return
var/list/blood_dna = list()
if(dna)
+ blood_dna["color"] = dna.species.exotic_blood_color //so when combined, the list grows with the number of colors
blood_dna[dna.unique_enzymes] = dna.blood_type
else
+ blood_dna["color"] = BLOOD_COLOR_HUMAN
blood_dna["UNKNOWN DNA"] = "X*"
return blood_dna
/mob/living/carbon/alien/get_blood_dna_list()
- return list("UNKNOWN DNA" = "X*")
+ return list("color" = BLOOD_COLOR_XENO, "UNKNOWN DNA" = "X*")
//to add a mob's dna info into an object's blood_DNA list.
/atom/proc/transfer_mob_blood_dna(mob/living/L)
@@ -447,18 +487,33 @@
LAZYINITLIST(blood_DNA) //if our list of DNA doesn't exist yet, initialise it.
var/old_length = blood_DNA.len
blood_DNA |= new_blood_dna
+ var/changed = FALSE
+ if(!blood_DNA["color"])
+ blood_DNA["color"] = new_blood_dna["color"]
+ changed = TRUE
+ else
+ var/old = blood_DNA["color"]
+ blood_DNA["color"] = BlendRGB(blood_DNA["color"], new_blood_dna["color"])
+ changed = old != blood_DNA["color"]
if(blood_DNA.len == old_length)
return FALSE
- return TRUE
+ return changed
//to add blood dna info to the object's blood_DNA list
/atom/proc/transfer_blood_dna(list/blood_dna, list/datum/disease/diseases)
LAZYINITLIST(blood_DNA)
+
var/old_length = blood_DNA.len
blood_DNA |= blood_dna
if(blood_DNA.len > old_length)
- return TRUE
+ . = TRUE
//some new blood DNA was added
+ if(!blood_dna["color"])
+ return
+ if(!blood_DNA["color"])
+ blood_DNA["color"] = blood_dna["color"]
+ else
+ blood_DNA["color"] = BlendRGB(blood_DNA["color"], blood_dna["color"])
//to add blood from a mob onto something, and transfer their dna info
/atom/proc/add_mob_blood(mob/living/M)
@@ -527,28 +582,7 @@
return TRUE
/atom/proc/blood_DNA_to_color()
- var/list/colors = list()//first we make a list of all bloodtypes present
- for(var/bloop in blood_DNA)
- if(colors[blood_DNA[bloop]])
- colors[blood_DNA[bloop]]++
- else
- colors[blood_DNA[bloop]] = 1
-
- var/final_rgb = BLOOD_COLOR_HUMAN //a default so we don't have white blood graphics if something messed up
-
- if(colors.len)
- var/sum = 0 //this is all shitcode, but it works; trust me
- final_rgb = bloodtype_to_color(colors[1])
- sum = colors[colors[1]]
- if(colors.len > 1)
- var/i = 2
- while(i <= colors.len)
- var/tmp = colors[colors[i]]
- final_rgb = BlendRGB(final_rgb, bloodtype_to_color(colors[i]), tmp/(tmp+sum))
- sum += tmp
- i++
-
- return final_rgb
+ return (blood_DNA && blood_DNA["color"]) || BLOOD_COLOR_HUMAN
/atom/proc/clean_blood()
. = blood_DNA? TRUE : FALSE
@@ -717,7 +751,7 @@
flags_1 |= ADMIN_SPAWNED_1
. = ..()
switch(var_name)
- if("color")
+ if(NAMEOF(src, color))
add_atom_colour(color, ADMIN_COLOUR_PRIORITY)
/atom/vv_get_dropdown()
@@ -856,6 +890,17 @@
/atom/proc/GenerateTag()
return
+/**
+ * Called after a shuttle is loaded **from map template initially**.
+ *
+ * @params
+ * * port - Mobile port/shuttle
+ * * dock - Stationary dock the shuttle's at
+ * * idnum - ID number of the shuttle
+ */
+/atom/proc/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE)
+ return
+
// Generic logging helper
/atom/proc/log_message(message, message_type, color=null, log_globally=TRUE)
if(!log_globally)
@@ -895,6 +940,8 @@
log_game(log_text)
if(LOG_GAME)
log_game(log_text)
+ if(LOG_SHUTTLE)
+ log_shuttle(log_text)
else
stack_trace("Invalid individual logging type: [message_type]. Defaulting to [LOG_GAME] (LOG_GAME).")
log_game(log_text)
@@ -947,6 +994,39 @@ Proc for attack log creation, because really why not
var/reverse_message = "has been [what_done] by [ssource][postfix]"
target.log_message(reverse_message, LOG_ATTACK, color="orange", log_globally=FALSE)
+/**
+ * log_wound() is for when someone is *attacked* and suffers a wound. Note that this only captures wounds from damage, so smites/forced wounds aren't logged, as well as demotions like cuts scabbing over
+ *
+ * Note that this has no info on the attack that dealt the wound: information about where damage came from isn't passed to the bodypart's damaged proc. When in doubt, check the attack log for attacks at that same time
+ * TODO later: Add logging for healed wounds, though that will require some rewriting of healing code to prevent admin heals from spamming the logs. Not high priority
+ *
+ * Arguments:
+ * * victim- The guy who got wounded
+ * * suffered_wound- The wound, already applied, that we're logging. It has to already be attached so we can get the limb from it
+ * * dealt_damage- How much damage is associated with the attack that dealt with this wound.
+ * * dealt_wound_bonus- The wound_bonus, if one was specified, of the wounding attack
+ * * dealt_bare_wound_bonus- The bare_wound_bonus, if one was specified *and applied*, of the wounding attack. Not shown if armor was present
+ * * base_roll- Base wounding ability of an attack is a random number from 1 to (dealt_damage ** WOUND_DAMAGE_EXPONENT). This is the number that was rolled in there, before mods
+ */
+/proc/log_wound(atom/victim, datum/wound/suffered_wound, dealt_damage, dealt_wound_bonus, dealt_bare_wound_bonus, base_roll)
+ if(QDELETED(victim) || !suffered_wound)
+ return
+ var/message = "has suffered: [suffered_wound][suffered_wound.limb ? " to [suffered_wound.limb.name]" : null]"// maybe indicate if it's a promote/demote?
+
+ if(dealt_damage)
+ message += " | Damage: [dealt_damage]"
+ // The base roll is useful since it can show how lucky someone got with the given attack. For example, dealing a cut
+ if(base_roll)
+ message += " (rolled [base_roll]/[dealt_damage ** WOUND_DAMAGE_EXPONENT])"
+
+ if(dealt_wound_bonus)
+ message += " | WB: [dealt_wound_bonus]"
+
+ if(dealt_bare_wound_bonus)
+ message += " | BWB: [dealt_bare_wound_bonus]"
+
+ victim.log_message(message, LOG_ATTACK, color="blue")
+
// Filter stuff
/atom/proc/add_filter(name,priority,list/params)
LAZYINITLIST(filter_data)
@@ -979,26 +1059,21 @@ Proc for attack log creation, because really why not
///Sets the custom materials for an item.
/atom/proc/set_custom_materials(var/list/materials, multiplier = 1)
-
- if(!materials)
- materials = custom_materials
-
if(custom_materials) //Only runs if custom materials existed at first. Should usually be the case but check anyways
for(var/i in custom_materials)
var/datum/material/custom_material = SSmaterials.GetMaterialRef(i)
custom_material.on_removed(src, material_flags) //Remove the current materials
if(!length(materials))
+ custom_materials = null
return
- custom_materials = list() //Reset the list
+ if(material_flags)
+ for(var/x in materials)
+ var/datum/material/custom_material = SSmaterials.GetMaterialRef(x)
+ custom_material.on_applied(src, materials[x] * multiplier * material_modifier, material_flags)
- for(var/x in materials)
- var/datum/material/custom_material = SSmaterials.GetMaterialRef(x)
-
- if(material_flags & MATERIAL_EFFECTS)
- custom_material.on_applied(src, materials[custom_material] * multiplier * material_modifier, material_flags)
- custom_materials[custom_material] += materials[x] * multiplier
+ custom_materials = SSmaterials.FindOrCreateMaterialCombo(materials, multiplier)
/**
* Returns true if this atom has gravity for the passed in turf
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index 9736f473e8..0238529195 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -120,25 +120,25 @@
if((var_name in careful_edits) && (var_value % world.icon_size) != 0)
return FALSE
switch(var_name)
- if("x")
+ if(NAMEOF(src, x))
var/turf/T = locate(var_value, y, z)
if(T)
forceMove(T)
return TRUE
return FALSE
- if("y")
+ if(NAMEOF(src, y))
var/turf/T = locate(x, var_value, z)
if(T)
forceMove(T)
return TRUE
return FALSE
- if("z")
+ if(NAMEOF(src, z))
var/turf/T = locate(x, y, var_value)
if(T)
forceMove(T)
return TRUE
return FALSE
- if("loc")
+ if(NAMEOF(src, loc))
if(istype(var_value, /atom))
forceMove(var_value)
return TRUE
diff --git a/code/game/atoms_movement.dm b/code/game/atoms_movement.dm
index 68db17f076..db9424d983 100644
--- a/code/game/atoms_movement.dm
+++ b/code/game/atoms_movement.dm
@@ -6,6 +6,7 @@
// To be removed on step_ conversion
// All this work to prevent a second bump
/atom/movable/Move(atom/newloc, direct=0)
+ set waitfor = FALSE //n o
. = FALSE
if(!newloc || newloc == loc)
return
@@ -52,6 +53,7 @@
////////////////////////////////////////
/atom/movable/Move(atom/newloc, direct)
+ set waitfor = FALSE //n o
var/atom/movable/pullee = pulling
var/turf/T = loc
if(!moving_from_pull)
diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm
index 7b798f19e4..154d2df563 100644
--- a/code/game/gamemodes/clock_cult/clock_cult.dm
+++ b/code/game/gamemodes/clock_cult/clock_cult.dm
@@ -38,7 +38,8 @@ Credit where due:
5. Xhuis from /tg/ for coding the first iteration of the mode, and the new, reworked version
6. ChangelingRain from /tg/ for maintaining the gamemode for months after its release prior to its rework
7. Clockwork cult code as of now, at least the one being pulled from Citadel Station's master branch, is being, or already is, fixed by Coolgat3 and Avunia.
-
+8. Modern clockwork cult code mixed with original clockwork code, with various changes to make it less of a fustercluck, done by KeRSe. \
+ Fixes and assistance done by TimothyTeakettle, Kevinz000, and Deltafire15. -Very glad for the help they gave.
*/
///////////
@@ -133,7 +134,7 @@ Credit where due:
config_tag = "clockwork_cult"
antag_flag = ROLE_SERVANT_OF_RATVAR
false_report_weight = 10
- required_players = 35
+ required_players = 24 //Fixing this directly for now since apparently config machine for forcing modes broke.
required_enemies = 3
recommended_enemies = 5
enemy_minimum_age = 7
@@ -143,13 +144,12 @@ Credit where due:
announce_text = "Servants of Ratvar are trying to summon the Justiciar!\n\
Servants: Construct defenses to protect the Ark. Sabotage the station!\n\
Crew: Stop the servants before they can summon the Clockwork Justiciar."
- var/servants_to_serve = list()
+ var/list/servants_to_serve = list() //Yes this list is made out of list
var/roundstart_player_count
- var/ark_time //In minutes, how long the Ark waits before activation; this is equal to 30 + (number of players / 5) (max 40 mins.)
var/datum/team/clockcult/main_clockcult
-/datum/game_mode/clockwork_cult/pre_setup()
+/datum/game_mode/clockwork_cult/pre_setup() //Gamemode and job code is pain. Have fun codediving all of that stuff, whoever works on this next - Delta
var/list/errorList = list()
var/list/reebes = SSmapping.LoadGroup(errorList, "Reebe", "map_files/generic", "City_of_Cogs.dmm", default_traits = ZTRAITS_REEBE, silent = TRUE)
if(errorList.len) // reebe failed to load
@@ -162,38 +162,36 @@ Credit where due:
restricted_jobs += protected_jobs
if(CONFIG_GET(flag/protect_assistant_from_antagonist))
restricted_jobs += "Assistant"
- var/starter_servants = 4 //Guaranteed four servants
+ var/starter_servants = 4 //Try to go for at least four
var/number_players = num_players()
roundstart_player_count = number_players
if(number_players > 30) //plus one servant for every additional 10 players above 30
number_players -= 30
starter_servants += round(number_players / 10)
- starter_servants = min(starter_servants, 8) //max 8 servants (that sould only happen with a ton of players)
- GLOB.clockwork_vitality += 50 * starter_servants //some starter Vitality to help recover from initial fuck ups
+ starter_servants = min(starter_servants, 8) //max 8 servants (that sould only happen with a ton of players)
while(starter_servants)
+ if(!antag_candidates.len)
+ break //Skip setup, DO NOT RUNTIME
var/datum/mind/servant = antag_pick(antag_candidates)
servants_to_serve += servant
antag_candidates -= servant
- servant.assigned_role = ROLE_SERVANT_OF_RATVAR
servant.special_role = ROLE_SERVANT_OF_RATVAR
+ servant.restricted_roles = restricted_jobs
starter_servants--
- ark_time = 30 + round((roundstart_player_count / 5)) //In minutes, how long the Ark will wait before activation
- ark_time = min(ark_time, 35) //35 minute maximum for the activation timer
- return 1
+ if(!servants_to_serve.len) //Uh oh, something went wrong
+ setup_error = "There are no clockcult candidates! (Or something went very wrong)"
+ return FALSE
+ GLOB.clockwork_vitality += 50 * servants_to_serve.len //some starter Vitality to help recover from initial fuck ups
+ return TRUE //Haha yes it works time to not touch it any more than that.
/datum/game_mode/clockwork_cult/post_setup()
for(var/S in servants_to_serve)
var/datum/mind/servant = S
log_game("[key_name(servant)] was made an initial servant of Ratvar")
var/mob/living/L = servant.current
- var/turf/T = pick(GLOB.servant_spawns)
- L.forceMove(T)
- GLOB.servant_spawns -= T
greet_servant(L)
equip_servant(L)
add_servant_of_ratvar(L, TRUE)
- var/obj/structure/destructible/clockwork/massive/celestial_gateway/G = GLOB.ark_of_the_clockwork_justiciar //that's a mouthful
- G.final_countdown(ark_time)
..()
return 1
@@ -201,20 +199,18 @@ Credit where due:
if(!M)
return 0
to_chat(M, "You are a servant of Ratvar, the Clockwork Justiciar!")
- to_chat(M, "You have approximately [ark_time] minutes until the Ark activates.")
- to_chat(M, "Unlock Script scripture by converting a new servant.")
- to_chat(M, "Application scripture will be unlocked halfway until the Ark's activation.")
+ to_chat(M, "Unlock Script scripture by converting a new servant or when 35kw of power is reached.")
+ to_chat(M, "Application scripture will be unlocked when 50kw of power is reached.")
M.playsound_local(get_turf(M), 'sound/ambience/antag/clockcultalr.ogg', 100, FALSE, pressure_affected = FALSE)
return 1
-/datum/game_mode/proc/equip_servant(mob/living/M) //Grants a clockwork slab to the mob, with one of each component
+/datum/game_mode/proc/equip_servant(mob/living/M) //Grants a clockwork slab to the mob
if(!M || !ishuman(M))
return FALSE
var/mob/living/carbon/human/L = M
- L.equipOutfit(/datum/outfit/servant_of_ratvar)
var/obj/item/clockwork/slab/S = new
var/slot = "At your feet"
- var/list/slots = list("In your left pocket" = SLOT_L_STORE, "In your right pocket" = SLOT_R_STORE, "In your backpack" = SLOT_IN_BACKPACK, "On your belt" = SLOT_BELT)
+ var/list/slots = list("In your left pocket" = SLOT_L_STORE, "In your right pocket" = SLOT_R_STORE, "In your backpack" = SLOT_IN_BACKPACK)
if(ishuman(L))
var/mob/living/carbon/human/H = L
slot = H.equip_in_one_of_slots(S, slots)
@@ -224,7 +220,6 @@ Credit where due:
if(!S.forceMove(get_turf(L)))
qdel(S)
if(S && !QDELETED(S))
- to_chat(L, "There is a paper in your backpack! It'll tell you if anything's changed, as well as what to expect.")
to_chat(L, "[slot] is a clockwork slab, a multipurpose tool used to construct machines and invoke ancient words of power. If this is your first time \
as a servant, you can find a concise tutorial in the Recollection category of its interface.")
to_chat(L, "If you want more information, you can read the wiki page to learn more.")
@@ -278,7 +273,7 @@ Credit where due:
gloves = /obj/item/clothing/gloves/color/yellow
belt = /obj/item/storage/belt/utility/servant
backpack_contents = list(/obj/item/storage/box/engineer = 1, \
- /obj/item/clockwork/replica_fabricator = 1, /obj/item/stack/tile/brass/fifty = 1, /obj/item/paper/servant_primer = 1, /obj/item/reagent_containers/food/drinks/bottle/holyoil = 1)
+ /obj/item/clockwork/replica_fabricator = 1, /obj/item/stack/tile/brass/fifty = 1, /obj/item/reagent_containers/food/drinks/bottle/holyoil = 1)
id = /obj/item/pda
var/plasmaman //We use this to determine if we should activate internals in post_equip()
@@ -305,53 +300,3 @@ Credit where due:
PDA.update_label()
PDA.id_check(H, W)
H.sec_hud_set_ID()
-
-
-//This paper serves as a quick run-down to the cult as well as a changelog to refer to.
-//Check strings/clockwork_cult_changelog.txt for the changelog, and update it when you can!
-/obj/item/paper/servant_primer
- name = "The Ark And You: A Primer On Servitude"
- color = "#DAAA18"
- info = "DON'T PANIC.
\
- Here's a quick primer on what you should know here.\
- \
-
You're in a place called Reebe right now. The crew can't get here normally.
\
-
In the north is your base camp, with supplies, consoles, and the Ark. In the south is an inaccessible area that the crew can walk between \
- once they arrive (more on that later.) Everything between that space is an open area.
\
-
Your job as a servant is to build fortifications and defenses to protect the Ark and your base once the Ark activates. You can do this \
- however you like, but work with your allies and coordinate your efforts.
\
-
Once the Ark activates, the station will be alerted. Portals to Reebe will open up in nearly every room. When they take these portals, \
- the crewmembers will arrive in the area that you can't access, but can get through it freely - whereas you can't. Treat this as the \"spawn\" of the \
- crew and defend it accordingly.
\
- \
- \
- Here is the layout of Reebe, from left to right:\
-
\
-
Dressing Room: Contains clothing, a dresser, and a mirror. There are spare slabs and absconders here.
\
-
Listening Station: Contains intercoms, a telecomms relay, and a list of frequencies.
\
-
Ark Chamber: Houses the Ark.
\
-
Observation Room: Contains five camera observers. These can be used to watch the station through its cameras, as well as to teleport down \
- to most areas. To do this, use the Warp action while hovering over the tile you want to warp to.
\
-
Infirmary: Contains sleepers and basic medical supplies for superficial wounds. The sleepers can consume Vitality to heal any occupants. \
- This room is generally more useful during the preparation phase; when defending the Ark, scripture is more useful.
\n"
-
- var/datum/browser/popup = new(user, "announcement_config", "Automated Announcement Configuration", 370, 220)
- popup.set_content(contents)
- popup.open()
-
-/obj/machinery/announcement_system/Topic(href, href_list)
- if(..())
- return
- if(!usr.canUseTopic(src, !hasSiliconAccessInArea(usr)))
- return
- if(stat & BROKEN)
- visible_message("[src] buzzes.", "You hear a faint buzz.")
- playsound(src.loc, 'sound/machines/buzz-two.ogg', 50, 1)
- return
-
- if(href_list["ArrivalTopic"])
- var/NewMessage = stripped_input(usr, "Enter in the arrivals announcement configuration.", "Arrivals Announcement Config", arrival)
- if(!usr.canUseTopic(src, !hasSiliconAccessInArea(usr)))
- return
- if(NewMessage)
- arrival = NewMessage
- else if(href_list["NewheadTopic"])
- var/NewMessage = stripped_input(usr, "Enter in the departmental head announcement configuration.", "Head Departmental Announcement Config", newhead)
- if(!usr.canUseTopic(src, !hasSiliconAccessInArea(usr)))
- return
- if(NewMessage)
- newhead = NewMessage
-
- else if(href_list["NewheadT-Topic"])
- newheadToggle = !newheadToggle
- update_icon()
- else if(href_list["ArrivalT-Topic"])
- arrivalToggle = !arrivalToggle
- update_icon()
-
+ switch(action)
+ if("ArrivalText")
+ var/NewMessage = trim(html_encode(param["newText"]), MAX_MESSAGE_LEN)
+ if(!usr.canUseTopic(src, !issilicon(usr)))
+ return
+ if(NewMessage)
+ arrival = NewMessage
+ log_game("The arrivals announcement was updated: [NewMessage] by:[key_name(usr)]")
+ if("NewheadText")
+ var/NewMessage = trim(html_encode(param["newText"]), MAX_MESSAGE_LEN)
+ if(!usr.canUseTopic(src, !issilicon(usr)))
+ return
+ if(NewMessage)
+ newhead = NewMessage
+ log_game("The head announcement was updated: [NewMessage] by:[key_name(usr)]")
+ if("NewheadToggle")
+ newheadToggle = !newheadToggle
+ update_icon()
+ if("ArrivalToggle")
+ arrivalToggle = !arrivalToggle
+ update_icon()
add_fingerprint(usr)
- interact(usr)
/obj/machinery/announcement_system/attack_robot(mob/living/silicon/user)
. = attack_ai(user)
/obj/machinery/announcement_system/attack_ai(mob/user)
- if(!user.canUseTopic(src, !hasSiliconAccessInArea(user)))
+ if(!user.canUseTopic(src, !issilicon(user)))
return
if(stat & BROKEN)
to_chat(user, "[src]'s firmware appears to be malfunctioning!")
@@ -165,8 +155,8 @@ GLOBAL_LIST_EMPTY(announcement_systems)
interact(user)
/obj/machinery/announcement_system/proc/act_up() //does funny breakage stuff
- stat |= BROKEN
- update_icon()
+ if(!obj_break()) // if badmins flag this unbreakable or its already broken
+ return
arrival = pick("#!@%ERR-34%2 CANNOT LOCAT@# JO# F*LE!", "CRITICAL ERROR 99.", "ERR)#: DA#AB@#E NOT F(*ND!")
newhead = pick("OV#RL()D: \[UNKNOWN??\] DET*#CT)D!", "ER)#R - B*@ TEXT F*O(ND!", "AAS.exe is not responding. NanoOS is searching for a solution to the problem.")
@@ -177,9 +167,7 @@ GLOBAL_LIST_EMPTY(announcement_systems)
act_up()
/obj/machinery/announcement_system/emag_act()
- . = ..()
if(obj_flags & EMAGGED)
return
obj_flags |= EMAGGED
act_up()
- return TRUE
diff --git a/code/game/machinery/aug_manipulator.dm b/code/game/machinery/aug_manipulator.dm
index b95e3149ea..28733a6b6c 100644
--- a/code/game/machinery/aug_manipulator.dm
+++ b/code/game/machinery/aug_manipulator.dm
@@ -100,10 +100,7 @@
stat |= BROKEN
update_icon()
-/obj/machinery/aug_manipulator/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/machinery/aug_manipulator/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
add_fingerprint(user)
if(storedpart)
diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm
index 4eeb6b8b0f..1f0687151d 100644
--- a/code/game/machinery/autolathe.dm
+++ b/code/game/machinery/autolathe.dm
@@ -46,29 +46,16 @@
"Dinnerware",
"Imported"
)
- var/list/allowed_materials = list(
- /datum/material/iron,
- /datum/material/glass,
- /datum/material/gold,
- /datum/material/silver,
- /datum/material/diamond,
- /datum/material/uranium,
- /datum/material/plasma,
- /datum/material/bluespace,
- /datum/material/bananium,
- /datum/material/titanium,
- /datum/material/runite,
- /datum/material/plastic,
- /datum/material/adamantine,
- /datum/material/mythril,
- /datum/material/wood
- )
+ var/list/allowed_materials
/// Base print speed
var/base_print_speed = 10
/obj/machinery/autolathe/Initialize()
- AddComponent(/datum/component/material_container, allowed_materials, _show_on_examine=TRUE, _after_insert=CALLBACK(src, .proc/AfterMaterialInsert))
+ var/list/mats = allowed_materials
+ if(!mats)
+ mats = SSmaterials.materialtypes_by_category[MAT_CATEGORY_RIGID]
+ AddComponent(/datum/component/material_container, mats, _show_on_examine=TRUE, _after_insert=CALLBACK(src, .proc/AfterMaterialInsert))
. = ..()
wires = new /datum/wires/autolathe(src)
stored_research = new stored_research
diff --git a/code/game/machinery/bank_machine.dm b/code/game/machinery/bank_machine.dm
index 2b683f16a3..8033f538ba 100644
--- a/code/game/machinery/bank_machine.dm
+++ b/code/game/machinery/bank_machine.dm
@@ -64,7 +64,7 @@
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, "bank_machine", name, 320, 165, master_ui, state)
+ ui = new(user, src, ui_key, "BankMachine", name, 320, 165, master_ui, state)
ui.open()
/obj/machinery/computer/bank_machine/ui_data(mob/user)
diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm
index 71de04ee99..b5031b68a1 100644
--- a/code/game/machinery/buttons.dm
+++ b/code/game/machinery/buttons.dm
@@ -43,7 +43,11 @@
board.one_access = 1
board.accesses = req_one_access
-/obj/machinery/button/update_icon_state()
+ setup_device()
+
+
+/obj/machinery/button/update_icon()
+ cut_overlays()
if(panel_open)
icon_state = "button-open"
else if(stat & (NOPOWER|BROKEN))
@@ -129,7 +133,12 @@
A.id = id
initialized_button = 1
-/obj/machinery/button/attack_hand(mob/user)
+/obj/machinery/button/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE)
+ if(id && istype(device, /obj/item/assembly/control))
+ var/obj/item/assembly/control/A = device
+ A.id = "[idnum][id]"
+
+/obj/machinery/button/on_attack_hand(mob/user)
. = ..()
if(.)
return
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index e386674b9e..2795ba45a9 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -72,6 +72,11 @@
if(mapload && is_station_level(z) && prob(3) && !start_active)
toggle_cam()
+/obj/machinery/camera/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE)
+ for(var/i in network)
+ network -= i
+ network += "[idnum][i]"
+
/obj/machinery/camera/Destroy()
if(can_use())
toggle_cam(null, 0) //kick anyone viewing out and remove from the camera chunks
@@ -230,7 +235,7 @@
itemname = P.name
info = P.notehtml
to_chat(U, "You hold \the [itemname] up to the camera...")
- U.changeNext_move(CLICK_CD_MELEE)
+ U.DelayNextAction(CLICK_CD_MELEE)
for(var/mob/O in GLOB.player_list)
if(isAI(O))
var/mob/living/silicon/ai/AI = O
diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm
index 83b0c0ee2d..effd70e9ab 100644
--- a/code/game/machinery/cell_charger.dm
+++ b/code/game/machinery/cell_charger.dm
@@ -79,10 +79,7 @@
charging = null
update_icon()
-/obj/machinery/cell_charger/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/machinery/cell_charger/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(!charging)
return
@@ -103,8 +100,18 @@
removecell()
/obj/machinery/cell_charger/attack_ai(mob/user)
+ if(!charging)
+ return
+
+ charging.forceMove(loc)
+ to_chat(user, "You remotely disconnect the battery port and eject [charging] from [src].")
+
+ removecell()
return
+/obj/machinery/cell_charger/attack_robot(mob/user)
+ attack_ai(user)
+
/obj/machinery/cell_charger/emp_act(severity)
. = ..()
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index cfe9d14663..5bbd3f8a65 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -26,6 +26,7 @@
var/efficiency
var/datum/mind/clonemind
+ var/get_clone_mind = CLONEPOD_GET_MIND
var/grab_ghost_when = CLONER_MATURE_CLONE
var/internal_radio = TRUE
@@ -74,31 +75,6 @@
speed_coeff = max(1, speed_coeff)
heal_level = clamp((efficiency * 10) + 10, MINIMUM_HEAL_LEVEL, 100)
-//The return of data disks?? Just for transferring between genetics machine/cloning machine.
-//TO-DO: Make the genetics machine accept them.
-/obj/item/disk/data
- name = "cloning data disk"
- icon_state = "datadisk0" //Gosh I hope syndies don't mistake them for the nuke disk.
- var/list/fields = list()
- var/list/mutations = list()
- var/max_mutations = 6
- var/read_only = 0 //Well,it's still a floppy disk
-
-//Disk stuff.
-/obj/item/disk/data/Initialize()
- . = ..()
- icon_state = "datadisk[rand(0,6)]"
- add_overlay("datadisk_gene")
-
-/obj/item/disk/data/attack_self(mob/user)
- read_only = !read_only
- to_chat(user, "You flip the write-protect tab to [read_only ? "protected" : "unprotected"].")
-
-/obj/item/disk/data/examine(mob/user)
- . = ..()
- . += "The write-protect tab is set to [read_only ? "protected" : "unprotected"]."
-
-
//Clonepod
/obj/machinery/clonepod/examine(mob/user)
@@ -134,43 +110,44 @@
return examine(user)
//Start growing a human clone in the pod!
-/obj/machinery/clonepod/proc/growclone(ckey, clonename, ui, mutation_index, mindref, datum/species/mrace, list/features, factions, list/quirks, datum/bank_account/insurance)
+/obj/machinery/clonepod/proc/growclone(ckey, clonename, ui, mutation_index, mindref, blood_type, datum/species/mrace, list/features, factions, list/quirks, datum/bank_account/insurance, list/traumas)
if(panel_open)
return FALSE
if(mess || attempting)
return FALSE
- clonemind = locate(mindref) in SSticker.minds
- if(!istype(clonemind)) //not a mind
- return FALSE
- if(!QDELETED(clonemind.current))
- if(clonemind.current.stat != DEAD) //mind is associated with a non-dead body
+ if(get_clone_mind == CLONEPOD_GET_MIND)
+ clonemind = locate(mindref) in SSticker.minds
+ if(!istype(clonemind)) //not a mind
return FALSE
- if(clonemind.current.suiciding) // Mind is associated with a body that is suiciding.
+ if(!QDELETED(clonemind.current))
+ if(clonemind.current.stat != DEAD) //mind is associated with a non-dead body
+ return FALSE
+ if(clonemind.current.suiciding) // Mind is associated with a body that is suiciding.
+ return FALSE
+ if(AmBloodsucker(clonemind.current)) //If the mind is a bloodsucker
+ return FALSE
+ if(clonemind.active) //somebody is using that mind
+ if( ckey(clonemind.key)!=ckey )
+ return FALSE
+ else
+ // get_ghost() will fail if they're unable to reenter their body
+ var/mob/dead/observer/G = clonemind.get_ghost()
+ if(!G)
+ return FALSE
+ if(G.suiciding) // The ghost came from a body that is suiciding.
+ return FALSE
+ if(clonemind.damnation_type) //Can't clone the damned.
+ INVOKE_ASYNC(src, .proc/horrifyingsound)
+ mess = TRUE
+ update_icon()
return FALSE
- if(AmBloodsucker(clonemind.current)) //If the mind is a bloodsucker
- return FALSE
- if(clonemind.active) //somebody is using that mind
- if( ckey(clonemind.key)!=ckey )
- return FALSE
- else
- // get_ghost() will fail if they're unable to reenter their body
- var/mob/dead/observer/G = clonemind.get_ghost()
- if(!G)
- return FALSE
- if(G.suiciding) // The ghost came from a body that is suiciding.
- return FALSE
- if(clonemind.damnation_type) //Can't clone the damned.
- INVOKE_ASYNC(src, .proc/horrifyingsound)
- mess = TRUE
- update_icon()
- return FALSE
current_insurance = insurance
attempting = TRUE //One at a time!!
countdown.start()
var/mob/living/carbon/human/H = new /mob/living/carbon/human(src)
- H.hardset_dna(ui, mutation_index, H.real_name, null, mrace, features)
+ H.hardset_dna(ui, mutation_index, H.real_name, blood_type, mrace, features)
H.easy_randmut(NEGATIVE+MINOR_NEGATIVE) //100% bad mutation. Can be cured with mutadone.
@@ -192,7 +169,14 @@
ADD_TRAIT(H, TRAIT_NOCRITDAMAGE, CLONING_POD_TRAIT)
H.Unconscious(80)
- clonemind.transfer_to(H)
+ if(clonemind)
+ clonemind.transfer_to(H)
+
+ else if(get_clone_mind == CLONEPOD_POLL_MIND)
+ var/list/candidates = pollCandidatesForMob("Do you want to play as [clonename]'s defective clone? (Don't ERP without permission from the original)", null, null, null, 100, H, POLL_IGNORE_CLONE)
+ if(LAZYLEN(candidates))
+ var/mob/C = pick(candidates)
+ H.key = C.key
if(grab_ghost_when == CLONER_FRESH_CLONE)
H.grab_ghost()
@@ -209,6 +193,12 @@
var/datum/quirk/Q = new V(H)
Q.on_clone(quirks[V])
+ for(var/t in traumas)
+ var/datum/brain_trauma/BT = t
+ var/datum/brain_trauma/cloned_trauma = BT.on_clone()
+ if(cloned_trauma)
+ H.gain_trauma(cloned_trauma, BT.resilience)
+
H.set_cloned_appearance()
H.give_genitals(TRUE)
@@ -271,9 +261,6 @@
var/obj/item/bodypart/BP = I
BP.attach_limb(mob_occupant)
- //Premature clones may have brain damage.
- mob_occupant.adjustOrganLoss(ORGAN_SLOT_BRAIN, -((speed_coeff / 2) * dmg_mult))
-
use_power(7500) //This might need tweaking.
else if((mob_occupant && mob_occupant.cloneloss <= (100 - heal_level)))
@@ -399,6 +386,13 @@
to_chat(occupant, "There is a bright flash! You feel like a new being.")
mob_occupant.flash_act()
+ var/list/policies = CONFIG_GET(keyed_list/policyconfig)
+ var/policy = policies[POLICYCONFIG_ON_CLONE]
+ if(policy)
+ to_chat(occupant, policy)
+ occupant.log_message("revived using cloning.", LOG_GAME)
+ mob_occupant.adjustOrganLoss(ORGAN_SLOT_BRAIN, mob_occupant.getCloneLoss())
+
occupant.forceMove(T)
update_icon()
mob_occupant.domutcheck(1) //Waiting until they're out before possible monkeyizing. The 1 argument forces powers to manifest.
@@ -474,10 +468,9 @@
unattached_flesh.Cut()
H.setCloneLoss(CLONE_INITIAL_DAMAGE) //Yeah, clones start with very low health, not with random, because why would they start with random health
- //H.setOrganLoss(ORGAN_SLOT_BRAIN, CLONE_INITIAL_DAMAGE)
- // In addition to being cellularly damaged and having barely any
-
- // brain function, they also have no limbs or internal organs.
+ // In addition to being cellularly damaged, they also have no limbs or internal organs.
+ // Applying brainloss is done when the clone leaves the pod, so application of traumas can happen.
+ // based on the level of damage sustained.
if(!HAS_TRAIT(H, TRAIT_NODISMEMBER))
var/static/list/zones = list(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG)
@@ -545,6 +538,17 @@
. += "cover-on"
. += "panel"
+//Experimental cloner; clones a body regardless of the owner's status, letting a ghost control it instead
+/obj/machinery/clonepod/experimental
+ name = "experimental cloning pod"
+ desc = "An ancient cloning pod. It seems to be an early prototype of the experimental cloners used in Nanotrasen Stations."
+ icon = 'icons/obj/machines/cloning.dmi'
+ icon_state = "pod_0"
+ req_access = null
+ circuit = /obj/item/circuitboard/machine/clonepod/experimental
+ internal_radio = FALSE
+ get_clone_mind = CLONEPOD_POLL_MIND
+
/*
* Manual -- A big ol' manual.
*/
diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm
index 7439fd1b8b..c8efe319db 100644
--- a/code/game/machinery/computer/Operating.dm
+++ b/code/game/machinery/computer/Operating.dm
@@ -46,7 +46,7 @@
/obj/machinery/computer/operating/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.not_incapacitated_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
- ui = new(user, src, ui_key, "operating_computer", name, 350, 470, master_ui, state)
+ ui = new(user, src, ui_key, "OperatingComputer", name, 350, 470, master_ui, state)
ui.open()
/obj/machinery/computer/operating/ui_data(mob/user)
@@ -108,6 +108,49 @@
))
else
data["patient"] = null
+ return data
+ switch(patient.stat)
+ if(CONSCIOUS)
+ data["patient"]["stat"] = "Conscious"
+ data["patient"]["statstate"] = "good"
+ if(SOFT_CRIT)
+ data["patient"]["stat"] = "Conscious"
+ data["patient"]["statstate"] = "average"
+ if(UNCONSCIOUS)
+ data["patient"]["stat"] = "Unconscious"
+ data["patient"]["statstate"] = "average"
+ if(DEAD)
+ data["patient"]["stat"] = "Dead"
+ data["patient"]["statstate"] = "bad"
+ data["patient"]["health"] = patient.health
+ data["patient"]["blood_type"] = patient.dna.blood_type
+ data["patient"]["maxHealth"] = patient.maxHealth
+ data["patient"]["minHealth"] = HEALTH_THRESHOLD_DEAD
+ data["patient"]["bruteLoss"] = patient.getBruteLoss()
+ data["patient"]["fireLoss"] = patient.getFireLoss()
+ data["patient"]["toxLoss"] = patient.getToxLoss()
+ data["patient"]["oxyLoss"] = patient.getOxyLoss()
+ data["procedures"] = list()
+ if(patient.surgeries.len)
+ for(var/datum/surgery/procedure in patient.surgeries)
+ var/datum/surgery_step/surgery_step = procedure.get_surgery_step()
+ var/chems_needed = surgery_step.get_chem_list()
+ var/alternative_step
+ var/alt_chems_needed = ""
+ if(surgery_step.repeatable)
+ var/datum/surgery_step/next_step = procedure.get_surgery_next_step()
+ if(next_step)
+ alternative_step = capitalize(next_step.name)
+ alt_chems_needed = next_step.get_chem_list()
+ else
+ alternative_step = "Finish operation"
+ data["procedures"] += list(list(
+ "name" = capitalize("[parse_zone(procedure.location)] [procedure.name]"),
+ "next_step" = capitalize(surgery_step.name),
+ "chems_needed" = chems_needed,
+ "alternative_step" = alternative_step,
+ "alt_chems_needed" = alt_chems_needed
+ ))
return data
/obj/machinery/computer/operating/ui_act(action, params)
diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm
index 9ff46c021b..d8553854b2 100644
--- a/code/game/machinery/computer/aifixer.dm
+++ b/code/game/machinery/computer/aifixer.dm
@@ -8,6 +8,8 @@
icon_keyboard = "tech_key"
icon_screen = "ai-fixer"
light_color = LIGHT_COLOR_PINK
+ ui_x = 370
+ ui_y = 360
/obj/machinery/computer/aifixer/attackby(obj/I, mob/user, params)
if(occupier && istype(I, /obj/item/screwdriver))
@@ -18,8 +20,12 @@
else
return ..()
-/obj/machinery/computer/aifixer/ui_interact(mob/user)
- . = ..()
+/obj/machinery/computer/aifixer/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
+ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
+ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "AiRestorer", name, ui_x, ui_y, master_ui, state)
+ ui.open()
var/dat = ""
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index 2d9880578c..4fb39c04e1 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -42,9 +42,9 @@
/obj/item/clothing/mask/facehugger/toy = ARCADE_WEIGHT_RARE,
/obj/item/gun/ballistic/automatic/toy/pistol/unrestricted = ARCADE_WEIGHT_TRICK,
/obj/item/hot_potato/harmless/toy = ARCADE_WEIGHT_RARE,
- /obj/item/twohanded/dualsaber/toy = ARCADE_WEIGHT_RARE,
- /obj/item/twohanded/dualsaber/hypereutactic/toy = ARCADE_WEIGHT_RARE,
- /obj/item/twohanded/dualsaber/hypereutactic/toy/rainbow = ARCADE_WEIGHT_RARE,
+ /obj/item/dualsaber/toy = ARCADE_WEIGHT_RARE,
+ /obj/item/dualsaber/hypereutactic/toy = ARCADE_WEIGHT_RARE,
+ /obj/item/dualsaber/hypereutactic/toy/rainbow = ARCADE_WEIGHT_RARE,
/obj/item/storage/box/snappops = ARCADE_WEIGHT_TRICK,
/obj/item/clothing/under/syndicate/tacticool = ARCADE_WEIGHT_TRICK,
@@ -136,3 +136,17 @@
empprize = pickweight(prizes)
new empprize(loc)
explosion(loc, -1, 0, 1+num_of_prizes, flame_range = 1+num_of_prizes)
+
+/obj/machinery/computer/arcade/attackby(obj/item/O, mob/user, params)
+ if(istype(O, /obj/item/stack/arcadeticket))
+ var/obj/item/stack/arcadeticket/T = O
+ var/amount = T.get_amount()
+ if(amount <2)
+ to_chat(user, "You need 2 tickets to claim a prize!")
+ return
+ prizevend(user)
+ T.pay_tickets()
+ T.update_icon()
+ O = T
+ to_chat(user, "You turn in 2 tickets to the [src] and claim a prize!")
+ return
diff --git a/code/game/machinery/computer/arcade/battle.dm b/code/game/machinery/computer/arcade/battle.dm
index b906b1afb5..fc99edd3eb 100644
--- a/code/game/machinery/computer/arcade/battle.dm
+++ b/code/game/machinery/computer/arcade/battle.dm
@@ -184,6 +184,15 @@
blocked = FALSE
return
+/obj/machinery/computer/arcade/battle/examine_more(mob/user)
+ to_chat(user, "Scribbled on the side of the Arcade Machine you notice some writing...\
+ \nmagical -> >=50 power\
+ \nsmart -> defend, defend, light attack\
+ \nshotgun -> defend, defend, power attack\
+ \nshort temper -> counter, counter, counter\
+ \npoisonous -> light attack, light attack, light attack\
+ \nchonker -> power attack, power attack, power attack")
+ return ..()
/obj/machinery/computer/arcade/battle/emag_act(mob/user)
. = ..()
diff --git a/code/game/machinery/computer/arcade/misc_arcade.dm b/code/game/machinery/computer/arcade/misc_arcade.dm
index 78b4a6863c..24516740f9 100644
--- a/code/game/machinery/computer/arcade/misc_arcade.dm
+++ b/code/game/machinery/computer/arcade/misc_arcade.dm
@@ -8,7 +8,7 @@
icon_state = "arcade"
circuit = /obj/item/circuitboard/computer/arcade/amputation
-/obj/machinery/computer/arcade/amputation/attack_hand(mob/user)
+/obj/machinery/computer/arcade/amputation/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(!iscarbon(user))
return
var/mob/living/carbon/c_user = user
@@ -28,4 +28,4 @@
for(var/i=1; i<=rand(3,5); i++)
prizevend(user)
else
- to_chat(c_user, "You (wisely) decide against putting your hand in the machine.")
\ No newline at end of file
+ to_chat(c_user, "You (wisely) decide against putting your hand in the machine.")
diff --git a/code/game/machinery/computer/atmos_alert.dm b/code/game/machinery/computer/atmos_alert.dm
index 6df7120dcc..fbedf62734 100644
--- a/code/game/machinery/computer/atmos_alert.dm
+++ b/code/game/machinery/computer/atmos_alert.dm
@@ -23,7 +23,7 @@
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, "atmos_alert", name, 350, 300, master_ui, state)
+ ui = new(user, src, ui_key, "AtmosAlertConsole", name, 350, 300, master_ui, state)
ui.open()
/obj/machinery/computer/atmos_alert/ui_data(mob/user)
diff --git a/code/game/machinery/computer/atmos_control.dm b/code/game/machinery/computer/atmos_control.dm
index 79ea51eca4..6ee975b338 100644
--- a/code/game/machinery/computer/atmos_control.dm
+++ b/code/game/machinery/computer/atmos_control.dm
@@ -53,14 +53,14 @@
"id_tag" = id_tag,
"timestamp" = world.time,
"pressure" = air_sample.return_pressure(),
- "temperature" = air_sample.temperature,
+ "temperature" = air_sample.return_temperature(),
"gases" = list()
))
var/total_moles = air_sample.total_moles()
if(total_moles)
- for(var/gas_id in air_sample.gases)
+ for(var/gas_id in air_sample.get_gases())
var/gas_name = GLOB.meta_gas_names[gas_id]
- signal.data["gases"][gas_name] = air_sample.gases[gas_id] / total_moles * 100
+ signal.data["gases"][gas_name] = air_sample.get_moles(gas_id) / total_moles * 100
radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
@@ -127,7 +127,7 @@ GLOBAL_LIST_EMPTY(atmos_air_controllers)
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, "atmos_control", name, ui_x, ui_y, master_ui, state)
+ ui = new(user, src, ui_key, "AtmosControlConsole", name, ui_x, ui_y, master_ui, state)
ui.open()
/obj/machinery/computer/atmos_control/ui_data(mob/user)
@@ -269,7 +269,7 @@ GLOBAL_LIST_EMPTY(atmos_air_controllers)
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, "atmos_control", name, ui_x, ui_y, master_ui, state)
+ ui = new(user, src, ui_key, "AtmosControlConsole", name, ui_x, ui_y, master_ui, state)
ui.open()
/obj/machinery/computer/atmos_control/tank/ui_data(mob/user)
diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm
index 450967050c..2b3416e1c8 100644
--- a/code/game/machinery/computer/camera.dm
+++ b/code/game/machinery/computer/camera.dm
@@ -4,109 +4,166 @@
icon_screen = "cameras"
icon_keyboard = "security_key"
circuit = /obj/item/circuitboard/computer/security
- var/last_pic = 1
- var/list/network = list("ss13")
- var/list/watchers = list() //who's using the console, associated with the camera they're on.
-
light_color = LIGHT_COLOR_RED
+ ui_x = 870
+ ui_y = 708
+
+ var/list/network = list("ss13")
+ var/obj/machinery/camera/active_camera
+ var/list/concurrent_users = list()
+
+ // Stuff needed to render the map
+ var/map_name
+ var/const/default_map_size = 15
+ var/obj/screen/cam_screen
+ var/obj/screen/plane_master/lighting/cam_plane_master
+ var/obj/screen/background/cam_background
/obj/machinery/computer/security/Initialize()
. = ..()
+ // Map name has to start and end with an A-Z character,
+ // and definitely NOT with a square bracket or even a number.
+ // I wasted 6 hours on this. :agony:
+ map_name = "camera_console_[REF(src)]_map"
+ // Convert networks to lowercase
for(var/i in network)
network -= i
network += lowertext(i)
-
-/obj/machinery/computer/security/check_eye(mob/user)
- if(!can_interact(user) || !(user in watchers) || !watchers[user])
- user.unset_machine()
- return
- var/obj/machinery/camera/C = watchers[user]
- if(!C.can_use())
- user.unset_machine()
- return
-
-/obj/machinery/computer/security/on_unset_machine(mob/user)
- watchers.Remove(user)
- user.reset_perspective(null)
+ // Initialize map objects
+ cam_screen = new
+ cam_screen.name = "screen"
+ cam_screen.assigned_map = map_name
+ cam_screen.del_on_map_removal = FALSE
+ cam_screen.screen_loc = "[map_name]:1,1"
+ cam_plane_master = new
+ cam_plane_master.name = "plane_master"
+ cam_plane_master.assigned_map = map_name
+ cam_plane_master.del_on_map_removal = FALSE
+ cam_plane_master.screen_loc = "[map_name]:CENTER"
+ cam_background = new
+ cam_background.assigned_map = map_name
+ cam_background.del_on_map_removal = FALSE
/obj/machinery/computer/security/Destroy()
- if(watchers.len)
- for(var/mob/M in watchers)
- M.unset_machine() //to properly reset the view of the users if the console is deleted.
+ qdel(cam_screen)
+ qdel(cam_plane_master)
+ qdel(cam_background)
return ..()
-/obj/machinery/computer/security/can_interact(mob/user)
- if((!hasSiliconAccessInArea(user) && !Adjacent(user)) || is_blind(user) || !in_view_range(user, src))
- return FALSE
- return ..()
+/obj/machinery/computer/security/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE)
+ for(var/i in network)
+ network -= i
+ network += "[idnum][i]"
-/obj/machinery/computer/security/interact(mob/user, special_state)
+/obj/machinery/computer/security/ui_interact(\
+ mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
+ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
+ // Update UI
+ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
+ // Show static if can't use the camera
+ if(!active_camera?.can_use())
+ show_camera_static()
+ if(!ui)
+ var/user_ref = REF(user)
+ var/is_living = isliving(user)
+ // Ghosts shouldn't count towards concurrent users, which produces
+ // an audible terminal_on click.
+ if(is_living)
+ concurrent_users += user_ref
+ // Turn on the console
+ if(length(concurrent_users) == 1 && is_living)
+ playsound(src, 'sound/machines/terminal_on.ogg', 25, FALSE)
+ use_power(active_power_usage)
+ // Register map objects
+ user.client.register_map_obj(cam_screen)
+ user.client.register_map_obj(cam_plane_master)
+ user.client.register_map_obj(cam_background)
+ // Open UI
+ ui = new(user, src, ui_key, "CameraConsole", name, ui_x, ui_y, master_ui, state)
+ ui.open()
+
+/obj/machinery/computer/security/ui_data()
+ var/list/data = list()
+ data["network"] = network
+ data["activeCamera"] = null
+ if(active_camera)
+ data["activeCamera"] = list(
+ name = active_camera.c_tag,
+ status = active_camera.status,
+ )
+ return data
+
+/obj/machinery/computer/security/ui_static_data()
+ var/list/data = list()
+ data["mapRef"] = map_name
+ var/list/cameras = get_available_cameras()
+ data["cameras"] = list()
+ for(var/i in cameras)
+ var/obj/machinery/camera/C = cameras[i]
+ data["cameras"] += list(list(
+ name = C.c_tag,
+ ))
+ return data
+
+/obj/machinery/computer/security/ui_act(action, params)
. = ..()
- if (ismob(user) && !isliving(user)) // ghosts don't need cameras
- return
- if (!network)
- stack_trace("No camera network")
- user.unset_machine()
- return FALSE
- if (!(islist(network)))
- stack_trace("Camera network is not a list")
- user.unset_machine()
- return FALSE
-
- var/list/camera_list = get_available_cameras()
- if(!(user in watchers))
- for(var/Num in camera_list)
- var/obj/machinery/camera/CAM = camera_list[Num]
- if(istype(CAM) && CAM.can_use())
- watchers[user] = CAM //let's give the user the first usable camera, and then let him change to the camera he wants.
- break
- if(!(user in watchers))
- user.unset_machine() // no usable camera on the network, we disconnect the user from the computer.
- return FALSE
- playsound(src, 'sound/machines/terminal_prompt.ogg', 25, 0)
- use_camera_console(user)
-
-/obj/machinery/computer/security/proc/use_camera_console(mob/user)
- var/list/camera_list = get_available_cameras()
- var/t = input(user, "Which camera should you change to?") as null|anything in camera_list
- if(!src || user.machine != src) //while we were choosing we got disconnected from our computer or are using another machine.
- return
- if(!t || t == "Cancel")
- user.unset_machine()
- playsound(src, 'sound/machines/terminal_off.ogg', 25, 0)
+ if(.)
return
- var/obj/machinery/camera/C = camera_list[t]
+ if(action == "switch_camera")
+ var/c_tag = params["name"]
+ var/list/cameras = get_available_cameras()
+ var/obj/machinery/camera/C = cameras[c_tag]
+ active_camera = C
+ playsound(src, get_sfx("terminal_type"), 25, FALSE)
- if(!C || !C.can_use() || !can_interact(user))
- user.unset_machine()
- return FALSE
+ // Show static if can't use the camera
+ if(!active_camera?.can_use())
+ show_camera_static()
+ return TRUE
- playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 25, 0)
- if(isAI(user))
- var/mob/living/silicon/ai/A = user
- A.eyeobj.setLoc(get_turf(C))
- A.client.eye = A.eyeobj
- else
- user.reset_perspective(C)
- user.overlay_fullscreen("flash", /obj/screen/fullscreen/flash/static)
- user.clear_fullscreen("flash", 5)
- watchers[user] = C
- use_power(50)
- addtimer(CALLBACK(src, .proc/use_camera_console, user), 5)
+ var/list/visible_turfs = list()
+ for(var/turf/T in (C.isXRay() \
+ ? range(C.view_range, C) \
+ : view(C.view_range, C)))
+ visible_turfs += T
-//returns the list of cameras accessible from this computer
+ var/list/bbox = get_bbox_of_atoms(visible_turfs)
+ var/size_x = bbox[3] - bbox[1] + 1
+ var/size_y = bbox[4] - bbox[2] + 1
+
+ cam_screen.vis_contents = visible_turfs
+ cam_background.icon_state = "clear"
+ cam_background.fill_rect(1, 1, size_x, size_y)
+
+ return TRUE
+
+/obj/machinery/computer/security/ui_close(mob/user)
+ var/user_ref = REF(user)
+ var/is_living = isliving(user)
+ // Living creature or not, we remove you anyway.
+ concurrent_users -= user_ref
+ // Unregister map objects
+ user.client.clear_map(map_name)
+ // Turn off the console
+ if(length(concurrent_users) == 0 && is_living)
+ active_camera = null
+ playsound(src, 'sound/machines/terminal_off.ogg', 25, FALSE)
+ use_power(0)
+
+/obj/machinery/computer/security/proc/show_camera_static()
+ cam_screen.vis_contents.Cut()
+ cam_background.icon_state = "scanline2"
+ cam_background.fill_rect(1, 1, default_map_size, default_map_size)
+
+// Returns the list of cameras accessible from this computer
/obj/machinery/computer/security/proc/get_available_cameras()
var/list/L = list()
for (var/obj/machinery/camera/C in GLOB.cameranet.cameras)
if((is_away_level(z) || is_away_level(C.z)) && (C.z != z))//if on away mission, can only receive feed from same z_level cameras
continue
L.Add(C)
-
- camera_sort(L)
-
var/list/D = list()
- D["Cancel"] = "Cancel"
for(var/obj/machinery/camera/C in L)
if(!C.network)
stack_trace("Camera in a cameranet has no camera network")
@@ -114,9 +171,9 @@
if(!(islist(C.network)))
stack_trace("Camera in a cameranet has a non-list camera network")
continue
- var/list/tempnetwork = C.network&network
+ var/list/tempnetwork = C.network & network
if(tempnetwork.len)
- D["[C.c_tag][(C.status ? null : " (Deactivated)")]"] = C
+ D["[C.c_tag]"] = C
return D
// SECURITY MONITORS
@@ -127,7 +184,6 @@
icon_state = "television"
icon_keyboard = null
icon_screen = "detective_tv"
- clockwork = TRUE //it'd look weird
pass_flags = PASSTABLE
/obj/machinery/computer/security/mining
@@ -145,7 +201,7 @@
circuit = /obj/item/circuitboard/computer/research
/obj/machinery/computer/security/hos
- name = "Head of Security's camera console"
+ name = "\improper Head of Security's camera console"
desc = "A custom security console with added access to the labor camp network."
network = list("ss13", "labor")
circuit = null
@@ -157,7 +213,7 @@
circuit = null
/obj/machinery/computer/security/qm
- name = "Quartermaster's camera console"
+ name = "\improper Quartermaster's camera console"
desc = "A console with access to the mining, auxillary base and vault camera networks."
network = list("mine", "auxbase", "vault")
circuit = null
@@ -172,7 +228,6 @@
network = list("thunder")
density = FALSE
circuit = null
- clockwork = TRUE //it'd look very weird
light_power = 0
/obj/machinery/computer/security/telescreen/Initialize()
@@ -190,11 +245,35 @@
name = "entertainment monitor"
desc = "Damn, they better have the /tg/ channel on these things."
icon = 'icons/obj/status_display.dmi'
- icon_state = "entertainment"
+ icon_state = "entertainment_blank"
network = list("thunder")
+ density = FALSE
+ circuit = null
+ interaction_flags_atom = NONE // interact() is called by BigClick()
+ var/icon_state_off = "entertainment_blank"
+ var/icon_state_on = "entertainment"
+
+/obj/machinery/computer/security/telescreen/entertainment/Initialize()
+ . = ..()
+ RegisterSignal(src, COMSIG_CLICK, .proc/BigClick)
+
+// Bypass clickchain to allow humans to use the telescreen from a distance
+/obj/machinery/computer/security/telescreen/entertainment/proc/BigClick()
+ interact(usr)
+
+/obj/machinery/computer/security/telescreen/entertainment/proc/notify(on)
+ if(on && icon_state == icon_state_off)
+ say(pick(
+ "Feats of bravery live now at the thunderdome!",
+ "Two enter, one leaves! Tune in now!",
+ "Violence like you've never seen it before!",
+ "Spears! Camera! Action! LIVE NOW!"))
+ icon_state = icon_state_on
+ else
+ icon_state = icon_state_off
/obj/machinery/computer/security/telescreen/rd
- name = "Research Director's telescreen"
+ name = "\improper Research Director's telescreen"
desc = "Used for watching the AI and the RD's goons from the safety of his office."
network = list("rd", "aicore", "aiupload", "minisat", "xeno", "test")
@@ -202,26 +281,26 @@
name = "circuitry telescreen"
desc = "Used for watching the other eggheads from the safety of the circuitry lab."
network = list("rd")
-
+
/obj/machinery/computer/security/telescreen/ce
- name = "Chief Engineer's telescreen"
+ name = "\improper Chief Engineer's telescreen"
desc = "Used for watching the engine, telecommunications and the minisat."
network = list("engine", "singularity", "tcomms", "minisat")
/obj/machinery/computer/security/telescreen/cmo
- name = "Chief Medical Officer's telescreen"
+ name = "\improper Chief Medical Officer's telescreen"
desc = "A telescreen with access to the medbay's camera network."
network = list("medbay")
/obj/machinery/computer/security/telescreen/vault
- name = "Vault monitor"
+ name = "vault monitor"
desc = "A telescreen that connects to the vault's camera network."
network = list("vault")
/obj/machinery/computer/security/telescreen/toxins
- name = "Bomb test site monitor"
+ name = "bomb test site monitor"
desc = "A telescreen that connects to the bomb test site's camera."
- network = list("toxin")
+ network = list("toxins")
/obj/machinery/computer/security/telescreen/engine
name = "engine monitor"
@@ -254,6 +333,15 @@
network = list("minisat")
/obj/machinery/computer/security/telescreen/aiupload
- name = "AI upload monitor"
+ name = "\improper AI upload monitor"
desc = "A telescreen that connects to the AI upload's camera network."
network = list("aiupload")
+
+// Subtype that connects to shuttles.
+/obj/machinery/computer/security/shuttle
+ circuit = /obj/item/circuitboard/computer/security/shuttle
+
+/obj/machinery/computer/security/shuttle/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE)
+ for(var/i in network)
+ network -= i
+ network += "[idnum][i]"
diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm
index 5fe62ebb76..4b5806b8fd 100644
--- a/code/game/machinery/computer/camera_advanced.dm
+++ b/code/game/machinery/computer/camera_advanced.dm
@@ -29,9 +29,17 @@
if(lock_override & CAMERA_LOCK_REEBE)
z_lock |= SSmapping.levels_by_trait(ZTRAIT_REEBE)
+/obj/machinery/computer/camera_advanced/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE)
+ for(var/i in networks)
+ networks -= i
+ networks += "[idnum][i]"
+
/obj/machinery/computer/camera_advanced/syndie
icon_keyboard = "syndie_key"
+/obj/machinery/computer/camera_advanced/syndie/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE)
+ return //For syndie nuke shuttle, to spy for station.
+
/obj/machinery/computer/camera_advanced/proc/CreateEye()
eyeobj = new()
eyeobj.origin = src
@@ -95,10 +103,7 @@
return FALSE
return ..()
-/obj/machinery/computer/camera_advanced/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/machinery/computer/camera_advanced/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(current_user)
to_chat(user, "The console is already in use!")
return
@@ -268,112 +273,4 @@
C.overlay_fullscreen("flash", /obj/screen/fullscreen/flash/static)
C.clear_fullscreen("flash", 3) //Shorter flash than normal since it's an ~~advanced~~ console!
else
- playsound(origin, 'sound/machines/terminal_prompt_deny.ogg', 25, 0)
-
-
-//Used by servants of Ratvar! They let you beam to the station.
-/obj/machinery/computer/camera_advanced/ratvar
- name = "ratvarian camera observer"
- desc = "A console used to snoop on the station's goings-on. A jet of steam occasionally whooshes out from slats on its sides."
- use_power = FALSE
- networks = list("ss13", "minisat") //:eye:
- var/datum/action/innate/servant_warp/warp_action = new
-
-/obj/machinery/computer/camera_advanced/ratvar/Initialize()
- . = ..()
- ratvar_act()
-
-/obj/machinery/computer/camera_advanced/ratvar/process()
- if(prob(1))
- playsound(src, 'sound/machines/clockcult/steam_whoosh.ogg', 25, TRUE)
- new/obj/effect/temp_visual/steam_release(get_turf(src))
-
-/obj/machinery/computer/camera_advanced/ratvar/CreateEye()
- ..()
- eyeobj.visible_icon = TRUE
- eyeobj.icon = 'icons/mob/cameramob.dmi' //in case you still had any doubts
- eyeobj.icon_state = "generic_camera"
-
-/obj/machinery/computer/camera_advanced/ratvar/GrantActions(mob/living/carbon/user)
- ..()
- if(warp_action)
- warp_action.Grant(user)
- warp_action.target = src
- actions += warp_action
-
-/obj/machinery/computer/camera_advanced/ratvar/can_use(mob/living/user)
- if(!is_servant_of_ratvar(user))
- to_chat(user, "[src]'s keys are in a language foreign to you, and you don't understand anything on its screen.")
- return
- if(clockwork_ark_active())
- to_chat(user, "The Ark is active, and [src] has shut down.")
- return
- . = ..()
-
-/datum/action/innate/servant_warp
- name = "Warp"
- desc = "Warps to the tile you're viewing. You can use the Abscond scripture to return. Clicking this button again cancels the warp."
- icon_icon = 'icons/mob/actions/actions_clockcult.dmi'
- button_icon_state = "warp_down"
- background_icon_state = "bg_clock"
- buttontooltipstyle = "clockcult"
- var/cancel = FALSE //if TRUE, an active warp will be canceled
- var/obj/effect/temp_visual/ratvar/warp_marker/warping
-
-/datum/action/innate/servant_warp/Activate()
- if(QDELETED(target) || !(ishuman(owner) || iscyborg(owner)) || !owner.canUseTopic(target))
- return
- if(!GLOB.servants_active) //No leaving unless there's servants from the get-go
- return
- if(warping)
- cancel = TRUE
- return
- var/mob/living/carbon/human/user = owner
- var/mob/camera/aiEye/remote/remote_eye = user.remote_control
- var/obj/machinery/computer/camera_advanced/ratvar/R = target
- var/turf/T = get_turf(remote_eye)
- if(!is_reebe(user.z) || !is_station_level(T.z))
- return
- if(isclosedturf(T))
- to_chat(user, "You can't teleport into a wall.")
- return
- else if(isspaceturf(T))
- to_chat(user, "[prob(1) ? "Servant cannot into space." : "You can't teleport into space."]")
- return
- else if(T.flags_1 & NOJAUNT_1)
- to_chat(user, "This tile is blessed by holy water and deflects the warp.")
- return
- var/area/AR = get_area(T)
- if(!AR.clockwork_warp_allowed)
- to_chat(user, "[AR.clockwork_warp_fail]")
- return
- if(alert(user, "Are you sure you want to warp to [AR]?", target.name, "Warp", "Cancel") == "Cancel" || QDELETED(R) || !user.canUseTopic(R))
- return
- do_sparks(5, TRUE, user)
- do_sparks(5, TRUE, T)
- warping = new(T)
- user.visible_message("[user]'s [target.name] flares!", "You begin warping to [AR]...")
- button_icon_state = "warp_cancel"
- owner.update_action_buttons()
- if(!do_after(user, 50, target = warping, extra_checks = CALLBACK(src, .proc/is_canceled)))
- to_chat(user, "Warp interrupted.")
- QDEL_NULL(warping)
- button_icon_state = "warp_down"
- owner.update_action_buttons()
- cancel = FALSE
- return
- button_icon_state = "warp_down"
- owner.update_action_buttons()
- QDEL_NULL(warping)
- if(!do_teleport(user, T, channel = TELEPORT_CHANNEL_CULT, forced = TRUE))
- to_chat(user, "Warp Failed. Something deflected our attempt to warp to [AR].")
- return
- T.visible_message("[user] warps in!")
- playsound(user, 'sound/magic/magic_missile.ogg', 50, TRUE)
- playsound(T, 'sound/magic/magic_missile.ogg', 50, TRUE)
- user.setDir(SOUTH)
- flash_color(user, flash_color = "#AF0AAF", flash_time = 5)
- R.remove_eye_control(user)
-
-/datum/action/innate/servant_warp/proc/is_canceled()
- return !cancel
+ playsound(origin, 'sound/machines/terminal_prompt_deny.ogg', 25, 0)
\ No newline at end of file
diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm
index 981a5643a8..400ce041c7 100644
--- a/code/game/machinery/computer/cloning.dm
+++ b/code/game/machinery/computer/cloning.dm
@@ -8,6 +8,7 @@
circuit = /obj/item/circuitboard/computer/cloning
req_access = list(ACCESS_HEADS) //ONLY USED FOR RECORD DELETION RIGHT NOW.
var/obj/machinery/dna_scannernew/scanner = null //Linked scanner. For scanning.
+ var/clonepod_type = /obj/machinery/clonepod
var/list/pods //Linked cloning pods
var/temp = "Inactive"
var/scantemp_ckey
@@ -17,6 +18,7 @@
var/obj/item/disk/data/diskette = null //Mostly so the geneticist can steal everything.
var/loading = 0 // Nice loading text
var/autoprocess = 0
+ var/use_records = TRUE // Old experimental cloner.
var/list/records = list()
light_color = LIGHT_COLOR_BLUE
@@ -36,29 +38,32 @@
return ..()
/obj/machinery/computer/cloning/proc/GetAvailablePod(mind = null)
- if(pods)
- for(var/P in pods)
- var/obj/machinery/clonepod/pod = P
- if(pod.occupant && pod.clonemind == mind)
- return null
- if(pod.is_operational() && !(pod.occupant || pod.mess))
- return pod
+ if(!pods)
+ return
+ for(var/P in pods)
+ var/obj/machinery/clonepod/pod = P
+ if(pod.occupant && pod.get_clone_mind == CLONEPOD_GET_MIND && pod.clonemind == mind)
+ return null
+ if(pod.is_operational() && !(pod.occupant || pod.mess))
+ return pod
/obj/machinery/computer/cloning/proc/HasEfficientPod()
- if(pods)
- for(var/P in pods)
- var/obj/machinery/clonepod/pod = P
- if(pod.is_operational() && pod.efficiency > 5)
- return TRUE
+ if(!pods)
+ return
+ for(var/P in pods)
+ var/obj/machinery/clonepod/pod = P
+ if(pod.is_operational() && pod.efficiency > 5)
+ return TRUE
/obj/machinery/computer/cloning/proc/GetAvailableEfficientPod(mind = null)
- if(pods)
- for(var/P in pods)
- var/obj/machinery/clonepod/pod = P
- if(pod.occupant && pod.clonemind == mind)
- return pod
- else if(!. && pod.is_operational() && !(pod.occupant || pod.mess) && pod.efficiency > 5)
- . = pod
+ if(!pods)
+ return
+ for(var/P in pods)
+ var/obj/machinery/clonepod/pod = P
+ if(pod.occupant && pod.clonemind == mind)
+ return pod
+ else if(!. && pod.is_operational() && !(pod.occupant || pod.mess) && pod.efficiency > 5)
+ . = pod
/obj/machinery/computer/cloning/process()
if(!(scanner && LAZYLEN(pods) && autoprocess))
@@ -73,7 +78,7 @@
if(pod.occupant)
continue //how though?
- if(pod.growclone(R.fields["ckey"], R.fields["name"], R.fields["UI"], R.fields["SE"], R.fields["mind"], R.fields["mrace"], R.fields["features"], R.fields["factions"], R.fields["quirks"], R.fields["bank_account"]))
+ if(pod.growclone(R.fields["ckey"], R.fields["name"], R.fields["UI"], R.fields["SE"], R.fields["mind"], R.fields["blood_type"], R.fields["mrace"], R.fields["features"], R.fields["factions"], R.fields["quirks"], R.fields["bank_account"], R.fields["traumas"]))
temp = "[R.fields["name"]] => Cloning cycle in progress..."
records -= R
@@ -103,12 +108,10 @@
return null
/obj/machinery/computer/cloning/proc/findcloner()
- var/obj/machinery/clonepod/podf = null
-
+ var/obj/machinery/clonepod/podf
for(var/direction in GLOB.cardinals)
-
- podf = locate(/obj/machinery/clonepod, get_step(src, direction))
- if (!isnull(podf) && podf.is_operational())
+ podf = locate(clonepod_type, get_step(src, direction))
+ if(podf?.is_operational())
AttachCloner(podf)
/obj/machinery/computer/cloning/proc/AttachCloner(obj/machinery/clonepod/pod)
@@ -132,7 +135,7 @@
else if(istype(W, /obj/item/multitool))
var/obj/item/multitool/P = W
- if(istype(P.buffer, /obj/machinery/clonepod))
+ if(istype(P.buffer, clonepod_type))
if(get_area(P.buffer) != get_area(src))
to_chat(user, "-% Cannot link machines across power zones. Buffer cleared %-")
P.buffer = null
@@ -157,13 +160,14 @@
var/dat = ""
dat += "Refresh"
- if(scanner && HasEfficientPod() && scanner.scan_level >= AUTOCLONING_MINIMAL_LEVEL)
- if(!autoprocess)
- dat += "Autoclone"
+ if(use_records)
+ if(scanner && HasEfficientPod() && scanner.scan_level >= AUTOCLONING_MINIMAL_LEVEL)
+ if(!autoprocess)
+ dat += "Autoclone"
+ else
+ dat += "Stop autoclone"
else
- dat += "Stop autoclone"
- else
- dat += "Autoclone"
+ dat += "Autoclone"
dat += "
Cloning Pod Status
"
dat += "
[temp]
"
@@ -190,26 +194,29 @@
else if(loading)
dat += "[scanner_occupant] => Scanning..."
else
- if(scanner_occupant.ckey != scantemp_ckey)
- scantemp = "Ready to Scan"
- scantemp_ckey = scanner_occupant.ckey
+ if(use_records)
+ if(scanner_occupant.ckey != scantemp_ckey)
+ scantemp = "Ready to Scan"
+ scantemp_ckey = scanner_occupant.ckey
+ else
+ scantemp = "Ready to Clone"
dat += "[scanner_occupant] => [scantemp]"
dat += ""
if(scanner_occupant)
- dat += "Start Scan"
- dat += " [src.scanner.locked ? "Unlock Scanner" : "Lock Scanner"]"
+ dat += "[use_records ? "Start Scan" : "Clone"]"
+ dat += " [scanner.locked ? "Unlock Scanner" : "Lock Scanner"]"
else
- dat += "Start Scan"
-
- // Database
- dat += "
Database Functions
"
- if (src.records.len && src.records.len > 0)
- dat += "View Records ([src.records.len]) "
- else
- dat += "View Records (0) "
- if (src.diskette)
- dat += "Eject Disk "
+ dat += "[use_records ? "Start Scan" : "Clone"]"
+ if(use_records)
+ // Database
+ dat += "
Database Functions
"
+ if (src.records.len && src.records.len > 0)
+ dat += "View Records ([src.records.len]) "
+ else
+ dat += "View Records (0) "
+ if (src.diskette)
+ dat += "Eject Disk "
@@ -290,24 +297,19 @@
autoprocess = FALSE
STOP_PROCESSING(SSmachines, src)
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
+ . = TRUE
else if ((href_list["scan"]) && !isnull(scanner) && scanner.is_operational())
scantemp = ""
- loading = 1
+ loading = TRUE
src.updateUsrDialog()
playsound(src, 'sound/machines/terminal_prompt.ogg', 50, 0)
say("Initiating scan...")
var/prev_locked = scanner.locked
scanner.locked = TRUE
- spawn(20)
- src.scan_occupant(scanner.occupant)
-
- loading = 0
- src.updateUsrDialog()
- playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
- scanner.locked = prev_locked
-
+ addtimer(CALLBACK(src, .proc/finish_scan, scanner.occupant, prev_locked), 2 SECONDS)
+ . = TRUE
//No locking an open scanner.
else if ((href_list["lock"]) && !isnull(scanner) && scanner.is_operational())
@@ -317,8 +319,17 @@
else
scanner.locked = FALSE
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
+ . = TRUE
- else if(href_list["view_rec"])
+
+ else if (href_list["refresh"])
+ src.updateUsrDialog()
+ playsound(src, "terminal_type", 25, 0)
+ . = TRUE
+
+ if(. || !use_records)
+ return
+ if(href_list["view_rec"])
playsound(src, "terminal_type", 25, 0)
src.active_record = find_record("id", href_list["view_rec"], records)
if(active_record)
@@ -330,6 +341,7 @@
src.menu = 3
else
src.temp = "Record missing."
+ . = TRUE
else if (href_list["del_rec"])
if ((!src.active_record) || (src.menu < 3))
@@ -353,8 +365,9 @@
else
src.temp = "Access Denied."
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
+ . = TRUE
- else if (href_list["disk"]) //Load or eject.
+ else if (href_list["disk"] && use_records) //Load or eject.
switch(href_list["disk"])
if("load")
if (!diskette || !istype(diskette.fields) || !diskette.fields["name"] || !diskette.fields)
@@ -392,10 +405,7 @@
diskette.name = "data disk - '[src.diskette.fields["name"]]'"
src.temp = "Save successful."
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
-
- else if (href_list["refresh"])
- src.updateUsrDialog()
- playsound(src, "terminal_type", 25, 0)
+ . = TRUE
else if (href_list["clone"])
var/datum/data/record/C = find_record("id", href_list["clone"], records)
@@ -415,7 +425,7 @@
else if(pod.occupant)
temp = "Cloning cycle already in progress."
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
- else if(pod.growclone(C.fields["ckey"], C.fields["name"], C.fields["UI"], C.fields["SE"], C.fields["mind"], C.fields["mrace"], C.fields["features"], C.fields["factions"], C.fields["quirks"], C.fields["bank_account"]))
+ else if(pod.growclone(C.fields["ckey"], C.fields["name"], C.fields["UI"], C.fields["SE"], C.fields["mind"], C.fields["blood_type"], C.fields["mrace"], C.fields["features"], C.fields["factions"], C.fields["quirks"], C.fields["bank_account"], C.fields["traumas"]))
temp = "[C.fields["name"]] => Cloning cycle in progress..."
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
records.Remove(C)
@@ -429,53 +439,49 @@
else
temp = "Data corruption."
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
+ . = TRUE
- else if (href_list["menu"])
- src.menu = text2num(href_list["menu"])
+ else if (href_list["menu"] && use_records)
+ menu = text2num(href_list["menu"])
playsound(src, "terminal_type", 25, 0)
+ . = TRUE
+/obj/machinery/computer/cloning/proc/finish_scan(mob/living/L, prev_locked)
+ if(!scanner || !L)
+ return
src.add_fingerprint(usr)
src.updateUsrDialog()
- return
+
+ if(use_records)
+ scan_occupant(L)
+ else
+ clone_occupant(L)
+
+ loading = FALSE
+ src.updateUsrDialog()
+ playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
+ scanner.locked = prev_locked
/obj/machinery/computer/cloning/proc/scan_occupant(occupant)
var/mob/living/mob_occupant = get_mob_or_brainmob(occupant)
var/datum/dna/dna
var/datum/bank_account/has_bank_account
+
+ // Do not use unless you know what they are.
+ var/mob/living/carbon/C = mob_occupant
+ var/mob/living/brain/B = mob_occupant
+
if(ishuman(mob_occupant))
- var/mob/living/carbon/C = mob_occupant
dna = C.has_dna()
var/obj/item/card/id/I = C.get_idcard()
if(I)
has_bank_account = I.registered_account
if(isbrain(mob_occupant))
- var/mob/living/brain/B = mob_occupant
dna = B.stored_dna
- if(!istype(dna))
- scantemp = "Unable to locate valid genetic data."
- playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
- return
- if(mob_occupant.suiciding || mob_occupant.hellbound)
- scantemp = "Subject's brain is not responding to scanning stimuli."
- playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
- return
- if((HAS_TRAIT(mob_occupant, TRAIT_NOCLONE)) && (src.scanner.scan_level < 2))
- scantemp = "Subject no longer contains the fundamental materials required to create a living clone."
- playsound(src, 'sound/machines/terminal_alert.ogg', 50, 0)
- return
- if ((!mob_occupant.ckey) || (!mob_occupant.client))
- scantemp = "Mental interface failure."
- playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
- return
- if (find_record("ckey", mob_occupant.ckey, records))
- scantemp = "Subject already in database."
- playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
- return
- if(SSeconomy.full_ancap && !has_bank_account)
- scantemp = "Subject is either missing an ID card with a bank account on it, or does not have an account to begin with. Please ensure the ID card is on the body before attempting to scan."
- playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
+ if(!can_scan(dna, mob_occupant, FALSE, has_bank_account))
return
+
var/datum/data/record/R = new()
if(dna.species)
// We store the instance rather than the path, because some
@@ -497,11 +503,17 @@
R.fields["features"] = dna.features
R.fields["factions"] = mob_occupant.faction
R.fields["quirks"] = list()
- R.fields["bank_account"] = has_bank_account
for(var/V in mob_occupant.roundstart_quirks)
var/datum/quirk/T = V
R.fields["quirks"][T.type] = T.clone_data()
+ R.fields["traumas"] = list()
+ if(ishuman(mob_occupant))
+ R.fields["traumas"] = C.get_traumas()
+ if(isbrain(mob_occupant))
+ R.fields["traumas"] = B.get_traumas()
+
+ R.fields["bank_account"] = has_bank_account
if (!isnull(mob_occupant.mind)) //Save that mind so traitors can continue traitoring after cloning.
R.fields["mind"] = "[REF(mob_occupant.mind)]"
@@ -520,3 +532,78 @@
board.records = records
scantemp = "Subject successfully scanned."
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
+
+//Used by the experimental cloning computer.
+/obj/machinery/computer/cloning/proc/clone_occupant(occupant)
+ var/mob/living/mob_occupant = get_mob_or_brainmob(occupant)
+ var/datum/dna/dna
+ if(ishuman(mob_occupant))
+ var/mob/living/carbon/C = mob_occupant
+ dna = C.has_dna()
+ if(isbrain(mob_occupant))
+ var/mob/living/brain/B = mob_occupant
+ dna = B.stored_dna
+
+ if(!can_scan(dna, mob_occupant, TRUE))
+ return
+
+ var/clone_species
+ if(dna.species)
+ clone_species = dna.species
+ else
+ var/datum/species/rando_race = pick(GLOB.roundstart_races)
+ clone_species = rando_race.type
+
+ var/obj/machinery/clonepod/pod = GetAvailablePod()
+ //Can't clone without someone to clone. Or a pod. Or if the pod is busy. Or full of gibs.
+ if(!LAZYLEN(pods))
+ temp = "No Clonepods detected."
+ playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
+ else if(!pod)
+ temp = "No Clonepods available."
+ playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
+ else if(pod.occupant)
+ temp = "Cloning cycle already in progress."
+ playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
+ else
+ pod.growclone(null, mob_occupant.real_name, dna.uni_identity, dna.mutation_index, null, dna.blood_type, clone_species, dna.features, mob_occupant.faction)
+ temp = "[mob_occupant.real_name] => Cloning data sent to pod."
+ playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
+
+/obj/machinery/computer/cloning/proc/can_scan(datum/dna/dna, mob/living/mob_occupant, experimental = FALSE, datum/bank_account/account)
+ if(!istype(dna))
+ scantemp = "Unable to locate valid genetic data."
+ playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
+ return
+ if(!experimental)
+ if(mob_occupant.suiciding || mob_occupant.hellbound)
+ scantemp = "Subject's brain is not responding to scanning stimuli."
+ playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
+ return
+ if((HAS_TRAIT(mob_occupant, TRAIT_NOCLONE)) && (src.scanner.scan_level < 2))
+ scantemp = "Subject no longer contains the fundamental materials required to create a living clone."
+ playsound(src, 'sound/machines/terminal_alert.ogg', 50, 0)
+ return
+ if (!experimental)
+ if(!mob_occupant.ckey || !mob_occupant.client)
+ scantemp = "Mental interface failure."
+ playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
+ return
+ if (find_record("ckey", mob_occupant.ckey, records))
+ scantemp = "Subject already in database."
+ playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
+ return
+ if(SSeconomy.full_ancap && !account)
+ scantemp = "Subject is either missing an ID card with a bank account on it, or does not have an account to begin with. Please ensure the ID card is on the body before attempting to scan."
+ playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
+ return
+ return TRUE
+
+//Prototype cloning console, much more rudimental and lacks modern functions such as saving records, autocloning, or safety checks.
+/obj/machinery/computer/cloning/prototype
+ name = "prototype cloning console"
+ desc = "Used to operate an experimental cloner."
+ icon_screen = "dna"
+ icon_keyboard = "med_key"
+ circuit = /obj/item/circuitboard/computer/cloning/prototype
+ clonepod_type = /obj/machinery/clonepod/experimental
diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index 22bea14381..6a99b248e3 100755
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -61,7 +61,7 @@
// main interface
if("main")
state = STATE_DEFAULT
- playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
+ playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE)
if("login")
var/mob/M = usr
@@ -73,19 +73,19 @@
auth_id = "[I.registered_name] ([I.assignment])"
if((ACCESS_CAPTAIN in I.access))
authenticated = 2
- playsound(src, 'sound/machines/terminal_on.ogg', 50, 0)
+ playsound(src, 'sound/machines/terminal_on.ogg', 50, FALSE)
if(obj_flags & EMAGGED)
authenticated = 2
auth_id = "Unknown"
to_chat(M, "[src] lets out a quiet alarm as its login is overridden.")
- playsound(src, 'sound/machines/terminal_on.ogg', 50, 0)
- playsound(src, 'sound/machines/terminal_alert.ogg', 25, 0)
+ playsound(src, 'sound/machines/terminal_on.ogg', 50, FALSE)
+ playsound(src, 'sound/machines/terminal_alert.ogg', 25, FALSE)
if(prob(25))
for(var/mob/living/silicon/ai/AI in active_ais())
SEND_SOUND(AI, sound('sound/machines/terminal_alert.ogg', volume = 10)) //Very quiet for balance reasons
if("logout")
authenticated = 0
- playsound(src, 'sound/machines/terminal_off.ogg', 50, 0)
+ playsound(src, 'sound/machines/terminal_off.ogg', 50, FALSE)
if("swipeidseclevel")
var/mob/M = usr
@@ -109,7 +109,7 @@
security_level_cd = world.time + 15 SECONDS
if(GLOB.security_level != old_level)
to_chat(usr, "Authorization confirmed. Modifying security level.")
- playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
+ playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE)
//Only notify people if an actual change happened
var/security_level = NUM2SECLEVEL(GLOB.security_level)
log_game("[key_name(usr)] has changed the security level to [security_level] with [src] at [AREACOORD(usr)].")
@@ -118,28 +118,28 @@
tmp_alertlevel = 0
else
to_chat(usr, "You are not authorized to do this!")
- playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
+ playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE)
tmp_alertlevel = 0
state = STATE_DEFAULT
else
to_chat(usr, "You need to swipe your ID!")
- playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
+ playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE)
if("announce")
if(authenticated==2)
- playsound(src, 'sound/machines/terminal_prompt.ogg', 50, 0)
+ playsound(src, 'sound/machines/terminal_prompt.ogg', 50, FALSE)
make_announcement(usr)
if("crossserver")
if(authenticated==2)
if(!checkCCcooldown())
- to_chat(usr, "Arrays recycling. Please stand by.")
- playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
+ to_chat(usr, "Arrays recycling. Please stand by.")
+ playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE)
return
var/input = stripped_multiline_input(usr, "Please choose a message to transmit to allied stations. Please be aware that this process is very expensive, and abuse will lead to... termination.", "Send a message to an allied station.", "")
if(!input || !(usr in view(1,src)) || !checkCCcooldown())
return
- playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
+ playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE)
send2otherserver("[station_name()]", input,"Comms_Console")
minor_announce(input, title = "Outgoing message to allied station")
usr.log_talk(input, LOG_SAY, tag="message to the other server")
@@ -168,22 +168,18 @@
if(D)
points_to_check = D.account_balance
if(points_to_check >= S.credit_cost)
- var/obj/machinery/shuttle_manipulator/M = locate() in GLOB.machines
- if(M)
- SSshuttle.shuttle_purchased = TRUE
- D.adjust_money(-S.credit_cost)
- minor_announce("[usr.real_name] has purchased [S.name] for [S.credit_cost] credits." , "Shuttle Purchase")
- message_admins("[ADMIN_LOOKUPFLW(usr)] purchased [S.name].")
- SSblackbox.record_feedback("text", "shuttle_purchase", 1, "[S.name]")
- M.unload_preview()
- M.load_template(S)
- M.existing_shuttle = SSshuttle.emergency
- M.action_load(S)
- message_admins("[S.name] loaded, purchased by [usr]")
- else
- to_chat(usr, "Something went wrong! The shuttle exchange system seems to be down.")
+ SSshuttle.shuttle_purchased = TRUE
+ SSshuttle.unload_preview()
+ SSshuttle.load_template(S)
+ SSshuttle.existing_shuttle = SSshuttle.emergency
+ SSshuttle.action_load(S)
+ D.adjust_money(-S.credit_cost)
+ minor_announce("[usr.real_name] has purchased [S.name] for [S.credit_cost] credits." , "Shuttle Purchase")
+ message_admins("[ADMIN_LOOKUPFLW(usr)] purchased [S.name].")
+ log_shuttle("[key_name(usr)] has purchased [S.name].")
+ SSblackbox.record_feedback("text", "shuttle_purchase", 1, "[S.name]")
else
- to_chat(usr, "Not enough credits.")
+ to_chat(usr, "Insufficient credits.")
if("callshuttle")
state = STATE_DEFAULT
@@ -268,7 +264,7 @@
// Status display stuff
if("setstat")
- playsound(src, "terminal_type", 50, 0)
+ playsound(src, "terminal_type", 50, FALSE)
switch(href_list["statdisp"])
if("message")
post_status("message", stat_msg1, stat_msg2)
@@ -308,13 +304,13 @@
if("MessageSyndicate")
if((authenticated==2) && (obj_flags & EMAGGED))
if(!checkCCcooldown())
- to_chat(usr, "Arrays recycling. Please stand by.")
- playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
+ to_chat(usr, "Arrays recycling. Please stand by.")
+ playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE)
return
var/input = stripped_input(usr, "Please choose a message to transmit to \[ABNORMAL ROUTING COORDINATES\] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "Send a message to /??????/.", "")
if(!input || !(usr in view(1,src)) || !checkCCcooldown())
return
- playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
+ playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE)
Syndicate_announce(input, usr)
to_chat(usr, "SYSERR @l(19833)of(transmit.dm): !@$ MESSAGE TRANSMITTED TO SYNDICATE COMMAND.")
for(var/client/X in GLOB.admins)
@@ -327,7 +323,7 @@
if("RestoreBackup")
to_chat(usr, "Backup routing data restored!")
- playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
+ playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE)
obj_flags &= ~EMAGGED
updateDialog()
@@ -341,7 +337,7 @@
return
Nuke_request(input, usr)
to_chat(usr, "Request sent.")
- usr.log_message("has requested the nuclear codes from CentCom", LOG_SAY)
+ usr.log_message("has requested the nuclear codes from CentCom with reason \"[input]\"", LOG_SAY)
priority_announce("The codes for the on-station nuclear self-destruct have been requested by [usr]. Confirmation or denial of this request will be sent shortly.", "Nuclear Self Destruct Codes Requested","commandreport")
CM.lastTimeUsed = world.time
@@ -448,7 +444,7 @@
if(authenticated == 1)
authenticated = 2
to_chat(user, "You scramble the communication routing circuits!")
- playsound(src, 'sound/machines/terminal_alert.ogg', 50, 0)
+ playsound(src, 'sound/machines/terminal_alert.ogg', 50, FALSE)
return TRUE
/obj/machinery/computer/communications/ui_interact(mob/user)
@@ -514,16 +510,16 @@
dat += " \[ Log In \]"
if(STATE_CALLSHUTTLE)
dat += get_call_shuttle_form()
- playsound(src, 'sound/machines/terminal_prompt.ogg', 50, 0)
+ playsound(src, 'sound/machines/terminal_prompt.ogg', 50, FALSE)
if(STATE_CANCELSHUTTLE)
dat += get_cancel_shuttle_form()
- playsound(src, 'sound/machines/terminal_prompt.ogg', 50, 0)
+ playsound(src, 'sound/machines/terminal_prompt.ogg', 50, FALSE)
if(STATE_MESSAGELIST)
dat += "Messages:"
for(var/i in 1 to messages.len)
var/datum/comm_message/M = messages[i]
dat += " [M.title]"
- playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
+ playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE)
if(STATE_VIEWMESSAGE)
if (currmsg)
dat += "[currmsg.title]
[currmsg.content]"
@@ -557,7 +553,7 @@
dat += " Red Alert |"
dat += " Lockdown |"
dat += " Biohazard \] "
- playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
+ playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE)
if(STATE_ALERT_LEVEL)
dat += "Current alert level: [NUM2SECLEVEL(GLOB.security_level)] "
if(GLOB.security_level == SEC_LEVEL_DELTA)
@@ -571,7 +567,7 @@
dat += "Confirm the change to: [NUM2SECLEVEL(tmp_alertlevel)] "
dat += "Swipe ID to confirm change. "
if(STATE_TOGGLE_EMERGENCY)
- playsound(src, 'sound/machines/terminal_prompt.ogg', 50, 0)
+ playsound(src, 'sound/machines/terminal_prompt.ogg', 50, FALSE)
if(GLOB.emergency_access == 1)
dat += "Emergency Maintenance Access is currently ENABLED"
dat += " Restore maintenance access restrictions? \[ OK | Cancel \]"
@@ -722,7 +718,7 @@
/obj/machinery/computer/communications/proc/make_announcement(mob/living/user, is_silicon)
if(!SScommunications.can_announce(user, is_silicon))
- to_chat(user, "Intercomms recharging. Please stand by.")
+ to_chat(user, "Intercomms recharging. Please stand by.")
return
var/input = stripped_input(user, "Please choose a message to announce to the station crew.", "What?")
if(!input || !user.canUseTopic(src))
diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm
index 01a1d043a2..cd8b5c1c59 100644
--- a/code/game/machinery/computer/crew.dm
+++ b/code/game/machinery/computer/crew.dm
@@ -80,7 +80,7 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new)
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, "crew", "crew monitor", 800, 600 , master_ui, state)
+ ui = new(user, src, ui_key, "CrewConsole", "crew monitor", 800, 600 , master_ui, state)
ui.open()
/datum/crewmonitor/proc/show(mob/M, source)
diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm
index d465ff2022..2dce50aa88 100644
--- a/code/game/machinery/computer/dna_console.dm
+++ b/code/game/machinery/computer/dna_console.dm
@@ -1,25 +1,41 @@
+/// Base timeout for creating mutation activators and other injectors
#define INJECTOR_TIMEOUT 100
+/// Maximum number of genetic makeup storage slots in DNA Console
#define NUMBER_OF_BUFFERS 3
+/// Timeout for DNA Scramble in DNA Consoles
#define SCRAMBLE_TIMEOUT 600
-#define JOKER_TIMEOUT 12000 //20 minutes
-#define JOKER_UPGRADE 1800
+/// Timeout for using the Joker feature to solve a gene in DNA Console
+#define JOKER_TIMEOUT 12000
+/// How much time DNA Scanner upgrade tiers remove from JOKER_TIMEOUT
+#define JOKER_UPGRADE 3000
+/// Maximum value for radiaton strength when pulsing enzymes
#define RADIATION_STRENGTH_MAX 15
-#define RADIATION_STRENGTH_MULTIPLIER 1 //larger has more range
+/// Larger multipliers will affect the range of values when pulsing enzymes
+#define RADIATION_STRENGTH_MULTIPLIER 1
+/// Maximum value for the radiation pulse duration when pulsing enzymes
#define RADIATION_DURATION_MAX 30
-#define RADIATION_ACCURACY_MULTIPLIER 3 //larger is less accurate
+/// Large values reduce pulse accuracy and may pulse other enzymes than selected
+#define RADIATION_ACCURACY_MULTIPLIER 3
+/// Special status indicating a scanner occupant is transforming eg. from monkey to human
+#define STATUS_TRANSFORMING 4
-#define RADIATION_IRRADIATION_MULTIPLIER 1 //multiplier for how much radiation a test subject receives
+/// Multiplier for how much radiation received from DNA Console functionality
+#define RADIATION_IRRADIATION_MULTIPLIER 1
-#define SCANNER_ACTION_SE 1
-#define SCANNER_ACTION_UI 2
-#define SCANNER_ACTION_UE 3
-#define SCANNER_ACTION_MIXED 4
+/// Flag for the mutation ref search system. Search will include scanner occupant
+#define SEARCH_OCCUPANT 1
+/// Flag for the mutation ref search system. Search will include console storage
+#define SEARCH_STORED 2
+/// Flag for the mutation ref search system. Search will include diskette storage
+#define SEARCH_DISKETTE 4
+/// Flag for the mutation ref search system. Search will include advanced injector mutations
+#define SEARCH_ADV_INJ 8
/obj/machinery/computer/scan_consolenew
- name = "\improper DNA scanner access console"
+ name = "DNA Console"
desc = "Scan DNA."
icon_screen = "dna"
icon_keyboard = "med_key"
@@ -31,47 +47,103 @@
active_power_usage = 400
light_color = LIGHT_COLOR_BLUE
+ /// Link to the techweb's stored research. Used to retrieve stored mutations
var/datum/techweb/stored_research
+ /// Maximum number of mutations that DNA Consoles are able to store
var/max_storage = 6
- var/combine
+ /// Duration for enzyme radiation pulses
var/radduration = 2
+ /// Strength for enzyme radiation pulses
var/radstrength = 1
+ /// Maximum number of chromosomes that DNA Consoles are able to store.
var/max_chromosomes = 6
-
- ///Amount of mutations we can store
- var/list/buffer[NUMBER_OF_BUFFERS]
- ///mutations we have stored
+ /// Maximum number of enzymes we can store
+ var/list/genetic_makeup_buffer[NUMBER_OF_BUFFERS]
+ /// List of all mutations stored on the DNA Console
var/list/stored_mutations = list()
- ///chromosomes we have stored
+ /// List of all chromosomes stored in the DNA Console
var/list/stored_chromosomes = list()
- ///combinations of injectors for the 'injector selection'. format is list("Elsa" = list(Cryokinesis, Geladikinesis), "The Hulk" = list(Hulk, Gigantism), etc) Glowy and the gang being an initialized datum
- var/list/injector_selection = list()
- ///max amount of selections you can make
+ /// Assoc list of all advanced injectors. Keys are injector names. Values are lists of mutations.
+ var/list/list/injector_selection = list()
+ /// Maximum number of advanced injectors that DNA Consoles store
var/max_injector_selections = 2
- ///hard-cap on the advanced dna injector
+ /// Maximum number of mutation that an advanced injector can store
var/max_injector_mutations = 10
- ///the max instability of the advanced injector.
+ /// Maximum total instability of all combined mutations allowed on an advanced injector
var/max_injector_instability = 50
- var/injectorready = 0 //world timer cooldown var
+ /// World time when injectors are ready to be printed
+ var/injectorready = 0
+ /// World time when JOKER algorithm can be used in DNA Consoles
var/jokerready = 0
+ /// World time when Scramble can be used in DNA Consoles
var/scrambleready = 0
- var/current_screen = "mainmenu"
- var/current_mutation //what block are we inspecting? only used when screen = "info"
- var/current_storage //what storage block are we looking at?
- var/obj/machinery/dna_scannernew/connected = null
+
+ /// Currently stored genetic data diskette
var/obj/item/disk/data/diskette = null
+
+ /// Current delayed action, used for delayed enzyme transfer on scanner door close
var/list/delayed_action = null
+ /// Index of the enzyme being modified during delayed enzyme pulse operations
+ var/rad_pulse_index = 0
+ /// World time when the enzyme pulse should complete
+ var/rad_pulse_timer = 0
+
+ /// Used for setting tgui data - Whether the connected DNA Scanner is usable
+ var/can_use_scanner = FALSE
+ /// Used for setting tgui data - Whether the current DNA Scanner occupant is viable for genetic modification
+ var/is_viable_occupant = FALSE
+ /// Used for setting tgui data - Whether Scramble DNA is ready
+ var/is_scramble_ready = FALSE
+ /// Used for setting tgui data - Whether JOKER algorithm is ready
+ var/is_joker_ready = FALSE
+ /// Used for setting tgui data - Whether injectors are ready to be printed
+ var/is_injector_ready = FALSE
+ /// Used for setting tgui data - Wheher an enzyme pulse operation is ongoing
+ var/is_pulsing_rads = FALSE
+ /// Used for setting tgui data - Time until scramble is ready
+ var/time_to_scramble = 0
+ /// Used for setting tgui data - Time until joker is ready
+ var/time_to_joker = 0
+ /// Used for setting tgui data - Time until injectors are ready
+ var/time_to_injector = 0
+ /// Used for setting tgui data - Time until the enzyme pulse is complete
+ var/time_to_pulse = 0
+
+ /// Currently connected DNA Scanner
+ var/obj/machinery/dna_scannernew/connected_scanner = null
+ /// Current DNA Scanner occupant
+ var/mob/living/carbon/scanner_occupant = null
+
+ /// Used for setting tgui data - List of occupant mutations
+ var/list/tgui_occupant_mutations = list()
+ /// Used for setting tgui data - List of DNA Console stored mutations
+ var/list/tgui_console_mutations = list()
+ /// Used for setting tgui data - List of diskette stored mutations
+ var/list/tgui_diskette_mutations = list()
+ /// Used for setting tgui data - List of DNA Console chromosomes
+ var/list/tgui_console_chromosomes = list()
+ /// Used for setting tgui data - List of occupant mutations
+ var/list/tgui_genetic_makeup = list()
+ /// Used for setting tgui data - List of occupant mutations
+ var/list/tgui_advinjector_mutations = list()
+
+
+ /// State of tgui view, i.e. which tab is currently active, or which genome we're currently looking at.
+ var/list/list/tgui_view_state = list()
+
+/obj/machinery/computer/scan_consolenew/process()
+ . = ..()
+
+ // This is for pulsing the UI element with radiation as part of genetic makeup
+ // If rad_pulse_index > 0 then it means we're attempting a rad pulse
+ if((rad_pulse_index > 0) && (rad_pulse_timer <= world.time))
+ rad_pulse()
+ return
+
/obj/machinery/computer/scan_consolenew/attackby(obj/item/I, mob/user, params)
- if (istype(I, /obj/item/disk/data)) //INSERT SOME DISKETTES
- if (!src.diskette)
- if (!user.transferItemToLoc(I,src))
- return
- src.diskette = I
- to_chat(user, "You insert [I].")
- src.updateUsrDialog()
- return
+ // Store chromosomes in the console if there's room
if (istype(I, /obj/item/chromosome))
if(LAZYLEN(stored_chromosomes) < max_chromosomes)
I.forceMove(src)
@@ -80,856 +152,1797 @@
else
to_chat(user, "You cannot store any more chromosomes!")
return
+
+ // Insert data disk if console disk slot is empty
+ // Swap data disk if there is one already a disk in the console
+ if (istype(I, /obj/item/disk/data)) //INSERT SOME DISKETTES
+ // Insert disk into DNA Console
+ if (!user.transferItemToLoc(I,src))
+ return
+ // If insertion was successful and there's already a diskette in the console, eject the old one.
+ if(diskette)
+ eject_disk(user)
+ // Set the new diskette.
+ diskette = I
+ to_chat(user, "You insert [I].")
+ return
+
+ // Recycle non-activator used injectors
+ // Turn activator used injectors (aka research injectors) to chromosomes
if(istype(I, /obj/item/dnainjector/activator))
var/obj/item/dnainjector/activator/A = I
if(A.used)
to_chat(user,"Recycled [I].")
if(A.research)
- var/c_typepath = generate_chromosome()
- var/obj/item/chromosome/CM = new c_typepath (drop_location())
- to_chat(user,"Recycled [I].")
- if((LAZYLEN(stored_chromosomes) < max_chromosomes) && prob(60))
- CM.forceMove(src)
- stored_chromosomes += CM
- to_chat(user,"[capitalize(CM.name)] added to storage.")
+ if(prob(60))
+ var/c_typepath = generate_chromosome()
+ var/obj/item/chromosome/CM = new c_typepath (drop_location())
+ if(LAZYLEN(stored_chromosomes) < max_chromosomes)
+ CM.forceMove(src)
+ stored_chromosomes += CM
+ to_chat(user,"[capitalize(CM.name)] added to storage.")
+ else
+ to_chat(user, "You cannot store any more chromosomes!")
+ to_chat(user, "[capitalize(CM.name)] added on top of the console.")
+ else
+ to_chat(user, "There was not enough genetic data to extract a viable chromosome.")
qdel(I)
return
- else
- return ..()
+
+ return ..()
+
+
+/obj/machinery/computer/scan_consolenew/AltClick(mob/user)
+ // Make sure the user can interact with the machine.
+ if(!user.canUseTopic(src, !issilicon(user)))
+ return
+
+ eject_disk(user)
/obj/machinery/computer/scan_consolenew/Initialize()
. = ..()
- for(var/direction in GLOB.cardinals)
- connected = locate(/obj/machinery/dna_scannernew, get_step(src, direction))
- if(!isnull(connected))
- break
+
+ // Connect with a nearby DNA Scanner on init
+ connect_to_scanner()
+
+ // Set appropriate ready timers and limits for machines functions
injectorready = world.time + INJECTOR_TIMEOUT
scrambleready = world.time + SCRAMBLE_TIMEOUT
jokerready = world.time + JOKER_TIMEOUT
+ // Set the default tgui state
+ set_default_state()
+
+ // Link machine with research techweb. Used for discovering and accessing
+ // already discovered mutations
stored_research = SSresearch.science_tech
/obj/machinery/computer/scan_consolenew/examine(mob/user)
. = ..()
- if(jokerready < world.time)
- . += "JOKER algorithm available."
- else
- . += "JOKER algorithm available in about [round(0.00166666667 * (jokerready - world.time))] minutes."
-/obj/machinery/computer/scan_consolenew/ui_interact(mob/user, last_change)
+/obj/machinery/computer/scan_consolenew/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)
. = ..()
- if(!user)
- return
- var/datum/browser/popup = new(user, "scannernew", "DNA Modifier Console", 800, 630) // Set up the popup browser window
- if(user.client)
- var/datum/asset/simple/assets = get_asset_datum(/datum/asset/simple/genetics)
- assets.send(user.client)
- if(!(in_range(src, user) || hasSiliconAccessInArea(user)))
- popup.close()
- return
- popup.add_stylesheet("scannernew", 'html/browser/scannernew.css')
- var/mob/living/carbon/viable_occupant
- var/list/occupant_status = list("
"
- return temp_html
-
-/obj/machinery/computer/scan_consolenew/Topic(href, href_list)
+/obj/machinery/computer/scan_consolenew/ui_act(action, var/list/params)
if(..())
- return
- if(!isturf(usr.loc))
- return
- if(!((isturf(loc) && in_range(src, usr)) || hasSiliconAccessInArea(usr)))
- return
- if(current_screen == "working")
- return
+ return TRUE
+
+ . = TRUE
add_fingerprint(usr)
usr.set_machine(src)
- var/mob/living/carbon/viable_occupant = get_viable_occupant()
+ switch(action)
+ // Connect this DNA Console to a nearby DNA Scanner
+ // Usually only activate as an option if there is no connected scanner
+ if("connect_scanner")
+ connect_to_scanner()
+ return
- //Basic Tasks///////////////////////////////////////////
- var/num = round(text2num(href_list["num"]))
- var/last_change
- switch(href_list["task"])
- if("togglelock")
- if(connected)
- connected.locked = !connected.locked
- if("toggleopen")
- if(connected)
- connected.toggle_open(usr)
- if("setduration")
- if(!num)
- num = round(input(usr, "Choose pulse duration:", "Input an Integer", null) as num|null)
- if(num)
- radduration = WRAP(num, 1, RADIATION_DURATION_MAX+1)
- if("setstrength")
- if(!num)
- num = round(input(usr, "Choose pulse strength:", "Input an Integer", null) as num|null)
- if(num)
- radstrength = WRAP(num, 1, RADIATION_STRENGTH_MAX+1)
- if("screen")
- current_screen = href_list["text"]
- if("scramble")
- if(viable_occupant && (scrambleready < world.time))
- viable_occupant.dna.remove_all_mutations(list(MUT_NORMAL, MUT_EXTRA))
- viable_occupant.dna.generate_dna_blocks()
- scrambleready = world.time + SCRAMBLE_TIMEOUT
- to_chat(usr,"DNA scrambled.")
- viable_occupant.radiation += RADIATION_STRENGTH_MULTIPLIER*50/(connected.damage_coeff ** 2)
- if("setbufferlabel")
- var/text = sanitize(input(usr, "Input a new label:", "Input a Text", null) as text|null)
- if(num && text)
- num = clamp(num, 1, NUMBER_OF_BUFFERS)
- var/list/buffer_slot = buffer[num]
- if(istype(buffer_slot))
- buffer_slot["label"] = text
- if("setbuffer")
- if(num && viable_occupant)
- num = clamp(num, 1, NUMBER_OF_BUFFERS)
- buffer[num] = list(
- "label"="Buffer[num]:[viable_occupant.real_name]",
- "UI"=viable_occupant.dna.uni_identity,
- "UE"=viable_occupant.dna.unique_enzymes,
- "name"=viable_occupant.real_name,
- "blood_type"=viable_occupant.dna.blood_type
- )
- if("clearbuffer")
- if(num)
- num = clamp(num, 1, NUMBER_OF_BUFFERS)
- var/list/buffer_slot = buffer[num]
- if(istype(buffer_slot))
- buffer_slot.Cut()
- if("transferbuffer")
- if(num && viable_occupant)
- switch(href_list["text"]) //Numbers are this high because other way upgrading laser is just not worth the hassle, and i cant think of anything better to inmrove
- if("ui")
- apply_buffer(SCANNER_ACTION_UI,num)
- if("ue")
- apply_buffer(SCANNER_ACTION_UE,num)
- if("mixed")
- apply_buffer(SCANNER_ACTION_MIXED,num)
- if("injector")
- if(num && injectorready < world.time)
- num = clamp(num, 1, NUMBER_OF_BUFFERS)
- var/list/buffer_slot = buffer[num]
- if(istype(buffer_slot))
- var/obj/item/dnainjector/timed/I
- switch(href_list["text"])
- if("ui")
- if(buffer_slot["UI"])
- I = new /obj/item/dnainjector/timed(loc)
- I.fields = list("UI"=buffer_slot["UI"])
- if(connected)
- I.damage_coeff = connected.damage_coeff
- if("ue")
- if(buffer_slot["name"] && buffer_slot["UE"] && buffer_slot["blood_type"])
- I = new /obj/item/dnainjector/timed(loc)
- I.fields = list("name"=buffer_slot["name"], "UE"=buffer_slot["UE"], "blood_type"=buffer_slot["blood_type"])
- if(connected)
- I.damage_coeff = connected.damage_coeff
- if("mixed")
- if(buffer_slot["UI"] && buffer_slot["name"] && buffer_slot["UE"] && buffer_slot["blood_type"])
- I = new /obj/item/dnainjector/timed(loc)
- I.fields = list("UI"=buffer_slot["UI"],"name"=buffer_slot["name"], "UE"=buffer_slot["UE"], "blood_type"=buffer_slot["blood_type"])
- if(connected)
- I.damage_coeff = connected.damage_coeff
- if(I)
- injectorready = world.time + INJECTOR_TIMEOUT
- if("loaddisk")
- if(num && diskette && diskette.fields)
- num = clamp(num, 1, NUMBER_OF_BUFFERS)
- buffer[num] = diskette.fields.Copy()
- if("savedisk")
- if(num && diskette && !diskette.read_only)
- num = clamp(num, 1, NUMBER_OF_BUFFERS)
- var/list/buffer_slot = buffer[num]
- if(istype(buffer_slot))
- diskette.name = "data disk \[[buffer_slot["label"]]\]"
- diskette.fields = buffer_slot.Copy()
- if("ejectdisk")
- if(diskette)
- diskette.forceMove(drop_location())
- diskette = null
- if("setdelayed")
- if(num)
- delayed_action = list("action"=text2num(href_list["delayaction"]),"buffer"=num)
- if("pulseui")
- if(num && viable_occupant && connected)
- radduration = WRAP(radduration, 1, RADIATION_DURATION_MAX+1)
- radstrength = WRAP(radstrength, 1, RADIATION_STRENGTH_MAX+1)
+ // Toggle the door open/closed status on attached DNA Scanner
+ if("toggle_door")
+ // GUARD CHECK - Scanner still connected and operational?
+ if(!scanner_operational())
+ return
- var/locked_state = connected.locked
- connected.locked = TRUE
+ connected_scanner.toggle_open(usr)
+ return
- current_screen = "working"
- ui_interact(usr)
+ // Toggle the door bolts on the attached DNA Scanner
+ if("toggle_lock")
+ // GUARD CHECK - Scanner still connected and operational?
+ if(!scanner_operational())
+ return
- sleep(radduration*10)
- current_screen = "ui"
+ connected_scanner.locked = !connected_scanner.locked
+ return
- if(viable_occupant && connected && connected.occupant==viable_occupant)
- viable_occupant.radiation += (RADIATION_IRRADIATION_MULTIPLIER*radduration*radstrength)/(connected.damage_coeff ** 2) //Read comment in "transferbuffer" section above for explanation
- switch(href_list["task"]) //Same thing as there but values are even lower, on best part they are about 0.0*, effectively no damage
- if("pulseui")
- var/len = length_char(viable_occupant.dna.uni_identity)
- num = WRAP(num, 1, len+1)
- num = randomize_radiation_accuracy(num, radduration + (connected.precision_coeff ** 2), len) //Each manipulator level above 1 makes randomization as accurate as selected time + manipulator lvl^2
- //Value is this high for the same reason as with laser - not worth the hassle of upgrading if the bonus is low
- var/block = round((num-1)/DNA_BLOCK_SIZE)+1
- var/subblock = num - block*DNA_BLOCK_SIZE
- last_change = "UI #[block]-[subblock]; "
+ // Scramble scanner occupant's DNA
+ if("scramble_dna")
+ // GUARD CHECK - Can we genetically modify the occupant? Includes scanner
+ // operational guard checks.
+ // GUARD CHECK - Is scramble DNA actually ready?
+ if(!can_modify_occupant() || !(scrambleready < world.time))
+ return
- var/hex = copytext_char(viable_occupant.dna.uni_identity, num, num+1)
- last_change += "[hex]"
- hex = scramble(hex, radstrength, radduration)
- last_change += "->[hex]"
+ scanner_occupant.dna.remove_all_mutations(list(MUT_NORMAL, MUT_EXTRA))
+ scanner_occupant.dna.generate_dna_blocks()
+ scrambleready = world.time + SCRAMBLE_TIMEOUT
+ to_chat(usr,"DNA scrambled.")
+ scanner_occupant.radiation += RADIATION_STRENGTH_MULTIPLIER*50/(connected_scanner.damage_coeff ** 2)
+ return
- viable_occupant.dna.uni_identity = copytext_char(viable_occupant.dna.uni_identity, 1, num) + hex + copytext_char(viable_occupant.dna.uni_identity, num + 1)
- viable_occupant.updateappearance(mutations_overlay_update=1)
+ // Check whether a specific mutation is eligible for discovery within the
+ // scanner occupant
+ // This is additionally done when a mutation's tab is selected in the tgui
+ // interface. This is because some mutations, such as Monkified on monkeys,
+ // are infact completed by default but not yet discovered. Likewise, all
+ // mutations can have their sequence completed while Monkified is still an
+ // active mutation and thus won't immediately be discovered but could be
+ // discovered when Monkified is removed
+ // ---------------------------------------------------------------------- //
+ // params["alias"] - Alias of a mutation. The alias is the "hidden" name of
+ // the mutation, for example "Mutation 5" or "Mutation 33"
+ if("check_discovery")
+ // GUARD CHECK - Can we genetically modify the occupant? Includes scanner
+ // operational guard checks.
+ if(!can_modify_occupant())
+ return
+
+ // GUARD CHECK - Have we somehow cheekily swapped occupants? This is
+ // unexpected.
+ if(!(scanner_occupant == connected_scanner.occupant))
+ return
+
+ check_discovery(params["alias"])
+ return
+
+ // Check all mutations of the occupant and check if any are discovered.
+ // This is called when the Genetic Sequencer is selected. It'll do things
+ // like immediately discover Monkified without needing to click through
+ // the mutation tabs and handle cases where mutations are solved but not
+ // discovered due to the Monkified mutation being active then removed.
+ if("all_check_discovery")
+ // GUARD CHECK - Can we genetically modify the occupant? Includes scanner
+ // operational guard checks.
+ if(!can_modify_occupant())
+ return
+
+ // GUARD CHECK - Have we somehow cheekily swapped occupants? This is
+ // unexpected.
+ if(!(scanner_occupant == connected_scanner.occupant))
+ return
+
+ // Go over all standard mutations and check if they've been discovered.
+ for(var/mutation_type in scanner_occupant.dna.mutation_index)
+ var/datum/mutation/human/HM = GET_INITIALIZED_MUTATION(mutation_type)
+ check_discovery(HM.alias)
+
+ return
+
+ // Set a gene in a mutation's genetic sequence. Will also check for mutations
+ // discovery as part of the process.
+ // ---------------------------------------------------------------------- //
+ // params["alias"] - Alias of a mutation. The alias is the "hidden" name of
+ // the mutation, for example "Mutation 5" or "Mutation 33"
+ // params["gene"] - The letter of the new gene
+ // params["pos"] - The BYOND index of the letter in the gene sequence to be
+ // changed. Expects a text string from TGUI and will convert to a number
+ if("pulse_gene")
+ // GUARD CHECK - Can we genetically modify the occupant? Includes scanner
+ // operational guard checks.
+ if(!can_modify_occupant())
+ return
+
+ // GUARD CHECK - Have we somehow cheekily swapped occupants? This is
+ // unexpected.
+ if(!(scanner_occupant == connected_scanner.occupant))
+ return
+
+ // GUARD CHECK - Is the occupant currently undergoing some form of
+ // transformation? If so, we don't want to be pulsing genes.
+ if(scanner_occupant.transformation_timer)
+ to_chat(usr,"Gene pulse failed: The scanner occupant undergoing a transformation.")
+ return
+
+ // Resolve mutation's BYOND path from the alias
+ var/alias = params["alias"]
+ var/path = GET_MUTATION_TYPE_FROM_ALIAS(alias)
+ // Make sure the occupant still has this mutation
+ if(!(path in scanner_occupant.dna.mutation_index))
+ return
+
+ // Resolve BYOND path to genome sequence of scanner occupant
+ var/sequence = GET_GENE_STRING(path, scanner_occupant.dna)
+
+ var/newgene = params["gene"]
+ var/genepos = text2num(params["pos"])
+
+ // If the new gene is J, this means we're dealing with a JOKER
+ // GUARD CHECK - Is JOKER actually ready?
+ if((newgene == "J") && (jokerready < world.time))
+ var/truegenes = GET_SEQUENCE(path)
+ newgene = truegenes[genepos]
+ jokerready = world.time + JOKER_TIMEOUT - (JOKER_UPGRADE * (connected_scanner.precision_coeff-1))
+
+ // If the gene is an X, we want to update the default genes with the new
+ // X to allow highlighting logic to work on the tgui interface.
+ if(newgene == "X")
+ var/defaultseq = scanner_occupant.dna.default_mutation_genes[path]
+ defaultseq = copytext_char(defaultseq, 1, genepos) + newgene + copytext_char(defaultseq, genepos + 1)
+ scanner_occupant.dna.default_mutation_genes[path] = defaultseq
+
+ // Copy genome to scanner occupant and do some basic mutation checks as
+ // we've increased the occupant rads
+ sequence = copytext_char(sequence, 1, genepos) + newgene + copytext_char(sequence, genepos + 1)
+ scanner_occupant.dna.mutation_index[path] = sequence
+ scanner_occupant.radiation += RADIATION_STRENGTH_MULTIPLIER/connected_scanner.damage_coeff
+ scanner_occupant.domutcheck()
+
+ // GUARD CHECK - Modifying genetics can lead to edge cases where the
+ // scanner occupant is qdel'd and replaced with a different entity.
+ // Examples of this include adding/removing the Monkified mutation which
+ // qdels the previous entity and creates a brand new one in its place.
+ // We should redo all of our occupant modification checks again, although
+ // it is less than ideal.
+ if(!can_modify_occupant())
+ return
+
+ // Check if we cracked a mutation
+ check_discovery(alias)
+
+ return
+
+ // Apply a chromosome to a specific mutation.
+ // ---------------------------------------------------------------------- //
+ // params["mutref"] - ATOM Ref of specific mutation to apply the chromo to
+ // params["chromo"] - Name of the chromosome to apply to the mutation
+ if("apply_chromo")
+ // GUARD CHECK - Can we genetically modify the occupant? Includes scanner
+ // operational guard checks.
+ if(!can_modify_occupant())
+ return
+
+ // GUARD CHECK - Have we somehow cheekily swapped occupants? This is
+ // unexpected.
+ if(!(scanner_occupant == connected_scanner.occupant))
+ return
+
+ var/bref = params["mutref"]
+
+ // GUARD CHECK - Only search occupant for this specific ref, since your
+ // can only apply chromosomes to mutations occupants.
+ var/datum/mutation/human/HM = get_mut_by_ref(bref, SEARCH_OCCUPANT)
+
+ // GUARD CHECK - This should not be possible. Unexpected result
+ if(!HM)
+ return
+
+ // Look through our stored chromos and compare names to find a
+ // stored chromo we can apply.
+ for(var/obj/item/chromosome/CM in stored_chromosomes)
+ if(CM.can_apply(HM) && (CM.name == params["chromo"]))
+ stored_chromosomes -= CM
+ CM.apply(HM)
+
+ return
+
+ // Print any type of standard injector, limited right now to activators that
+ // activate a dormant mutation and mutators that forcibly create a new
+ // MUT_EXTRA mutation
+ // ---------------------------------------------------------------------- //
+ // params["mutref"] - ATOM Ref of specific mutation to create an injector of
+ // params["is_activator"] - Is this an "Activator" style injector, also
+ // referred to as a "Research" type. Expects a string with 0 or 1, which
+ // then gets converted to a number.
+ // params["source"] - The source the request came from.
+ // Expected results:
+ // "occupant" - From genetic sequencer
+ // "console" - From DNA Console storage
+ // "disk" - From inserted diskette
+ if("print_injector")
+ // Because printing mutators and activators share a bunch of code,
+ // it makes sense to keep them both together and set unique vars
+ // later in the code
+
+ // As a side note, because mutations can contain unique metadata,
+ // this system uses BYOND Atom Refs to safely and accurately
+ // identify mutations from big ol' lists
+
+ // GUARD CHECK - Is the injector actually ready?
+ if(world.time < injectorready)
+ return
+
+ var/search_flags = 0
+
+ switch(params["source"])
+ if("occupant")
+ // GUARD CHECK - Make sure we can modify the occupant before we
+ // attempt to search them for any given mutation refs. This could
+ // lead to no search flags being passed to get_mut_by_ref and this
+ // is intended functionality to prevent any cheese or abuse
+ if(can_modify_occupant())
+ search_flags |= SEARCH_OCCUPANT
+ if("console")
+ search_flags |= SEARCH_STORED
+ if("disk")
+ search_flags |= SEARCH_DISKETTE
+
+ var/bref = params["mutref"]
+ var/datum/mutation/human/HM = get_mut_by_ref(bref, search_flags)
+
+ // GUARD CHECK - This should not be possible. Unexpected result
+ if(!HM)
+ return
+
+ // Create a new DNA Injector and add the appropriate mutations to it
+ var/obj/item/dnainjector/activator/I = new /obj/item/dnainjector/activator(loc)
+ I.add_mutations += new HM.type(copymut = HM)
+
+ var/is_activator = text2num(params["is_activator"])
+
+ // Activators are also called "research" injectors and are used to create
+ // chromosomes by recycling at the DNA Console
+ if(is_activator)
+ I.name = "[HM.name] activator"
+ I.research = TRUE
+ // If there's an operational connected scanner, we can use its upgrades
+ // to improve our injector's radiation generation
+ if(scanner_operational())
+ I.damage_coeff = connected_scanner.damage_coeff*4
+ injectorready = world.time + INJECTOR_TIMEOUT * (1 - 0.1 * connected_scanner.precision_coeff)
else
- current_screen = "mainmenu"
-
- if(connected)
- connected.locked = locked_state
- if("inspect")
- if(viable_occupant)
- var/list/mutations = get_mutation_list(TRUE)
- if(current_mutation == mutations[num])
- current_mutation = null
+ injectorready = world.time + INJECTOR_TIMEOUT
+ else
+ I.name = "[HM.name] mutator"
+ I.doitanyway = TRUE
+ // If there's an operational connected scanner, we can use its upgrades
+ // to improve our injector's radiation generation
+ if(scanner_operational())
+ I.damage_coeff = connected_scanner.damage_coeff
+ injectorready = world.time + INJECTOR_TIMEOUT * 5 * (1 - 0.1 * connected_scanner.precision_coeff)
else
- current_mutation = mutations[num]
+ injectorready = world.time + INJECTOR_TIMEOUT * 5
+
+ return
+
+ // Save a mutation to the console's storage buffer.
+ // ---------------------------------------------------------------------- //
+ // params["mutref"] - ATOM Ref of specific mutation to store
+ // params["source"] - The source the request came from.
+ // Expected results:
+ // "occupant" - From genetic sequencer
+ // "disk" - From inserted diskette
+ if("save_console")
+ var/search_flags = 0
+
+ switch(params["source"])
+ if("occupant")
+ // GUARD CHECK - Make sure we can modify the occupant before we
+ // attempt to search them for any given mutation refs. This could
+ // lead to no search flags being passed to get_mut_by_ref and this
+ // is intended functionality to prevent any cheese or abuse
+ if(can_modify_occupant())
+ search_flags |= SEARCH_OCCUPANT
+ if("disk")
+ search_flags |= SEARCH_DISKETTE
+
+ // GUARD CHECK - Is mutation storage full?
+ if(LAZYLEN(stored_mutations) >= max_storage)
+ to_chat(usr,"Mutation storage is full.")
+ return
+
+ var/bref = params["mutref"]
+ var/datum/mutation/human/HM = get_mut_by_ref(bref, search_flags)
+
+ // GUARD CHECK - This should not be possible. Unexpected result
+ if(!HM)
+ return
+
+ var/datum/mutation/human/A = new HM.type()
+ A.copy_mutation(HM)
+ stored_mutations += A
+ to_chat(usr,"Mutation successfully stored.")
+ return
+
+ // Save a mutation to the diskette's storage buffer.
+ // ---------------------------------------------------------------------- //
+ // params["mutref"] - ATOM Ref of specific mutation to store
+ // params["source"] - The source the request came from
+ // Expected results:
+ // "occupant" - From genetic sequencer
+ // "console" - From DNA Console storage
+ if("save_disk")
+ // GUARD CHECK - This code shouldn't even be callable without a diskette
+ // inserted. Unexpected result
+ if(!diskette)
+ return
+
+ // GUARD CHECK - Make sure the disk is not full
+ if(LAZYLEN(diskette.mutations) >= diskette.max_mutations)
+ to_chat(usr,"Disk storage is full.")
+ return
+
+ // GUARD CHECK - Make sure the disk isn't set to read only, as we're
+ // attempting to write to it
+ if(diskette.read_only)
+ to_chat(usr,"Disk is set to read only mode.")
+ return
+
+ var/search_flags = 0
+
+ switch(params["source"])
+ if("occupant")
+ // GUARD CHECK - Make sure we can modify the occupant before we
+ // attempt to search them for any given mutation refs. This could
+ // lead to no search flags being passed to get_mut_by_ref and this
+ // is intended functionality to prevent any cheese or abuse
+ if(can_modify_occupant())
+ search_flags |= SEARCH_OCCUPANT
+ if("console")
+ search_flags |= SEARCH_STORED
+
+ var/bref = params["mutref"]
+ var/datum/mutation/human/HM = get_mut_by_ref(bref, search_flags)
+
+ // GUARD CHECK - This should not be possible. Unexpected result
+ if(!HM)
+ return
+
+ var/datum/mutation/human/A = new HM.type()
+ A.copy_mutation(HM)
+ diskette.mutations += A
+ to_chat(usr,"Mutation successfully stored to disk.")
+ return
+
+ // Completely removes a MUT_EXTRA mutation or mutation with corrupt gene
+ // sequence from the scanner occupant
+ // ---------------------------------------------------------------------- //
+ // params["mutref"] - ATOM Ref of specific mutation to nullify
+ if("nullify")
+ // GUARD CHECK - Can we genetically modify the occupant? Includes scanner
+ // operational guard checks.
+ if(!can_modify_occupant())
+ return
+
+ var/bref = params["mutref"]
+ var/datum/mutation/human/HM = get_mut_by_ref(bref, SEARCH_OCCUPANT)
+
+ // GUARD CHECK - This should not be possible. Unexpected result
+ if(!HM)
+ return
+
+ // GUARD CHECK - Nullify should only be used on scrambled or "extra"
+ // mutations.
+ if(!HM.scrambled && !(HM.class == MUT_EXTRA))
+ return
+
+ scanner_occupant.dna.remove_mutation(HM.type)
+ return
+
+ // Deletes saved mutation from console buffer.
+ // ---------------------------------------------------------------------- //
+ // params["mutref"] - ATOM Ref of specific mutation to delete
+ if("delete_console_mut")
+ var/bref = params["mutref"]
+ var/datum/mutation/human/HM = get_mut_by_ref(bref, SEARCH_STORED)
- if("inspectstorage")
- current_storage = num
- current_screen = "info"
- if("savemut")
- if(viable_occupant)
- var/succes
- if(LAZYLEN(stored_mutations) < max_storage)
- var/mutation = text2path(href_list["path"])
- if(ispath(mutation, /datum/mutation/human)) //sanity checks
- var/datum/mutation/human/HM = viable_occupant.dna.get_mutation(mutation)
- if(HM)
- var/datum/mutation/human/A = new HM.type()
- A.copy_mutation(HM)
- succes = TRUE
- stored_mutations += A
- to_chat(usr,"Mutation succesfully stored.")
- if(!succes) //we can exactly return here
- to_chat(usr,"Mutation storage is full.")
- if("deletemut")
- var/datum/mutation/human/HM = stored_mutations[num]
if(HM)
stored_mutations.Remove(HM)
qdel(HM)
- current_screen = "mutations"
- if("activator")
- if(injectorready < world.time)
- var/mutation = text2path(href_list["path"])
- if(ispath(mutation, /datum/mutation/human))
- var/datum/mutation/human/HM = get_valid_mutation(mutation)
- if(HM)
- var/obj/item/dnainjector/activator/I = new /obj/item/dnainjector/activator(loc)
- I.add_mutations += new HM.type (copymut = HM)
- I.name = "[HM.name] activator"
- I.research = TRUE
- if(connected)
- I.damage_coeff = connected.damage_coeff*4
- injectorready = world.time + INJECTOR_TIMEOUT * (1 - 0.1 * connected.precision_coeff) //precision_coeff being the matter bin rating
- else
- injectorready = world.time + INJECTOR_TIMEOUT
- if("mutator")
- if(injectorready < world.time)
- var/mutation = text2path(href_list["path"])
- if(ispath(mutation, /datum/mutation/human))
- var/datum/mutation/human/HM = get_valid_mutation(mutation)
- if(HM)
- var/obj/item/dnainjector/activator/I = new /obj/item/dnainjector/activator(loc)
- I.add_mutations += new HM.type (copymut = HM)
- I.doitanyway = TRUE
- I.name = "[HM.name] injector"
- if(connected)
- I.damage_coeff = connected.damage_coeff
- injectorready = world.time + INJECTOR_TIMEOUT * 5 * (1 - 0.1 * connected.precision_coeff)
- else
- injectorready = world.time + INJECTOR_TIMEOUT * 5
- if("advinjector")
- var/selection = href_list["injector"]
- if(injectorready < world.time)
- if(injector_selection.Find(selection))
- var/list/true_selection = injector_selection[selection]
- if(LAZYLEN(injector_selection))
- var/obj/item/dnainjector/activator/I = new /obj/item/dnainjector/activator(loc)
- for(var/A in true_selection)
- var/datum/mutation/human/HM = A
- I.add_mutations += new HM.type (copymut = HM)
- I.doitanyway = TRUE
- I.name = "Advanced [selection] injector"
- if(connected)
- I.damage_coeff = connected.damage_coeff
- injectorready = world.time + INJECTOR_TIMEOUT * 8 * (1 - 0.1 * connected.precision_coeff)
- else
- injectorready = world.time + INJECTOR_TIMEOUT * 8
- if("nullify")
- if(viable_occupant)
- var/datum/mutation/human/A = viable_occupant.dna.get_mutation(current_mutation)
- if(A && (!viable_occupant.dna.mutation_in_sequence(current_mutation) || A.scrambled))
- viable_occupant.dna.remove_mutation(current_mutation)
- current_screen = "mainmenu"
- current_mutation = null
- if("pulsegene")
- if(current_screen != "info")
- var/path = text2path(href_list["path"])
- if(viable_occupant && num && (path in viable_occupant.dna.mutation_index))
- var/list/genes = list("A","T","G","C","X")
- if(jokerready < world.time)
- genes += "JOKER"
- var/sequence = GET_GENE_STRING(path, viable_occupant.dna)
- var/original = sequence[num]
- var/new_gene = input("From [original] to-", "New block", original) as null|anything in genes
- if(!new_gene)
- new_gene = original
- if(viable_occupant == get_viable_occupant()) //No cheesing
- if((new_gene == "JOKER") && (jokerready < world.time))
- var/true_genes = GET_SEQUENCE(current_mutation)
- new_gene = true_genes[num]
- jokerready = world.time + JOKER_TIMEOUT - (JOKER_UPGRADE * (connected.precision_coeff-1))
- sequence = copytext(sequence, 1, num) + new_gene + copytext(sequence, num+1, length(sequence)+1)
- viable_occupant.dna.mutation_index[path] = sequence
- viable_occupant.radiation += RADIATION_STRENGTH_MULTIPLIER/connected.damage_coeff
- viable_occupant.domutcheck()
- if("exportdiskmut")
- if(diskette && !diskette.read_only)
- var/path = text2path(href_list["path"])
- if(ispath(path, /datum/mutation/human))
- var/datum/mutation/human/A = get_valid_mutation(path)
- if(A && diskette && (LAZYLEN(diskette.mutations) < diskette.max_mutations))
- var/datum/mutation/human/HM = new A.type()
- diskette.mutations += HM
- HM.copy_mutation(A)
- to_chat(usr, "Succesfully written [A.name] to [diskette.name].")
- if("deletediskmut")
- if(diskette && !diskette.read_only)
- if(num && (LAZYLEN(diskette.mutations) >= num))
- var/datum/mutation/human/A = diskette.mutations[num]
- diskette.mutations.Remove(A)
- qdel(A)
- if("importdiskmut")
- if(diskette && (LAZYLEN(diskette.mutations) >= num))
- if(LAZYLEN(stored_mutations) < max_storage)
- var/datum/mutation/human/A = diskette.mutations[num]
- var/datum/mutation/human/HM = new A.type()
- HM.copy_mutation(A)
- stored_mutations += HM
- to_chat(usr,"Succesfully written [A.name] to storage.")
- if("combine")
- if(num && (LAZYLEN(stored_mutations) >= num))
- if(LAZYLEN(stored_mutations) < max_storage)
- var/datum/mutation/human/A = stored_mutations[num]
- var/path = A.type
- if(combine)
- var/result_path = get_mixed_mutation(combine, path)
- if(result_path)
- stored_mutations += new result_path()
- to_chat(usr, "Succes! New mutation has been added to storage")
- discover(result_path)
- combine = null
- else
- to_chat(usr, "Failed. No mutation could be created.")
- combine = null
- else
- combine = path
- to_chat(usr,"Selected [A.name] for combining")
- else
- to_chat(usr, "Not enough space to store potential mutation.")
- if("ejectchromosome")
- if(LAZYLEN(stored_chromosomes) <= num)
- var/obj/item/chromosome/CM = stored_chromosomes[num]
- CM.forceMove(drop_location())
- adjust_item_drop_location(CM)
- stored_chromosomes -= CM
- if("applychromosome")
- if(viable_occupant && (LAZYLEN(viable_occupant.dna.mutations) <= num))
- var/datum/mutation/human/HM = viable_occupant.dna.mutations[num]
- var/list/chromosomes = list()
- for(var/obj/item/chromosome/CM in stored_chromosomes)
- if(CM.can_apply(HM))
- chromosomes += CM
- if(chromosomes.len)
- var/obj/item/chromosome/CM = input("Select a chromosome to apply", "Apply Chromosome") as null|anything in sortNames(chromosomes)
- if(CM)
- to_chat(usr, "You apply [CM] to [HM.name].")
- stored_chromosomes -= CM
- CM.apply(HM)
- if("expand_advinjector")
- var/mutation = text2path(href_list["path"])
- var/datum/mutation/human/HM = get_valid_mutation(mutation)
- if(HM && LAZYLEN(injector_selection))
- var/which_injector = input(usr, "Select Adv. Injector", "Advanced Injectors") as null|anything in injector_selection
- if(injector_selection.Find(which_injector))
- var/list/true_selection = injector_selection[which_injector]
- var/total_instability
- for(var/B in true_selection)
- var/datum/mutation/human/mootacion = B
- total_instability += mootacion.instability
- total_instability += HM.instability
- if((total_instability > max_injector_instability) || (true_selection.len + 1) > max_injector_mutations)
- to_chat(usr, "Adding more mutations would make the advanced injector too unstable!")
- else
- true_selection += HM //reminder that this works. because I keep forgetting this works
- if("remove_from_advinjector")
- var/mutation = text2path(href_list["path"])
- var/selection = href_list["injector"]
- if(injector_selection.Find(selection))
- var/list/true_selection = injector_selection[selection]
- for(var/B in true_selection)
- var/datum/mutation/human/HM = B
- if(HM.type == mutation)
- true_selection -= HM
- break
+ return
- if("remove_advinjector")
- var/selection = href_list["injector"]
- for(selection in injector_selection)
- if(selection == selection)
- injector_selection.Remove(selection)
+ // Deletes saved mutation from disk buffer.
+ // ---------------------------------------------------------------------- //
+ // params["mutref"] - ATOM Ref of specific mutation to delete
+ if("delete_disk_mut")
+ // GUARD CHECK - This code shouldn't even be callable without a diskette
+ // inserted. Unexpected result
+ if(!diskette)
+ return
- if("add_advinjector")
- if(LAZYLEN(injector_selection) < max_injector_selections)
- var/new_selection = input(usr, "Enter Adv. Injector name", "Advanced Injectors") as text|null
- if(new_selection && !(new_selection in injector_selection))
- injector_selection[new_selection] = list()
+ // GUARD CHECK - Make sure the disk isn't set to read only, as we're
+ // attempting to write to it (via deletion)
+ if(diskette.read_only)
+ to_chat(usr,"Disk is set to read only mode.")
+ return
+ var/bref = params["mutref"]
+ var/datum/mutation/human/HM = get_mut_by_ref(bref, SEARCH_DISKETTE)
- ui_interact(usr,last_change)
+ if(HM)
+ diskette.mutations.Remove(HM)
+ qdel(HM)
-/obj/machinery/computer/scan_consolenew/proc/scramble(input,rs,rd) //hexadecimal genetics. dont confuse with scramble button
+ return
+
+ // Ejects a stored chromosome from the DNA Console
+ // ---------------------------------------------------------------------- //
+ // params["chromo"] - Text string of the chromosome name
+ if("eject_chromo")
+ var/chromname = params["chromo"]
+
+ for(var/obj/item/chromosome/CM in stored_chromosomes)
+ if(chromname == CM.name)
+ CM.forceMove(drop_location())
+ adjust_item_drop_location(CM)
+ stored_chromosomes -= CM
+ return
+
+ return
+
+ // Combines two mutations from the console to try and create a new mutation
+ // ---------------------------------------------------------------------- //
+ // params["firstref"] - ATOM Ref of first mutation for combination
+ // params["secondref"] - ATOM Ref of second mutation for combination
+ // mutation
+ if("combine_console")
+ // GUaRD CHECK - Make sure mutation storage isn't full. If it is, we won't
+ // be able to store the new combo mutation
+ if(LAZYLEN(stored_mutations) >= max_storage)
+ to_chat(usr,"Mutation storage is full.")
+ return
+
+ // GUARD CHECK - We're running a research-type operation. If, for some
+ // reason, somehow the DNA Console has been disconnected from the research
+ // network - Or was never in it to begin with - don't proceed
+ if(!stored_research)
+ return
+
+ var/first_bref = params["firstref"]
+ var/second_bref = params["secondref"]
+
+ // GUARD CHECK - Find the source and destination mutations on the console
+ // and make sure they actually exist.
+ var/datum/mutation/human/source_mut = get_mut_by_ref(first_bref, SEARCH_STORED | SEARCH_DISKETTE)
+ if(!source_mut)
+ return
+
+ var/datum/mutation/human/dest_mut = get_mut_by_ref(second_bref, SEARCH_STORED | SEARCH_DISKETTE)
+ if(!dest_mut)
+ return
+
+ // Attempt to mix the two mutations to get a new type
+ var/result_path = get_mixed_mutation(source_mut.type, dest_mut.type)
+
+ if(!result_path)
+ return
+
+ // If we got a new type, add it to our storage
+ stored_mutations += new result_path()
+ to_chat(usr, "Success! New mutation has been added to console storage.")
+
+ // If it's already discovered, end here. Otherwise, add it to the list of
+ // discovered mutations.
+ // We've already checked for stored_research earlier
+ if(result_path in stored_research.discovered_mutations)
+ return
+
+ var/datum/mutation/human/HM = GET_INITIALIZED_MUTATION(result_path)
+ stored_research.discovered_mutations += result_path
+ say("Successfully mutated [HM.name].")
+ return
+
+ // Combines two mutations from the disk to try and create a new mutation
+ // ---------------------------------------------------------------------- //
+ // params["firstref"] - ATOM Ref of first mutation for combination
+ // params["secondref"] - ATOM Ref of second mutation for combination
+ // mutation
+ if("combine_disk")
+ // GUARD CHECK - This code shouldn't even be callable without a diskette
+ // inserted. Unexpected result
+ if(!diskette)
+ return
+
+ // GUARD CHECK - Make sure the disk is not full.
+ if(LAZYLEN(diskette.mutations) >= diskette.max_mutations)
+ to_chat(usr,"Disk storage is full.")
+ return
+
+ // GUARD CHECK - Make sure the disk isn't set to read only, as we're
+ // attempting to write to it
+ if(diskette.read_only)
+ to_chat(usr,"Disk is set to read only mode.")
+ return
+
+ // GUARD CHECK - We're running a research-type operation. If, for some
+ // reason, somehow the DNA Console has been disconnected from the research
+ // network - Or was never in it to begin with - don't proceed
+ if(!stored_research)
+ return
+
+ var/first_bref = params["firstref"]
+ var/second_bref = params["secondref"]
+
+ // GUARD CHECK - Find the source and destination mutations on the console
+ // and make sure they actually exist.
+ var/datum/mutation/human/source_mut = get_mut_by_ref(first_bref, SEARCH_STORED | SEARCH_DISKETTE)
+ if(!source_mut)
+ return
+
+ var/datum/mutation/human/dest_mut = get_mut_by_ref(second_bref, SEARCH_STORED | SEARCH_DISKETTE)
+ if(!dest_mut)
+ return
+
+ // Attempt to mix the two mutations to get a new type
+ var/result_path = get_mixed_mutation(source_mut.type, dest_mut.type)
+
+ if(!result_path)
+ return
+
+ // If we got a new type, add it to our storage
+ diskette.mutations += new result_path()
+ to_chat(usr, "Success! New mutation has been added to the disk.")
+
+ // If it's already discovered, end here. Otherwise, add it to the list of
+ // discovered mutations
+ // We've already checked for stored_research earlier
+ if(result_path in stored_research.discovered_mutations)
+ return
+
+ var/datum/mutation/human/HM = GET_INITIALIZED_MUTATION(result_path)
+ stored_research.discovered_mutations += result_path
+ say("Successfully mutated [HM.name].")
+ return
+
+ // Sets the Genetic Makeup pulse strength.
+ // ---------------------------------------------------------------------- //
+ // params["val"] - New strength value as text string, converted to number
+ // later on in code
+ if("set_pulse_strength")
+ var/value = round(text2num(params["val"]))
+ radstrength = WRAP(value, 1, RADIATION_STRENGTH_MAX+1)
+ return
+
+ // Sets the Genetic Makeup pulse duration
+ // ---------------------------------------------------------------------- //
+ // params["val"] - New strength value as text string, converted to number
+ // later on in code
+ if("set_pulse_duration")
+ var/value = round(text2num(params["val"]))
+ radduration = WRAP(value, 1, RADIATION_DURATION_MAX+1)
+ return
+
+ // Saves Genetic Makeup information to disk
+ // ---------------------------------------------------------------------- //
+ // params["index"] - The BYOND index of the console genetic makeup buffer to
+ // copy to disk
+ if("save_makeup_disk")
+ // GUARD CHECK - This code shouldn't even be callable without a diskette
+ // inserted. Unexpected result
+ if(!diskette)
+ return
+
+ // GUARD CHECK - Make sure the disk isn't set to read only, as we're
+ // attempting to write to it
+ if(diskette.read_only)
+ to_chat(usr,"Disk is set to read only mode.")
+ return
+
+ // Convert the index to a number and clamp within the array range
+ var/buffer_index = text2num(params["index"])
+ buffer_index = clamp(buffer_index, 1, NUMBER_OF_BUFFERS)
+
+ var/list/buffer_slot = genetic_makeup_buffer[buffer_index]
+
+ // GUARD CHECK - This should not be possible to activate on a buffer slot
+ // that doesn't have any genetic data. Unexpected result
+ if(!istype(buffer_slot))
+ return
+
+ diskette.genetic_makeup_buffer = buffer_slot.Copy()
+ return
+
+ // Loads Genetic Makeup from disk to a console buffer
+ // ---------------------------------------------------------------------- //
+ // params["index"] - The BYOND index of the console genetic makeup buffer to
+ // copy to. Expected as text string, converted to number later
+ if("load_makeup_disk")
+ // GUARD CHECK - This code shouldn't even be callable without a diskette
+ // inserted. Unexpected result
+ if(!diskette)
+ return
+
+ // GUARD CHECK - This should not be possible to activate on a diskette
+ // that doesn't have any genetic data. Unexpected result
+ if(LAZYLEN(diskette.genetic_makeup_buffer) == 0)
+ return
+
+ // Convert the index to a number and clamp within the array range, then
+ // copy the data from the disk to that buffer
+ var/buffer_index = text2num(params["index"])
+ buffer_index = clamp(buffer_index, 1, NUMBER_OF_BUFFERS)
+ genetic_makeup_buffer[buffer_index] = diskette.genetic_makeup_buffer.Copy()
+ return
+
+ // Deletes genetic makeup buffer from the inserted diskette
+ if("del_makeup_disk")
+ // GUARD CHECK - This code shouldn't even be callable without a diskette
+ // inserted. Unexpected result
+ if(!diskette)
+ return
+
+ // GUARD CHECK - Make sure the disk isn't set to read only, as we're
+ // attempting to write (via deletion) to it
+ if(diskette.read_only)
+ to_chat(usr,"Disk is set to read only mode.")
+ return
+
+ diskette.genetic_makeup_buffer.Cut()
+ return
+
+ // Saves the scanner occupant's genetic makeup to a given console buffer
+ // ---------------------------------------------------------------------- //
+ // params["index"] - The BYOND index of the console genetic makeup buffer to
+ // save the new genetic data to. Expected as text string, converted to
+ // number later
+ if("save_makeup_console")
+ // GUARD CHECK - Can we genetically modify the occupant? Includes scanner
+ // operational guard checks.
+ if(!can_modify_occupant())
+ return
+
+ // Convert the index to a number and clamp within the array range, then
+ // copy the data from the disk to that buffer
+ var/buffer_index = text2num(params["index"])
+ buffer_index = clamp(buffer_index, 1, NUMBER_OF_BUFFERS)
+
+ // Set the new information
+ genetic_makeup_buffer[buffer_index] = list(
+ "label"="Slot [buffer_index]:[scanner_occupant.real_name]",
+ "UI"=scanner_occupant.dna.uni_identity,
+ "UE"=scanner_occupant.dna.unique_enzymes,
+ "name"=scanner_occupant.real_name,
+ "blood_type"=scanner_occupant.dna.blood_type)
+
+ return
+
+ // Deleted genetic makeup data from a console buffer slot
+ // ---------------------------------------------------------------------- //
+ // params["index"] - The BYOND index of the console genetic makeup buffer to
+ // delete the genetic data from. Expected as text string, converted to
+ // number later
+ if("del_makeup_console")
+ // Convert the index to a number and clamp within the array range, then
+ // copy the data from the disk to that buffer
+ var/buffer_index = text2num(params["index"])
+ buffer_index = clamp(buffer_index, 1, NUMBER_OF_BUFFERS)
+ var/list/buffer_slot = genetic_makeup_buffer[buffer_index]
+
+ // GUARD CHECK - This shouldn't be possible to execute this on a null
+ // buffer. Unexpected resut
+ if(!istype(buffer_slot))
+ return
+
+ genetic_makeup_buffer[buffer_index] = null
+ return
+
+ // Eject stored diskette from console
+ if("eject_disk")
+ eject_disk(usr)
+ return
+
+ // Create a Genetic Makeup injector. These injectors are timed and thus are
+ // only temporary
+ // ---------------------------------------------------------------------- //
+ // params["index"] - The BYOND index of the console genetic makeup buffer to
+ // create the makeup injector from. Expected as text string, converted to
+ // number later
+ // params["type"] - Type of injector to create
+ // Expected results:
+ // "ue" - Unique Enzyme, changes name and blood type
+ // "ui" - Unique Identity, changes looks
+ // "mixed" - Combination of both ue and ui
+ if("makeup_injector")
+ // Convert the index to a number and clamp within the array range, then
+ // copy the data from the disk to that buffer
+ var/buffer_index = text2num(params["index"])
+ buffer_index = clamp(buffer_index, 1, NUMBER_OF_BUFFERS)
+ var/list/buffer_slot = genetic_makeup_buffer[buffer_index]
+
+ // GUARD CHECK - This shouldn't be possible to execute this on a null
+ // buffer. Unexpected resut
+ if(!istype(buffer_slot))
+ return
+
+ var/type = params["type"]
+ var/obj/item/dnainjector/timed/I
+
+ switch(type)
+ if("ui")
+ // GUARD CHECK - There's currently no way to save partial genetic data.
+ // However, if this is the case, we can't make a complete injector and
+ // this catches that edge case
+ if(!buffer_slot["UI"])
+ to_chat(usr,"Genetic data corrupted, unable to create injector.")
+ return
+
+ I = new /obj/item/dnainjector/timed(loc)
+ I.fields = list("UI"=buffer_slot["UI"])
+
+ // If there is a connected scanner, we can use its upgrades to reduce
+ // the radiation generated by this injector
+ if(scanner_operational())
+ I.damage_coeff = connected_scanner.damage_coeff
+ if("ue")
+ // GUARD CHECK - There's currently no way to save partial genetic data.
+ // However, if this is the case, we can't make a complete injector and
+ // this catches that edge case
+ if(!buffer_slot["name"] || !buffer_slot["UE"] || !buffer_slot["blood_type"])
+ to_chat(usr,"Genetic data corrupted, unable to create injector.")
+ return
+
+ I = new /obj/item/dnainjector/timed(loc)
+ I.fields = list("name"=buffer_slot["name"], "UE"=buffer_slot["UE"], "blood_type"=buffer_slot["blood_type"])
+
+ // If there is a connected scanner, we can use its upgrades to reduce
+ // the radiation generated by this injector
+ if(scanner_operational())
+ I.damage_coeff = connected_scanner.damage_coeff
+ if("mixed")
+ // GUARD CHECK - There's currently no way to save partial genetic data.
+ // However, if this is the case, we can't make a complete injector and
+ // this catches that edge case
+ if(!buffer_slot["UI"] || !buffer_slot["name"] || !buffer_slot["UE"] || !buffer_slot["blood_type"])
+ to_chat(usr,"Genetic data corrupted, unable to create injector.")
+ return
+
+ I = new /obj/item/dnainjector/timed(loc)
+ I.fields = list("UI"=buffer_slot["UI"],"name"=buffer_slot["name"], "UE"=buffer_slot["UE"], "blood_type"=buffer_slot["blood_type"])
+
+ // If there is a connected scanner, we can use its upgrades to reduce
+ // the radiation generated by this injector
+ if(scanner_operational())
+ I.damage_coeff = connected_scanner.damage_coeff
+
+ // If we successfully created an injector, don't forget to set the new
+ // ready timer.
+ if(I)
+ injectorready = world.time + INJECTOR_TIMEOUT
+
+ return
+
+ // Applies a genetic makeup buffer to the scanner occupant
+ // ---------------------------------------------------------------------- //
+ // params["index"] - The BYOND index of the console genetic makeup buffer to
+ // apply to the scanner occupant. Expected as text string, converted to
+ // number later
+ // params["type"] - Type of genetic makeup copy to implement
+ // Expected results:
+ // "ue" - Unique Enzyme, changes name and blood type
+ // "ui" - Unique Identity, changes looks
+ // "mixed" - Combination of both ue and ui
+ if("makeup_apply")
+ // GUARD CHECK - Can we genetically modify the occupant? Includes scanner
+ // operational guard checks.
+ if(!can_modify_occupant())
+ return
+
+ // Convert the index to a number and clamp within the array range, then
+ // copy the data from the disk to that buffer
+ var/buffer_index = text2num(params["index"])
+ buffer_index = clamp(buffer_index, 1, NUMBER_OF_BUFFERS)
+ var/list/buffer_slot = genetic_makeup_buffer[buffer_index]
+
+ // GUARD CHECK - This shouldn't be possible to execute this on a null
+ // buffer. Unexpected resut
+ if(!istype(buffer_slot))
+ return
+
+ var/type = params["type"]
+
+ apply_genetic_makeup(type, buffer_slot)
+ return
+
+ // Applies a genetic makeup buffer to the next scanner occupant. This sets
+ // some code that will run when the connected DNA Scanner door is next
+ // closed
+ // This allows people to self-modify their genetic makeup, as tgui
+ // interfaces can not be accessed while inside the DNA Scanner and genetic
+ // makeup injectors are only temporary
+ // ---------------------------------------------------------------------- //
+ // params["index"] - The BYOND index of the console genetic makeup buffer to
+ // apply to the scanner occupant. Expected as text string, converted to
+ // number later
+ // params["type"] - Type of genetic makeup copy to implement
+ // Expected results:
+ // "ue" - Unique Enzyme, changes name and blood type
+ // "ui" - Unique Identity, changes looks
+ // "mixed" - Combination of both ue and ui
+ if("makeup_delay")
+ // Convert the index to a number and clamp within the array range, then
+ // copy the data from the disk to that buffer
+ var/buffer_index = text2num(params["index"])
+ buffer_index = clamp(buffer_index, 1, NUMBER_OF_BUFFERS)
+ var/list/buffer_slot = genetic_makeup_buffer[buffer_index]
+
+ // GUARD CHECK - This shouldn't be possible to execute this on a null
+ // buffer. Unexpected resut
+ if(!istype(buffer_slot))
+ return
+
+ var/type = params["type"]
+
+ // Set the delayed action. The next time the scanner door is closed,
+ // unless this is cancelled in the UI, the action will happen
+ delayed_action = list("type" = type, "buffer_slot" = buffer_slot)
+ return
+
+ // Attempts to modify the indexed element of the Unique Identity string
+ // This is a time delayed action that is handled in process()
+ // ---------------------------------------------------------------------- //
+ // params["index"] - The BYOND index of the Unique Identity string to
+ // attempt to modify
+ if("makeup_pulse")
+ // GUARD CHECK - Can we genetically modify the occupant? Includes scanner
+ // operational guard checks.
+ if(!can_modify_occupant())
+ return
+
+ // Set the appropriate timer and index to pulse. This is then managed
+ // later on in process()
+ var/len = length_char(scanner_occupant.dna.uni_identity)
+ rad_pulse_timer = world.time + (radduration*10)
+ rad_pulse_index = WRAP(text2num(params["index"]), 1, len+1)
+ START_PROCESSING(SSobj, src)
+ return
+
+ // Cancels the delayed action - In this context it is not the radiation
+ // pulse from "makeup_pulse", which can not be cancelled. It is instead
+ // the delayed genetic transfer from "makeup_delay"
+ if("cancel_delay")
+ delayed_action = null
+ return
+
+ // Creates a new advanced injector storage buffer in the console
+ // ---------------------------------------------------------------------- //
+ // params["name"] - The name to apply to the new injector
+ if("new_adv_inj")
+ // GUARD CHECK - Make sure we can make a new injector. This code should
+ // not be called if we're already maxed out and this is an Unexpected
+ // result
+ if(!(LAZYLEN(injector_selection) < max_injector_selections))
+ return
+
+ // GUARD CHECK - Sanitise and trim the proposed name. This prevents HTML
+ // injection and equivalent as tgui input is not stripped
+ var/inj_name = params["name"]
+ inj_name = trim(sanitize(inj_name))
+
+ // GUARD CHECK - If the name is null or blank, or the name is already in
+ // the list of advanced injectors, we want to reject it as we can't have
+ // duplicate named advanced injectors
+ if(!inj_name || (inj_name in injector_selection))
+ return
+
+ injector_selection[inj_name] = list()
+ return
+
+ // Deleted an advanced injector storage buffer from the console
+ // ---------------------------------------------------------------------- //
+ // params["name"] - The name of the injector to delete
+ if("del_adv_inj")
+ var/inj_name = params["name"]
+
+ // GUARD CHECK - If the name is null or blank, reject.
+ // GUARD CHECK - If the name isn't in the list of advanced injectors, we
+ // want to reject this as it shouldn't be possible ever do this.
+ // Unexpected result
+ if(!inj_name || !(inj_name in injector_selection))
+ return
+
+ injector_selection.Remove(inj_name)
+ return
+
+ // Creates an injector from an advanced injector buffer
+ // ---------------------------------------------------------------------- //
+ // params["name"] - The name of the injector to print
+ if("print_adv_inj")
+ // As a side note, because mutations can contain unique metadata,
+ // this system uses BYOND Atom Refs to safely and accurately
+ // identify mutations from big ol' lists.
+
+ // GUARD CHECK - Is the injector actually ready?
+ if(world.time < injectorready)
+ return
+
+ var/inj_name = params["name"]
+
+ // GUARD CHECK - If the name is null or blank, reject.
+ // GUARD CHECK - If the name isn't in the list of advanced injectors, we
+ // want to reject this as it shouldn't be possible ever do this.
+ // Unexpected result
+ if(!inj_name || !(inj_name in injector_selection))
+ return
+
+ var/list/injector = injector_selection[inj_name]
+ var/obj/item/dnainjector/activator/I = new /obj/item/dnainjector/activator(loc)
+
+ // Run through each mutation in our Advanced Injector and add them to a
+ // new injector
+ for(var/A in injector)
+ var/datum/mutation/human/HM = A
+ I.add_mutations += new HM.type(copymut=HM)
+
+ // Force apply any mutations, this is functionality similar to mutators
+ I.doitanyway = TRUE
+ I.name = "Advanced [inj_name] injector"
+
+ // If there's an operational connected scanner, we can use its upgrades
+ // to improve our injector's radiation generation
+ if(scanner_operational())
+ I.damage_coeff = connected_scanner.damage_coeff
+ injectorready = world.time + INJECTOR_TIMEOUT * 8 * (1 - 0.1 * connected_scanner.precision_coeff)
+ else
+ injectorready = world.time + INJECTOR_TIMEOUT * 8
+
+ return
+
+ // Adds a mutation to an advanced injector
+ // ---------------------------------------------------------------------- //
+ // params["mutref"] - ATOM Ref of specific mutation to add to the injector
+ // params["advinj"] - Name of the advanced injector to add the mutation to
+ if("add_advinj_mut")
+ // GUARD CHECK - Can we genetically modify the occupant? Includes scanner
+ // operational guard checks.
+ // This is needed because this operation can only be completed from the
+ // genetic sequencer.
+ if(!can_modify_occupant())
+ return
+
+ var/adv_inj = params["advinj"]
+
+ // GUARD CHECK - Make sure our advanced injector actually exists. This
+ // should not be possible. Unexpected result
+ if(!(adv_inj in injector_selection))
+ return
+
+ // GUARD CHECK - Make sure we limit the number of mutations appropriately
+ if(LAZYLEN(injector_selection[adv_inj]) >= max_injector_mutations)
+ to_chat(usr,"Advanced injector mutation storage is full.")
+ return
+
+ var/mut_source = params["source"]
+ var/search_flag = 0
+
+ switch(mut_source)
+ if("disk")
+ search_flag = SEARCH_DISKETTE
+ if("occupant")
+ search_flag = SEARCH_OCCUPANT
+ if("console")
+ search_flag = SEARCH_STORED
+
+ if(!search_flag)
+ return
+
+ var/bref = params["mutref"]
+ // We've already made sure we can modify the occupant, so this is safe to
+ // call
+ var/datum/mutation/human/HM = get_mut_by_ref(bref, search_flag)
+
+ // GUARD CHECK - This should not be possible. Unexpected result
+ if(!HM)
+ return
+
+ // We want to make sure we stick within the instability limit.
+ // We start with the instability of the mutation we're intending to add.
+ var/instability_total = HM.instability
+
+ // We then add the instabilities of all other mutations in the injector,
+ // remembering to apply the Stabilizer chromosome modifiers
+ for(var/datum/mutation/human/I in injector_selection[adv_inj])
+ instability_total += I.instability * GET_MUTATION_STABILIZER(I)
+
+ // If this would take us over the max instability, we inform the user.
+ if(instability_total > max_injector_instability)
+ to_chat(usr,"Extra mutation would make the advanced injector too instable.")
+ return
+
+ // If we've got here, all our checks are passed and we can successfully
+ // add the mutation to the advanced injector.
+ var/datum/mutation/human/A = new HM.type()
+ A.copy_mutation(HM)
+ injector_selection[adv_inj] += A
+ to_chat(usr,"Mutation successfully added to advanced injector.")
+ return
+
+ // Deletes a mutation from an advanced injector
+ // ---------------------------------------------------------------------- //
+ // params["mutref"] - ATOM Ref of specific mutation to del from the injector
+ if("delete_injector_mut")
+ var/bref = params["mutref"]
+
+ var/datum/mutation/human/HM = get_mut_by_ref(bref, SEARCH_ADV_INJ)
+
+ // GUARD CHECK - This should not be possible. Unexpected result
+ if(!HM)
+ return
+
+ // Check Advanced Injectors to find and remove the mutation
+ for(var/I in injector_selection)
+ if(injector_selection["[I]"].Remove(HM))
+ qdel(HM)
+ return
+
+ return
+
+ // Sets a new tgui view state
+ // ---------------------------------------------------------------------- //
+ // params["id"] - Key for the state to set
+ // params[...] - Every other element is used to set state variables
+ if("set_view")
+ for (var/key in params)
+ if(key == "src")
+ continue
+ tgui_view_state[key] = params[key]
+ return TRUE
+ return FALSE
+
+/**
+ * Applies the enzyme buffer to the current scanner occupant
+ *
+ * Applies the type of a specific genetic makeup buffer to the current scanner
+ * occupant
+ *
+ * Arguments:
+ * * type - "ui"/"ue"/"mixed" - Which part of the enzyme buffer to apply
+ * * buffer_slot - Index of the enzyme buffer to apply
+ */
+/obj/machinery/computer/scan_consolenew/proc/apply_genetic_makeup(type, buffer_slot)
+ // Note - This proc is only called from code that has already performed the
+ // necessary occupant guard checks. If you call this code yourself, please
+ // apply can_modify_occupant() or equivalent checks first.
+
+ // Pre-calc the rad increase since we'll be using it in all the possible
+ // operations
+ var/rad_increase = rand(100/(connected_scanner.damage_coeff ** 2),250/(connected_scanner.damage_coeff ** 2))
+
+ switch(type)
+ if("ui")
+ // GUARD CHECK - There's currently no way to save partial genetic data.
+ // However, if this is the case, we can't make a complete injector and
+ // this catches that edge case
+ if(!buffer_slot["UI"])
+ to_chat(usr,"Genetic data corrupted, unable to apply genetic data.")
+ return FALSE
+ scanner_occupant.dna.uni_identity = buffer_slot["UI"]
+ scanner_occupant.updateappearance(mutations_overlay_update=1)
+ scanner_occupant.radiation += rad_increase
+ scanner_occupant.domutcheck()
+ return TRUE
+ if("ue")
+ // GUARD CHECK - There's currently no way to save partial genetic data.
+ // However, if this is the case, we can't make a complete injector and
+ // this catches that edge case
+ if(!buffer_slot["name"] || !buffer_slot["UE"] || !buffer_slot["blood_type"])
+ to_chat(usr,"Genetic data corrupted, unable to apply genetic data.")
+ return FALSE
+ scanner_occupant.real_name = buffer_slot["name"]
+ scanner_occupant.name = buffer_slot["name"]
+ scanner_occupant.dna.unique_enzymes = buffer_slot["UE"]
+ scanner_occupant.dna.blood_type = buffer_slot["blood_type"]
+ scanner_occupant.radiation += rad_increase
+ scanner_occupant.domutcheck()
+ return TRUE
+ if("mixed")
+ // GUARD CHECK - There's currently no way to save partial genetic data.
+ // However, if this is the case, we can't make a complete injector and
+ // this catches that edge case
+ if(!buffer_slot["UI"] || !buffer_slot["name"] || !buffer_slot["UE"] || !buffer_slot["blood_type"])
+ to_chat(usr,"Genetic data corrupted, unable to apply genetic data.")
+ return FALSE
+ scanner_occupant.dna.uni_identity = buffer_slot["UI"]
+ scanner_occupant.updateappearance(mutations_overlay_update=1)
+ scanner_occupant.real_name = buffer_slot["name"]
+ scanner_occupant.name = buffer_slot["name"]
+ scanner_occupant.dna.unique_enzymes = buffer_slot["UE"]
+ scanner_occupant.dna.blood_type = buffer_slot["blood_type"]
+ scanner_occupant.radiation += rad_increase
+ scanner_occupant.domutcheck()
+ return TRUE
+
+ return FALSE
+/**
+ * Checks if there is a connected DNA Scanner that is operational
+ */
+/obj/machinery/computer/scan_consolenew/proc/scanner_operational()
+ if(!connected_scanner)
+ return FALSE
+
+ return (connected_scanner && connected_scanner.is_operational())
+
+/**
+ * Checks if there is a valid DNA Scanner occupant for genetic modification
+ *
+ * Checks if there is a valid subject in the DNA Scanner that can be genetically
+ * modified. Will set the scanner occupant var as part of this check.
+ * Requires that the scanner can be operated and will return early if it can't
+ */
+/obj/machinery/computer/scan_consolenew/proc/can_modify_occupant()
+ // GUARD CHECK - We always want to perform the scanner operational check as
+ // part of checking if we can modify the occupant.
+ // We can never modify the occupant of a broken scanner.
+ if(!scanner_operational())
+ return FALSE
+
+ if(!connected_scanner.occupant)
+ return FALSE
+
+ scanner_occupant = connected_scanner.occupant
+
+ // Check validity of occupent for DNA Modification
+ // DNA Modification:
+ // requires DNA
+ // this DNA can not be bad
+ // is done via radiation bursts, so radiation immune carbons are not viable
+ // And the DNA Scanner itself must have a valid scan level
+ if(scanner_occupant.has_dna() && !HAS_TRAIT(scanner_occupant, TRAIT_RADIMMUNE) && !HAS_TRAIT(scanner_occupant, TRAIT_NOCLONE) || (connected_scanner.scan_level == 3))
+ return TRUE
+
+ return FALSE
+
+/**
+ * Checks for adjacent DNA scanners and connects when it finds a viable one
+ *
+ * Seearches cardinal directions in order. Stops when it finds a viable DNA Scanner.
+ * Will connect to a broken scanner if no functional scanner is available.
+ * Links itself to the DNA Scanner to receive door open and close events.
+ */
+/obj/machinery/computer/scan_consolenew/proc/connect_to_scanner()
+ var/obj/machinery/dna_scannernew/test_scanner = null
+ var/obj/machinery/dna_scannernew/broken_scanner = null
+
+ // Look in each cardinal direction and try and find a DNA Scanner
+ // If you find a DNA Scanner, check to see if it broken or working
+ // If it's working, set the current scanner and return early
+ // If it's not working, remember it anyway as a broken scanner
+ for(var/direction in GLOB.cardinals)
+ test_scanner = locate(/obj/machinery/dna_scannernew, get_step(src, direction))
+ if(!isnull(test_scanner))
+ if(test_scanner.is_operational())
+ connected_scanner = test_scanner
+ connected_scanner.linked_console = src
+ return
+ else
+ broken_scanner = test_scanner
+
+ // Ultimately, if we have a broken scanner, we'll attempt to connect to it as
+ // a fallback case, but the code above will prefer a working scanner
+ if(!isnull(broken_scanner))
+ connected_scanner = broken_scanner
+ connected_scanner.linked_console = src
+
+/**
+ * Called by connected DNA Scanners when their doors close.
+ *
+ * Sets the new scanner occupant and completes delayed enzyme transfer if one
+ * is queued.
+ */
+/obj/machinery/computer/scan_consolenew/proc/on_scanner_close()
+ // Set the appropriate occupant now the scanner is closed
+ if(connected_scanner.occupant)
+ scanner_occupant = connected_scanner.occupant
+ else
+ scanner_occupant = null
+
+ // If we have a delayed action - In this case the only delayed action is
+ // applying a genetic makeup buffer the next time the DNA Scanner is closed -
+ // we want to perform it.
+ // GUARD CHECK - Make sure we can modify the occupant, apply_genetic_makeup()
+ // assumes we've already done this.
+ if(delayed_action && can_modify_occupant())
+ var/type = delayed_action["type"]
+ var/buffer_slot = delayed_action["buffer_slot"]
+ if(apply_genetic_makeup(type, buffer_slot))
+ to_chat(connected_scanner.occupant, "[src] activates!")
+ delayed_action = null
+
+/**
+ * Called by connected DNA Scanners when their doors open.
+ *
+ * Clears enzyme pulse operations, stops processing and nulls the current
+ * scanner occupant var.
+ */
+/obj/machinery/computer/scan_consolenew/proc/on_scanner_open()
+ // If we had a radiation pulse action ongoing, we want to stop this.
+ // Imagine it being like a microwave stopping when you open the door.
+ rad_pulse_index = 0
+ rad_pulse_timer = 0
+ STOP_PROCESSING(SSobj, src)
+ scanner_occupant = null
+
+/**
+ * Builds the genetic makeup list which will be sent to tgui interface.
+ */
+/obj/machinery/computer/scan_consolenew/proc/build_genetic_makeup_list()
+ // No code will ever null this list, we can safely Cut it.
+ tgui_genetic_makeup.Cut()
+
+ for(var/i=1, i <= NUMBER_OF_BUFFERS, i++)
+ if(genetic_makeup_buffer[i])
+ tgui_genetic_makeup["[i]"] = genetic_makeup_buffer[i].Copy()
+ else
+ tgui_genetic_makeup["[i]"] = null
+
+/**
+ * Builds the genetic makeup list which will be sent to tgui interface.
+ *
+ * Will iterate over the connected scanner occupant, DNA Console, inserted
+ * diskette and chromosomes and any advanced injectors, building the main data
+ * structures which get passed to the tgui interface.
+ */
+/obj/machinery/computer/scan_consolenew/proc/build_mutation_list(can_modify_occ)
+ // No code will ever null these lists. We can safely Cut them.
+ tgui_occupant_mutations.Cut()
+ tgui_diskette_mutations.Cut()
+ tgui_console_mutations.Cut()
+ tgui_console_chromosomes.Cut()
+ tgui_advinjector_mutations.Cut()
+
+ // ------------------------------------------------------------------------ //
+ // GUARD CHECK - Can we genetically modify the occupant? This check will have
+ // previously included checks to make sure the DNA Scanner is still
+ // operational
+ if(can_modify_occ)
+ // ---------------------------------------------------------------------- //
+ // Start cataloguing all mutations that the occupant has by default
+ for(var/mutation_type in scanner_occupant.dna.mutation_index)
+ var/datum/mutation/human/HM = GET_INITIALIZED_MUTATION(mutation_type)
+
+ var/list/mutation_data = list()
+ var/text_sequence = scanner_occupant.dna.mutation_index[mutation_type]
+ var/default_sequence = scanner_occupant.dna.default_mutation_genes[mutation_type]
+ var/discovered = (stored_research && (mutation_type in stored_research.discovered_mutations))
+
+ mutation_data["Alias"] = HM.alias
+ mutation_data["Sequence"] = text_sequence
+ mutation_data["DefaultSeq"] = default_sequence
+ mutation_data["Discovered"] = discovered
+ mutation_data["Source"] = "occupant"
+
+ // We only want to pass this information along to the tgui interface if
+ // the mutation has been discovered. Prevents people being able to cheese
+ // or "hack" their way to figuring out what undiscovered mutations are
+ if(discovered)
+ mutation_data["Name"] = HM.name
+ mutation_data["Description"] = HM.desc
+ mutation_data["Instability"] = HM.instability * GET_MUTATION_STABILIZER(HM)
+ mutation_data["Quality"] = HM.quality
+
+ // Assume the mutation is normal unless assigned otherwise.
+ var/mut_class = MUT_NORMAL
+
+ // Check if the mutation is currently activated. If it is, we can add even
+ // MORE information to send to tgui.
+ var/datum/mutation/human/A = scanner_occupant.dna.get_mutation(mutation_type)
+ if(A)
+ mutation_data["Active"] = TRUE
+ mutation_data["Scrambled"] = A.scrambled
+ mutation_data["Class"] = A.class
+ mut_class = A.class
+ mutation_data["CanChromo"] = A.can_chromosome
+ mutation_data["ByondRef"] = REF(A)
+ mutation_data["Type"] = A.type
+ if(A.can_chromosome)
+ mutation_data["ValidChromos"] = jointext(A.valid_chrom_list, ", ")
+ mutation_data["AppliedChromo"] = A.chromosome_name
+ mutation_data["ValidStoredChromos"] = build_chrom_list(A)
+ else
+ mutation_data["Active"] = FALSE
+ mutation_data["Scrambled"] = FALSE
+ mutation_data["Class"] = MUT_NORMAL
+
+ // Technically NONE of these mutations should be MUT_EXTRA but this will
+ // catch any weird edge cases
+ // Assign icons by priority - MUT_EXTRA will ALSO be discovered, so it
+ // has a higher priority for icon/image assignment
+ if (mut_class == MUT_EXTRA)
+ mutation_data["Image"] = "dna_extra.gif"
+ else if(discovered)
+ mutation_data["Image"] = "dna_discovered.gif"
+ else
+ mutation_data["Image"] = "dna_undiscovered.gif"
+
+ tgui_occupant_mutations += list(mutation_data)
+
+ // ---------------------------------------------------------------------- //
+ // Now get additional/"extra" mutations that they shouldn't have by default
+ for(var/datum/mutation/human/HM in scanner_occupant.dna.mutations)
+ // If it's in the mutation index array, we've already catalogued this
+ // mutation and can safely skip over it. It really shouldn't be, but this
+ // will catch any weird edge cases
+ if(HM.type in scanner_occupant.dna.mutation_index)
+ continue
+
+ var/list/mutation_data = list()
+ var/text_sequence = GET_SEQUENCE(HM.type)
+
+ // These will all be active mutations. They're added by injector and their
+ // sequencing code can't be changed. They can only be nullified, which
+ // completely removes them.
+ var/datum/mutation/human/A = GET_INITIALIZED_MUTATION(HM.type)
+
+ mutation_data["Alias"] = A.alias
+ mutation_data["Sequence"] = text_sequence
+ mutation_data["Discovered"] = TRUE
+ mutation_data["Quality"] = HM.quality
+ mutation_data["Source"] = "occupant"
+
+ mutation_data["Name"] = HM.name
+ mutation_data["Description"] = HM.desc
+ mutation_data["Instability"] = HM.instability * GET_MUTATION_STABILIZER(HM)
+
+ mutation_data["Active"] = TRUE
+ mutation_data["Scrambled"] = HM.scrambled
+ mutation_data["Class"] = HM.class
+ mutation_data["CanChromo"] = HM.can_chromosome
+ mutation_data["ByondRef"] = REF(HM)
+ mutation_data["Type"] = HM.type
+
+ if(HM.can_chromosome)
+ mutation_data["ValidChromos"] = jointext(HM.valid_chrom_list, ", ")
+ mutation_data["AppliedChromo"] = HM.chromosome_name
+ mutation_data["ValidStoredChromos"] = build_chrom_list(HM)
+
+ // Nothing in this list should be undiscovered. Technically nothing
+ // should be anything but EXTRA. But we're just handling some edge cases.
+ if (HM.class == MUT_EXTRA)
+ mutation_data["Image"] = "dna_extra.gif"
+ else
+ mutation_data["Image"] = "dna_discovered.gif"
+
+ tgui_occupant_mutations += list(mutation_data)
+
+ // ------------------------------------------------------------------------ //
+ // Build the list of mutations stored within the DNA Console
+ for(var/datum/mutation/human/HM in stored_mutations)
+ var/list/mutation_data = list()
+
+ var/datum/mutation/human/A = GET_INITIALIZED_MUTATION(HM.type)
+
+ mutation_data["Alias"] = A.alias
+ mutation_data["Name"] = HM.name
+ mutation_data["Source"] = "console"
+ mutation_data["Active"] = TRUE
+ mutation_data["Description"] = HM.desc
+ mutation_data["Instability"] = HM.instability * GET_MUTATION_STABILIZER(HM)
+ mutation_data["ByondRef"] = REF(HM)
+ mutation_data["Type"] = HM.type
+
+ mutation_data["CanChromo"] = HM.can_chromosome
+ if(HM.can_chromosome)
+ mutation_data["ValidChromos"] = jointext(HM.valid_chrom_list, ", ")
+ mutation_data["AppliedChromo"] = HM.chromosome_name
+ mutation_data["ValidStoredChromos"] = build_chrom_list(HM)
+
+ tgui_console_mutations += list(mutation_data)
+
+ // ------------------------------------------------------------------------ //
+ // Build the list of chromosomes stored within the DNA Console
+ var/chrom_index = 1
+ for(var/obj/item/chromosome/CM in stored_chromosomes)
+ var/list/chromo_data = list()
+
+ chromo_data["Name"] = CM.name
+ chromo_data["Description"] = CM.desc
+ chromo_data["Index"] = chrom_index
+
+ tgui_console_chromosomes += list(chromo_data)
+ ++chrom_index
+
+ // ------------------------------------------------------------------------ //
+ // Build the list of mutations stored on any inserted diskettes
+ if(diskette)
+ for(var/datum/mutation/human/HM in diskette.mutations)
+ var/list/mutation_data = list()
+
+ var/datum/mutation/human/A = GET_INITIALIZED_MUTATION(HM.type)
+
+ mutation_data["Alias"] = A.alias
+ mutation_data["Name"] = HM.name
+ mutation_data["Active"] = TRUE
+ //mutation_data["Sequence"] = GET_SEQUENCE(HM.type)
+ mutation_data["Source"] = "disk"
+ mutation_data["Description"] = HM.desc
+ mutation_data["Instability"] = HM.instability * GET_MUTATION_STABILIZER(HM)
+ mutation_data["ByondRef"] = REF(HM)
+ mutation_data["Type"] = HM.type
+
+ mutation_data["CanChromo"] = HM.can_chromosome
+ if(HM.can_chromosome)
+ mutation_data["ValidChromos"] = jointext(HM.valid_chrom_list, ", ")
+ mutation_data["AppliedChromo"] = HM.chromosome_name
+ mutation_data["ValidStoredChromos"] = build_chrom_list(HM)
+
+ tgui_diskette_mutations += list(mutation_data)
+
+ // ------------------------------------------------------------------------ //
+ // Build the list of mutations stored within any Advanced Injectors
+ if(LAZYLEN(injector_selection))
+ for(var/I in injector_selection)
+ var/list/mutations = list()
+ for(var/datum/mutation/human/HM in injector_selection[I])
+ var/list/mutation_data = list()
+
+ var/datum/mutation/human/A = GET_INITIALIZED_MUTATION(HM.type)
+
+ mutation_data["Alias"] = A.alias
+ mutation_data["Name"] = HM.name
+ mutation_data["Active"] = TRUE
+ //mutation_data["Sequence"] = GET_SEQUENCE(HM.type)
+ mutation_data["Source"] = "injector"
+ mutation_data["Description"] = HM.desc
+ mutation_data["Instability"] = HM.instability * GET_MUTATION_STABILIZER(HM)
+ mutation_data["ByondRef"] = REF(HM)
+ mutation_data["Type"] = HM.type
+
+ if(HM.can_chromosome)
+ mutation_data["AppliedChromo"] = HM.chromosome_name
+
+ mutations += list(mutation_data)
+ tgui_advinjector_mutations += list(list(
+ "name" = "[I]",
+ "mutations" = mutations,
+ ))
+
+/**
+ * Takes any given chromosome and calculates chromosome compatibility
+ *
+ * Will iterate over the stored chromosomes in the DNA Console and will check
+ * whether it can be applied to the supplied mutation. Then returns a list of
+ * names of chromosomes that were compatible.
+ *
+ * Arguments:
+ * * mutation - The mutation to check chromosome compatibility with
+ */
+/obj/machinery/computer/scan_consolenew/proc/build_chrom_list(mutation)
+ var/list/chromosomes = list()
+
+ for(var/obj/item/chromosome/CM in stored_chromosomes)
+ if(CM.can_apply(mutation))
+ chromosomes += CM.name
+
+ return chromosomes
+
+/**
+ * Checks whether a mutation alias has been discovered
+ *
+ * Checks whether a given mutation's genetic sequence has been completed and
+ * discovers it if appropriate
+ *
+ * Arguments:
+ * * alias - Alias of the mutation to check (ie "Mutation 51" or "Mutation 12")
+ */
+/obj/machinery/computer/scan_consolenew/proc/check_discovery(alias)
+ // Note - All code paths that call this have already done checks on the
+ // current occupant to prevent cheese and other abuses. If you call this
+ // proc please also do the following checks first:
+ // if(!can_modify_occupant())
+ // return
+ // if(!(scanner_occupant == connected_scanner.occupant))
+ // return
+
+ // Turn the alias ("Mutation 1", "Mutation 35") into a mutation path
+ var/path = GET_MUTATION_TYPE_FROM_ALIAS(alias)
+
+ // Check to see if this mutation is in the active mutation list. If it isn't,
+ // then the mutation isn't eligible for discovery. If it is but is scrambled,
+ // then the mutation isn't eligible for discovery. Finally, check if the
+ // mutation is in discovered mutations - If it isn't, add it to discover.
+ var/datum/mutation/human/M = scanner_occupant.dna.get_mutation(path)
+ if(!M)
+ return FALSE
+ if(M.scrambled)
+ return FALSE
+ if(stored_research && !(path in stored_research.discovered_mutations))
+ var/datum/mutation/human/HM = GET_INITIALIZED_MUTATION(path)
+ stored_research.discovered_mutations += path
+ say("Successfully discovered [HM.name].")
+ return TRUE
+
+ return FALSE
+
+/**
+ * Find a mutation from various storage locations via ATOM ref
+ *
+ * Takes an ATOM Ref and searches the appropriate mutation buffers and storage
+ * vars to try and find the associated mutation.
+ *
+ * Arguments:
+ * * ref - ATOM ref of the mutation to locate
+ * * target_flags - Flags for storage mediums to search, see #defines
+ */
+/obj/machinery/computer/scan_consolenew/proc/get_mut_by_ref(ref, target_flags)
+ var/mutation
+
+ // Assume the occupant is valid and the check has been carried out before
+ // calling this proc with the relevant flags.
+ if(target_flags & SEARCH_OCCUPANT)
+ mutation = (locate(ref) in scanner_occupant.dna.mutations)
+ if(mutation)
+ return mutation
+
+ if(target_flags & SEARCH_STORED)
+ mutation = (locate(ref) in stored_mutations)
+ if(mutation)
+ return mutation
+
+ if(diskette && (target_flags & SEARCH_DISKETTE))
+ mutation = (locate(ref) in diskette.mutations)
+ if(mutation)
+ return mutation
+
+ if(injector_selection && (target_flags & SEARCH_ADV_INJ))
+ for(var/I in injector_selection)
+ mutation = (locate(ref) in injector_selection["[I]"])
+ if(mutation)
+ return mutation
+
+ return null
+
+/**
+ * Creates a randomised accuracy value for the enzyme pulse functionality.
+ *
+ * Donor code from previous DNA Console iteration.
+ *
+ * Arguments:
+ * * position - Index of the intended enzyme element to pulse
+ * * radduration - Duration of intended radiation pulse
+ * * number_of_blocks - Number of individual data blocks in the pulsed enzyme
+ */
+/obj/machinery/computer/scan_consolenew/proc/randomize_radiation_accuracy(position, radduration, number_of_blocks)
+ var/val = round(gaussian(0, RADIATION_ACCURACY_MULTIPLIER/radduration) + position, 1)
+ return WRAP(val, 1, number_of_blocks+1)
+
+/**
+ * Scrambles an enzyme element value for the enzyme pulse functionality.
+ *
+ * Donor code from previous DNA Console iteration.
+ *
+ * Arguments:
+ * * input - Enzyme identity element to scramble, expected hex value
+ * * rs - Strength of radiation pulse, increases the range of possible outcomes
+ */
+/obj/machinery/computer/scan_consolenew/proc/scramble(input,rs)
var/length = length(input)
var/ran = gaussian(0, rs*RADIATION_STRENGTH_MULTIPLIER)
if(ran == 0)
@@ -940,98 +1953,71 @@
ran = -round(-ran) //positive, so ceiling it
return num2hex(WRAP(hex2num(input)+ran, 0, 16**length), length)
-/obj/machinery/computer/scan_consolenew/proc/randomize_radiation_accuracy(position, radduration, number_of_blocks)
- var/val = round(gaussian(0, RADIATION_ACCURACY_MULTIPLIER/radduration) + position, 1)
- return WRAP(val, 1, number_of_blocks+1)
+ /**
+ * Performs the enzyme radiation pulse.
+ *
+ * Donor code from previous DNA Console iteration. Called from process() when
+ * there is a radiation pulse in progress. Ends processing.
+ */
+/obj/machinery/computer/scan_consolenew/proc/rad_pulse()
+ // GUARD CHECK - Can we genetically modify the occupant? Includes scanner
+ // operational guard checks.
+ // If we can't, abort the procedure.
+ if(!can_modify_occupant())
+ rad_pulse_index = 0
+ STOP_PROCESSING(SSobj, src)
+ return
-/obj/machinery/computer/scan_consolenew/proc/get_viable_occupant()
- var/mob/living/carbon/viable_occupant = null
- if(connected)
- viable_occupant = connected.occupant
- if(!istype(viable_occupant) || !viable_occupant.dna || HAS_TRAIT_NOT_FROM(viable_occupant, TRAIT_RADIMMUNE,BLOODSUCKER_TRAIT) || HAS_TRAIT(viable_occupant, TRAIT_NOCLONE))
- viable_occupant = null
- return viable_occupant
+ var/len = length_char(scanner_occupant.dna.uni_identity)
+ var/num = randomize_radiation_accuracy(rad_pulse_index, radduration + (connected_scanner.precision_coeff ** 2), len) //Each manipulator level above 1 makes randomization as accurate as selected time + manipulator lvl^2 //Value is this high for the same reason as with laser - not worth the hassle of upgrading if the bonus is low
+ var/hex = copytext_char(scanner_occupant.dna.uni_identity, num, num+1)
+ hex = scramble(hex, radstrength, radduration)
-/obj/machinery/computer/scan_consolenew/proc/apply_buffer(action,buffer_num)
- buffer_num = clamp(buffer_num, 1, NUMBER_OF_BUFFERS)
- var/list/buffer_slot = buffer[buffer_num]
- var/mob/living/carbon/viable_occupant = get_viable_occupant()
- if(istype(buffer_slot))
- viable_occupant.radiation += rand(100/(connected.damage_coeff ** 2),250/(connected.damage_coeff ** 2))
- //15 and 40 are just magic numbers that were here before so i didnt touch them, they are initial boundaries of damage
- //Each laser level reduces damage by lvl^2, so no effect on 1 lvl, 4 times less damage on 2 and 9 times less damage on 3
- //Numbers are this high because other way upgrading laser is just not worth the hassle, and i cant think of anything better to inmrove
- switch(action)
- if(SCANNER_ACTION_UI)
- if(buffer_slot["UI"])
- viable_occupant.dna.uni_identity = buffer_slot["UI"]
- viable_occupant.updateappearance(mutations_overlay_update=1)
- if(SCANNER_ACTION_UE)
- if(buffer_slot["name"] && buffer_slot["UE"] && buffer_slot["blood_type"])
- viable_occupant.real_name = buffer_slot["name"]
- viable_occupant.name = buffer_slot["name"]
- viable_occupant.dna.unique_enzymes = buffer_slot["UE"]
- viable_occupant.dna.blood_type = buffer_slot["blood_type"]
- if(SCANNER_ACTION_MIXED)
- if(buffer_slot["UI"])
- viable_occupant.dna.uni_identity = buffer_slot["UI"]
- viable_occupant.updateappearance(mutations_overlay_update=1)
- if(buffer_slot["name"] && buffer_slot["UE"] && buffer_slot["blood_type"])
- viable_occupant.real_name = buffer_slot["name"]
- viable_occupant.name = buffer_slot["name"]
- viable_occupant.dna.unique_enzymes = buffer_slot["UE"]
- viable_occupant.dna.blood_type = buffer_slot["blood_type"]
+ scanner_occupant.dna.uni_identity = copytext_char(scanner_occupant.dna.uni_identity, 1, num) + hex + copytext_char(scanner_occupant.dna.uni_identity, num + 1)
+ scanner_occupant.updateappearance(mutations_overlay_update=1)
-/obj/machinery/computer/scan_consolenew/proc/on_scanner_close()
- if(delayed_action && get_viable_occupant())
- to_chat(connected.occupant, "[src] activates!")
- apply_buffer(delayed_action["action"],delayed_action["buffer"])
- delayed_action = null //or make it stick + reset button ?
+ rad_pulse_index = 0
+ STOP_PROCESSING(SSobj, src)
+ return
-/obj/machinery/computer/scan_consolenew/proc/get_valid_mutation(mutation)
- var/mob/living/carbon/C = get_viable_occupant()
- if(C)
- var/datum/mutation/human/HM = C.dna.get_mutation(mutation)
- if(HM)
- return HM
- for(var/datum/mutation/human/A in stored_mutations)
- if(A.type == mutation)
- return A
+/**
+ * Sets the default state for the tgui interface.
+ */
+/obj/machinery/computer/scan_consolenew/proc/set_default_state()
+ tgui_view_state["consoleMode"] = "storage"
+ tgui_view_state["storageMode"] = "console"
+ tgui_view_state["storageConsSubMode"] = "mutations"
+ tgui_view_state["storageDiskSubMode"] = "mutations"
+/**
+ * Ejects the DNA Disk from the console.
+ *
+ * Will insert into the user's hand if possible, otherwise will drop it at the
+ * console's location.
+ *
+ * Arguments:
+ * * user - The mob that is attempting to eject the diskette.
+ */
+/obj/machinery/computer/scan_consolenew/proc/eject_disk(mob/user)
+ // Check for diskette.
+ if(!diskette)
+ return
-/obj/machinery/computer/scan_consolenew/proc/get_mutation_list(include_storage) //Returns a list of the mutation index types and any extra mutations
- var/mob/living/carbon/viable_occupant = get_viable_occupant()
- var/list/paths = list()
- if(viable_occupant)
- for(var/A in viable_occupant.dna.mutation_index)
- paths += A
- for(var/datum/mutation/human/A in viable_occupant.dna.mutations)
- if(A.class == MUT_EXTRA)
- paths += A.type
- if(include_storage)
- for(var/datum/mutation/human/A in stored_mutations)
- paths += A.type
- return paths
+ to_chat(user, "You eject [diskette] from [src].")
-/obj/machinery/computer/scan_consolenew/proc/get_valid_gene_string(mutation)
- var/mob/living/carbon/C = get_viable_occupant()
- if(C && (mutation in C.dna.mutation_index))
- return GET_GENE_STRING(mutation, C.dna)
- else if(C && (LAZYLEN(C.dna.mutations)))
- for(var/datum/mutation/human/A in C.dna.mutations)
- if(A.type == mutation)
- return GET_SEQUENCE(mutation)
- for(var/datum/mutation/human/A in stored_mutations)
- if(A.type == mutation)
- return GET_SEQUENCE(mutation)
+ // Reset the state to console storage.
+ tgui_view_state["storageMode"] = "console"
+
+ // If the disk shouldn't pop into the user's hand for any reason, drop it on the console instead.
+ if(!istype(user) || !Adjacent(user) || !user.put_in_active_hand(diskette))
+ diskette.forceMove(drop_location())
+ diskette = null
-/obj/machinery/computer/scan_consolenew/proc/discover(mutation)
- if(stored_research && !(mutation in stored_research.discovered_mutations))
- stored_research.discovered_mutations += mutation
- return TRUE
-/////////////////////////// DNA MACHINES
#undef INJECTOR_TIMEOUT
#undef NUMBER_OF_BUFFERS
+#undef SCRAMBLE_TIMEOUT
+#undef JOKER_TIMEOUT
+#undef JOKER_UPGRADE
#undef RADIATION_STRENGTH_MAX
#undef RADIATION_STRENGTH_MULTIPLIER
@@ -1041,11 +2027,9 @@
#undef RADIATION_IRRADIATION_MULTIPLIER
-#undef SCANNER_ACTION_SE
-#undef SCANNER_ACTION_UI
-#undef SCANNER_ACTION_UE
-#undef SCANNER_ACTION_MIXED
+#undef STATUS_TRANSFORMING
-//#undef BAD_MUTATION_DIFFICULTY
-//#undef GOOD_MUTATION_DIFFICULTY
-//#undef OP_MUTATION_DIFFICULTY
+#undef SEARCH_OCCUPANT
+#undef SEARCH_STORED
+#undef SEARCH_DISKETTE
+#undef SEARCH_ADV_INJ
diff --git a/code/game/machinery/computer/launchpad_control.dm b/code/game/machinery/computer/launchpad_control.dm
index 1924cd9f23..fdbe2f1060 100644
--- a/code/game/machinery/computer/launchpad_control.dm
+++ b/code/game/machinery/computer/launchpad_control.dm
@@ -56,7 +56,7 @@
/obj/machinery/computer/launchpad/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, "launchpad_console", name, ui_x, ui_y, master_ui, state)
+ ui = new(user, src, ui_key, "LaunchpadConsole", name, ui_x, ui_y, master_ui, state)
ui.open()
/obj/machinery/computer/launchpad/ui_data(mob/user)
diff --git a/code/game/machinery/computer/prisoner/gulag_teleporter.dm b/code/game/machinery/computer/prisoner/gulag_teleporter.dm
index ca75ff1dd0..dd925fbe3b 100644
--- a/code/game/machinery/computer/prisoner/gulag_teleporter.dm
+++ b/code/game/machinery/computer/prisoner/gulag_teleporter.dm
@@ -25,7 +25,7 @@
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, "gulag_console", name, ui_x, ui_y, master_ui, state)
+ ui = new(user, src, ui_key, "GulagTeleporterConsole", name, ui_x, ui_y, master_ui, state)
ui.open()
/obj/machinery/computer/prisoner/gulag_teleporter_computer/ui_data(mob/user)
diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm
index 2621616759..4fd9665b1d 100644
--- a/code/game/machinery/computer/robot.dm
+++ b/code/game/machinery/computer/robot.dm
@@ -5,163 +5,123 @@
icon_keyboard = "rd_key"
req_access = list(ACCESS_ROBOTICS)
circuit = /obj/item/circuitboard/computer/robotics
- var/temp = null
-
light_color = LIGHT_COLOR_PINK
+ ui_x = 500
+ ui_y = 460
/obj/machinery/computer/robotics/proc/can_control(mob/user, mob/living/silicon/robot/R)
+ . = FALSE
if(!istype(R))
- return FALSE
+ return
if(isAI(user))
- if (R.connected_ai != user)
- return FALSE
+ if(R.connected_ai != user)
+ return
if(iscyborg(user))
- if (R != user)
- return FALSE
+ if(R != user)
+ return
if(R.scrambledcodes)
- return FALSE
- if (hasSiliconAccessInArea(user) && !issilicon(user))
- if (!Adjacent(user))
- return FALSE
+ return
return TRUE
-/obj/machinery/computer/robotics/ui_interact(mob/user)
- . = ..()
- if (src.z > 6)
- to_chat(user, "Unable to establish a connection: \black You're too far away from the station!")
- return
- user.set_machine(src)
- var/dat
- var/robots = 0
+/obj/machinery/computer/robotics/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
+ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
+ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "RoboticsControlConsole", name, ui_x, ui_y, master_ui, state)
+ ui.open()
+
+/obj/machinery/computer/robotics/ui_data(mob/user)
+ var/list/data = list()
+
+ data["can_hack"] = FALSE
+ if(issilicon(user))
+ var/mob/living/silicon/S = user
+ if(S.hack_software)
+ data["can_hack"] = TRUE
+ else if(IsAdminGhost(user))
+ data["can_hack"] = TRUE
+
+ data["cyborgs"] = list()
for(var/mob/living/silicon/robot/R in GLOB.silicon_mobs)
if(!can_control(user, R))
continue
- robots++
- dat += "[R.name] |"
- if(R.stat)
- dat += " Not Responding |"
- else if(R.locked_down)
- dat += " Locked Down |"
- else
- dat += " Operating Normally |"
- if(R.cell)
- dat += " Battery Installed ([R.cell.charge]/[R.cell.maxcharge]) |"
- else
- dat += " No Cell Installed |"
- if(R.module)
- dat += " Module Installed ([R.module.name]) |"
- else
- dat += " No Module Installed |"
- if(R.connected_ai)
- dat += " Slaved to [R.connected_ai.name] |"
- else
- dat += " Independent from AI |"
- if(issilicon(user) && user != R)
- var/mob/living/silicon/S = user
- if(is_servant_of_ratvar(S))
- dat += "(Convert) "
- else if(S.hack_software && !R.emagged)
- dat += "(Hack) "
- else if(IsAdminGhost(user) && !R.emagged)
- dat += "(Hack) "
- dat += "([R.locked_down? "Lockdown" : "Release"]) "
- dat += "(Destroy)"
- dat += " "
+ if(z != (get_turf(R)).z)
+ continue
+ var/list/cyborg_data = list(
+ name = R.name,
+ locked_down = R.locked_down,
+ status = R.stat,
+ charge = R.cell ? round(R.cell.percent()) : null,
+ module = R.module ? "[R.module.name] Module" : "No Module Detected",
+ synchronization = R.connected_ai,
+ emagged = R.emagged,
+ ref = REF(R)
+ )
+ data["cyborgs"] += list(cyborg_data)
- if(!robots)
- dat += "No Cyborg Units detected within access parameters."
- dat += " "
-
- var/drones = 0
+ data["drones"] = list()
for(var/mob/living/simple_animal/drone/D in GLOB.drones_list)
if(D.hacked)
continue
- drones++
- dat += "[D.name] |"
- if(D.stat)
- dat += " Not Responding |"
- dat += "(Destroy)"
- dat += " "
+ if(z != (get_turf(D)).z)
+ continue
+ var/list/drone_data = list(
+ name = D.name,
+ status = D.stat,
+ ref = REF(D)
+ )
+ data["drones"] += list(drone_data)
- if(!drones)
- dat += "No Drone Units detected within access parameters."
+ return data
- var/datum/browser/popup = new(user, "computer", "Cyborg Control Console", 400, 500)
- popup.set_content(dat)
- popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
- popup.open()
- return
-
-/obj/machinery/computer/robotics/Topic(href, href_list)
+/obj/machinery/computer/robotics/ui_act(action, params)
if(..())
return
- if (href_list["temp"])
- src.temp = null
-
- else if (href_list["killbot"])
- if(src.allowed(usr))
- var/mob/living/silicon/robot/R = locate(href_list["killbot"]) in GLOB.silicon_mobs
- if(can_control(usr, R))
- var/choice = input("Are you certain you wish to detonate [R.name]?") in list("Confirm", "Abort")
- if(choice == "Confirm" && can_control(usr, R) && !..())
+ switch(action)
+ if("killbot")
+ if(allowed(usr))
+ var/mob/living/silicon/robot/R = locate(params["ref"]) in GLOB.silicon_mobs
+ if(can_control(usr, R) && !..())
var/turf/T = get_turf(R)
message_admins("[ADMIN_LOOKUPFLW(usr)] detonated [key_name_admin(R, R.client)] at [ADMIN_VERBOSEJMP(T)]!")
log_game("\[key_name(usr)] detonated [key_name(R)]!")
if(R.connected_ai)
to_chat(R.connected_ai, "
ALERT - Cyborg detonation detected: [R.name] ")
R.self_destruct()
- else
- to_chat(usr, "Access Denied.")
-
- else if (href_list["stopbot"])
- if(src.allowed(usr))
- var/mob/living/silicon/robot/R = locate(href_list["stopbot"]) in GLOB.silicon_mobs
- if(can_control(usr, R))
- var/choice = input("Are you certain you wish to [!R.locked_down ? "lock down" : "release"] [R.name]?") in list("Confirm", "Abort")
- if(choice == "Confirm" && can_control(usr, R) && !..())
- message_admins("[ADMIN_LOOKUPFLW(usr)] [!R.locked_down ? "locked down" : "released"] [key_name(R, R.client)][ADMIN_LOOKUPFLW(R)]!")
+ else
+ to_chat(usr, "Access Denied.")
+ if("stopbot")
+ if(allowed(usr))
+ var/mob/living/silicon/robot/R = locate(params["ref"]) in GLOB.silicon_mobs
+ if(can_control(usr, R) && !..())
+ message_admins("[ADMIN_LOOKUPFLW(usr)] [!R.locked_down ? "locked down" : "released"] [ADMIN_LOOKUPFLW(R)]!")
log_game("[key_name(usr)] [!R.locked_down ? "locked down" : "released"] [key_name(R)]!")
R.SetLockdown(!R.locked_down)
to_chat(R, "[!R.locked_down ? "Your lockdown has been lifted!" : "You have been locked down!"]")
if(R.connected_ai)
to_chat(R.connected_ai, "[!R.locked_down ? "NOTICE - Cyborg lockdown lifted" : "ALERT - Cyborg lockdown detected"]: [R.name] ")
-
- else
- to_chat(usr, "Access Denied.")
-
- else if (href_list["magbot"])
- var/mob/living/silicon/S = usr
- if((istype(S) && S.hack_software) || IsAdminGhost(usr))
- var/mob/living/silicon/robot/R = locate(href_list["magbot"]) in GLOB.silicon_mobs
- if(istype(R) && !R.emagged && (R.connected_ai == usr || IsAdminGhost(usr)) && !R.scrambledcodes && can_control(usr, R))
- log_game("[key_name(usr)] emagged [key_name(R)] using robotic console!")
- message_admins("[ADMIN_LOOKUPFLW(usr)] emagged cyborg [key_name_admin(R)] using robotic console!")
- R.SetEmagged(1)
-
- else if(href_list["convert"])
- if(isAI(usr) && is_servant_of_ratvar(usr))
- var/mob/living/silicon/robot/R = locate(href_list["convert"]) in GLOB.silicon_mobs
- if(istype(R) && !is_servant_of_ratvar(R) && R.connected_ai == usr)
- log_game("[key_name(usr)] converted [key_name(R)] using robotic console!")
- message_admins("[ADMIN_LOOKUPFLW(usr)] converted cyborg [key_name_admin(R)] using robotic console!")
- add_servant_of_ratvar(R)
-
- else if (href_list["killdrone"])
- if(src.allowed(usr))
- var/mob/living/simple_animal/drone/D = locate(href_list["killdrone"]) in GLOB.mob_list
- if(D.hacked)
- to_chat(usr, "ERROR: [D] is not responding to external commands.")
else
- var/turf/T = get_turf(D)
- message_admins("[ADMIN_LOOKUPFLW(usr)] detonated [key_name_admin(D)] at [ADMIN_VERBOSEJMP(T)]!")
- log_game("[key_name(usr)] detonated [key_name(D)]!")
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(3, 1, D)
- s.start()
- D.visible_message("\the [D] self destructs!")
- D.gib()
-
-
- src.updateUsrDialog()
- return
+ to_chat(usr, "Access Denied.")
+ if("magbot")
+ var/mob/living/silicon/S = usr
+ if((istype(S) && S.hack_software) || IsAdminGhost(usr))
+ var/mob/living/silicon/robot/R = locate(params["ref"]) in GLOB.silicon_mobs
+ if(istype(R) && !R.emagged && (R.connected_ai == usr || IsAdminGhost(usr)) && !R.scrambledcodes && can_control(usr, R))
+ log_game("[key_name(usr)] emagged [key_name(R)] using robotic console!")
+ message_admins("[ADMIN_LOOKUPFLW(usr)] emagged cyborg [key_name_admin(R)] using robotic console!")
+ R.SetEmagged(TRUE)
+ if("killdrone")
+ if(allowed(usr))
+ var/mob/living/simple_animal/drone/D = locate(params["ref"]) in GLOB.mob_list
+ if(D.hacked)
+ to_chat(usr, "ERROR: [D] is not responding to external commands.")
+ else
+ var/turf/T = get_turf(D)
+ message_admins("[ADMIN_LOOKUPFLW(usr)] detonated [key_name_admin(D)] at [ADMIN_VERBOSEJMP(T)]!")
+ log_game("[key_name(usr)] detonated [key_name(D)]!")
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
+ s.set_up(3, TRUE, D)
+ s.start()
+ D.visible_message("\the [D] self destructs!")
+ D.gib()
diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm
index 25f4237439..5c280eeace 100644
--- a/code/game/machinery/computer/security.dm
+++ b/code/game/machinery/computer/security.dm
@@ -662,7 +662,7 @@ What a mess.*/
GLOB.data_core.removeMajorCrime(active1.fields["id"], href_list["cdataid"])
if("notes")
if(istype(active2, /datum/data/record))
- var/t1 = stripped_input(usr, "Please summarize notes:", "Secure. records", active2.fields["notes"], null)
+ var/t1 = stripped_multiline_input(usr, "Please summarize notes:", "Secure records", active2.fields["notes"], 8192)
if(!canUseSecurityRecordsConsole(usr, t1, null, a2))
return
active2.fields["notes"] = t1
diff --git a/code/game/machinery/computer/station_alert.dm b/code/game/machinery/computer/station_alert.dm
index fcb18b4dff..b4340b9350 100644
--- a/code/game/machinery/computer/station_alert.dm
+++ b/code/game/machinery/computer/station_alert.dm
@@ -20,7 +20,7 @@
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, "station_alert", name, 325, 500, master_ui, state)
+ ui = new(user, src, ui_key, "StationAlertConsole", name, 325, 500, master_ui, state)
ui.open()
/obj/machinery/computer/station_alert/ui_data(mob/user)
diff --git a/code/game/machinery/computer/teleporter.dm b/code/game/machinery/computer/teleporter.dm
index 6710258626..e7957a5b75 100644
--- a/code/game/machinery/computer/teleporter.dm
+++ b/code/game/machinery/computer/teleporter.dm
@@ -38,7 +38,7 @@ obj/machinery/computer/teleporter/ui_interact(mob/user, ui_key = "main", datum/t
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, "teleporter", name, ui_x, ui_y, master_ui, state)
+ ui = new(user, src, ui_key, "Teleporter", name, ui_x, ui_y, master_ui, state)
ui.open()
/obj/machinery/computer/teleporter/ui_data(mob/user)
diff --git a/code/game/machinery/defibrillator_mount.dm b/code/game/machinery/defibrillator_mount.dm
index 5c13bfdf5d..677cbe1208 100644
--- a/code/game/machinery/defibrillator_mount.dm
+++ b/code/game/machinery/defibrillator_mount.dm
@@ -59,7 +59,7 @@
return defib.get_cell()
//defib interaction
-/obj/machinery/defibrillator_mount/attack_hand(mob/living/user)
+/obj/machinery/defibrillator_mount/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
if(!defib)
to_chat(user, "There's no defibrillator unit loaded!")
return
diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm
index a2d3cccc35..252e6cf6b3 100644
--- a/code/game/machinery/deployable.dm
+++ b/code/game/machinery/deployable.dm
@@ -169,7 +169,8 @@
to_chat(user, "[src] is now in [mode] mode.")
-/obj/item/grenade/barrier/prime()
+/obj/item/grenade/barrier/prime(mob/living/lanced_by)
+ . = ..()
new /obj/structure/barricade/security(get_turf(src.loc))
switch(mode)
if(VERTICAL)
diff --git a/code/game/machinery/dish_drive.dm b/code/game/machinery/dish_drive.dm
index 31e6a3cfeb..3cfd8fdfc4 100644
--- a/code/game/machinery/dish_drive.dm
+++ b/code/game/machinery/dish_drive.dm
@@ -31,7 +31,7 @@
if(user.Adjacent(src))
. += "Alt-click it to beam its contents to any nearby disposal bins."
-/obj/machinery/dish_drive/attack_hand(mob/living/user)
+/obj/machinery/dish_drive/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
if(!contents.len)
to_chat(user, "There's nothing in [src]!")
return
diff --git a/code/game/machinery/dna_scanner.dm b/code/game/machinery/dna_scanner.dm
index 4b2ba85d11..e721e986d2 100644
--- a/code/game/machinery/dna_scanner.dm
+++ b/code/game/machinery/dna_scanner.dm
@@ -15,6 +15,7 @@
var/precision_coeff
var/message_cooldown
var/breakout_time = 1200
+ var/obj/machinery/computer/scan_consolenew/linked_console = null
/obj/machinery/dna_scannernew/RefreshParts()
scan_level = 0
@@ -22,8 +23,8 @@
precision_coeff = 0
for(var/obj/item/stock_parts/scanning_module/P in component_parts)
scan_level += P.rating
- for(var/obj/item/stock_parts/matter_bin/P in component_parts)
- precision_coeff = P.rating
+ for(var/obj/item/stock_parts/matter_bin/M in component_parts)
+ precision_coeff = M.rating
for(var/obj/item/stock_parts/micro_laser/P in component_parts)
damage_coeff = P.rating
@@ -31,11 +32,8 @@
. = ..()
if(in_range(user, src) || isobserver(user))
. += "The status display reads: Radiation pulse accuracy increased by factor [precision_coeff**2]. Radiation pulse damage decreased by factor [damage_coeff**2]."
- if(scan_level >= 3)
- . += "Scanner has been upgraded to support autoprocessing."
/obj/machinery/dna_scannernew/update_icon_state()
-
//no power or maintenance
if(stat & (NOPOWER|BROKEN))
icon_state = initial(icon_state)+ (state_open ? "_open" : "") + "_unpowered"
@@ -53,10 +51,6 @@
//running
icon_state = initial(icon_state)+ (state_open ? "_open" : "")
-/obj/machinery/dna_scannernew/power_change()
- ..()
- update_icon()
-
/obj/machinery/dna_scannernew/proc/toggle_open(mob/user)
if(panel_open)
to_chat(user, "Close the maintenance panel first.")
@@ -76,11 +70,9 @@
if(!locked)
open_machine()
return
- user.changeNext_move(CLICK_CD_BREAKOUT)
- user.last_special = world.time + CLICK_CD_BREAKOUT
user.visible_message("You see [user] kicking against the door of [src]!", \
"You lean on the back of [src] and start pushing the door open... (this will take about [DisplayTimeText(breakout_time)].)", \
- "You hear a metallic creaking from [src].")
+ "You hear a metallic creaking from [src].")
if(do_after(user,(breakout_time), target = src))
if(!user || user.stat != CONSCIOUS || user.loc != src || state_open || !locked)
return
@@ -96,33 +88,28 @@
return C
return null
-/obj/machinery/dna_scannernew/close_machine(atom/movable/target)
+/obj/machinery/dna_scannernew/close_machine(mob/living/carbon/user)
if(!state_open)
return FALSE
- ..(target)
-
- // search for ghosts, if the corpse is empty and the scanner is connected to a cloner
- var/mob/living/mob_occupant = get_mob_or_brainmob(occupant)
- if(istype(mob_occupant))
- if(locate_computer(/obj/machinery/computer/cloning))
- if(!mob_occupant.suiciding && !(HAS_TRAIT(mob_occupant, TRAIT_NOCLONE)) && !mob_occupant.hellbound)
- mob_occupant.notify_ghost_cloning("Your corpse has been placed into a cloning scanner. Re-enter your corpse if you want to be cloned!", source = src)
+ ..(user)
// DNA manipulators cannot operate on severed heads or brains
- if(isliving(occupant))
- var/obj/machinery/computer/scan_consolenew/console = locate_computer(/obj/machinery/computer/scan_consolenew)
- if(console)
- console.on_scanner_close()
+ if(iscarbon(occupant))
+ if(linked_console)
+ linked_console.on_scanner_close()
return TRUE
/obj/machinery/dna_scannernew/open_machine()
- if(state_open || panel_open)
+ if(state_open)
return FALSE
..()
+ if(linked_console)
+ linked_console.on_scanner_open()
+
return TRUE
/obj/machinery/dna_scannernew/relaymove(mob/user as mob)
@@ -133,51 +120,49 @@
return
open_machine()
-/obj/machinery/dna_scannernew/screwdriver_act(mob/living/user, obj/item/I)
- . = TRUE
- if(..())
- return
- if(occupant)
- to_chat(user, "[src] is currently occupied!")
- return
- if(state_open)
- to_chat(user, "[src] must be closed to [panel_open ? "close" : "open"] its maintenance hatch!")
- return
- if(default_deconstruction_screwdriver(user, icon_state, icon_state, I)) //sent icon_state is irrelevant...
- update_icon() //..since we're updating the icon here, since the scanner can be unpowered when opened/closed
- return
- return FALSE
+/obj/machinery/dna_scannernew/attackby(obj/item/I, mob/user, params)
-/obj/machinery/dna_scannernew/wrench_act(mob/living/user, obj/item/I)
- . = ..()
- if(default_change_direction_wrench(user, I))
- return TRUE
+ if(!occupant && default_deconstruction_screwdriver(user, icon_state, icon_state, I))//sent icon_state is irrelevant...
+ update_icon()//..since we're updating the icon here, since the scanner can be unpowered when opened/closed
+ return
-/obj/machinery/dna_scannernew/crowbar_act(mob/living/user, obj/item/I)
- . = ..()
if(default_pry_open(I))
- return TRUE
- if(default_deconstruction_crowbar(I))
- return TRUE
+ return
-/obj/machinery/dna_scannernew/default_pry_open(obj/item/I) //wew
- . = !(state_open || panel_open || (flags_1 & NODECONSTRUCT_1)) && I.tool_behaviour == TOOL_CROWBAR
- if(.)
- I.play_tool_sound(src, 50)
- visible_message("[usr] pries open [src].", "You pry open [src].")
- open_machine()
+ if(default_deconstruction_crowbar(I))
+ return
+
+ return ..()
/obj/machinery/dna_scannernew/interact(mob/user)
toggle_open(user)
-/obj/machinery/dna_scannernew/AltClick(mob/user)
- . = ..()
- if(!user.canUseTopic(src, !hasSiliconAccessInArea(user)))
- return
- interact(user)
- return TRUE
-
/obj/machinery/dna_scannernew/MouseDrop_T(mob/target, mob/user)
- if(user.stat || user.lying || !Adjacent(user) || !user.Adjacent(target) || !iscarbon(target) || !user.IsAdvancedToolUser())
+ var/mob/living/L = user
+ if(user.stat || (isliving(user) && (!(L.mobility_flags & MOBILITY_STAND) || !(L.mobility_flags & MOBILITY_UI))) || !Adjacent(user) || !user.Adjacent(target) || !iscarbon(target) || !user.IsAdvancedToolUser())
return
close_machine(target)
+
+
+//Just for transferring between genetics machines.
+/obj/item/disk/data
+ name = "DNA data disk"
+ icon_state = "datadisk0" //Gosh I hope syndies don't mistake them for the nuke disk.
+ var/list/genetic_makeup_buffer = list()
+ var/list/fields = list()
+ var/list/mutations = list()
+ var/max_mutations = 6
+ var/read_only = FALSE //Well,it's still a floppy disk
+
+/obj/item/disk/data/Initialize()
+ . = ..()
+ icon_state = "datadisk[rand(0,6)]"
+ add_overlay("datadisk_gene")
+
+/obj/item/disk/data/attack_self(mob/user)
+ read_only = !read_only
+ to_chat(user, "You flip the write-protect tab to [read_only ? "protected" : "unprotected"].")
+
+/obj/item/disk/data/examine(mob/user)
+ . = ..()
+ . += "The write-protect tab is set to [read_only ? "protected" : "unprotected"]."
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 2a45267c65..b5e752cc6b 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -93,7 +93,7 @@
var/shuttledocked = 0
var/delayed_close_requested = FALSE // TRUE means the door will automatically close the next time it's opened.
- var/air_tight = FALSE //TRUE means density will be set as soon as the door begins to close
+ air_tight = FALSE
var/prying_so_hard = FALSE
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
@@ -157,6 +157,10 @@
. = ..()
AddComponent(/datum/component/ntnet_interface)
+/obj/machinery/door/airlock/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE)
+ if(id_tag)
+ id_tag = "[idnum][id_tag]"
+
/obj/machinery/door/airlock/proc/update_other_id()
for(var/obj/machinery/door/airlock/A in GLOB.airlocks)
if(A.closeOtherId == closeOtherId && A != src)
@@ -188,7 +192,7 @@
/obj/machinery/door/airlock/vv_edit_var(var_name)
. = ..()
switch (var_name)
- if ("cyclelinkeddir")
+ if (NAMEOF(src, cyclelinkeddir))
cyclelinkairlock()
/obj/machinery/door/airlock/check_access_ntnet(datum/netdata/data)
@@ -413,8 +417,8 @@
// shock user with probability prb (if all connections & power are working)
// returns TRUE if shocked, FALSE otherwise
// The preceding comment was borrowed from the grille's shock script
-/obj/machinery/door/airlock/proc/shock(mob/user, prb)
- if(!hasPower()) // unpowered, no shock
+/obj/machinery/door/airlock/proc/shock(mob/living/user, prb)
+ if(!istype(user) || !hasPower()) // unpowered, no shock
return FALSE
if(shockCooldown > world.time)
return FALSE //Already shocked someone recently?
@@ -759,10 +763,7 @@
/obj/machinery/door/airlock/attack_paw(mob/user)
return attack_hand(user)
-/obj/machinery/door/airlock/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/machinery/door/airlock/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(!(issilicon(user) || IsAdminGhost(user)))
if(src.isElectrified())
if(src.shock(user, 100))
@@ -779,6 +780,8 @@
H.apply_damage(10, BRUTE, BODY_ZONE_HEAD)
else
visible_message("[user] headbutts the airlock. Good thing [user.p_theyre()] wearing a helmet.")
+ else
+ return ..()
/obj/machinery/door/airlock/attempt_wire_interaction(mob/user)
if(security_level)
@@ -1058,11 +1061,11 @@
to_chat(user, "The airlock's bolts prevent it from being forced!")
else if( !welded && !operating)
if(!beingcrowbarred) //being fireaxe'd
- var/obj/item/twohanded/fireaxe/F = I
- if(F.wielded)
- INVOKE_ASYNC(src, (density ? .proc/open : .proc/close), 2)
- else
- to_chat(user, "You need to be wielding the fire axe to do that!")
+ var/obj/item/fireaxe/axe = I
+ if(!axe.wielded)
+ to_chat(user, "You need to be wielding \the [axe] to do that!")
+ return
+ INVOKE_ASYNC(src, (density ? .proc/open : .proc/close), 2)
else
INVOKE_ASYNC(src, (density ? .proc/open : .proc/close), 2)
@@ -1440,7 +1443,7 @@
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
- ui = new(user, src, ui_key, "ai_airlock", name, 500, 390, master_ui, state)
+ ui = new(user, src, ui_key, "AiAirlock", name, 500, 390, master_ui, state)
ui.open()
return TRUE
diff --git a/code/game/machinery/doors/airlock_electronics.dm b/code/game/machinery/doors/airlock_electronics.dm
index ae6930f5fb..a0ce3954c3 100644
--- a/code/game/machinery/doors/airlock_electronics.dm
+++ b/code/game/machinery/doors/airlock_electronics.dm
@@ -2,10 +2,14 @@
name = "airlock electronics"
req_access = list(ACCESS_MAINT_TUNNELS)
custom_price = PRICE_CHEAP
-
+ /// A list of all granted accesses
var/list/accesses = list()
+ /// If the airlock should require ALL or only ONE of the listed accesses
var/one_access = 0
- var/unres_sides = 0 //unrestricted sides, or sides of the airlock that will open regardless of access
+ /// Unrestricted sides, or sides of the airlock that will open regardless of access
+ var/unres_sides = 0
+ /// A holder of the electronics, in case of them working as an integrated part
+ var/holder
/obj/item/electronics/airlock/examine(mob/user)
. = ..()
@@ -13,31 +17,37 @@
/obj/item/electronics/airlock/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.hands_state)
- SStgui.try_update_ui(user, src, ui_key, ui, force_open)
+ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
- ui = new(user, src, ui_key, "airlock_electronics", name, 420, 485, master_ui, state)
+ ui = new(user, src, ui_key, "AirlockElectronics", name, 420, 485, master_ui, state)
ui.open()
+/obj/item/electronics/airlock/ui_static_data(mob/user)
+ var/list/data = list()
+ var/list/regions = list()
+ for(var/i in 1 to 7)
+ var/list/accesses = list()
+ for(var/access in get_region_accesses(i))
+ if (get_access_desc(access))
+ accesses += list(list(
+ "desc" = replacetext(get_access_desc(access), " ", " "),
+ "ref" = access,
+ ))
+
+ regions += list(list(
+ "name" = get_region_accesses_name(i),
+ "regid" = i,
+ "accesses" = accesses
+ ))
+
+ data["regions"] = regions
+ return data
+
/obj/item/electronics/airlock/ui_data()
var/list/data = list()
- var/list/regions = list()
-
- for(var/i in 1 to 7)
- var/list/region = list()
- var/list/accesses = list()
- for(var/j in get_region_accesses(i))
- var/list/access = list()
- access["name"] = get_access_desc(j)
- access["id"] = j
- access["req"] = (j in src.accesses)
- accesses[++accesses.len] = access
- region["name"] = get_region_accesses_name(i)
- region["accesses"] = accesses
- regions[++regions.len] = region
- data["regions"] = regions
+ data["accesses"] = accesses
data["oneAccess"] = one_access
data["unres_direction"] = unres_sides
-
return data
/obj/item/electronics/airlock/ui_act(action, params)
@@ -48,12 +58,12 @@
accesses = list()
one_access = 0
. = TRUE
- if("one_access")
- one_access = !one_access
- . = TRUE
if("grant_all")
accesses = get_all_accesses()
. = TRUE
+ if("one_access")
+ one_access = !one_access
+ . = TRUE
if("set")
var/access = text2num(params["access"])
if (!(access in accesses))
@@ -65,3 +75,20 @@
var/unres_direction = text2num(params["unres_direction"])
unres_sides ^= unres_direction //XOR, toggles only the bit that was clicked
. = TRUE
+ if("grant_region")
+ var/region = text2num(params["region"])
+ if(isnull(region))
+ return
+ accesses |= get_region_accesses(region)
+ . = TRUE
+ if("deny_region")
+ var/region = text2num(params["region"])
+ if(isnull(region))
+ return
+ accesses -= get_region_accesses(region)
+ . = TRUE
+
+/obj/item/electronics/airlock/ui_host()
+ if(holder)
+ return holder
+ return src
diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm
index 1d39372dec..5a1ed7dd19 100644
--- a/code/game/machinery/doors/brigdoors.dm
+++ b/code/game/machinery/doors/brigdoors.dm
@@ -144,7 +144,7 @@
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, "brig_timer", name, 300, 138, master_ui, state)
+ ui = new(user, src, ui_key, "BrigTimer", name, 300, 138, master_ui, state)
ui.open()
//icon update function
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index 98a888fa66..f3886d0036 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -12,12 +12,14 @@
armor = list("melee" = 30, "bullet" = 30, "laser" = 20, "energy" = 20, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 70)
CanAtmosPass = ATMOS_PASS_DENSITY
flags_1 = PREVENT_CLICK_UNDER_1
+ ricochet_chance_mod = 0.8
interaction_flags_atom = INTERACT_ATOM_UI_INTERACT
var/secondsElectrified = 0
+ var/air_tight = FALSE //TRUE means density will be set as soon as the door begins to close
var/shockedby
- var/visible = TRUE
+ var/visible = TRUE // To explain: Whether the door can block line of sight when closed or not.
var/operating = FALSE
var/glass = FALSE
var/welded = FALSE
@@ -138,10 +140,7 @@
do_animate("deny")
return
-/obj/machinery/door/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/machinery/door/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
return try_to_activate_door(user)
/obj/machinery/door/attack_tk(mob/user)
@@ -160,7 +159,7 @@
open()
else
close()
- return
+ return TRUE
if(density)
do_animate("deny")
@@ -180,11 +179,36 @@
/obj/machinery/door/proc/try_to_crowbar(obj/item/I, mob/user)
return
+/obj/machinery/door/proc/is_holding_pressure()
+ var/turf/open/T = loc
+ if(!T)
+ return FALSE
+ if(!density)
+ return FALSE
+ // alrighty now we check for how much pressure we're holding back
+ var/min_moles = T.air.total_moles()
+ var/max_moles = min_moles
+ // okay this is a bit hacky. First, we set density to 0 and recalculate our adjacent turfs
+ density = FALSE
+ T.ImmediateCalculateAdjacentTurfs()
+ // then we use those adjacent turfs to figure out what the difference between the lowest and highest pressures we'd be holding is
+ for(var/turf/open/T2 in T.atmos_adjacent_turfs)
+ if((flags_1 & ON_BORDER_1) && get_dir(src, T2) != dir)
+ continue
+ var/moles = T2.air.total_moles()
+ if(moles < min_moles)
+ min_moles = moles
+ if(moles > max_moles)
+ max_moles = moles
+ density = TRUE
+ T.ImmediateCalculateAdjacentTurfs() // alright lets put it back
+ return max_moles - min_moles > 20
+
/obj/machinery/door/attackby(obj/item/I, mob/user, params)
- if(user.a_intent != INTENT_HARM && (istype(I, /obj/item/crowbar) || istype(I, /obj/item/twohanded/fireaxe)))
+ if(user.a_intent != INTENT_HARM && (I.tool_behaviour == TOOL_CROWBAR || istype(I, /obj/item/fireaxe)))
try_to_crowbar(I, user)
return 1
- else if(istype(I, /obj/item/weldingtool))
+ else if(I.tool_behaviour == TOOL_WELDER)
try_to_weld(I, user)
return 1
else if(!(I.item_flags & NOBLUDGEON) && user.a_intent != INTENT_HARM)
@@ -222,13 +246,13 @@
if(prob(20/severity) && (istype(src, /obj/machinery/door/airlock) || istype(src, /obj/machinery/door/window)) )
INVOKE_ASYNC(src, .proc/open)
if(prob(severity*10 - 20))
- if(secondsElectrified == 0)
- secondsElectrified = -1
+ if(secondsElectrified == MACHINE_NOT_ELECTRIFIED)
+ secondsElectrified = MACHINE_ELECTRIFIED_PERMANENT
LAZYADD(shockedby, "\[[TIME_STAMP("hh:mm:ss", FALSE)]\]EM Pulse")
addtimer(CALLBACK(src, .proc/unelectrify), 300)
/obj/machinery/door/proc/unelectrify()
- secondsElectrified = 0
+ secondsElectrified = MACHINE_NOT_ELECTRIFIED
/obj/machinery/door/update_icon_state()
if(density)
@@ -288,8 +312,11 @@
return
operating = TRUE
+
do_animate("closing")
layer = closingLayer
+ if(air_tight)
+ density = TRUE
sleep(5)
density = TRUE
sleep(5)
@@ -301,7 +328,7 @@
update_freelook_sight()
if(safe)
CheckForMobs()
- else
+ else if(!(flags_1 & ON_BORDER_1))
crush()
return 1
@@ -313,6 +340,10 @@
/obj/machinery/door/proc/crush()
for(var/mob/living/L in get_turf(src))
L.visible_message("[src] closes on [L], crushing [L.p_them()]!", "[src] closes on you and crushes you!")
+ if(iscarbon(L))
+ var/mob/living/carbon/C = L
+ for(var/datum/wound/W in C.all_wounds)
+ W.crush(DOOR_CRUSH_DAMAGE)
if(isalien(L)) //For xenos
L.adjustBruteLoss(DOOR_CRUSH_DAMAGE * 1.5) //Xenos go into crit after aproximately the same amount of crushes as humans.
L.emote("roar")
diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm
index b52cf1a891..2d41575e70 100644
--- a/code/game/machinery/doors/firedoor.dm
+++ b/code/game/machinery/doors/firedoor.dm
@@ -23,6 +23,10 @@
assemblytype = /obj/structure/firelock_frame
armor = list("melee" = 30, "bullet" = 30, "laser" = 20, "energy" = 20, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 95, "acid" = 70)
interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_REQUIRES_SILICON | INTERACT_MACHINE_OPEN
+ air_tight = TRUE
+ attack_hand_is_action = TRUE
+ attack_hand_speed = CLICK_CD_MELEE
+ var/emergency_close_timer = 0
var/nextstate = null
var/boltslocked = TRUE
var/list/affecting_areas
@@ -68,13 +72,16 @@
return ..()
/obj/machinery/door/firedoor/Bumped(atom/movable/AM)
- if(panel_open || operating)
+ if(panel_open || operating || welded)
return
- if(!density)
- return ..()
+ if(ismob(AM))
+ var/mob/user = AM
+ if(density && !welded && !operating && !(stat & NOPOWER) && (!density || allow_hand_open(user)))
+ add_fingerprint(user)
+ open()
+ return TRUE
return FALSE
-
/obj/machinery/door/firedoor/power_change()
if(powered(power_channel))
stat &= ~NOPOWER
@@ -82,13 +89,17 @@
else
stat |= NOPOWER
-/obj/machinery/door/firedoor/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/machinery/door/firedoor/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+ if(!welded && !operating && !(stat & NOPOWER) && (!density || allow_hand_open(user)))
+ add_fingerprint(user)
+ if(density)
+ emergency_close_timer = world.time + 30 // prevent it from instaclosing again if in space
+ open()
+ else
+ close()
+ return TRUE
if(operating || !density)
return
- user.changeNext_move(CLICK_CD_MELEE)
user.visible_message("[user] bangs on \the [src].",
"You bang on \the [src].")
@@ -100,7 +111,7 @@
return
if(welded)
- if(istype(C, /obj/item/wrench))
+ if(C.tool_behaviour == TOOL_WRENCH)
if(boltslocked)
to_chat(user, "There are screws locking the bolts in place!")
return
@@ -114,7 +125,7 @@
"You undo [src]'s floor bolts.")
deconstruct(TRUE)
return
- if(istype(C, /obj/item/screwdriver))
+ if(C.tool_behaviour == TOOL_SCREWDRIVER)
user.visible_message("[user] [boltslocked ? "unlocks" : "locks"] [src]'s bolts.", \
"You [boltslocked ? "unlock" : "lock"] [src]'s floor bolts.")
C.play_tool_sound(src)
@@ -140,10 +151,27 @@
return
if(density)
+ if(is_holding_pressure())
+ // tell the user that this is a bad idea, and have a do_after as well
+ to_chat(user, "As you begin crowbarring \the [src] a gush of air blows in your face... maybe you should reconsider?")
+ if(!do_after(user, 15, TRUE, src)) // give them a few seconds to reconsider their decision.
+ return
+ log_game("[key_name_admin(user)] has opened a firelock with a pressure difference at [AREACOORD(loc)]") // there bibby I made it logged just for you. Enjoy.
+ // since we have high-pressure-ness, close all other firedoors on the tile
+ whack_a_mole()
+ if(welded || operating || !density)
+ return // in case things changed during our do_after
+ emergency_close_timer = world.time + 60 // prevent it from instaclosing again if in space
open()
else
close()
+/obj/machinery/door/firedoor/proc/allow_hand_open(mob/user)
+ var/area/A = get_area(src)
+ if(A && A.fire)
+ return FALSE
+ return !is_holding_pressure()
+
/obj/machinery/door/firedoor/attack_ai(mob/user)
add_fingerprint(user)
if(welded || operating || stat & NOPOWER)
@@ -171,20 +199,16 @@
if("closing")
flick("door_closing", src)
-/obj/machinery/door/firedoor/update_icon_state()
+/obj/machinery/door/firedoor/update_icon()
+ cut_overlays()
if(density)
icon_state = "door_closed"
+ if(welded)
+ add_overlay("welded")
else
icon_state = "door_open"
-
-/obj/machinery/door/firedoor/update_overlays()
- . = ..()
- if(!welded)
- return
- if(density)
- . += "welded"
- else
- . += "welded_open"
+ if(welded)
+ add_overlay("welded_open")
/obj/machinery/door/firedoor/open()
. = ..()
@@ -194,6 +218,61 @@
. = ..()
latetoggle()
+/obj/machinery/door/firedoor/proc/whack_a_mole(reconsider_immediately = FALSE)
+ set waitfor = 0
+ for(var/cdir in GLOB.cardinals)
+ if((flags_1 & ON_BORDER_1) && cdir != dir)
+ continue
+ whack_a_mole_part(get_step(src, cdir), reconsider_immediately)
+ if(flags_1 & ON_BORDER_1)
+ whack_a_mole_part(get_turf(src), reconsider_immediately)
+
+/obj/machinery/door/firedoor/proc/whack_a_mole_part(turf/start_point, reconsider_immediately)
+ set waitfor = 0
+ var/list/doors_to_close = list()
+ var/list/turfs = list()
+ turfs[start_point] = 1
+ for(var/i = 1; (i <= turfs.len && i <= 11); i++) // check up to 11 turfs.
+ var/turf/open/T = turfs[i]
+ if(istype(T, /turf/open/space))
+ return -1
+ for(var/T2 in T.atmos_adjacent_turfs)
+ if(turfs[T2])
+ continue
+ var/is_cut_by_unopen_door = FALSE
+ for(var/obj/machinery/door/firedoor/FD in T2)
+ if((FD.flags_1 & ON_BORDER_1) && get_dir(T2, T) != FD.dir)
+ continue
+ if(FD.operating || FD == src || FD.welded || FD.density)
+ continue
+ doors_to_close += FD
+ is_cut_by_unopen_door = TRUE
+
+ for(var/obj/machinery/door/firedoor/FD in T)
+ if((FD.flags_1 & ON_BORDER_1) && get_dir(T, T2) != FD.dir)
+ continue
+ if(FD.operating || FD == src || FD.welded || FD.density)
+ continue
+ doors_to_close += FD
+ is_cut_by_unopen_door= TRUE
+ if(!is_cut_by_unopen_door)
+ turfs[T2] = 1
+ if(turfs.len > 10)
+ return // too big, don't bother
+ for(var/obj/machinery/door/firedoor/FD in doors_to_close)
+ FD.emergency_pressure_stop(FALSE)
+ if(reconsider_immediately)
+ var/turf/open/T = FD.loc
+ if(istype(T))
+ T.ImmediateCalculateAdjacentTurfs()
+
+/obj/machinery/door/firedoor/proc/emergency_pressure_stop(consider_timer = TRUE)
+ set waitfor = 0
+ if(density || operating || welded)
+ return
+ if(world.time >= emergency_close_timer || !consider_timer)
+ close()
+
/obj/machinery/door/firedoor/deconstruct(disassembled = TRUE)
if(!(flags_1 & NODECONSTRUCT_1))
var/obj/structure/firelock_frame/F = new assemblytype(get_turf(src))
@@ -227,6 +306,59 @@
opacity = TRUE
density = TRUE
+/obj/machinery/door/firedoor/border_only/close()
+ if(density)
+ return TRUE
+ if(operating || welded)
+ return
+ var/turf/T1 = get_turf(src)
+ var/turf/T2 = get_step(T1, dir)
+ for(var/mob/living/M in T1)
+ if(M.stat == CONSCIOUS && M.pulling && M.pulling.loc == T2 && !M.pulling.anchored && M.pulling.move_resist <= M.move_force)
+ var/mob/living/M2 = M.pulling
+ if(!istype(M2) || !M2.buckled || !M2.buckled.buckle_prevents_pull)
+ to_chat(M, "You pull [M.pulling] through [src] right as it closes")
+ M.pulling.forceMove(T1)
+ M.start_pulling(M2)
+
+ for(var/mob/living/M in T2)
+ if(M.stat == CONSCIOUS && M.pulling && M.pulling.loc == T1 && !M.pulling.anchored && M.pulling.move_resist <= M.move_force)
+ var/mob/living/M2 = M.pulling
+ if(!istype(M2) || !M2.buckled || !M2.buckled.buckle_prevents_pull)
+ to_chat(M, "You pull [M.pulling] through [src] right as it closes")
+ M.pulling.forceMove(T2)
+ M.start_pulling(M2)
+ . = ..()
+
+/obj/machinery/door/firedoor/border_only/allow_hand_open(mob/user)
+ var/area/A = get_area(src)
+ if((!A || !A.fire) && !is_holding_pressure())
+ return TRUE
+ whack_a_mole(TRUE) // WOOP WOOP SIDE EFFECTS
+ var/turf/T = loc
+ var/turf/T2 = get_step(T, dir)
+ if(!T || !T2)
+ return
+ var/status1 = check_door_side(T)
+ var/status2 = check_door_side(T2)
+ if((status1 == 1 && status2 == -1) || (status1 == -1 && status2 == 1))
+ to_chat(user, "Access denied. Try closing another firedoor to minimize decompression, or using a crowbar.")
+ return FALSE
+ return TRUE
+
+/obj/machinery/door/firedoor/border_only/proc/check_door_side(turf/open/start_point)
+ var/list/turfs = list()
+ turfs[start_point] = 1
+ for(var/i = 1; (i <= turfs.len && i <= 11); i++) // check up to 11 turfs.
+ var/turf/open/T = turfs[i]
+ if(istype(T, /turf/open/space))
+ return -1
+ for(var/T2 in T.atmos_adjacent_turfs)
+ turfs[T2] = 1
+ if(turfs.len <= 10)
+ return 0 // not big enough to matter
+ return start_point.air.return_pressure() < 20 ? -1 : 1
+
/obj/machinery/door/firedoor/border_only/CanPass(atom/movable/mover, turf/target)
if(istype(mover) && (mover.pass_flags & PASSGLASS))
return TRUE
@@ -257,6 +389,18 @@
assemblytype = /obj/structure/firelock_frame/heavy
max_integrity = 550
+/obj/machinery/door/firedoor/window
+ name = "window shutter"
+ icon = 'icons/obj/doors/doorfirewindow.dmi'
+ desc = "A second window that slides in when the original window is broken, designed to protect against hull breaches. Truly a work of genius by NT engineers."
+ glass = TRUE
+ explosion_block = 0
+ max_integrity = 50
+ resistance_flags = 0 // not fireproof
+ heat_proof = FALSE
+
+/obj/machinery/door/firedoor/window/allow_hand_open()
+ return TRUE
/obj/item/electronics/firelock
name = "firelock circuitry"
@@ -294,7 +438,7 @@
/obj/structure/firelock_frame/attackby(obj/item/C, mob/user)
switch(constructionStep)
if(CONSTRUCTION_PANEL_OPEN)
- if(istype(C, /obj/item/crowbar))
+ if(C.tool_behaviour == TOOL_CROWBAR)
C.play_tool_sound(src)
user.visible_message("[user] starts prying something out from [src]...", \
"You begin prying out the wire cover...")
@@ -308,7 +452,7 @@
constructionStep = CONSTRUCTION_WIRES_EXPOSED
update_icon()
return
- if(istype(C, /obj/item/wrench))
+ if(C.tool_behaviour == TOOL_WRENCH)
if(locate(/obj/machinery/door/firedoor) in get_turf(src))
to_chat(user, "There's already a firelock there.")
return
@@ -350,7 +494,7 @@
return
if(CONSTRUCTION_WIRES_EXPOSED)
- if(istype(C, /obj/item/wirecutters))
+ if(C.tool_behaviour == TOOL_WIRECUTTER)
C.play_tool_sound(src)
user.visible_message("[user] starts cutting the wires from [src]...", \
"You begin removing [src]'s wires...")
@@ -364,7 +508,7 @@
constructionStep = CONSTRUCTION_GUTTED
update_icon()
return
- if(istype(C, /obj/item/crowbar))
+ if(C.tool_behaviour == TOOL_CROWBAR)
C.play_tool_sound(src)
user.visible_message("[user] starts prying a metal plate into [src]...", \
"You begin prying the cover plate back onto [src]...")
@@ -379,7 +523,7 @@
update_icon()
return
if(CONSTRUCTION_GUTTED)
- if(istype(C, /obj/item/crowbar))
+ if(C.tool_behaviour == TOOL_CROWBAR)
user.visible_message("[user] begins removing the circuit board from [src]...", \
"You begin prying out the circuit board from [src]...")
if(!C.use_tool(src, user, 50, volume=50))
@@ -401,7 +545,7 @@
"You begin adding wires to [src]...")
playsound(get_turf(src), 'sound/items/deconstruct.ogg', 50, 1)
if(do_after(user, 60, target = src))
- if(constructionStep != CONSTRUCTION_GUTTED || !B.use_tool(src, user, 0, 5))
+ if(constructionStep != CONSTRUCTION_GUTTED || B.get_amount() < 5 || !B)
return
user.visible_message("[user] adds wires to [src].", \
"You wire [src].")
@@ -410,7 +554,7 @@
update_icon()
return
if(CONSTRUCTION_NOCIRCUIT)
- if(istype(C, /obj/item/weldingtool))
+ if(C.tool_behaviour == TOOL_WELDER)
if(!C.tool_start_check(user, amount=1))
return
user.visible_message("[user] begins cutting apart [src]'s frame...", \
diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm
index c032ded6b0..4226d8a439 100644
--- a/code/game/machinery/doors/poddoor.dm
+++ b/code/game/machinery/doors/poddoor.dm
@@ -16,6 +16,9 @@
damage_deflection = 70
poddoor = TRUE
+/obj/machinery/door/poddoor/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE)
+ id = "[idnum][id]"
+
/obj/machinery/door/poddoor/preopen
icon_state = "open"
density = FALSE
diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm
index 492e90720c..c9c577231e 100644
--- a/code/game/machinery/doors/windowdoor.dm
+++ b/code/game/machinery/doors/windowdoor.dm
@@ -54,6 +54,15 @@
else
icon_state = "[src.base_state]open"
+/obj/machinery/door/window/update_atom_colour()
+ if((color && (color_hex2num(color) < 255)))
+ visible = TRUE
+ if(density)
+ set_opacity(TRUE)
+ else
+ visible = FALSE
+ set_opacity(density && visible)
+
/obj/machinery/door/window/proc/open_and_close()
open()
if(src.check_access(null))
@@ -143,16 +152,18 @@
do_animate("opening")
playsound(src.loc, 'sound/machines/windowdoor.ogg', 100, 1)
src.icon_state ="[src.base_state]open"
- sleep(10)
+ addtimer(CALLBACK(src, .proc/finish_opening), 10)
+ return TRUE
+/obj/machinery/door/window/proc/finish_opening()
+ operating = FALSE
density = FALSE
-// src.sd_set_opacity(0) //TODO: why is this here? Opaque windoors? ~Carn
+ if(visible)
+ set_opacity(FALSE)
air_update_turf(1)
update_freelook_sight()
-
if(operating == 1) //emag again
operating = FALSE
- return 1
/obj/machinery/door/window/close(forced=0)
if (src.operating)
@@ -171,10 +182,13 @@
density = TRUE
air_update_turf(1)
update_freelook_sight()
- sleep(10)
+ addtimer(CALLBACK(src, .proc/finish_closing), 10)
+ return TRUE
+/obj/machinery/door/window/proc/finish_closing()
+ if(visible)
+ set_opacity(TRUE)
operating = FALSE
- return 1
/obj/machinery/door/window/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
switch(damage_type)
diff --git a/code/game/machinery/exp_cloner.dm b/code/game/machinery/exp_cloner.dm
deleted file mode 100644
index 2c669aac80..0000000000
--- a/code/game/machinery/exp_cloner.dm
+++ /dev/null
@@ -1,298 +0,0 @@
-//Experimental cloner; clones a body regardless of the owner's status, letting a ghost control it instead
-/obj/machinery/clonepod/experimental
- name = "experimental cloning pod"
- desc = "An ancient cloning pod. It seems to be an early prototype of the experimental cloners used in Nanotrasen Stations."
- icon = 'icons/obj/machines/cloning.dmi'
- icon_state = "pod_0"
- req_access = null
- circuit = /obj/item/circuitboard/machine/clonepod/experimental
- internal_radio = FALSE
-
-//Start growing a human clone in the pod!
-/obj/machinery/clonepod/experimental/growclone(clonename, ui, mutation_index, mindref, last_death, blood_type, datum/species/mrace, list/features, factions, list/quirks)
- if(panel_open)
- return FALSE
- if(mess || attempting)
- return FALSE
-
- attempting = TRUE //One at a time!!
- countdown.start()
-
- var/mob/living/carbon/human/H = new /mob/living/carbon/human(src)
-
- H.hardset_dna(ui, mutation_index, H.real_name, blood_type, mrace, features)
-
- if(efficiency > 2)
- var/list/unclean_mutations = (GLOB.not_good_mutations|GLOB.bad_mutations)
- H.dna.remove_mutation_group(unclean_mutations)
- if(efficiency > 5 && prob(20))
- H.easy_randmut(POSITIVE)
- if(efficiency < 3 && prob(50))
- var/mob/M = H.easy_randmut(NEGATIVE+MINOR_NEGATIVE)
- if(ismob(M))
- H = M
-
- H.silent = 20 //Prevents an extreme edge case where clones could speak if they said something at exactly the right moment.
- occupant = H
-
- if(!clonename) //to prevent null names
- clonename = "clone ([rand(1,999)])"
- H.real_name = clonename
-
- icon_state = "pod_1"
- //Get the clone body ready
- maim_clone(H)
- ADD_TRAIT(H, TRAIT_STABLEHEART, "cloning")
- ADD_TRAIT(H, TRAIT_EMOTEMUTE, "cloning")
- ADD_TRAIT(H, TRAIT_MUTE, "cloning")
- ADD_TRAIT(H, TRAIT_NOBREATH, "cloning")
- ADD_TRAIT(H, TRAIT_NOCRITDAMAGE, "cloning")
- H.Unconscious(80)
-
- var/list/candidates = pollCandidatesForMob("Do you want to play as [clonename]'s defective clone?", null, null, null, 100, H)
- if(LAZYLEN(candidates))
- var/mob/C = pick(candidates)
- H.key = C.key
-
- if(grab_ghost_when == CLONER_FRESH_CLONE)
- H.grab_ghost()
- to_chat(H, "Consciousness slowly creeps over you as your body regenerates. So this is what cloning feels like?")
-
- if(grab_ghost_when == CLONER_MATURE_CLONE)
- H.ghostize(TRUE) //Only does anything if they were still in their old body and not already a ghost
- to_chat(H.get_ghost(TRUE), "Your body is beginning to regenerate in a cloning pod. You will become conscious when it is complete.")
-
- if(H)
- H.faction |= factions
-
- H.set_cloned_appearance()
-
- H.suiciding = FALSE
- attempting = FALSE
- return TRUE
-
-
-//Prototype cloning console, much more rudimental and lacks modern functions such as saving records, autocloning, or safety checks.
-/obj/machinery/computer/prototype_cloning
- name = "prototype cloning console"
- desc = "Used to operate an experimental cloner."
- icon_screen = "dna"
- icon_keyboard = "med_key"
- circuit = /obj/item/circuitboard/computer/prototype_cloning
- var/obj/machinery/dna_scannernew/scanner = null //Linked scanner. For scanning.
- var/list/pods //Linked experimental cloning pods
- var/temp = "Inactive"
- var/scantemp = "Ready to Scan"
- var/loading = FALSE // Nice loading text
-
- light_color = LIGHT_COLOR_BLUE
-
-/obj/machinery/computer/prototype_cloning/Initialize()
- . = ..()
- updatemodules(TRUE)
-
-/obj/machinery/computer/prototype_cloning/Destroy()
- if(pods)
- for(var/P in pods)
- DetachCloner(P)
- pods = null
- return ..()
-
-/obj/machinery/computer/prototype_cloning/proc/GetAvailablePod(mind = null)
- if(pods)
- for(var/P in pods)
- var/obj/machinery/clonepod/experimental/pod = P
- if(pod.is_operational() && !(pod.occupant || pod.mess))
- return pod
-
-/obj/machinery/computer/prototype_cloning/proc/updatemodules(findfirstcloner)
- scanner = findscanner()
- if(findfirstcloner && !LAZYLEN(pods))
- findcloner()
-
-/obj/machinery/computer/prototype_cloning/proc/findscanner()
- var/obj/machinery/dna_scannernew/scannerf = null
-
- // Loop through every direction
- for(var/direction in GLOB.cardinals)
- // Try to find a scanner in that direction
- scannerf = locate(/obj/machinery/dna_scannernew, get_step(src, direction))
- // If found and operational, return the scanner
- if (!isnull(scannerf) && scannerf.is_operational())
- return scannerf
-
- // If no scanner was found, it will return null
- return null
-
-/obj/machinery/computer/prototype_cloning/proc/findcloner()
- var/obj/machinery/clonepod/experimental/podf = null
- for(var/direction in GLOB.cardinals)
- podf = locate(/obj/machinery/clonepod/experimental, get_step(src, direction))
- if (!isnull(podf) && podf.is_operational())
- AttachCloner(podf)
-
-/obj/machinery/computer/prototype_cloning/proc/AttachCloner(obj/machinery/clonepod/experimental/pod)
- if(!pod.connected)
- pod.connected = src
- LAZYADD(pods, pod)
-
-/obj/machinery/computer/prototype_cloning/proc/DetachCloner(obj/machinery/clonepod/experimental/pod)
- pod.connected = null
- LAZYREMOVE(pods, pod)
-
-/obj/machinery/computer/prototype_cloning/attackby(obj/item/W, mob/user, params)
- if(istype(W, /obj/item/multitool))
- var/obj/item/multitool/P = W
-
- if(istype(P.buffer, /obj/machinery/clonepod/experimental))
- if(get_area(P.buffer) != get_area(src))
- to_chat(user, "-% Cannot link machines across power zones. Buffer cleared %-")
- P.buffer = null
- return
- to_chat(user, "-% Successfully linked [P.buffer] with [src] %-")
- var/obj/machinery/clonepod/experimental/pod = P.buffer
- if(pod.connected)
- pod.connected.DetachCloner(pod)
- AttachCloner(pod)
- else
- P.buffer = src
- to_chat(user, "-% Successfully stored [REF(P.buffer)] [P.buffer.name] in buffer %-")
- return
- else
- return ..()
-
-/obj/machinery/computer/prototype_cloning/attack_hand(mob/user)
- if(..())
- return
- interact(user)
-
-/obj/machinery/computer/prototype_cloning/interact(mob/user)
- user.set_machine(src)
- add_fingerprint(user)
-
- if(..())
- return
-
- updatemodules(TRUE)
-
- var/dat = ""
- dat += "Refresh"
-
- dat += "
Cloning Pod Status
"
- dat += "
[temp]
"
-
- if (isnull(src.scanner) || !LAZYLEN(pods))
- dat += "
Modules
"
- //dat += "Reload Modules"
- if (isnull(src.scanner))
- dat += "ERROR: No Scanner detected! "
- if (!LAZYLEN(pods))
- dat += "ERROR: No Pod detected "
-
- // Scan-n-Clone
- if (!isnull(src.scanner))
- var/mob/living/scanner_occupant = get_mob_or_brainmob(scanner.occupant)
-
- dat += "
Cloning
"
-
- dat += "
"
- if(!scanner_occupant)
- dat += "Scanner Unoccupied"
- else if(loading)
- dat += "[scanner_occupant] => Scanning..."
- else
- scantemp = "Ready to Clone"
- dat += "[scanner_occupant] => [scantemp]"
- dat += "
"
-
- if(scanner_occupant)
- dat += "Clone"
- dat += " [src.scanner.locked ? "Unlock Scanner" : "Lock Scanner"]"
- else
- dat += "Clone"
-
- var/datum/browser/popup = new(user, "cloning", "Prototype Cloning System Control")
- popup.set_content(dat)
- popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
- popup.open()
-
-/obj/machinery/computer/prototype_cloning/Topic(href, href_list)
- if(..())
- return
-
- if(loading)
- return
-
- else if ((href_list["clone"]) && !isnull(scanner) && scanner.is_operational())
- scantemp = ""
-
- loading = TRUE
- updateUsrDialog()
- playsound(src, 'sound/machines/terminal_prompt.ogg', 50, 0)
- say("Initiating scan...")
-
- spawn(20)
- clone_occupant(scanner.occupant)
- loading = FALSE
- updateUsrDialog()
- playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
-
- //No locking an open scanner.
- else if ((href_list["lock"]) && !isnull(scanner) && scanner.is_operational())
- if ((!scanner.locked) && (scanner.occupant))
- scanner.locked = TRUE
- playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
- else
- scanner.locked = FALSE
- playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
-
- else if (href_list["refresh"])
- updateUsrDialog()
- playsound(src, "terminal_type", 25, 0)
-
- add_fingerprint(usr)
- updateUsrDialog()
- return
-
-/obj/machinery/computer/prototype_cloning/proc/clone_occupant(occupant)
- var/mob/living/mob_occupant = get_mob_or_brainmob(occupant)
- var/datum/dna/dna
- if(ishuman(mob_occupant))
- var/mob/living/carbon/C = mob_occupant
- dna = C.has_dna()
- if(isbrain(mob_occupant))
- var/mob/living/brain/B = mob_occupant
- dna = B.stored_dna
-
- if(!istype(dna))
- scantemp = "Unable to locate valid genetic data."
- playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
- return
- if((HAS_TRAIT(mob_occupant, TRAIT_NOCLONE)) && (src.scanner.scan_level < 2))
- scantemp = "Subject no longer contains the fundamental materials required to create a living clone."
- playsound(src, 'sound/machines/terminal_alert.ogg', 50, 0)
- return
-
- var/clone_species
- if(dna.species)
- clone_species = dna.species
- else
- var/datum/species/rando_race = pick(GLOB.roundstart_races)
- clone_species = rando_race.type
-
- var/obj/machinery/clonepod/pod = GetAvailablePod()
- //Can't clone without someone to clone. Or a pod. Or if the pod is busy. Or full of gibs.
- if(!LAZYLEN(pods))
- temp = "No Clonepods detected."
- playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
- else if(!pod)
- temp = "No Clonepods available."
- playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
- else if(pod.occupant)
- temp = "Cloning cycle already in progress."
- playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
- else
- pod.growclone(mob_occupant.real_name, dna.uni_identity, dna.mutation_index, null, null, dna.blood_type, clone_species, dna.features, mob_occupant.faction)
- temp = "[mob_occupant.real_name] => Cloning data sent to pod."
- playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
-
diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm
index 0b23e650d7..000b3dc7b5 100644
--- a/code/game/machinery/firealarm.dm
+++ b/code/game/machinery/firealarm.dm
@@ -141,7 +141,7 @@
if(user)
log_game("[user] reset a fire alarm at [COORD(src)]")
-/obj/machinery/firealarm/attack_hand(mob/user)
+/obj/machinery/firealarm/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(buildstage != 2)
return ..()
add_fingerprint(user)
diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm
index f4f1aa0637..c0e1122140 100644
--- a/code/game/machinery/flasher.dm
+++ b/code/game/machinery/flasher.dm
@@ -36,6 +36,9 @@
else
bulb = new(src)
+/obj/machinery/flasher/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE)
+ id = "[idnum][id]"
+
/obj/machinery/flasher/Destroy()
QDEL_NULL(bulb)
return ..()
diff --git a/code/game/machinery/gulag_item_reclaimer.dm b/code/game/machinery/gulag_item_reclaimer.dm
index 55b1e34022..45484caa77 100644
--- a/code/game/machinery/gulag_item_reclaimer.dm
+++ b/code/game/machinery/gulag_item_reclaimer.dm
@@ -31,7 +31,7 @@
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, "gulag_item_reclaimer", name, 300, 400, master_ui, state)
+ ui = new(user, src, ui_key, "GulagItemReclaimer", name, 300, 400, master_ui, state)
ui.open()
/obj/machinery/gulag_item_reclaimer/ui_data(mob/user)
diff --git a/code/game/machinery/gulag_teleporter.dm b/code/game/machinery/gulag_teleporter.dm
index fb41ac986d..da64699dd4 100644
--- a/code/game/machinery/gulag_teleporter.dm
+++ b/code/game/machinery/gulag_teleporter.dm
@@ -101,8 +101,6 @@ The console is located at computer/gulag_teleporter.dm
if(!locked)
open_machine()
return
- user.changeNext_move(CLICK_CD_BREAKOUT)
- user.last_special = world.time + CLICK_CD_BREAKOUT
user.visible_message("You see [user] kicking against the door of [src]!", \
"You lean on the back of [src] and start pushing the door open... (this will take about [DisplayTimeText(breakout_time)].)", \
"You hear a metallic creaking from [src].")
diff --git a/code/game/machinery/harvester.dm b/code/game/machinery/harvester.dm
index 141f261688..191967ac1a 100644
--- a/code/game/machinery/harvester.dm
+++ b/code/game/machinery/harvester.dm
@@ -50,7 +50,7 @@
harvesting = FALSE
warming_up = FALSE
-/obj/machinery/harvester/attack_hand(mob/user)
+/obj/machinery/harvester/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(state_open)
close_machine()
else if(!harvesting)
diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm
index 621e486e90..25f4248d6d 100644
--- a/code/game/machinery/hologram.dm
+++ b/code/game/machinery/hologram.dm
@@ -78,7 +78,7 @@ GLOBAL_LIST_EMPTY(network_holopads)
new_disk.forceMove(src)
disk = new_disk
-/obj/machinery/holopad/tutorial/attack_hand(mob/user)
+/obj/machinery/holopad/tutorial/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(!istype(user))
return
if(user.incapacitated() || !is_operational())
diff --git a/code/game/machinery/hypnochair.dm b/code/game/machinery/hypnochair.dm
index 1b57f61b79..16b464ced6 100644
--- a/code/game/machinery/hypnochair.dm
+++ b/code/game/machinery/hypnochair.dm
@@ -37,7 +37,7 @@
/obj/machinery/hypnochair/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.notcontained_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
- ui = new(user, src, ui_key, "hypnochair", name, ui_x, ui_y, master_ui, state)
+ ui = new(user, src, ui_key, "HypnoChair", name, ui_x, ui_y, master_ui, state)
ui.open()
/obj/machinery/hypnochair/ui_data()
@@ -178,8 +178,6 @@
icon_state += "_occupied"
/obj/machinery/hypnochair/container_resist(mob/living/user)
- user.changeNext_move(CLICK_CD_BREAKOUT)
- user.last_special = world.time + CLICK_CD_BREAKOUT
user.visible_message("You see [user] kicking against the door of [src]!", \
"You lean on the back of [src] and start pushing the door open... (this will take about [DisplayTimeText(600)].)", \
"You hear a metallic creaking from [src].")
diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm
index 099b51db82..ba4d01cfe5 100644
--- a/code/game/machinery/igniter.dm
+++ b/code/game/machinery/igniter.dm
@@ -26,10 +26,7 @@
on = TRUE
icon_state = "igniter1"
-/obj/machinery/igniter/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/machinery/igniter/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
add_fingerprint(user)
use_power(50)
@@ -53,6 +50,9 @@
else
icon_state = "igniter0"
+/obj/machinery/igniter/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE)
+ id = "[idnum][id]"
+
// Wall mounted remote-control igniter.
/obj/machinery/sparker
diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm
index ad5df7cea0..bf71786a05 100644
--- a/code/game/machinery/iv_drip.dm
+++ b/code/game/machinery/iv_drip.dm
@@ -13,7 +13,8 @@
var/obj/item/reagent_containers/beaker
var/static/list/drip_containers = typecacheof(list(/obj/item/reagent_containers/blood,
/obj/item/reagent_containers/food,
- /obj/item/reagent_containers/glass))
+ /obj/item/reagent_containers/glass,
+ /obj/item/reagent_containers/chem_pack))
/obj/machinery/iv_drip/Initialize(mapload)
. = ..()
@@ -157,12 +158,7 @@
attached.transfer_blood_to(beaker, amount)
update_icon()
-/obj/machinery/iv_drip/attack_hand(mob/user)
- . = ..()
- if(.)
- return
- if(!ishuman(user))
- return
+/obj/machinery/iv_drip/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(attached)
visible_message("[attached] is detached from [src]")
attached = null
@@ -173,7 +169,11 @@
else
toggle_mode()
-/obj/machinery/iv_drip/verb/eject_beaker()
+/obj/machinery/iv_drip/attack_robot(mob/user)
+ if(Adjacent(user))
+ attack_hand(user)
+
+/obj/machinery/iv_drip/verb/eject_beaker(mob/user)
set category = "Object"
set name = "Remove IV Container"
set src in view(1)
@@ -188,6 +188,8 @@
if(usr && Adjacent(usr) && usr.can_hold_items())
if(!usr.put_in_hands(beaker))
beaker.forceMove(drop_location())
+ if(iscyborg(user))
+ beaker.forceMove(drop_location())
beaker = null
update_icon()
diff --git a/code/game/machinery/launch_pad.dm b/code/game/machinery/launch_pad.dm
index c8219e9ebf..63ef40e045 100644
--- a/code/game/machinery/launch_pad.dm
+++ b/code/game/machinery/launch_pad.dm
@@ -285,8 +285,7 @@
/obj/item/launchpad_remote/ui_interact(mob/user, ui_key = "launchpad_remote", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
- ui = new(user, src, ui_key, "launchpad_remote", "Briefcase Launchpad Remote", 300, 240, master_ui, state) //width, height
- ui.set_style("syndicate")
+ ui = new(user, src, ui_key, "LaunchpadRemote", "Briefcase Launchpad Remote", 300, 240, master_ui, state) //width, height
ui.open()
ui.set_autoupdate(TRUE)
diff --git a/code/game/machinery/mass_driver.dm b/code/game/machinery/mass_driver.dm
index ab0a0534ab..a8fa31d5fb 100644
--- a/code/game/machinery/mass_driver.dm
+++ b/code/game/machinery/mass_driver.dm
@@ -11,6 +11,8 @@
var/id = 1
var/drive_range = 50 //this is mostly irrelevant since current mass drivers throw into space, but you could make a lower-range mass driver for interstation transport or something I guess.
+/obj/machinery/mass_driver/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE)
+ id = "[idnum][id]"
/obj/machinery/mass_driver/proc/drive(amount)
if(stat & (BROKEN|NOPOWER))
diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm
index 1887ee46c0..2a60711a81 100644
--- a/code/game/machinery/porta_turret/portable_turret.dm
+++ b/code/game/machinery/porta_turret/portable_turret.dm
@@ -17,6 +17,7 @@
active_power_usage = 300 //when active, this turret takes up constant 300 Equipment power
req_access = list(ACCESS_SEC_DOORS)
power_channel = EQUIP //drains power from the EQUIPMENT channel
+ speed_process = TRUE
var/base_icon_state = "standard"
var/scan_range = 7
@@ -53,7 +54,7 @@
var/last_fired = 0 //world.time the turret last fired
var/shot_delay = 15 //ticks until next shot (1.5 ?)
-
+ var/shot_stagger = 0 // sleep() shots to stagger attacks
var/check_records = 1 //checks if it can use the security records
var/criminals = 1 //checks if it can shoot people on arrest
@@ -436,6 +437,9 @@
else if(!always_up)
popDown() // no valid targets, close the cover
+/obj/machinery/porta_turret/proc/randomize_shot_stagger()
+ shot_stagger = rand(0, min(2 SECONDS, round(shot_delay/3, world.tick_lag)))
+
/obj/machinery/porta_turret/proc/tryToShootAt(list/atom/movable/targets)
while(targets.len > 0)
var/atom/movable/M = pick(targets)
@@ -443,7 +447,6 @@
if(target(M))
return 1
-
/obj/machinery/porta_turret/proc/popUp() //pops the turret up
if(!anchored)
return
@@ -525,11 +528,14 @@
if(target)
popUp() //pop the turret up if it's not already up.
setDir(get_dir(base, target))//even if you can't shoot, follow the target
- shootAt(target)
+ INVOKE_ASYNC(src, .proc/shootAt, target)
return 1
return
-/obj/machinery/porta_turret/proc/shootAt(atom/movable/target)
+/obj/machinery/porta_turret/proc/shootAt(atom/movable/target, stagger_enabled = FALSE)
+ if(stagger_enabled)
+ randomize_shot_stagger()
+ sleep(shot_stagger)
if(!raised) //the turret has to be raised in order to fire - makes sense, right?
return
diff --git a/code/game/machinery/porta_turret/portable_turret_construct.dm b/code/game/machinery/porta_turret/portable_turret_construct.dm
index 9d86e3792d..7c2000175e 100644
--- a/code/game/machinery/porta_turret/portable_turret_construct.dm
+++ b/code/game/machinery/porta_turret/portable_turret_construct.dm
@@ -79,6 +79,9 @@
if(PTURRET_INTERNAL_ARMOUR_ON)
if(istype(I, /obj/item/gun/energy)) //the gun installation part
var/obj/item/gun/energy/E = I
+ if(!E.can_turret)
+ to_chat(user, "[src] can't be fit into turrets.")
+ return
if(!user.transferItemToLoc(E, src))
return
installed_gun = E
@@ -168,10 +171,7 @@
return ..()
-/obj/machinery/porta_turret_construct/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/machinery/porta_turret_construct/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
switch(build_step)
if(PTURRET_GUN_EQUIPPED)
build_step = PTURRET_INTERNAL_ARMOUR_ON
diff --git a/code/game/machinery/porta_turret/portable_turret_cover.dm b/code/game/machinery/porta_turret/portable_turret_cover.dm
index 7fdb9b38be..e0746bda78 100644
--- a/code/game/machinery/porta_turret/portable_turret_cover.dm
+++ b/code/game/machinery/porta_turret/portable_turret_cover.dm
@@ -31,10 +31,7 @@
return parent_turret.attack_ai(user)
-/obj/machinery/porta_turret_cover/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/machinery/porta_turret_cover/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
return parent_turret.attack_hand(user)
diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm
old mode 100644
new mode 100755
index 2fff2011c1..1d118023c9
--- a/code/game/machinery/recharger.dm
+++ b/code/game/machinery/recharger.dm
@@ -19,7 +19,7 @@
/obj/item/modular_computer,
/obj/item/ammo_casing/mws_batt,
/obj/item/ammo_box/magazine/mws_mag,
- /obj/item/twohanded/electrostaff,
+ /obj/item/electrostaff,
/obj/item/gun/ballistic/automatic/magrifle))
/obj/machinery/recharger/RefreshParts()
@@ -108,10 +108,7 @@
return ..()
-/obj/machinery/recharger/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/machinery/recharger/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
add_fingerprint(user)
if(charging)
diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm
index 8680aa69e6..706d2bb9bf 100644
--- a/code/game/machinery/recycler.dm
+++ b/code/game/machinery/recycler.dm
@@ -225,6 +225,6 @@
/obj/item/paper/guides/recycler
name = "paper - 'garbage duty instructions'"
- info = "
New Assignment
You have been assigned to collect garbage from trash bins, located around the station. The crewmembers will put their trash into it and you will collect the said trash.
There is a recycling machine near your closet, inside maintenance; use it to recycle the trash for a small chance to get useful minerals. Then deliver these minerals to cargo or engineering. You are our last hope for a clean station, do not screw this up!"
+ info = "_New Assignment_\n\n You have been assigned to collect garbage from trash bins, located around the station. The crewmembers will put their trash into it and you will collect the said trash.
\n" // less lines than in woundscan() so we don't overload people trying to get basic med info
+ msg += "\n"
for(var/thing in M.diseases)
var/datum/disease/D = thing
@@ -414,7 +436,7 @@ GENETICS SCANNER
var/blood_typepath = C.get_blood_id()
if(blood_typepath)
if(ishuman(C))
- if(H.bleed_rate)
+ if(H.is_bleeding())
msg += "Subject is bleeding!\n"
var/blood_percent = round((C.scan_blood_volume() / (BLOOD_VOLUME_NORMAL * C.blood_ratio))*100)
var/blood_type = C.dna.blood_type
@@ -505,6 +527,67 @@ GENETICS SCANNER
desc = "A hand-held body scanner able to distinguish vital signs of the subject with high accuracy."
advanced = TRUE
+/// Displays wounds with extended information on their status vs medscanners
+/proc/woundscan(mob/user, mob/living/carbon/patient, obj/item/healthanalyzer/wound/scanner)
+ if(!istype(patient))
+ return
+
+ var/render_list = ""
+ for(var/i in patient.get_wounded_bodyparts())
+ var/obj/item/bodypart/wounded_part = i
+ render_list += "Warning: Physical trauma[LAZYLEN(wounded_part.wounds) > 1? "s" : ""] detected in [wounded_part.name]"
+ for(var/k in wounded_part.wounds)
+ var/datum/wound/W = k
+ render_list += "
[W.get_scanner_description()]
\n"
+ render_list += ""
+
+ if(render_list == "")
+ if(istype(scanner))
+ // Only emit the cheerful scanner message if this scan came from a scanner
+ playsound(scanner, 'sound/machines/ping.ogg', 50, FALSE)
+ to_chat(user, "\The [scanner] makes a happy ping and briefly displays a smiley face with several exclamation points! It's really excited to report that [patient] has no wounds!")
+ else
+ to_chat(user, "No wounds detected in subject.")
+ else
+ to_chat(user, jointext(render_list, ""))
+
+/obj/item/healthanalyzer/wound
+ name = "first aid analyzer"
+ icon_state = "adv_spectrometer"
+ desc = "A prototype MeLo-Tech medical scanner used to diagnose injuries and recommend treatment for serious wounds, but offers no further insight into the patient's health. You hope the final version is less annoying to read!"
+ var/next_encouragement
+ var/greedy
+
+/obj/item/healthanalyzer/wound/attack_self(mob/user)
+ if(next_encouragement < world.time)
+ playsound(src, 'sound/machines/ping.ogg', 50, FALSE)
+ var/list/encouragements = list("briefly displays a happy face, gazing emptily at you", "briefly displays a spinning cartoon heart", "displays an encouraging message about eating healthy and exercising", \
+ "reminds you that everyone is doing their best", "displays a message wishing you well", "displays a sincere thank-you for your interest in first-aid", "formally absolves you of all your sins")
+ to_chat(user, "\The [src] makes a happy ping and [pick(encouragements)]!")
+ next_encouragement = world.time + 10 SECONDS
+ greedy = FALSE
+ else if(!greedy)
+ to_chat(user, "\The [src] displays an eerily high-definition frowny face, chastizing you for asking it for too much encouragement.")
+ greedy = TRUE
+ else
+ playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE)
+ if(isliving(user))
+ var/mob/living/L = user
+ to_chat(L, "\The [src] makes a disappointed buzz and pricks your finger for being greedy. Ow!")
+ L.adjustBruteLoss(4)
+ L.dropItemToGround(src)
+
+/obj/item/healthanalyzer/wound/attack(mob/living/carbon/patient, mob/living/carbon/human/user)
+ add_fingerprint(user)
+ user.visible_message("[user] scans [patient] for serious injuries.", "You scan [patient] for serious injuries.")
+
+ if(!istype(patient))
+ playsound(src, 'sound/machines/buzz-sigh.ogg', 30, TRUE)
+ to_chat(user, "\The [src] makes a sad buzz and briefly displays a frowny face, indicating it can't scan [patient].")
+ return
+
+ woundscan(user, patient, src)
+
/obj/item/analyzer
desc = "A hand-held environmental scanner which reports current gas levels. Alt-Click to use the built in barometer function."
name = "analyzer"
@@ -541,57 +624,13 @@ GENETICS SCANNER
if (user.stat || user.eye_blind)
return
- var/turf/location = user.loc
+ //Functionality moved down to proc/scan_turf()
+ var/turf/location = get_turf(user)
if(!istype(location))
return
-
- var/datum/gas_mixture/environment = location.return_air()
-
- var/pressure = environment.return_pressure()
- var/total_moles = environment.total_moles()
-
- to_chat(user, "Results:")
- if(abs(pressure - ONE_ATMOSPHERE) < 10)
- to_chat(user, "Pressure: [round(pressure, 0.01)] kPa")
- else
- to_chat(user, "Pressure: [round(pressure, 0.01)] kPa")
- if(total_moles)
- var/list/env_gases = environment.gases
-
- var/o2_concentration = env_gases[/datum/gas/oxygen]/total_moles
- var/n2_concentration = env_gases[/datum/gas/nitrogen]/total_moles
- var/co2_concentration = env_gases[/datum/gas/carbon_dioxide]/total_moles
- var/plasma_concentration = env_gases[/datum/gas/plasma]/total_moles
-
- if(abs(n2_concentration - N2STANDARD) < 20)
- to_chat(user, "Nitrogen: [round(n2_concentration*100, 0.01)] % ([round(env_gases[/datum/gas/nitrogen], 0.01)] mol)")
- else
- to_chat(user, "Nitrogen: [round(n2_concentration*100, 0.01)] % ([round(env_gases[/datum/gas/nitrogen], 0.01)] mol)")
-
- if(abs(o2_concentration - O2STANDARD) < 2)
- to_chat(user, "Oxygen: [round(o2_concentration*100, 0.01)] % ([round(env_gases[/datum/gas/oxygen], 0.01)] mol)")
- else
- to_chat(user, "Oxygen: [round(o2_concentration*100, 0.01)] % ([round(env_gases[/datum/gas/oxygen], 0.01)] mol)")
-
- if(co2_concentration > 0.01)
- to_chat(user, "CO2: [round(co2_concentration*100, 0.01)] % ([round(env_gases[/datum/gas/carbon_dioxide], 0.01)] mol)")
- else
- to_chat(user, "CO2: [round(co2_concentration*100, 0.01)] % ([round(env_gases[/datum/gas/carbon_dioxide], 0.01)] mol)")
-
- if(plasma_concentration > 0.005)
- to_chat(user, "Plasma: [round(plasma_concentration*100, 0.01)] % ([round(env_gases[/datum/gas/plasma], 0.01)] mol)")
- else
- to_chat(user, "Plasma: [round(plasma_concentration*100, 0.01)] % ([round(env_gases[/datum/gas/plasma], 0.01)] mol)")
-
- GAS_GARBAGE_COLLECT(environment.gases)
-
- for(var/id in env_gases)
- if(id in GLOB.hardcoded_gases)
- continue
- var/gas_concentration = env_gases[id]/total_moles
- to_chat(user, "[GLOB.meta_gas_names[id]]: [round(gas_concentration*100, 0.01)] % ([round(env_gases[id], 0.01)] mol)")
- to_chat(user, "Temperature: [round(environment.temperature-T0C, 0.01)] °C ([round(environment.temperature, 0.01)] K)")
-
+
+ scan_turf(user, location)
+
/obj/item/analyzer/AltClick(mob/user) //Barometer output for measuring when the next storm happens
. = ..()
@@ -670,7 +709,7 @@ GENETICS SCANNER
var/total_moles = air_contents.total_moles()
var/pressure = air_contents.return_pressure()
var/volume = air_contents.return_volume() //could just do mixture.volume... but safety, I guess?
- var/temperature = air_contents.temperature
+ var/temperature = air_contents.return_temperature()
var/cached_scan_results = air_contents.analyzer_results
if(total_moles > 0)
@@ -678,10 +717,9 @@ GENETICS SCANNER
to_chat(user, "Volume: [volume] L")
to_chat(user, "Pressure: [round(pressure,0.01)] kPa")
- var/list/cached_gases = air_contents.gases
- for(var/id in cached_gases)
- var/gas_concentration = cached_gases[id]/total_moles
- to_chat(user, "[GLOB.meta_gas_names[id]]: [round(gas_concentration*100, 0.01)] % ([round(cached_gases[id], 0.01)] mol)")
+ for(var/id in air_contents.get_gases())
+ var/gas_concentration = air_contents.get_moles(id)/total_moles
+ to_chat(user, "[GLOB.meta_gas_names[id]]: [round(gas_concentration*100, 0.01)] % ([round(air_contents.get_moles(id), 0.01)] mol)")
to_chat(user, "Temperature: [round(temperature - T0C,0.01)] °C ([round(temperature, 0.01)] K)")
else
@@ -697,6 +735,73 @@ GENETICS SCANNER
to_chat(user, "Power of the last fusion reaction: [fusion_power]\n This power indicates it was a [tier]-tier fusion reaction.")
return
+/obj/item/analyzer/proc/scan_turf(mob/user, turf/location)
+
+ var/datum/gas_mixture/environment = location.return_air()
+
+ var/pressure = environment.return_pressure()
+ var/total_moles = environment.total_moles()
+ var/cached_scan_results = environment.analyzer_results
+
+ to_chat(user, "Results:")
+ if(abs(pressure - ONE_ATMOSPHERE) < 10)
+ to_chat(user, "Pressure: [round(pressure, 0.01)] kPa")
+ else
+ to_chat(user, "Pressure: [round(pressure, 0.01)] kPa")
+ if(total_moles)
+
+ var/o2_concentration = environment.get_moles(/datum/gas/oxygen)/total_moles
+ var/n2_concentration = environment.get_moles(/datum/gas/nitrogen)/total_moles
+ var/co2_concentration = environment.get_moles(/datum/gas/carbon_dioxide)/total_moles
+ var/plasma_concentration = environment.get_moles(/datum/gas/plasma)/total_moles
+
+ if(abs(n2_concentration - N2STANDARD) < 20)
+ to_chat(user, "Nitrogen: [round(n2_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/nitrogen), 0.01)] mol)")
+ else
+ to_chat(user, "Nitrogen: [round(n2_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/nitrogen), 0.01)] mol)")
+
+ if(abs(o2_concentration - O2STANDARD) < 2)
+ to_chat(user, "Oxygen: [round(o2_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/oxygen), 0.01)] mol)")
+ else
+ to_chat(user, "Oxygen: [round(o2_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/oxygen), 0.01)] mol)")
+
+ if(co2_concentration > 0.01)
+ to_chat(user, "CO2: [round(co2_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/carbon_dioxide), 0.01)] mol)")
+ else
+ to_chat(user, "CO2: [round(co2_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/carbon_dioxide), 0.01)] mol)")
+
+ if(plasma_concentration > 0.005)
+ to_chat(user, "Plasma: [round(plasma_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/plasma), 0.01)] mol)")
+ else
+ to_chat(user, "Plasma: [round(plasma_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/plasma), 0.01)] mol)")
+
+ for(var/id in environment.get_gases())
+ if(id in GLOB.hardcoded_gases)
+ continue
+ var/gas_concentration = environment.get_moles(id)/total_moles
+ to_chat(user, "[GLOB.meta_gas_names[id]]: [round(gas_concentration*100, 0.01)] % ([round(environment.get_moles(id), 0.01)] mol)")
+ to_chat(user, "Temperature: [round(environment.return_temperature()-T0C, 0.01)] °C ([round(environment.return_temperature(), 0.01)] K)")
+
+ if(cached_scan_results && cached_scan_results["fusion"]) //notify the user if a fusion reaction was detected
+ var/fusion_power = round(cached_scan_results["fusion"], 0.01)
+ var/tier = fusionpower2text(fusion_power)
+ to_chat(user, "Large amounts of free neutrons detected in the air indicate that a fusion reaction took place.")
+ to_chat(user, "Power of the last fusion reaction: [fusion_power]\n This power indicates it was a [tier]-tier fusion reaction.")
+
+/obj/item/analyzer/ranged
+ desc = "A hand-held scanner which uses advanced spectroscopy and infrared readings to analyze gases as a distance. Alt-Click to use the built in barometer function."
+ name = "long-range analyzer"
+ icon = 'icons/obj/device.dmi'
+ icon_state = "ranged_analyzer"
+
+/obj/item/analyzer/ranged/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
+ . = ..()
+ if(target.tool_act(user, src, tool_behaviour))
+ return
+ // Tool act didn't scan it, so let's get it's turf.
+ var/turf/location = get_turf(target)
+ scan_turf(user, location)
+
//slime scanner
/obj/item/slime_scanner
@@ -882,3 +987,9 @@ GENETICS SCANNER
return "[HM.name] ([HM.alias])"
else
return HM.alias
+
+#undef SCANMODE_HEALTH
+#undef SCANMODE_CHEMICAL
+#undef SCANMODE_WOUND
+#undef SCANNER_CONDENSED
+#undef SCANNER_VERBOSE
\ No newline at end of file
diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm
index 78a1a3bfda..cef06bfde8 100644
--- a/code/game/objects/items/devices/taperecorder.dm
+++ b/code/game/objects/items/devices/taperecorder.dm
@@ -54,8 +54,7 @@
mytape.ruin() //Fires destroy the tape
..()
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/item/taperecorder/attack_hand(mob/user)
+/obj/item/taperecorder/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(loc == user)
if(mytape)
if(!user.is_holding(src))
diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm
index b6261b9060..4d255fd339 100644
--- a/code/game/objects/items/devices/traitordevices.dm
+++ b/code/game/objects/items/devices/traitordevices.dm
@@ -76,6 +76,9 @@ effective or pretty fucking useless.
var/used = 0 // is it cooling down?
var/stealth = FALSE
+ var/ui_x = 320
+ var/ui_y = 335
+
/obj/item/healthanalyzer/rad_laser/attack(mob/living/M, mob/living/user)
if(!stealth || !irradiate)
..()
@@ -111,7 +114,12 @@ effective or pretty fucking useless.
ui_interact(user)
/obj/item/healthanalyzer/rad_laser/ui_interact(mob/user)
- . = ..()
+/obj/item/healthanalyzer/rad_laser/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
+ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.hands_state)
+ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "RadioactiveMicrolaser", "Radioactive Microlaser", ui_x, ui_y, master_ui, state)
+ ui.open()
var/dat = "Irradiation: [irradiate ? "On" : "Off"] "
dat += "Stealth Mode (NOTE: Deactivates automatically while Irradiation is off): [stealth ? "On" : "Off"] "
diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm
index b929642f33..c791b7e323 100644
--- a/code/game/objects/items/devices/transfer_valve.dm
+++ b/code/game/objects/items/devices/transfer_valve.dm
@@ -13,6 +13,8 @@
var/mob/attacher = null
var/valve_open = FALSE
var/toggle = 1
+ var/ui_x = 310
+ var/ui_y = 320
/obj/item/transfer_valve/IsAssemblyHolder()
return TRUE
@@ -77,7 +79,7 @@
if(attached_device)
attached_device.Crossed(AM)
-/obj/item/transfer_valve/attack_hand()//Triggers mousetraps
+/obj/item/transfer_valve/on_attack_hand()//Triggers mousetraps
. = ..()
if(.)
return
@@ -168,8 +170,8 @@
target_self = TRUE
if(change_volume)
if(!target_self)
- target.volume += tank_two.volume
- target.volume += tank_one.air_contents.volume
+ target.set_volume(target.return_volume() + tank_two.volume)
+ target.set_volume(target.return_volume() + tank_one.air_contents.return_volume())
var/datum/gas_mixture/temp
temp = tank_one.air_contents.remove_ratio(1)
target.merge(temp)
@@ -180,11 +182,11 @@
/obj/item/transfer_valve/proc/split_gases()
if (!valve_open || !tank_one || !tank_two)
return
- var/ratio1 = tank_one.air_contents.volume/tank_two.air_contents.volume
+ var/ratio1 = tank_one.air_contents.return_volume()/tank_two.air_contents.return_volume()
var/datum/gas_mixture/temp
temp = tank_two.air_contents.remove_ratio(ratio1)
tank_one.air_contents.merge(temp)
- tank_two.air_contents.volume -= tank_one.air_contents.volume
+ tank_two.air_contents.set_volume(tank_two.air_contents.return_volume() - tank_one.air_contents.return_volume())
/*
Exadv1: I know this isn't how it's going to work, but this was just to check
@@ -235,3 +237,52 @@
// eventually maybe have it update icon to show state (timer, prox etc.) like old bombs
/obj/item/transfer_valve/proc/c_state()
return
+
+/obj/item/transfer_valve/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
+ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.hands_state)
+ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "TransferValve", name, ui_x, ui_y, master_ui, state)
+ ui.open()
+
+/obj/item/transfer_valve/ui_data(mob/user)
+ var/list/data = list()
+ data["tank_one"] = tank_one
+ data["tank_two"] = tank_two
+ data["attached_device"] = attached_device
+ data["valve"] = valve_open
+ return data
+
+/obj/item/transfer_valve/ui_act(action, params)
+ if(..())
+ return
+
+ switch(action)
+ if("tankone")
+ if(tank_one)
+ split_gases()
+ valve_open = FALSE
+ tank_one.forceMove(drop_location())
+ tank_one = null
+ . = TRUE
+ if("tanktwo")
+ if(tank_two)
+ split_gases()
+ valve_open = FALSE
+ tank_two.forceMove(drop_location())
+ tank_two = null
+ . = TRUE
+ if("toggle")
+ toggle_valve()
+ . = TRUE
+ if("device")
+ if(attached_device)
+ attached_device.attack_self(usr)
+ . = TRUE
+ if("remove_device")
+ if(attached_device)
+ attached_device.on_detach()
+ attached_device = null
+ . = TRUE
+
+ update_icon()
diff --git a/code/game/objects/items/dice.dm b/code/game/objects/items/dice.dm
index 4fdb862288..2fe4c67362 100644
--- a/code/game/objects/items/dice.dm
+++ b/code/game/objects/items/dice.dm
@@ -1,10 +1,10 @@
-/obj/item/storage/pill_bottle/dice
+/obj/item/storage/box/dice
name = "bag of dice"
desc = "Contains all the luck you'll ever need."
icon = 'icons/obj/dice.dmi'
icon_state = "dicebag"
-/obj/item/storage/pill_bottle/dice/Initialize()
+/obj/item/storage/box/dice/Initialize()
. = ..()
var/special_die = pick("1","2","fudge","space","00","8bd20","4dd6","100")
if(special_die == "1")
@@ -30,7 +30,7 @@
if(special_die == "100")
new /obj/item/dice/d100(src)
-/obj/item/storage/pill_bottle/dice/suicide_act(mob/user)
+/obj/item/storage/box/dice/suicide_act(mob/user)
user.visible_message("[user] is gambling with death! It looks like [user.p_theyre()] trying to commit suicide!")
return (OXYLOSS)
diff --git a/code/game/objects/items/dualsaber.dm b/code/game/objects/items/dualsaber.dm
new file mode 100644
index 0000000000..08460993ee
--- /dev/null
+++ b/code/game/objects/items/dualsaber.dm
@@ -0,0 +1,355 @@
+/*
+ * Double-Bladed Energy Swords - Cheridan
+ */
+/obj/item/dualsaber
+ icon_state = "dualsaber0"
+ lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
+ name = "double-bladed energy sword"
+ desc = "Handle with care."
+ force = 3
+ throwforce = 5
+ throw_speed = 3
+ throw_range = 5
+ w_class = WEIGHT_CLASS_SMALL
+ item_flags = SLOWS_WHILE_IN_HAND
+ var/w_class_on = WEIGHT_CLASS_BULKY
+ hitsound = "swing_hit"
+ var/hitsound_on = 'sound/weapons/blade1.ogg'
+ armour_penetration = 35
+ var/saber_color = "green"
+ light_color = "#00ff00"//green
+ attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
+ max_integrity = 200
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 70)
+ resistance_flags = FIRE_PROOF
+ wound_bonus = -110
+ bare_wound_bonus = 20
+ block_parry_data = /datum/block_parry_data/dual_esword
+ var/hacked = FALSE
+ /// Can this reflect all energy projectiles?
+ var/can_reflect = TRUE
+ var/brightness_on = 6 //TWICE AS BRIGHT AS A REGULAR ESWORD
+ var/list/possible_colors = list("red", "blue", "green", "purple")
+ var/list/rainbow_colors = list(LIGHT_COLOR_RED, LIGHT_COLOR_GREEN, LIGHT_COLOR_LIGHT_CYAN, LIGHT_COLOR_LAVENDER)
+ var/spinnable = TRUE
+ total_mass = 0.4 //Survival flashlights typically weigh around 5 ounces.
+ var/total_mass_on = 3.4
+ var/wielded = FALSE // track wielded status on item
+ var/slowdown_wielded = 0
+
+/datum/block_parry_data/dual_esword
+ block_damage_absorption = 2
+ block_damage_multiplier = 0.15
+ block_damage_multiplier_override = list(
+ ATTACK_TYPE_MELEE = 0.25
+ )
+ block_start_delay = 0 // instantaneous block
+ block_stamina_cost_per_second = 2.5
+ block_stamina_efficiency = 3
+ block_lock_sprinting = TRUE
+ // no attacking while blocking
+ block_lock_attacking = TRUE
+ block_projectile_mitigation = 75
+
+ parry_time_windup = 0
+ parry_time_active = 8
+ parry_time_spindown = 0
+ // we want to signal to players the most dangerous phase, the time when automatic counterattack is a thing.
+ parry_time_windup_visual_override = 1
+ parry_time_active_visual_override = 3
+ parry_time_spindown_visual_override = 4
+ parry_flags = PARRY_DEFAULT_HANDLE_FEEDBACK // esword users can attack while parrying.
+ parry_time_perfect = 2 // first ds isn't perfect
+ parry_time_perfect_leeway = 1
+ parry_imperfect_falloff_percent = 10
+ parry_efficiency_to_counterattack = 100
+ parry_efficiency_considered_successful = 25 // VERY generous
+ parry_efficiency_perfect = 90
+ parry_failed_stagger_duration = 3 SECONDS
+ parry_failed_clickcd_duration = CLICK_CD_MELEE
+
+ // more efficient vs projectiles
+ block_stamina_efficiency_override = list(
+ TEXT_ATTACK_TYPE_PROJECTILE = 4
+ )
+
+/obj/item/dualsaber/Initialize()
+ . = ..()
+ RegisterSignal(src, COMSIG_TWOHANDED_WIELD, .proc/on_wield)
+ RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, .proc/on_unwield)
+
+/obj/item/dualsaber/ComponentInitialize()
+ . = ..()
+ AddComponent(/datum/component/two_handed, force_unwielded=3, force_wielded=34, \
+ wieldsound='sound/weapons/saberon.ogg', unwieldsound='sound/weapons/saberoff.ogg')
+
+/obj/item/dualsaber/Initialize()
+ . = ..()
+ if(LAZYLEN(possible_colors))
+ saber_color = pick(possible_colors)
+ switch(saber_color)
+ if("red")
+ light_color = LIGHT_COLOR_RED
+ if("green")
+ light_color = LIGHT_COLOR_GREEN
+ if("blue")
+ light_color = LIGHT_COLOR_LIGHT_CYAN
+ if("purple")
+ light_color = LIGHT_COLOR_LAVENDER
+
+/// Triggered on wield of two handed item
+/// Specific hulk checks due to reflection chance for balance issues and switches hitsounds.
+/obj/item/dualsaber/proc/on_wield(obj/item/source, mob/living/carbon/user)
+ if(user.has_dna() && user.dna.check_mutation(HULK))
+ to_chat(user, "You lack the grace to wield this!")
+ return COMPONENT_TWOHANDED_BLOCK_WIELD
+ wielded = TRUE
+ sharpness = IS_SHARP
+ w_class = w_class_on
+ total_mass = total_mass_on
+ hitsound = 'sound/weapons/blade1.ogg'
+ slowdown += slowdown_wielded
+ START_PROCESSING(SSobj, src)
+ set_light(brightness_on)
+ AddElement(/datum/element/sword_point)
+ item_flags |= (ITEM_CAN_BLOCK|ITEM_CAN_PARRY)
+
+/// Triggered on unwield of two handed item
+/// switch hitsounds
+/obj/item/dualsaber/proc/on_unwield(obj/item/source, mob/living/carbon/user)
+ sharpness = initial(sharpness)
+ w_class = initial(w_class)
+ total_mass = initial(total_mass)
+ wielded = FALSE
+ hitsound = "swing_hit"
+ slowdown_wielded -= slowdown_wielded
+ STOP_PROCESSING(SSobj, src)
+ set_light(0)
+ RemoveElement(/datum/element/sword_point)
+ item_flags &= ~(ITEM_CAN_BLOCK|ITEM_CAN_PARRY)
+
+/obj/item/dualsaber/Destroy()
+ STOP_PROCESSING(SSobj, src)
+ . = ..()
+
+/obj/item/dualsaber/update_icon_state()
+ if(wielded)
+ icon_state = "dualsaber[saber_color][wielded]"
+ else
+ icon_state = "dualsaber0"
+ clean_blood()
+
+/obj/item/dualsaber/suicide_act(mob/living/carbon/user)
+ if(wielded)
+ user.visible_message("[user] begins spinning way too fast! It looks like [user.p_theyre()] trying to commit suicide!")
+ var/obj/item/bodypart/head/myhead = user.get_bodypart(BODY_ZONE_HEAD)//stole from chainsaw code
+ var/obj/item/organ/brain/B = user.getorganslot(ORGAN_SLOT_BRAIN)
+ B.organ_flags &= ~ORGAN_VITAL //this cant possibly be a good idea
+ var/randdir
+ for(var/i in 1 to 24)//like a headless chicken!
+ if(user.is_holding(src))
+ randdir = pick(GLOB.alldirs)
+ user.Move(get_step(user, randdir),randdir)
+ user.emote("spin")
+ if (i == 3 && myhead)
+ myhead.drop_limb()
+ sleep(3)
+ else
+ user.visible_message("[user] panics and starts choking to death!")
+ return OXYLOSS
+ else
+ user.visible_message("[user] begins beating [user.p_them()]self to death with \the [src]'s handle! It probably would've been cooler if [user.p_they()] turned it on first!")
+ return BRUTELOSS
+
+/obj/item/dualsaber/attack(mob/target, mob/living/carbon/human/user)
+ if(user.has_dna() && user.dna.check_mutation(HULK))
+ to_chat(user, "You grip the blade too hard and accidentally drop it!")
+ user.dropItemToGround(src)
+ return
+ ..()
+ if(HAS_TRAIT(user, TRAIT_CLUMSY) && (wielded) && prob(40))
+ impale(user)
+ return
+ if(spinnable && (wielded) && prob(50))
+ INVOKE_ASYNC(src, .proc/jedi_spin, user)
+
+/obj/item/dualsaber/proc/jedi_spin(mob/living/user)
+ for(var/i in list(NORTH,SOUTH,EAST,WEST,EAST,SOUTH,NORTH,SOUTH,EAST,WEST,EAST,SOUTH))
+ user.setDir(i)
+ if(i == WEST)
+ user.emote("flip")
+ sleep(1)
+
+/obj/item/dualsaber/proc/impale(mob/living/user)
+ to_chat(user, "You twirl around a bit before losing your balance and impaling yourself on [src].")
+ if (force)
+ user.take_bodypart_damage(20,25)
+ else
+ user.adjustStaminaLoss(25)
+
+/obj/item/dualsaber/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return)
+ if(!wielded)
+ return NONE
+ if(can_reflect && is_energy_reflectable_projectile(object) && (attack_type & ATTACK_TYPE_PROJECTILE))
+ block_return[BLOCK_RETURN_REDIRECT_METHOD] = REDIRECT_METHOD_RETURN_TO_SENDER //no you
+ return BLOCK_SHOULD_REDIRECT | BLOCK_SUCCESS | BLOCK_REDIRECTED
+ return ..()
+
+/obj/item/dualsaber/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0) //In case thats just so happens that it is still activated on the groud, prevents hulk from picking it up
+ if(wielded)
+ to_chat(user, "You can't pick up such dangerous item with your meaty hands without losing fingers, better not to!")
+ return 1
+
+/obj/item/dualsaber/process()
+ if(wielded)
+ if(hacked)
+ rainbow_process()
+ open_flame()
+ else
+ STOP_PROCESSING(SSobj, src)
+
+/obj/item/dualsaber/proc/rainbow_process()
+ light_color = pick(rainbow_colors)
+
+/obj/item/dualsaber/ignition_effect(atom/A, mob/user)
+ // same as /obj/item/melee/transforming/energy, mostly
+ if(!wielded)
+ return ""
+ var/in_mouth = ""
+ if(iscarbon(user))
+ var/mob/living/carbon/C = user
+ if(C.wear_mask)
+ in_mouth = ", barely missing [user.p_their()] nose"
+ . = "[user] swings [user.p_their()] [name][in_mouth]. [user.p_they(TRUE)] light[user.p_s()] [user.p_their()] [A.name] in the process."
+ playsound(loc, hitsound, get_clamped_volume(), 1, -1)
+ add_fingerprint(user)
+ // Light your candles while spinning around the room
+ if(spinnable)
+ INVOKE_ASYNC(src, .proc/jedi_spin, user)
+
+/obj/item/dualsaber/green
+ possible_colors = list("green")
+
+/obj/item/dualsaber/red
+ possible_colors = list("red")
+
+/obj/item/dualsaber/blue
+ possible_colors = list("blue")
+
+/obj/item/dualsaber/purple
+ possible_colors = list("purple")
+
+/obj/item/dualsaber/attackby(obj/item/W, mob/user, params)
+ if(istype(W, /obj/item/multitool))
+ if(!hacked)
+ hacked = TRUE
+ to_chat(user, "2XRNBW_ENGAGE")
+ saber_color = "rainbow"
+ update_icon()
+ else
+ to_chat(user, "It's starting to look like a triple rainbow - no, nevermind.")
+ else
+ return ..()
+
+/////////////////////////////////////////////////////
+// HYPEREUTACTIC Blades /////////////////////////
+/////////////////////////////////////////////////////
+
+/obj/item/dualsaber/hypereutactic
+ icon = 'icons/obj/1x2.dmi'
+ icon_state = "hypereutactic"
+ lefthand_file = 'icons/mob/inhands/64x64_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/64x64_righthand.dmi'
+ item_state = "hypereutactic"
+ inhand_x_dimension = 64
+ inhand_y_dimension = 64
+ name = "hypereutactic blade"
+ desc = "A supermassive weapon envisioned to cleave the very fabric of space and time itself in twain, the hypereutactic blade dynamically flash-forges a hypereutactic crystaline nanostructure capable of passing through most known forms of matter like a hot knife through butter."
+ force = 7
+ hitsound_on = 'sound/weapons/nebhit.ogg'
+ armour_penetration = 60
+ light_color = "#37FFF7"
+ rainbow_colors = list("#FF0000", "#FFFF00", "#00FF00", "#00FFFF", "#0000FF","#FF00FF", "#3399ff", "#ff9900", "#fb008b", "#9800ff", "#00ffa3", "#ccff00")
+ attack_verb = list("attacked", "slashed", "stabbed", "sliced", "destroyed", "ripped", "devastated", "shredded")
+ spinnable = FALSE
+ total_mass_on = 4
+ slowdown_wielded = 1
+
+/obj/item/dualsaber/hypereutactic/ComponentInitialize()
+ . = ..()
+ AddComponent(/datum/component/two_handed, force_unwielded=7, force_wielded=40, \
+ wieldsound='sound/weapons/nebon.ogg', unwieldsound='sound/weapons/nebhit.ogg')
+ AddElement(/datum/element/update_icon_updates_onmob)
+
+/obj/item/dualsaber/hypereutactic/update_icon_state()
+ return
+
+/obj/item/dualsaber/hypereutactic/update_overlays()
+ . = ..()
+ var/mutable_appearance/blade_overlay = mutable_appearance(icon, "hypereutactic_blade")
+ var/mutable_appearance/gem_overlay = mutable_appearance(icon, "hypereutactic_gem")
+
+ if(light_color)
+ blade_overlay.color = light_color
+ gem_overlay.color = light_color
+
+ . += gem_overlay
+
+ if(wielded)
+ . += blade_overlay
+
+ clean_blood()
+
+/obj/item/dualsaber/hypereutactic/AltClick(mob/living/user)
+ . = ..()
+ if(!user.canUseTopic(src, BE_CLOSE, FALSE) || hacked)
+ return
+ if(user.incapacitated() || !istype(user))
+ to_chat(user, "You can't do that right now!")
+ return
+ if(alert("Are you sure you want to recolor your blade?", "Confirm Repaint", "Yes", "No") == "Yes")
+ var/energy_color_input = input(usr,"","Choose Energy Color",light_color) as color|null
+ if(!energy_color_input || !user.canUseTopic(src, BE_CLOSE, FALSE) || hacked)
+ return
+ light_color = sanitize_hexcolor(energy_color_input, desired_format=6, include_crunch=1)
+ update_icon()
+ update_light()
+ return TRUE
+
+/obj/item/dualsaber/hypereutactic/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE)
+ . = ..()
+ if(isinhands)
+ var/mutable_appearance/gem_inhand = mutable_appearance(icon_file, "hypereutactic_gem")
+ gem_inhand.color = light_color
+ . += gem_inhand
+ if(wielded)
+ var/mutable_appearance/blade_inhand = mutable_appearance(icon_file, "hypereutactic_blade")
+ blade_inhand.color = light_color
+ . += blade_inhand
+
+/obj/item/dualsaber/hypereutactic/examine(mob/user)
+ . = ..()
+ if(!hacked)
+ . += "Alt-click to recolor it."
+
+/obj/item/dualsaber/hypereutactic/rainbow_process()
+ . = ..()
+ update_icon()
+ update_light()
+
+/obj/item/dualsaber/hypereutactic/chaplain
+ name = "divine lightblade"
+ desc = "A giant blade of bright and holy light, said to cut down the wicked with ease."
+ force = 5
+ block_chance = 50
+ armour_penetration = 0
+ var/chaplain_spawnable = TRUE
+ can_reflect = FALSE
+ obj_flags = UNIQUE_RENAME
+
+/obj/item/dualsaber/hypereutactic/chaplain/ComponentInitialize()
+ . = ..()
+ AddComponent(/datum/component/two_handed, force_unwielded=5, force_wielded=20, \
+ wieldsound='sound/weapons/nebon.ogg', unwieldsound='sound/weapons/nebhit.ogg')
+ AddComponent(/datum/component/anti_magic, TRUE, TRUE, FALSE, null, null, FALSE)
diff --git a/code/game/objects/items/eightball.dm b/code/game/objects/items/eightball.dm
index c4a15a1871..dbc4c297ca 100644
--- a/code/game/objects/items/eightball.dm
+++ b/code/game/objects/items/eightball.dm
@@ -196,7 +196,7 @@
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
- ui = new(user, src, ui_key, "eightball", name, 400, 600, master_ui, state)
+ ui = new(user, src, ui_key, "EightBallVote", name, 400, 600, master_ui, state)
ui.open()
/obj/item/toy/eightball/haunted/ui_data(mob/user)
@@ -229,4 +229,4 @@
else
votes[selected_answer] += 1
voted[user.ckey] = selected_answer
- . = TRUE
\ No newline at end of file
+ . = TRUE
diff --git a/code/game/objects/items/electrostaff.dm b/code/game/objects/items/electrostaff.dm
new file mode 100644
index 0000000000..9750994c87
--- /dev/null
+++ b/code/game/objects/items/electrostaff.dm
@@ -0,0 +1,264 @@
+
+/obj/item/electrostaff
+ icon = 'icons/obj/items_and_weapons.dmi'
+ icon_state = "electrostaff"
+ item_state = "electrostaff"
+ lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi'
+ name = "riot suppression electrostaff"
+ desc = "A large quarterstaff, with massive silver electrodes mounted at the end."
+ w_class = WEIGHT_CLASS_HUGE
+ slot_flags = ITEM_SLOT_BACK | ITEM_SLOT_OCLOTHING
+ throwforce = 15 //if you are a madman and finish someone off with this, power to you.
+ throw_speed = 1
+ item_flags = NO_MAT_REDEMPTION
+ attack_verb = list("struck", "beaten", "thwacked", "pulped")
+ total_mass = 5 //yeah this is a heavy thing, beating people with it while it's off is not going to do you any favors. (to curb stun-kill rampaging without it being on)
+ block_parry_data = /datum/block_parry_data/electrostaff
+ attack_speed = CLICK_CD_MELEE
+ var/obj/item/stock_parts/cell/cell = /obj/item/stock_parts/cell/high
+ var/on = FALSE
+ var/can_block_projectiles = FALSE //can't block guns
+ var/lethal_cost = 400 //10000/400*20 = 500. decent enough?
+ var/lethal_damage = 20
+ var/lethal_stam_cost = 4
+ var/stun_cost = 333 //10000/333*25 = 750. stunbatons are at time of writing 10000/1000*49 = 490.
+ var/stun_status_effect = STATUS_EFFECT_ELECTROSTAFF //a small slowdown effect
+ var/stun_stamdmg = 40
+ var/stun_status_duration = 25
+ var/stun_stam_cost = 3.5
+ var/wielded = FALSE // track wielded status on item
+
+// haha security desword time /s
+/datum/block_parry_data/electrostaff
+ block_damage_absorption = 0
+ block_damage_multiplier = 1
+ can_block_attack_types = ~ATTACK_TYPE_PROJECTILE // only able to parry non projectiles
+ block_damage_multiplier_override = list(
+ TEXT_ATTACK_TYPE_MELEE = 0.5, // only useful on melee and unarmed
+ TEXT_ATTACK_TYPE_UNARMED = 0.3
+ )
+ block_start_delay = 0.5 // near instantaneous block
+ block_stamina_cost_per_second = 3
+ block_stamina_efficiency = 2 // haha this is a horrible idea
+ // more slowdown that deswords because security
+ block_slowdown = 2
+ // no attacking while blocking
+ block_lock_attacking = TRUE
+
+ parry_time_windup = 1
+ parry_time_active = 5
+ parry_time_spindown = 0
+ parry_time_spindown_visual_override = 1
+ parry_flags = PARRY_DEFAULT_HANDLE_FEEDBACK | PARRY_LOCK_ATTACKING // no attacking while parrying
+ parry_time_perfect = 0
+ parry_time_perfect_leeway = 0.5
+ parry_efficiency_perfect = 100
+ parry_imperfect_falloff_percent = 1
+ parry_imperfect_falloff_percent_override = list(
+ TEXT_ATTACK_TYPE_PROJECTILE = 45 // really crappy vs projectiles
+ )
+ parry_time_perfect_leeway_override = list(
+ TEXT_ATTACK_TYPE_PROJECTILE = 1 // extremely harsh window for projectiles
+ )
+ // not extremely punishing to fail, but no spamming the parry.
+ parry_cooldown = 2.5 SECONDS
+ parry_failed_stagger_duration = 1.5 SECONDS
+ parry_failed_clickcd_duration = 1 SECONDS
+
+/obj/item/electrostaff/Initialize(mapload)
+ . = ..()
+ if(ispath(cell))
+ cell = new cell
+ RegisterSignal(src, COMSIG_TWOHANDED_WIELD, .proc/turn_on)
+ RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, .proc/turn_off)
+
+/obj/item/electrostaff/ComponentInitialize()
+ . = ..()
+ AddComponent(/datum/component/two_handed, force_multiplier=2, wieldsound="sparks", unwieldsound="sparks")
+
+/obj/item/electrostaff/Destroy()
+ STOP_PROCESSING(SSobj, src)
+ QDEL_NULL(cell)
+ return ..()
+
+/obj/item/electrostaff/get_cell()
+ . = cell
+ if(iscyborg(loc))
+ var/mob/living/silicon/robot/R = loc
+ . = R.get_cell()
+
+/obj/item/electrostaff/proc/min_hitcost()
+ return min(stun_cost, lethal_cost)
+
+/obj/item/electrostaff/proc/turn_on(obj/item/source, mob/user)
+ wielded = TRUE
+ item_flags |= (ITEM_CAN_BLOCK|ITEM_CAN_PARRY)
+ if(!cell)
+ if(user)
+ to_chat(user, "[src] has no cell.")
+ return
+ if(cell.charge < min_hitcost())
+ if(user)
+ to_chat(user, "[src] is out of charge.")
+ return
+ on = TRUE
+ START_PROCESSING(SSobj, src)
+ if(user)
+ to_chat(user, "You turn [src] on.")
+
+/obj/item/electrostaff/proc/turn_off(obj/item/source, mob/user)
+ wielded = FALSE
+ item_flags &= ~(ITEM_CAN_BLOCK|ITEM_CAN_PARRY)
+ if(user)
+ to_chat(user, "You turn [src] off.")
+ on = FALSE
+ STOP_PROCESSING(SSobj, src)
+
+/obj/item/electrostaff/update_icon_state()
+ if(!wielded)
+ icon_state = item_state = "electrostaff"
+ else
+ icon_state = item_state = (on? "electrostaff_1" : "electrostaff_0")
+ set_light(7, on? 1 : 0, LIGHT_COLOR_CYAN)
+
+/obj/item/electrostaff/examine(mob/living/user)
+ . = ..()
+ if(cell)
+ . += "The cell charge is [round(cell.percent())]%."
+ else
+ . += "There is no cell installed!"
+
+/obj/item/electrostaff/attackby(obj/item/W, mob/user, params)
+ if(istype(W, /obj/item/stock_parts/cell))
+ var/obj/item/stock_parts/cell/C = W
+ if(cell)
+ to_chat(user, "[src] already has a cell!")
+ else
+ if(C.maxcharge < min_hit_cost())
+ to_chat(user, "[src] requires a higher capacity cell.")
+ return
+ if(!user.transferItemToLoc(W, src))
+ return
+ cell = C
+ to_chat(user, "You install a cell in [src].")
+
+ else if(W.tool_behaviour == TOOL_SCREWDRIVER)
+ if(cell)
+ cell.update_icon()
+ cell.forceMove(get_turf(src))
+ cell = null
+ to_chat(user, "You remove the cell from [src].")
+ turn_off(user, TRUE)
+ else
+ return ..()
+
+/obj/item/electrostaff/process()
+ deductcharge(50) //Wasteful!
+
+/obj/item/electrostaff/proc/min_hit_cost()
+ return min(lethal_cost, stun_cost)
+
+/obj/item/electrostaff/proc/deductcharge(amount)
+ var/obj/item/stock_parts/cell/C = get_cell()
+ if(!C)
+ turn_off()
+ return FALSE
+ C.use(min(amount, C.charge))
+ if(QDELETED(src))
+ return FALSE
+ if(C.charge < min_hit_cost())
+ turn_off()
+
+/obj/item/electrostaff/attack(mob/living/target, mob/living/user)
+ if(IS_STAMCRIT(user))//CIT CHANGE - makes it impossible to baton in stamina softcrit
+ to_chat(user, "You're too exhausted to use [src] properly.")//CIT CHANGE - ditto
+ return //CIT CHANGE - ditto
+ if(on && HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50))
+ clowning_around(user) //ouch!
+ return
+ if(iscyborg(target))
+ return ..()
+ var/list/return_list = list()
+ if(target.mob_run_block(src, 0, "[user]'s [name]", ATTACK_TYPE_MELEE, 0, user, null, return_list) & BLOCK_SUCCESS) //No message; run_block() handles that
+ playsound(target, 'sound/weapons/genhit.ogg', 50, 1)
+ return FALSE
+ if(user.a_intent != INTENT_HARM)
+ if(stun_act(target, user, null, return_list))
+ user.do_attack_animation(target)
+ user.adjustStaminaLossBuffered(stun_stam_cost)
+ return
+ else if(!harm_act(target, user, null, return_list))
+ return ..() //if you can't fry them just beat them with it
+ else //we did harm act them
+ user.do_attack_animation(target)
+ user.adjustStaminaLossBuffered(lethal_stam_cost)
+
+/obj/item/electrostaff/proc/stun_act(mob/living/target, mob/living/user, no_charge_and_force = FALSE, list/block_return = list())
+ var/stunforce = block_calculate_resultant_damage(stun_stamdmg, block_return)
+ if(!no_charge_and_force)
+ if(!on)
+ target.visible_message("[user] has bapped [target] with [src]. Luckily it was off.", \
+ "[user] has bapped you with [src]. Luckily it was off")
+ turn_off() //if it wasn't already off
+ return FALSE
+ var/obj/item/stock_parts/cell/C = get_cell()
+ var/chargeleft = C.charge
+ deductcharge(stun_cost)
+ if(QDELETED(src) || QDELETED(C)) //boom
+ return FALSE
+ if(chargeleft < stun_cost)
+ stunforce *= round(chargeleft/stun_cost, 0.1)
+ target.adjustStaminaLoss(stunforce)
+ target.apply_effect(EFFECT_STUTTER, stunforce)
+ SEND_SIGNAL(target, COMSIG_LIVING_MINOR_SHOCK)
+ if(user)
+ target.lastattacker = user.real_name
+ target.lastattackerckey = user.ckey
+ target.visible_message("[user] has shocked [target] with [src]!", \
+ "[user] has shocked you with [src]!")
+ log_combat(user, target, "stunned with an electrostaff")
+ playsound(src, 'sound/weapons/staff.ogg', 50, 1, -1)
+ target.apply_status_effect(stun_status_effect, stun_status_duration)
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ H.forcesay(GLOB.hit_appends)
+ return TRUE
+
+/obj/item/electrostaff/proc/harm_act(mob/living/target, mob/living/user, no_charge_and_force = FALSE, list/block_return = list())
+ var/lethal_force = block_calculate_resultant_damage(lethal_damage, block_return)
+ if(!no_charge_and_force)
+ if(!on)
+ return FALSE //standard item attack
+ var/obj/item/stock_parts/cell/C = get_cell()
+ var/chargeleft = C.charge
+ deductcharge(lethal_cost)
+ if(QDELETED(src) || QDELETED(C)) //boom
+ return FALSE
+ if(chargeleft < stun_cost)
+ lethal_force *= round(chargeleft/lethal_cost, 0.1)
+ target.adjustFireLoss(lethal_force) //good against ointment spam
+ SEND_SIGNAL(target, COMSIG_LIVING_MINOR_SHOCK)
+ if(user)
+ target.lastattacker = user.real_name
+ target.lastattackerckey = user.ckey
+ target.visible_message("[user] has seared [target] with [src]!", \
+ "[user] has seared you with [src]!")
+ log_combat(user, target, "burned with an electrostaff")
+ playsound(src, 'sound/weapons/sear.ogg', 50, 1, -1)
+ return TRUE
+
+/obj/item/electrostaff/proc/clowning_around(mob/living/user)
+ user.visible_message("[user] accidentally hits [user.p_them()]self with [src]!", \
+ "You accidentally hit yourself with [src]!")
+ SEND_SIGNAL(user, COMSIG_LIVING_MINOR_SHOCK)
+ harm_act(user, user, TRUE)
+ stun_act(user, user, TRUE)
+ deductcharge(lethal_cost)
+
+/obj/item/electrostaff/emp_act(severity)
+ . = ..()
+ if (!(. & EMP_PROTECT_SELF))
+ turn_off()
+ if(!iscyborg(loc))
+ deductcharge(1000 / severity, TRUE, FALSE)
diff --git a/code/game/objects/items/extinguisher.dm b/code/game/objects/items/extinguisher.dm
index 2d9d0b61c2..b1f51f608d 100644
--- a/code/game/objects/items/extinguisher.dm
+++ b/code/game/objects/items/extinguisher.dm
@@ -110,7 +110,7 @@
. += "The safety is [safety ? "on" : "off"]."
if(reagents.total_volume)
- . += "You can loose its screws to empty it."
+ . += "Alt-click to empty it."
/obj/item/extinguisher/proc/AttemptRefill(atom/target, mob/user)
if(istype(target, tanktype) && target.Adjacent(user))
@@ -230,7 +230,7 @@
repetition++
addtimer(CALLBACK(src, /obj/item/extinguisher/proc/move_chair, B, movementdirection, repetition), timer_seconds)
-/obj/item/extinguisher/screwdriver_act(mob/user, obj/item/tool)
+/obj/item/extinguisher/AltClick(mob/user)
if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
return
EmptyExtinguisher(user)
@@ -244,7 +244,7 @@
var/turf/open/theturf = T
theturf.MakeSlippery(TURF_WET_WATER, min_wet_time = 10 SECONDS, wet_time_to_add = 5 SECONDS)
- user.visible_message("[user] empties out \the [src] onto the floor using the release valve.", "You quietly empty out \the [src] by loosing the release valve's screws.")
+ user.visible_message("[user] empties out \the [src] onto the floor using the release valve.", "You quietly empty out \the [src] by using its release valve.")
//firebot assembly
/obj/item/extinguisher/attackby(obj/O, mob/user, params)
diff --git a/code/game/objects/items/fireaxe.dm b/code/game/objects/items/fireaxe.dm
new file mode 100644
index 0000000000..7cb22d5eb0
--- /dev/null
+++ b/code/game/objects/items/fireaxe.dm
@@ -0,0 +1,72 @@
+/*
+ * Fireaxe
+ */
+/obj/item/fireaxe // DEM AXES MAN, marker -Agouri
+ icon_state = "fireaxe0"
+ lefthand_file = 'icons/mob/inhands/weapons/axes_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/axes_righthand.dmi'
+ name = "fire axe"
+ desc = "Truly, the weapon of a madman. Who would think to fight fire with an axe?"
+ force = 5
+ throwforce = 15
+ w_class = WEIGHT_CLASS_BULKY
+ slot_flags = ITEM_SLOT_BACK
+ attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut")
+ hitsound = 'sound/weapons/bladeslice.ogg'
+ sharpness = IS_SHARP
+ max_integrity = 200
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30)
+ resistance_flags = FIRE_PROOF
+ wound_bonus = -20
+ var/wielded = FALSE // track wielded status on item
+
+/obj/item/fireaxe/Initialize()
+ . = ..()
+ RegisterSignal(src, COMSIG_TWOHANDED_WIELD, .proc/on_wield)
+ RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, .proc/on_unwield)
+
+/obj/item/fireaxe/ComponentInitialize()
+ . = ..()
+ AddComponent(/datum/component/butchering, 100, 80, 0 , hitsound) //axes are not known for being precision butchering tools
+ AddComponent(/datum/component/two_handed, force_unwielded=5, force_wielded=24, icon_wielded="fireaxe1")
+
+/// triggered on wield of two handed item
+/obj/item/fireaxe/proc/on_wield(obj/item/source, mob/user)
+ wielded = TRUE
+
+/// triggered on unwield of two handed item
+/obj/item/fireaxe/proc/on_unwield(obj/item/source, mob/user)
+ wielded = FALSE
+
+/obj/item/fireaxe/update_icon_state()
+ icon_state = "fireaxe0"
+
+/obj/item/fireaxe/suicide_act(mob/user)
+ user.visible_message("[user] axes [user.p_them()]self from head to toe! It looks like [user.p_theyre()] trying to commit suicide!")
+ return (BRUTELOSS)
+
+/obj/item/fireaxe/afterattack(atom/A, mob/living/user, proximity)
+ . = ..()
+ if(!proximity || !wielded || IS_STAMCRIT(user))
+ return
+ if(istype(A, /obj/structure/window)) //destroys windows and grilles in one hit (or more if it has a ton of health like plasmaglass)
+ var/obj/structure/window/W = A
+ W.take_damage(200, BRUTE, "melee", 0)
+ else if(istype(A, /obj/structure/grille))
+ var/obj/structure/grille/G = A
+ G.take_damage(40, BRUTE, "melee", 0)
+
+/*
+ * Bone Axe
+ */
+/obj/item/fireaxe/boneaxe // Blatant imitation of the fireaxe, but made out of bone.
+ icon_state = "bone_axe0"
+ name = "bone axe"
+ desc = "A large, vicious axe crafted out of several sharpened bone plates and crudely tied together. Made of monsters, by killing monsters, for killing monsters."
+
+/obj/item/fireaxe/boneaxe/update_icon_state()
+ icon_state = "bone_axe0"
+
+/obj/item/fireaxe/boneaxe/ComponentInitialize()
+ . = ..()
+ AddComponent(/datum/component/two_handed, force_unwielded=5, force_wielded=23, icon_wielded="bone_axe1")
diff --git a/code/game/objects/items/flamethrower.dm b/code/game/objects/items/flamethrower.dm
index c785c22813..515f5715dd 100644
--- a/code/game/objects/items/flamethrower.dm
+++ b/code/game/objects/items/flamethrower.dm
@@ -131,6 +131,7 @@
/obj/item/flamethrower/analyzer_act(mob/living/user, obj/item/I)
if(ptank)
ptank.analyzer_act(user, I)
+ return TRUE
/obj/item/flamethrower/attack_self(mob/user)
@@ -204,11 +205,10 @@
//TODO: DEFERRED Consider checking to make sure tank pressure is high enough before doing this...
//Transfer 5% of current tank air contents to turf
var/datum/gas_mixture/air_transfer = ptank.air_contents.remove_ratio(release_amount)
- if(air_transfer.gases[/datum/gas/plasma])
- air_transfer.gases[/datum/gas/plasma] *= 5
+ air_transfer.set_moles(/datum/gas/plasma, air_transfer.get_moles(/datum/gas/plasma) * 5)
target.assume_air(air_transfer)
//Burn it based on transfered gas
- target.hotspot_expose((ptank.air_contents.temperature*2) + 380,500)
+ target.hotspot_expose((ptank.air_contents.return_temperature()*2) + 380,500)
//location.hotspot_expose(1000,500,1)
SSair.add_to_active(target, 0)
diff --git a/code/game/objects/items/granters.dm b/code/game/objects/items/granters.dm
index bafffa18e3..1554142c8c 100644
--- a/code/game/objects/items/granters.dm
+++ b/code/game/objects/items/granters.dm
@@ -477,6 +477,23 @@
name = "empty scroll"
icon_state = "blankscroll"
+/obj/item/book/granter/martial/krav_maga
+ martial = /datum/martial_art/krav_maga
+ name = "parchment scroll"
+ martialname = "krav maga"
+ desc = "A worn parchment scrap written in an ancient language. Somehow you can still understand the lessons!"
+ greet = "You have learned the ancient martial art of Krav Maga. You have special attacks with which to take down your foes."
+ icon = 'icons/obj/wizard.dmi'
+ icon_state ="scroll2"
+ remarks = list("Sweep the legs...", "Chop the throat...", "Punch the lungs...", "Get the gold...", "Where are my sick gloves..?")
+
+/obj/item/book/granter/martial/krav_maga/onlearned(mob/living/carbon/user)
+ . = ..()
+ if(oneuse == TRUE)
+ desc = "It's completely blank."
+ name = "empty scroll"
+ icon_state = "blankscroll"
+
// I did not include mushpunch's grant, it is not a book and the item does it just fine.
@@ -510,7 +527,7 @@
oneuse = FALSE
remarks = list("So that is how icing is made!", "Placing fruit on top? How simple...", "Huh layering cake seems harder then this...", "This book smells like candy", "A clown must have made this page, or they forgot to spell check it before printing...", "Wait, a way to cook slime to be safe?")
-/obj/item/book/granter/crafting_recipe/coldcooking //IceCream
+/obj/item/book/granter/crafting_recipe/coldcooking //Icecream
name = "Cooking with Ice"
desc = "A cook book that teaches you many old icecream treats."
crafting_recipe_types = list(/datum/crafting_recipe/food/banana_split, /datum/crafting_recipe/food/root_float, /datum/crafting_recipe/food/bluecharrie_float, /datum/crafting_recipe/food/charrie_float)
diff --git a/code/game/objects/items/grenades/antigravity.dm b/code/game/objects/items/grenades/antigravity.dm
index a4bc207be0..b6700599a3 100644
--- a/code/game/objects/items/grenades/antigravity.dm
+++ b/code/game/objects/items/grenades/antigravity.dm
@@ -7,7 +7,8 @@
var/forced_value = 0
var/duration = 300
-/obj/item/grenade/antigravity/prime()
+/obj/item/grenade/antigravity/prime(mob/living/lanced_by)
+ . = ..()
update_mob()
for(var/turf/T in view(range,src))
diff --git a/code/game/objects/items/grenades/chem_grenade.dm b/code/game/objects/items/grenades/chem_grenade.dm
index 91dde2899d..f06dd634c6 100644
--- a/code/game/objects/items/grenades/chem_grenade.dm
+++ b/code/game/objects/items/grenades/chem_grenade.dm
@@ -97,7 +97,7 @@
to_chat(user, "You add [A] to the [initial(name)] assembly.")
else if(stage == EMPTY && istype(I, /obj/item/stack/cable_coil))
- if (I.use_tool(src, user, 0, 1, max_level = JOB_SKILL_BASIC))
+ if (I.use_tool(src, user, 0, 1, skill_gain_mult = TRIVIAL_USE_TOOL_MULT))
det_time = 50 // In case the cable_coil was removed and readded.
stage_change(WIRED)
to_chat(user, "You rig the [initial(name)] assembly.")
@@ -174,10 +174,11 @@
message_admins(message)
user.log_message("primed [src] ([reagent_string])",LOG_GAME)
-/obj/item/grenade/chem_grenade/prime()
+/obj/item/grenade/chem_grenade/prime(mob/living/lanced_by)
if(stage != READY)
return FALSE
+ . = ..()
var/list/datum/reagents/reactants = list()
for(var/obj/item/reagent_containers/glass/G in beakers)
reactants += G.reagents
@@ -217,7 +218,7 @@
ignition_temp = 25 // Large grenades are slightly more effective at setting off heat-sensitive mixtures than smaller grenades.
threatscale = 1.1 // 10% more effective.
-/obj/item/grenade/chem_grenade/large/prime()
+/obj/item/grenade/chem_grenade/large/prime(mob/living/lanced_by)
if(stage != READY)
return FALSE
@@ -286,7 +287,7 @@
return
..()
-/obj/item/grenade/chem_grenade/adv_release/prime()
+/obj/item/grenade/chem_grenade/adv_release/prime(mob/living/lanced_by)
if(stage != READY)
return FALSE
diff --git a/code/game/objects/items/grenades/clusterbuster.dm b/code/game/objects/items/grenades/clusterbuster.dm
index c16b4a30a1..9980ff34ce 100644
--- a/code/game/objects/items/grenades/clusterbuster.dm
+++ b/code/game/objects/items/grenades/clusterbuster.dm
@@ -14,7 +14,8 @@
var/max_spawned = 8
var/segment_chance = 35
-/obj/item/grenade/clusterbuster/prime()
+/obj/item/grenade/clusterbuster/prime(mob/living/lanced_by)
+ . = ..()
update_mob()
var/numspawned = rand(min_spawned,max_spawned)
var/again = 0
@@ -59,7 +60,7 @@
step_away(src,loc)
addtimer(CALLBACK(src, .proc/prime), rand(15,60))
-/obj/item/grenade/clusterbuster/segment/prime()
+/obj/item/grenade/clusterbuster/segment/prime(mob/living/lanced_by)
new payload_spawner(drop_location(), payload, rand(min_spawned,max_spawned))
playsound(src, prime_sound, 75, 1, -3)
qdel(src)
diff --git a/code/game/objects/items/grenades/emgrenade.dm b/code/game/objects/items/grenades/emgrenade.dm
index 99cf4bdf99..815a3b343c 100644
--- a/code/game/objects/items/grenades/emgrenade.dm
+++ b/code/game/objects/items/grenades/emgrenade.dm
@@ -4,7 +4,8 @@
icon_state = "emp"
item_state = "emp"
-/obj/item/grenade/empgrenade/prime()
+/obj/item/grenade/empgrenade/prime(mob/living/lanced_by)
+ . = ..()
update_mob()
empulse(src, 4, 10)
qdel(src)
diff --git a/code/game/objects/items/grenades/flashbang.dm b/code/game/objects/items/grenades/flashbang.dm
index 6f79df28fe..bf9fab5f04 100644
--- a/code/game/objects/items/grenades/flashbang.dm
+++ b/code/game/objects/items/grenades/flashbang.dm
@@ -6,7 +6,8 @@
righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
var/flashbang_range = 7 //how many tiles away the mob will be stunned.
-/obj/item/grenade/flashbang/prime()
+/obj/item/grenade/flashbang/prime(mob/living/lanced_by)
+ . = ..()
update_mob()
var/flashbang_turf = get_turf(src)
if(!flashbang_turf)
@@ -42,3 +43,102 @@
var/distance = get_dist(get_turf(M), source)
if(M.flash_act(affect_silicon = 1))
M.DefaultCombatKnockdown(max(200/max(1,distance), 60))
+
+/obj/item/grenade/stingbang
+ name = "stingbang"
+ icon_state = "timeg"
+ item_state = "flashbang"
+ lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
+ var/flashbang_range = 1 //how many tiles away the mob will be stunned.
+ shrapnel_type = /obj/item/projectile/bullet/pellet/stingball
+ shrapnel_radius = 5
+ custom_premium_price = 700 // mostly gotten through cargo, but throw in one for the sec vendor ;)
+
+/obj/item/grenade/stingbang/mega
+ name = "mega stingbang"
+ shrapnel_type = /obj/item/projectile/bullet/pellet/stingball/mega
+ shrapnel_radius = 12
+
+/obj/item/grenade/stingbang/breaker
+ name = "breakbang"
+ shrapnel_type = /obj/item/projectile/bullet/pellet/stingball/breaker
+
+/obj/item/grenade/stingbang/shred
+ name = "shredbang"
+ shrapnel_type = /obj/item/projectile/bullet/pellet/stingball/shred
+
+/obj/item/grenade/stingbang/prime(mob/living/lanced_by)
+ if(iscarbon(loc))
+ var/mob/living/carbon/C = loc
+ var/obj/item/bodypart/B = C.get_holding_bodypart_of_item(src)
+ if(B)
+ C.visible_message("[src] goes off in [C]'s hand, blowing [C.p_their()] [B.name] to bloody shreds!", "[src] goes off in your hand, blowing your [B.name] to bloody shreds!")
+ B.dismember()
+
+ . = ..()
+ update_mob()
+ var/flashbang_turf = get_turf(src)
+ if(!flashbang_turf)
+ return
+ do_sparks(rand(5, 9), FALSE, src)
+ playsound(flashbang_turf, 'sound/weapons/flashbang.ogg', 50, TRUE, 8, 0.9)
+ new /obj/effect/dummy/lighting_obj (flashbang_turf, LIGHT_COLOR_WHITE, (flashbang_range + 2), 2, 1)
+ for(var/mob/living/M in get_hearers_in_view(flashbang_range, flashbang_turf))
+ pop(get_turf(M), M)
+ qdel(src)
+
+/obj/item/grenade/stingbang/proc/pop(turf/T , mob/living/M)
+ if(M.stat == DEAD) //They're dead!
+ return
+ M.show_message("POP", MSG_AUDIBLE)
+ var/distance = max(0,get_dist(get_turf(src),T))
+
+//Flash
+ if(M.flash_act(affect_silicon = 1))
+ M.Paralyze(max(10/max(1,distance), 5))
+ M.Knockdown(max(100/max(1,distance), 60))
+
+//Bang
+ if(!distance || loc == M || loc == M.loc)
+ M.Paralyze(20)
+ M.Knockdown(200)
+ M.soundbang_act(1, 200, 10, 15)
+ if(M.apply_damages(10, 10))
+ to_chat(M, "The blast from \the [src] bruises and burns you!")
+
+ // only checking if they're on top of the tile, cause being one tile over will be its own punishment
+
+// Grenade that releases more shrapnel the more times you use it in hand between priming and detonation (sorta like the 9bang from MW3), for admin goofs
+/obj/item/grenade/primer
+ name = "rotfrag grenade"
+ desc = "A grenade that generates more shrapnel the more you rotate it in your hand after pulling the pin. This one releases shrapnel shards."
+ icon_state = "timeg"
+ item_state = "flashbang"
+ lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
+ var/rots_per_mag = 3 /// how many times we need to "rotate" the charge in hand per extra tile of magnitude
+ shrapnel_type = /obj/item/projectile/bullet/shrapnel
+ var/rots = 1 /// how many times we've "rotated" the charge
+
+/obj/item/grenade/primer/attack_self(mob/user)
+ . = ..()
+ if(active)
+ if(!user.CheckActionCooldown())
+ return
+ user.playsound_local(user, 'sound/misc/box_deploy.ogg', 50, TRUE)
+ rots++
+ user.DelayNextAction(CLICK_CD_RAPID)
+
+/obj/item/grenade/primer/prime(mob/living/lanced_by)
+ shrapnel_radius = round(rots / rots_per_mag)
+ . = ..()
+ qdel(src)
+
+/obj/item/grenade/primer/stingbang
+ name = "rotsting"
+ desc = "A grenade that generates more shrapnel the more you rotate it in your hand after pulling the pin. This one releases stingballs."
+ lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
+ rots_per_mag = 2
+ shrapnel_type = /obj/item/projectile/bullet/pellet/stingball
diff --git a/code/game/objects/items/grenades/ghettobomb.dm b/code/game/objects/items/grenades/ghettobomb.dm
index 1725d84dcc..3553d79faf 100644
--- a/code/game/objects/items/grenades/ghettobomb.dm
+++ b/code/game/objects/items/grenades/ghettobomb.dm
@@ -45,12 +45,13 @@
/obj/item/grenade/iedcasing/attack_self(mob/user) //
if(!active)
- if(clown_check(user))
+ if(!botch_check(user))
to_chat(user, "You light the [name]!")
cut_overlay("improvised_grenade_filled")
preprime(user, null, FALSE)
-/obj/item/grenade/iedcasing/prime() //Blowing that can up
+/obj/item/grenade/iedcasing/prime(mob/living/lanced_by) //Blowing that can up
+ . = ..()
update_mob()
explosion(src.loc,-1,-1,2, flame_range = 4) // small explosion, plus a very large fireball.
qdel(src)
diff --git a/code/game/objects/items/grenades/grenade.dm b/code/game/objects/items/grenades/grenade.dm
index 8a41ee4601..7a6157bf65 100644
--- a/code/game/objects/items/grenades/grenade.dm
+++ b/code/game/objects/items/grenades/grenade.dm
@@ -17,10 +17,31 @@
var/det_time = 50
var/display_timer = 1
var/clumsy_check = GRENADE_CLUMSY_FUMBLE
+ var/sticky = FALSE
+ // I moved the explosion vars and behavior to base grenades because we want all grenades to call [/obj/item/grenade/proc/prime] so we can send COMSIG_GRENADE_PRIME
+ ///how big of a devastation explosion radius on prime
+ var/ex_dev = 0
+ ///how big of a heavy explosion radius on prime
+ var/ex_heavy = 0
+ ///how big of a light explosion radius on prime
+ var/ex_light = 0
+ ///how big of a flame explosion radius on prime
+ var/ex_flame = 0
+
+ // dealing with creating a [/datum/component/pellet_cloud] on prime
+ /// if set, will spew out projectiles of this type
+ var/shrapnel_type
+ /// the higher this number, the more projectiles are created as shrapnel
+ var/shrapnel_radius
+ var/shrapnel_initialized
/obj/item/grenade/suicide_act(mob/living/carbon/user)
user.visible_message("[user] primes [src], then eats it! It looks like [user.p_theyre()] trying to commit suicide!")
+ if(shrapnel_type && shrapnel_radius)
+ shrapnel_initialized = TRUE
+ AddComponent(/datum/component/pellet_cloud, projectile_type=shrapnel_type, magnitude=shrapnel_radius)
playsound(src, 'sound/items/eatfood.ogg', 50, 1)
+ SEND_SIGNAL(src, COMSIG_GRENADE_ARMED, det_time)
preprime(user, det_time)
user.transferItemToLoc(src, user, TRUE)//>eat a grenade set to 5 seconds >rush captain
sleep(det_time)//so you dont die instantly
@@ -32,19 +53,21 @@
if(!QDELETED(src))
qdel(src)
-/obj/item/grenade/proc/clown_check(mob/living/carbon/human/user)
+/obj/item/grenade/proc/botch_check(mob/living/carbon/human/user)
var/clumsy = HAS_TRAIT(user, TRAIT_CLUMSY)
if(clumsy)
if(clumsy_check == GRENADE_CLUMSY_FUMBLE && prob(50))
to_chat(user, "Huh? How does this thing work?")
preprime(user, 5, FALSE)
- return FALSE
+ return TRUE
else if(clumsy_check == GRENADE_NONCLUMSY_FUMBLE && !(user.mind && HAS_TRAIT(user.mind, TRAIT_CLOWN_MENTALITY)))
to_chat(user, "You pull the pin on [src]. Attached to it is a pink ribbon that says, \"HONK\"")
preprime(user, 5, FALSE)
- return FALSE
- return TRUE
+ return TRUE
+ else if(sticky && prob(50)) // to add risk to sticky tape grenade cheese, no return cause we still prime as normal after
+ to_chat(user, "What the... [src] is stuck to your hand!")
+ ADD_TRAIT(src, TRAIT_NODROP, STICKY_NODROP)
/obj/item/grenade/examine(mob/user)
. = ..()
@@ -56,8 +79,16 @@
/obj/item/grenade/attack_self(mob/user)
+ if(HAS_TRAIT(src, TRAIT_NODROP))
+ to_chat(user, "You try prying [src] off your hand...")
+ if(do_after(user, 70, target=src))
+ to_chat(user, "You manage to remove [src] from your hand.")
+ REMOVE_TRAIT(src, TRAIT_NODROP, STICKY_NODROP)
+
+ return
+
if(!active)
- if(clown_check(user))
+ if(!botch_check(user)) // if they botch the prime, it'll be handled in botch_check
preprime(user)
/obj/item/grenade/proc/log_grenade(mob/user, turf/T)
@@ -81,10 +112,18 @@
icon_state = initial(icon_state) + "_active"
addtimer(CALLBACK(src, .proc/prime), isnull(delayoverride)? det_time : delayoverride)
-/obj/item/grenade/proc/prime()
+/obj/item/grenade/proc/prime(mob/living/lanced_by)
var/turf/T = get_turf(src)
log_game("Grenade detonation at [AREACOORD(T)], location [loc]")
+ if(shrapnel_type && shrapnel_radius && !shrapnel_initialized) // add a second check for adding the component in case whatever triggered the grenade went straight to prime (badminnery for example)
+ shrapnel_initialized = TRUE
+ AddComponent(/datum/component/pellet_cloud, projectile_type=shrapnel_type, magnitude=shrapnel_radius)
+
+ SEND_SIGNAL(src, COMSIG_GRENADE_PRIME, lanced_by)
+ if(ex_dev || ex_heavy || ex_light || ex_flame)
+ explosion(loc, ex_dev, ex_heavy, ex_light, flame_range = ex_flame)
+
/obj/item/grenade/proc/update_mob()
if(ismob(loc))
var/mob/M = loc
diff --git a/code/game/objects/items/grenades/plastic.dm b/code/game/objects/items/grenades/plastic.dm
index fe2a27f1a8..a2b0e3edd4 100644
--- a/code/game/objects/items/grenades/plastic.dm
+++ b/code/game/objects/items/grenades/plastic.dm
@@ -122,7 +122,9 @@
var/obj/item/I = AM
I.throw_speed = max(1, (I.throw_speed - 3))
I.throw_range = max(1, (I.throw_range - 3))
- I.embedding = I.embedding.setRating(embed_chance = 0)
+ if(I.embedding)
+ I.embedding["embed_chance"] = 0
+ I.updateEmbedding()
target.add_overlay(plastic_overlay, TRUE)
if(!nadeassembly)
@@ -205,9 +207,10 @@
else
return ..()
-/obj/item/grenade/plastic/c4/prime()
+/obj/item/grenade/plastic/c4/prime(mob/living/lanced_by)
if(QDELETED(src))
return
+ . = ..()
var/turf/location
if(target)
if(!QDELETED(target))
diff --git a/code/game/objects/items/grenades/smokebomb.dm b/code/game/objects/items/grenades/smokebomb.dm
index f26390faf6..1b856fc013 100644
--- a/code/game/objects/items/grenades/smokebomb.dm
+++ b/code/game/objects/items/grenades/smokebomb.dm
@@ -17,7 +17,8 @@
qdel(smoke)
return ..()
-/obj/item/grenade/smokebomb/prime()
+/obj/item/grenade/smokebomb/prime(mob/living/lanced_by)
+ . = ..()
update_mob()
playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3)
smoke.set_up(4, src)
diff --git a/code/game/objects/items/grenades/spawnergrenade.dm b/code/game/objects/items/grenades/spawnergrenade.dm
index 2cc72f3694..a8b0fa3cd3 100644
--- a/code/game/objects/items/grenades/spawnergrenade.dm
+++ b/code/game/objects/items/grenades/spawnergrenade.dm
@@ -7,7 +7,8 @@
var/spawner_type = null // must be an object path
var/deliveryamt = 1 // amount of type to deliver
-/obj/item/grenade/spawnergrenade/prime() // Prime now just handles the two loops that query for people in lockers and people who can see it.
+/obj/item/grenade/spawnergrenade/prime(mob/living/lanced_by) // Prime now just handles the two loops that query for people in lockers and people who can see it.
+ . = ..()
update_mob()
if(spawner_type && deliveryamt)
// Make a quick flash
diff --git a/code/game/objects/items/grenades/syndieminibomb.dm b/code/game/objects/items/grenades/syndieminibomb.dm
index 35e9abd982..9f12edeb17 100644
--- a/code/game/objects/items/grenades/syndieminibomb.dm
+++ b/code/game/objects/items/grenades/syndieminibomb.dm
@@ -4,27 +4,45 @@
icon = 'icons/obj/grenade.dmi'
icon_state = "syndicate"
item_state = "flashbang"
+ ex_dev = 1
+ ex_heavy = 2
+ ex_light = 4
+ ex_flame = 2
-/obj/item/grenade/syndieminibomb/prime()
+/obj/item/grenade/syndieminibomb/prime(mob/living/lanced_by)
+ . = ..()
update_mob()
- explosion(src.loc,1,2,4,flame_range = 2)
qdel(src)
/obj/item/grenade/syndieminibomb/concussion
name = "HE Grenade"
desc = "A compact shrapnel grenade meant to devastate nearby organisms and cause some damage in the process. Pull pin and throw opposite direction."
icon_state = "concussion"
+ ex_heavy = 2
+ ex_light = 3
+ ex_flame = 3
-/obj/item/grenade/syndieminibomb/concussion/prime()
- update_mob()
- explosion(src.loc,0,2,3,flame_range = 3)
- qdel(src)
-
-/obj/item/grenade/syndieminibomb/concussion/frag
+/obj/item/grenade/frag
name = "frag grenade"
- desc = "Fire in the hole."
+ desc = "An anti-personnel fragmentation grenade, this weapon excels at killing soft targets by shredding them with metal shrapnel."
icon_state = "frag"
+ shrapnel_type = /obj/item/projectile/bullet/shrapnel
+ shrapnel_radius = 4
+ ex_heavy = 1
+ ex_light = 3
+ ex_flame = 4
+
+/obj/item/grenade/frag/mega
+ name = "FRAG grenade"
+ desc = "An anti-everything fragmentation grenade, this weapon excels at killing anything any everything by shredding them with metal shrapnel."
+ shrapnel_type = /obj/item/projectile/bullet/shrapnel/mega
+ shrapnel_radius = 12
+
+/obj/item/grenade/frag/prime(mob/living/lanced_by)
+ . = ..()
+ update_mob()
+ qdel(src)
/obj/item/grenade/gluon
desc = "An advanced grenade that releases a harmful stream of gluons inducing radiation in those nearby. These gluon streams will also make victims feel exhausted, and induce shivering. This extreme coldness will also likely wet any nearby floors."
@@ -36,7 +54,8 @@
var/rad_damage = 350
var/stamina_damage = 30
-/obj/item/grenade/gluon/prime()
+/obj/item/grenade/gluon/prime(mob/living/lanced_by)
+ . = ..()
update_mob()
playsound(loc, 'sound/effects/empulse.ogg', 50, 1)
radiation_pulse(src, rad_damage)
diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm
index c7c9fa37a9..4c9ea06620 100644
--- a/code/game/objects/items/handcuffs.dm
+++ b/code/game/objects/items/handcuffs.dm
@@ -320,7 +320,7 @@
do_sparks(1, TRUE, src)
qdel(src)
-/obj/item/restraints/legcuffs/beartrap/energy/attack_hand(mob/user)
+/obj/item/restraints/legcuffs/beartrap/energy/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
Crossed(user) //honk
. = ..()
diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm
index 381257721e..691b4c4228 100644
--- a/code/game/objects/items/holy_weapons.dm
+++ b/code/game/objects/items/holy_weapons.dm
@@ -168,6 +168,7 @@
icon_state = "witchhunterhat"
item_state = "witchhunterhat"
flags_cover = HEADCOVERSEYES
+ flags_inv = HIDEHAIR
/obj/item/storage/box/holy/follower
name = "Followers of the Chaplain Kit"
@@ -224,6 +225,7 @@
throwforce = 10
w_class = WEIGHT_CLASS_TINY
obj_flags = UNIQUE_RENAME
+ wound_bonus = -10
var/chaplain_spawnable = TRUE
total_mass = TOTAL_MASS_MEDIEVAL_WEAPON
@@ -656,6 +658,8 @@
item_flags = ABSTRACT
w_class = WEIGHT_CLASS_HUGE
sharpness = IS_SHARP
+ wound_bonus = -20
+ bare_wound_bonus = 25
total_mass = TOTAL_MASS_HAND_REPLACEMENT
/obj/item/nullrod/armblade/Initialize()
diff --git a/code/game/objects/items/implants/implantchair.dm b/code/game/objects/items/implants/implantchair.dm
index 3ea27c84bb..b3c1f79e94 100644
--- a/code/game/objects/items/implants/implantchair.dm
+++ b/code/game/objects/items/implants/implantchair.dm
@@ -121,8 +121,6 @@
update_icon()
/obj/machinery/implantchair/container_resist(mob/living/user)
- user.changeNext_move(CLICK_CD_BREAKOUT)
- user.last_special = world.time + CLICK_CD_BREAKOUT
user.visible_message("You see [user] kicking against the door of [src]!", \
"You lean on the back of [src] and start pushing the door open... (this will take about [DisplayTimeText(breakout_time)].)", \
"You hear a metallic creaking from [src].")
@@ -191,4 +189,4 @@
brainwash(C, objective)
message_admins("[ADMIN_LOOKUPFLW(user)] brainwashed [key_name_admin(C)] with objective '[objective]'.")
log_game("[key_name(user)] brainwashed [key_name(C)] with objective '[objective]'.")
- return TRUE
\ No newline at end of file
+ return TRUE
diff --git a/code/game/objects/items/kitchen.dm b/code/game/objects/items/kitchen.dm
index e44212ba3f..8f274c04aa 100644
--- a/code/game/objects/items/kitchen.dm
+++ b/code/game/objects/items/kitchen.dm
@@ -54,6 +54,14 @@
else
return ..()
+/obj/item/kitchen/fork/throwing
+ name = "throwing fork"
+ desc = "A fork, sharpened to perfection, making it a great weapon for throwing."
+ throwforce = 15
+ throw_speed = 4
+ throw_range = 6
+ embedding = list("pain_mult" = 2, "embed_chance" = 100, "fall_chance" = 0, "embed_chance_turf_mod" = 15)
+ sharpness = IS_SHARP
/obj/item/kitchen/knife
name = "kitchen knife"
@@ -71,6 +79,8 @@
sharpness = IS_SHARP_ACCURATE
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
var/bayonet = FALSE //Can this be attached to a gun?
+ wound_bonus = -5
+ bare_wound_bonus = 10
custom_price = PRICE_NORMAL
/obj/item/kitchen/knife/Initialize()
@@ -138,6 +148,7 @@
icon_state = "buckknife"
item_state = "knife"
desc = "A military combat utility survival knife."
+ embedding = list("pain_mult" = 4, "embed_chance" = 65, "fall_chance" = 10, "ignore_throwspeed_threshold" = TRUE)
force = 20
throwforce = 20
attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "cut")
@@ -148,6 +159,7 @@
icon_state = "survivalknife"
item_state = "knife"
desc = "A hunting grade survival knife."
+ embedding = list("pain_mult" = 4, "embed_chance" = 35, "fall_chance" = 10)
force = 15
throwforce = 15
bayonet = TRUE
@@ -159,6 +171,7 @@
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
desc = "A sharpened bone. The bare minimum in survival."
+ embedding = list("pain_mult" = 4, "embed_chance" = 35, "fall_chance" = 10)
force = 15
throwforce = 15
custom_materials = null
diff --git a/code/game/objects/items/manuals.dm b/code/game/objects/items/manuals.dm
index 6c01e68a48..0673e1d489 100644
--- a/code/game/objects/items/manuals.dm
+++ b/code/game/objects/items/manuals.dm
@@ -506,7 +506,9 @@
if(prob(50))
step(W, pick(GLOB.alldirs))
ADD_TRAIT(H, TRAIT_DISFIGURED, TRAIT_GENERIC)
- H.bleed_rate = 5
+ for(var/i in H.bodyparts)
+ var/obj/item/bodypart/BP = i
+ BP.generic_bleedstacks += 5
H.gib_animation()
sleep(3)
H.adjustBruteLoss(1000) //to make the body super-bloody
diff --git a/code/game/objects/items/melee/energy.dm b/code/game/objects/items/melee/energy.dm
index 63279d2ddc..e0b08ba8ef 100644
--- a/code/game/objects/items/melee/energy.dm
+++ b/code/game/objects/items/melee/energy.dm
@@ -103,7 +103,7 @@
throw_speed = 3
throw_range = 5
sharpness = IS_SHARP
- embedding = list("embed_chance" = 75, "embedded_impact_pain_multiplier" = 10)
+ embedding = list("embed_chance" = 75, "impact_pain_mult" = 10)
armour_penetration = 35
item_flags = NEEDS_PERMIT | ITEM_CAN_PARRY
block_parry_data = /datum/block_parry_data/energy_sword
@@ -147,6 +147,12 @@
return NONE
return ..()
+/obj/item/melee/transforming/energy/sword/on_active_parry(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/block_return, parry_efficiency, parry_time)
+ . = ..()
+ if(parry_efficiency >= 80) // perfect parry
+ block_return[BLOCK_RETURN_REDIRECT_METHOD] = REDIRECT_METHOD_RETURN_TO_SENDER
+ . |= BLOCK_SHOULD_REDIRECT
+
/obj/item/melee/transforming/energy/sword/cyborg
sword_color = "red"
light_color = "#ff0000"
@@ -369,7 +375,7 @@
return
else
to_chat(user, "You combine the two light swords, making a single supermassive blade! You're cool.")
- new /obj/item/twohanded/dualsaber/hypereutactic(user.drop_location())
+ new /obj/item/dualsaber/hypereutactic(user.drop_location())
qdel(W)
qdel(src)
else
diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm
index 741607edc3..9a7d455df6 100644
--- a/code/game/objects/items/melee/misc.dm
+++ b/code/game/objects/items/melee/misc.dm
@@ -19,6 +19,8 @@
slot_flags = ITEM_SLOT_BELT
force = 14
throwforce = 10
+ wound_bonus = 15
+ bare_wound_bonus = 10
reach = 2
w_class = WEIGHT_CLASS_NORMAL
attack_verb = list("flogged", "whipped", "lashed", "disciplined")
@@ -268,6 +270,8 @@
var/force_off // Damage when off - not stunning
var/weight_class_on // What is the new size class when turned on
+ wound_bonus = 15
+
/obj/item/melee/classic_baton/Initialize()
. = ..()
@@ -371,6 +375,7 @@
var/wait_desc = get_wait_description()
if(wait_desc)
to_chat(user, wait_desc)
+ return DISCARD_LAST_ACTION
/obj/item/melee/classic_baton/telescopic
name = "telescopic baton"
@@ -393,6 +398,7 @@
force_off = 0
weight_class_on = WEIGHT_CLASS_BULKY
total_mass = TOTAL_MASS_NORMAL_ITEM
+ bare_wound_bonus = 5
/obj/item/melee/classic_baton/telescopic/suicide_act(mob/user)
var/mob/living/carbon/human/H = user
@@ -621,7 +627,7 @@
to_chat(user, "[target] doesn't seem to want to get on [src]!")
update_icon()
-/obj/item/melee/roastingstick/attack_hand(mob/user)
+/obj/item/melee/roastingstick/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
..()
if (held_sausage)
user.put_in_hands(held_sausage)
@@ -689,7 +695,7 @@
item_state = "mace_greyscale"
lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
- material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS | MATERIAL_EFFECTS //Material type changes the prefix as well as the color.
+ material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS //Material type changes the prefix as well as the color.
custom_materials = list(/datum/material/iron = 12000) //Defaults to an Iron Mace.
slot_flags = ITEM_SLOT_BELT
force = 14
diff --git a/code/game/objects/items/melee/transforming.dm b/code/game/objects/items/melee/transforming.dm
index 5bccf91868..66752c4c9a 100644
--- a/code/game/objects/items/melee/transforming.dm
+++ b/code/game/objects/items/melee/transforming.dm
@@ -53,6 +53,8 @@
throw_speed = 4
if(attack_verb_on.len)
attack_verb = attack_verb_on
+ if(embedding)
+ updateEmbedding()
icon_state = icon_state_on
w_class = w_class_on
else
@@ -62,6 +64,8 @@
throw_speed = initial(throw_speed)
if(attack_verb_off.len)
attack_verb = attack_verb_off
+ if(embedding)
+ updateEmbedding()
icon_state = initial(icon_state)
w_class = initial(w_class)
total_mass = initial(total_mass)
@@ -80,4 +84,4 @@
/obj/item/melee/transforming/proc/clumsy_transform_effect(mob/living/user)
if(clumsy_check && HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50))
to_chat(user, "You accidentally cut yourself with [src], like a doofus!")
- user.take_bodypart_damage(5,5)
\ No newline at end of file
+ user.take_bodypart_damage(5,5)
diff --git a/code/game/objects/items/miscellaneous.dm b/code/game/objects/items/miscellaneous.dm
index ae9ea6985c..a7f7e3152c 100644
--- a/code/game/objects/items/miscellaneous.dm
+++ b/code/game/objects/items/miscellaneous.dm
@@ -18,6 +18,8 @@
icon = 'icons/obj/device.dmi'
icon_state = "gangtool-blue"
item_state = "radio"
+ var/list/stored_options
+ var/force_refresh = FALSE //if set to true, the beacon will recalculate its display options whenever opened
/obj/item/choice_beacon/attack_self(mob/user)
if(canUseBeacon(user))
@@ -34,14 +36,15 @@
return FALSE
/obj/item/choice_beacon/proc/generate_options(mob/living/M)
- var/list/display_names = generate_display_names()
- if(!display_names.len)
+ if(!stored_options || force_refresh)
+ stored_options = generate_display_names()
+ if(!stored_options.len)
return
- var/choice = input(M,"Which item would you like to order?","Select an Item") as null|anything in display_names
+ var/choice = input(M,"Which item would you like to order?","Select an Item") as null|anything in stored_options
if(!choice || !M.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
return
- spawn_option(display_names[choice],M)
+ spawn_option(stored_options[choice],M)
qdel(src)
/obj/item/choice_beacon/proc/spawn_option(obj/choice,mob/living/M)
@@ -129,6 +132,75 @@
hos_gun_list[initial(A.name)] = A
return hos_gun_list
+/obj/item/choice_beacon/augments
+ name = "augment beacon"
+ desc = "Summons augmentations."
+
+/obj/item/choice_beacon/augments/generate_display_names()
+ var/static/list/augment_list
+ if(!augment_list)
+ augment_list = list()
+ var/list/templist = list(
+ /obj/item/organ/cyberimp/brain/anti_drop,
+ /obj/item/organ/cyberimp/arm/toolset,
+ /obj/item/organ/cyberimp/arm/surgery,
+ /obj/item/organ/cyberimp/chest/thrusters,
+ /obj/item/organ/lungs/cybernetic,
+ /obj/item/organ/liver/cybernetic) //cyberimplants range from a nice bonus to fucking broken bullshit so no subtypesof
+ for(var/V in templist)
+ var/atom/A = V
+ augment_list[initial(A.name)] = A
+ return augment_list
+
+/obj/item/choice_beacon/augments/spawn_option(obj/choice,mob/living/M)
+ new choice(get_turf(M))
+ to_chat(M, "You hear something crackle from the beacon for a moment before a voice speaks. \"Please stand by for a message from S.E.L.F. Message as follows: Item request received. Your package has been transported, use the autosurgeon supplied to apply the upgrade. Message ends.\"")
+
+/obj/item/choice_beacon/box
+ name = "choice box (default)"
+ desc = "Think really hard about what you want, and then rip it open!"
+ icon = 'icons/obj/storage.dmi'
+ icon_state = "deliverypackage3"
+ item_state = "deliverypackage3"
+
+/obj/item/choice_beacon/box/spawn_option(obj/choice,mob/living/M)
+ to_chat(M, "The box opens, revealing the [choice]!")
+ playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1)
+ M.temporarilyRemoveItemFromInventory(src, TRUE)
+ M.put_in_hands(new choice)
+ qdel(src)
+
+/obj/item/choice_beacon/box/plushie
+ name = "choice box (plushie)"
+ desc = "Using the power of quantum entanglement, this box contains every plush, until the moment it is opened!"
+ icon = 'icons/obj/plushes.dmi'
+ icon_state = "box"
+ item_state = "box"
+
+/obj/item/choice_beacon/box/spawn_option(choice,mob/living/M)
+ if(ispath(choice, /obj/item/toy/plush))
+ ..() //regular plush, spawn it naturally
+ else
+ //snowflake plush
+ var/obj/item/toy/plush/snowflake_plushie = new(get_turf(M))
+ snowflake_plushie.set_snowflake_from_config(choice)
+ M.temporarilyRemoveItemFromInventory(src, TRUE)
+ M.put_in_hands(new choice)
+ qdel(src)
+
+/obj/item/choice_beacon/box/plushie/generate_display_names()
+ var/list/plushie_list = list()
+ //plushie set 1: just subtypes of /obj/item/toy/plush
+ var/list/plushies_set_one = subtypesof(/obj/item/toy/plush) - list(/obj/item/toy/plush/narplush, /obj/item/toy/plush/awakenedplushie, /obj/item/toy/plush/random_snowflake, /obj/item/toy/plush/random) //don't allow these special ones (you can still get narplush/hugbox)
+ for(var/V in plushies_set_one)
+ var/atom/A = V
+ plushie_list[initial(A.name)] = A
+ //plushie set 2: snowflake plushies
+ var/list/plushies_set_two = CONFIG_GET(keyed_list/snowflake_plushies)
+ for(var/V in plushies_set_two)
+ plushie_list[V] = V //easiest way to do this which works with how selecting options works, despite being snowflakey to have the key equal the value
+ return plushie_list
+
/obj/item/skub
desc = "It's skub."
name = "skub"
diff --git a/code/game/objects/items/mop.dm b/code/game/objects/items/mop.dm
index 3a06c7d7fe..b420bfc002 100644
--- a/code/game/objects/items/mop.dm
+++ b/code/game/objects/items/mop.dm
@@ -58,7 +58,7 @@
if(T)
user.visible_message("[user] cleans \the [T] with [src].", "You clean \the [T] with [src].")
clean(T)
- user.changeNext_move(CLICK_CD_MELEE)
+ user.DelayNextAction(CLICK_CD_MELEE)
user.do_attack_animation(T, used_item = src)
if(istype(L))
L.adjustStaminaLossBuffered(stamusage)
@@ -128,4 +128,4 @@
return ..()
/obj/item/mop/advanced/cyborg
- insertable = FALSE
\ No newline at end of file
+ insertable = FALSE
diff --git a/code/game/objects/items/pet_carrier.dm b/code/game/objects/items/pet_carrier.dm
index 9d9409acf0..c6b5a7e224 100644
--- a/code/game/objects/items/pet_carrier.dm
+++ b/code/game/objects/items/pet_carrier.dm
@@ -22,6 +22,12 @@
var/occupant_weight = 0
var/max_occupants = 3 //Hard-cap so you can't have infinite mice or something in one carrier
var/max_occupant_weight = MOB_SIZE_SMALL //This is calculated from the mob sizes of occupants
+ var/entrance_name = "door" //name of the entrance to the item
+ var/escape_time = 200 //how long it takes for mobs above small sizes to escape (for small sizes, its randomly 1.5 to 2x this)
+ var/alternate_escape_time = 0 //how long it takes for mobs to escape when the entrance is open
+ var/load_time = 30 //how long it takes for mobs to be loaded into the pet carrier
+ var/has_lock_sprites = TRUE //whether to load the lock overlays or not
+ var/allows_hostiles = FALSE //does the pet carrier allow hostile entities to be held within it?
/obj/item/pet_carrier/Destroy()
if(occupants.len)
@@ -51,20 +57,20 @@
else
. += "It has nothing inside."
if(user.canUseTopic(src))
- . += "Activate it in your hand to [open ? "close" : "open"] its door."
+ . += "Activate it in your hand to [open ? "close" : "open"] its [entrance_name]."
if(!open)
- . += "Alt-click to [locked ? "unlock" : "lock"] its door."
+ . += "Alt-click to [locked ? "unlock" : "lock"] its [entrance_name]."
/obj/item/pet_carrier/attack_self(mob/living/user)
if(open)
- to_chat(user, "You close [src]'s door.")
+ to_chat(user, "You close [src]'s [entrance_name].")
playsound(user, 'sound/effects/bin_close.ogg', 50, TRUE)
open = FALSE
else
if(locked)
to_chat(user, "[src] is locked!")
return
- to_chat(user, "You open [src]'s door.")
+ to_chat(user, "You open [src]'s [entrance_name].")
playsound(user, 'sound/effects/bin_open.ogg', 50, TRUE)
open = TRUE
update_icon()
@@ -86,7 +92,7 @@
if(user.a_intent == INTENT_HARM)
return ..()
if(!open)
- to_chat(user, "You need to open [src]'s door!")
+ to_chat(user, "You need to open [src]'s [entrance_name]!")
return
if(target.mob_size > max_occupant_weight)
if(ishuman(target))
@@ -94,13 +100,16 @@
if(iscatperson(H))
to_chat(user, "You'd need a lot of catnip and treats, plus maybe a laser pointer, for that to work.")
else
- to_chat(user, "Humans, generally, do not fit into pet carriers.")
+ to_chat(user, "Humans, generally, do not fit into [name]s.")
else
to_chat(user, "You get the feeling [target] isn't meant for a [name].")
return
if(user == target)
to_chat(user, "Why would you ever do that?")
return
+ if((ishostile(target) && (!allows_hostiles || !istype(target, /mob/living/simple_animal/hostile/carp/cayenne))) || target.move_resist >= MOVE_FORCE_VERY_STRONG) //don't allow goliaths into pet carriers, but let cayenne in!
+ to_chat(user, "You have a feeling you shouldn't keep this as a pet.")
+ return
load_occupant(user, target)
/obj/item/pet_carrier/relaymove(mob/living/user, direction)
@@ -110,8 +119,8 @@
remove_occupant(user)
return
else if(!locked)
- loc.visible_message("[user] pushes open the door to [src]!", \
- "[user] pushes open the door of [src]!")
+ loc.visible_message("[user] pushes open the [entrance_name] to [src]!", \
+ "[user] pushes open the [entrance_name] of [src]!")
open = TRUE
update_icon()
return
@@ -119,12 +128,24 @@
container_resist(user)
/obj/item/pet_carrier/container_resist(mob/living/user)
- user.changeNext_move(CLICK_CD_BREAKOUT)
- user.last_special = world.time + CLICK_CD_BREAKOUT
+ //don't do the whole resist timer thing if it's open!
+ if(open)
+ if(alternate_escape_time > 0)
+ loc.visible_message("The [src] begins to shake!")
+ if(do_after(user, alternate_escape_time, target = user))
+ loc.visible_message("[user] jumps out of [src]")
+ remove_occupant(user)
+ return
+ else //instant escape, different message
+ loc.visible_message("[user] climbs out of [src]!", \
+ "[user] jumps out of [src]!")
+ remove_occupant(user)
+ return
+
if(user.mob_size <= MOB_SIZE_SMALL)
- to_chat(user, "You poke a limb through [src]'s bars and start fumbling for the lock switch... (This will take some time.)")
- to_chat(loc, "You see [user] reach through the bars and fumble for the lock switch!")
- if(!do_after(user, rand(300, 400), target = user) || open || !locked || !(user in occupants))
+ to_chat(user, "You begin to try escaping the [src] and start fumbling for the lock switch... (This will take some time.)")
+ to_chat(loc, "You see [user] attempting to unlock the [src]!")
+ if(!do_after(user, rand(escape_time * 1.5, escape_time * 2), target = user) || open || !locked || !(user in occupants))
return
loc.visible_message("[user] flips the lock switch on [src] by reaching through!", null, null, null, user)
to_chat(user, "Bingo! The lock pops open!")
@@ -132,12 +153,12 @@
playsound(src, 'sound/machines/boltsup.ogg', 30, TRUE)
update_icon()
else
- loc.visible_message("[src] starts rattling as something pushes against the door!", null, null, null, user)
- to_chat(user, "You start pushing out of [src]... (This will take about 20 seconds.)")
- if(!do_after(user, 200, target = user) || open || !locked || !(user in occupants))
+ loc.visible_message("[src] starts rattling as something pushes against the [entrance_name]!", null, null, null, user)
+ to_chat(user, "You start pushing out of [src]... (This will take about [escape_time/10] seconds.)")
+ if(!do_after(user, escape_time, target = user) || open || !locked || !(user in occupants))
return
loc.visible_message("[user] shoves out of [src]!", null, null, null, user)
- to_chat(user, "You shove open [src]'s door against the lock's resistance and fall out!")
+ to_chat(user, "You shove open [src]'s [entrance_name] against the lock's resistance and fall out!")
locked = FALSE
open = TRUE
update_icon()
@@ -151,7 +172,7 @@
/obj/item/pet_carrier/update_overlays()
. = ..()
- if(!open)
+ if(!open && has_lock_sprites)
. += "[locked ? "" : "un"]locked"
/obj/item/pet_carrier/MouseDrop(atom/over_atom)
@@ -166,21 +187,22 @@
/obj/item/pet_carrier/proc/load_occupant(mob/living/user, mob/living/target)
if(pet_carrier_full(src))
to_chat(user, "[src] is already carrying too much!")
- return
+ return FALSE
user.visible_message("[user] starts loading [target] into [src].", \
"You start loading [target] into [src]...", null, null, target)
to_chat(target, "[user] starts loading you into [user.p_their()] [name]!")
- if(!do_mob(user, target, 30))
- return
+ if(!do_mob(user, target, load_time))
+ return FALSE
if(target in occupants)
- return
+ return FALSE
if(pet_carrier_full(src)) //Run the checks again, just in case
to_chat(user, "[src] is already carrying too much!")
- return
+ return FALSE
user.visible_message("[user] loads [target] into [src]!", \
"You load [target] into [src].", null, null, target)
to_chat(target, "[user] loads you into [user.p_their()] [name]!")
add_occupant(target)
+ return TRUE
/obj/item/pet_carrier/proc/add_occupant(mob/living/occupant)
if(occupant in occupants || !istype(occupant))
@@ -192,9 +214,81 @@
/obj/item/pet_carrier/proc/remove_occupant(mob/living/occupant, turf/new_turf)
if(!(occupant in occupants) || !istype(occupant))
return
- occupant.forceMove(new_turf ? new_turf : drop_location())
+ occupant.forceMove(new_turf ? new_turf : get_turf(src))
occupants -= occupant
occupant_weight -= occupant.mob_size
occupant.setDir(SOUTH)
+//bluespace jar, a reskin of the pet carrier that can fit people and smashes when thrown
+/obj/item/pet_carrier/bluespace
+ name = "bluespace jar"
+ desc = "A jar, that seems to be bigger on the inside, somehow allowing lifeforms to fit through its narrow entrance."
+ open = FALSE //starts closed so it looks better on menus
+ icon_state = "bluespace_jar"
+ item_state = "bluespace_jar"
+ lefthand_file = ""
+ righthand_file = ""
+ max_occupant_weight = MOB_SIZE_HUMAN //can fit people, like a bluespace bodybag!
+ load_time = 40 //loading things into a jar takes longer than a regular pet carrier
+ entrance_name = "lid"
+ w_class = WEIGHT_CLASS_SMALL //it's a jar
+ throw_speed = 3
+ throw_range = 7
+ max_occupants = 1 //far less than a regular carrier or bluespace bodybag, because it can be thrown to release the contents
+ allows_hostiles = TRUE //can fit hostile creatures, with the move resist restrictions in place, this means they still cannot take things like legions/goliaths/etc regardless
+ has_lock_sprites = FALSE //jar doesn't show the regular lock overlay
+ custom_materials = list(/datum/material/glass = 1000, /datum/material/bluespace = 600)
+ escape_time = 200 //equal to the time of a bluespace bodybag
+ alternate_escape_time = 100
+ var/datum/gas_mixture/occupant_gas_supply
+
+/obj/item/pet_carrier/bluespace/update_icon_state()
+ if(open)
+ icon_state = "bluespace_jar_open"
+ else
+ icon_state = "bluespace_jar"
+
+/obj/item/pet_carrier/bluespace/throw_impact()
+ . = ..()
+ //delete the item upon impact, releasing the creature inside (this is handled by its deletion)
+ if(occupants.len)
+ loc.visible_message("The bluespace jar smashes, releasing [occupants[1]]!")
+ playsound(src, "shatter", 70, 1)
+ qdel(src)
+
+/obj/item/pet_carrier/bluespace/add_occupant(mob/living/occupant) //update the gas supply as required, this acts like magical internals
+ . = ..()
+ if(!occupant_gas_supply)
+ occupant_gas_supply = new
+ if(isanimal(occupant))
+ var/mob/living/simple_animal/animal = occupant
+ occupant_gas_supply[/datum/gas/oxygen] = 0.0064 //make sure it has some gas in so it isn't depressurized
+ occupant_gas_supply.set_temperature(animal.minbodytemp) //simple animals only care about temperature/pressure when their turf isnt a location
+ else
+ if(ishuman(occupant)) //humans require resistance to cold/heat and living in no air while inside, and lose this when outside
+ ADD_TRAIT(occupant, TRAIT_RESISTCOLD, "bluespace_container_cold_resist")
+ ADD_TRAIT(occupant, TRAIT_RESISTHEAT, "bluespace_container_heat_resist")
+ ADD_TRAIT(occupant, TRAIT_NOBREATH, "bluespace_container_no_breath")
+ ADD_TRAIT(occupant, TRAIT_RESISTHIGHPRESSURE, "bluespace_container_resist_high_pressure")
+ ADD_TRAIT(occupant, TRAIT_RESISTLOWPRESSURE, "bluespace_container_resist_low_pressure")
+
+/obj/item/pet_carrier/bluespace/remove_occupant(mob/living/occupant)
+ . = ..()
+ if(ishuman(occupant))
+ REMOVE_TRAIT(occupant, TRAIT_RESISTCOLD, "bluespace_container_cold_resist")
+ REMOVE_TRAIT(occupant, TRAIT_RESISTHEAT, "bluespace_container_heat_resist")
+ REMOVE_TRAIT(occupant, TRAIT_NOBREATH, "bluespace_container_no_breath")
+ REMOVE_TRAIT(occupant, TRAIT_RESISTHIGHPRESSURE, "bluespace_container_resist_high_pressure")
+ REMOVE_TRAIT(occupant, TRAIT_RESISTLOWPRESSURE, "bluespace_container_resist_low_pressure")
+ name = initial(name)
+
+/obj/item/pet_carrier/bluespace/return_air()
+ if(!occupant_gas_supply)
+ occupant_gas_supply = new
+ return occupant_gas_supply
+
+/obj/item/pet_carrier/bluespace/load_occupant(mob/living/user, mob/living/target)
+ if(..())
+ name = "[initial(name)] ([target])"
+
#undef pet_carrier_full
diff --git a/code/game/objects/items/pinpointer.dm b/code/game/objects/items/pinpointer.dm
index 5a395c112a..3420e72c72 100644
--- a/code/game/objects/items/pinpointer.dm
+++ b/code/game/objects/items/pinpointer.dm
@@ -183,3 +183,20 @@
A.other_pair = B
B.other_pair = A
+
+/obj/item/pinpointer/shuttle
+ name = "fugitive pinpointer"
+ desc = "A handheld tracking device that locates the bounty hunter shuttle for quick escapes."
+ icon_state = "pinpointer_hunter"
+ var/obj/shuttleport
+
+/obj/item/pinpointer/shuttle/Initialize(mapload)
+ . = ..()
+ shuttleport = SSshuttle.getShuttle("huntership")
+
+/obj/item/pinpointer/shuttle/scan_for_target()
+ target = shuttleport
+
+/obj/item/pinpointer/shuttle/Destroy()
+ shuttleport = null
+ . = ..()
\ No newline at end of file
diff --git a/code/game/objects/items/pitchfork.dm b/code/game/objects/items/pitchfork.dm
new file mode 100644
index 0000000000..49d0b64498
--- /dev/null
+++ b/code/game/objects/items/pitchfork.dm
@@ -0,0 +1,101 @@
+/obj/item/pitchfork
+ icon_state = "pitchfork0"
+ lefthand_file = 'icons/mob/inhands/weapons/polearms_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/polearms_righthand.dmi'
+ name = "pitchfork"
+ desc = "A simple tool used for moving hay."
+ force = 7
+ throwforce = 15
+ w_class = WEIGHT_CLASS_BULKY
+ attack_verb = list("attacked", "impaled", "pierced")
+ hitsound = 'sound/weapons/bladeslice.ogg'
+ sharpness = IS_SHARP
+ max_integrity = 200
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30)
+ resistance_flags = FIRE_PROOF
+ var/wielded = FALSE // track wielded status on item
+
+/obj/item/pitchfork/Initialize()
+ . = ..()
+ RegisterSignal(src, COMSIG_TWOHANDED_WIELD, .proc/on_wield)
+ RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, .proc/on_unwield)
+
+/obj/item/pitchfork/ComponentInitialize()
+ . = ..()
+ AddComponent(/datum/component/two_handed, force_unwielded=7, force_wielded=15, icon_wielded="pitchfork1")
+ AddElement(/datum/element/sword_point)
+
+/// triggered on wield of two handed item
+/obj/item/pitchfork/proc/on_wield(obj/item/source, mob/user)
+ wielded = TRUE
+
+/// triggered on unwield of two handed item
+/obj/item/pitchfork/proc/on_unwield(obj/item/source, mob/user)
+ wielded = FALSE
+
+/obj/item/pitchfork/update_icon_state()
+ icon_state = "pitchfork0"
+
+/obj/item/pitchfork/demonic
+ name = "demonic pitchfork"
+ desc = "A red pitchfork, it looks like the work of the devil."
+ force = 19
+ throwforce = 24
+
+/obj/item/pitchfork/demonic/Initialize()
+ . = ..()
+ set_light(3,6,LIGHT_COLOR_RED)
+
+/obj/item/pitchfork/demonic/ComponentInitialize()
+ . = ..()
+ AddComponent(/datum/component/two_handed, force_unwielded=19, force_wielded=25)
+
+/obj/item/pitchfork/demonic/greater
+ force = 24
+ throwforce = 50
+
+/obj/item/pitchfork/demonic/greater/ComponentInitialize()
+ . = ..()
+ AddComponent(/datum/component/two_handed, force_unwielded=24, force_wielded=34)
+
+/obj/item/pitchfork/demonic/ascended
+ force = 100
+ throwforce = 100
+
+/obj/item/pitchfork/demonic/ascended/ComponentInitialize()
+ . = ..()
+ AddComponent(/datum/component/two_handed, force_unwielded=100, force_wielded=500000) // Kills you DEAD
+
+/obj/item/pitchfork/suicide_act(mob/user)
+ user.visible_message("[user] impales [user.p_them()]self in [user.p_their()] abdomen with [src]! It looks like [user.p_theyre()] trying to commit suicide!")
+ return (BRUTELOSS)
+
+/obj/item/pitchfork/demonic/pickup(mob/living/user)
+ . = ..()
+ if(isliving(user) && user.mind && user.owns_soul() && !is_devil(user))
+ var/mob/living/U = user
+ U.visible_message("As [U] picks [src] up, [U]'s arms briefly catch fire.", \
+ "\"As you pick up [src] your arms ignite, reminding you of all your past sins.\"")
+ if(ishuman(U))
+ var/mob/living/carbon/human/H = U
+ H.apply_damage(rand(force/2, force), BURN, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM))
+ else
+ U.adjustFireLoss(rand(force/2,force))
+
+/obj/item/pitchfork/demonic/attack(mob/target, mob/living/carbon/human/user)
+ if(user.mind && user.owns_soul() && !is_devil(user))
+ to_chat(user, "[src] burns in your hands.")
+ user.apply_damage(rand(force/2, force), BURN, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM))
+ ..()
+
+/obj/item/pitchfork/demonic/ascended/afterattack(atom/target, mob/user, proximity)
+ . = ..()
+ if(!proximity || !wielded)
+ return
+ if(iswallturf(target))
+ var/turf/closed/wall/W = target
+ user.visible_message("[user] blasts \the [target] with \the [src]!")
+ playsound(target, 'sound/magic/disintegrate.ogg', 100, TRUE)
+ W.break_wall()
+ W.ScrapeAway(flags = CHANGETURF_INHERIT_AIR)
+ return
diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm
index 00a9ff22f4..44205f4884 100644
--- a/code/game/objects/items/plushes.dm
+++ b/code/game/objects/items/plushes.dm
@@ -8,6 +8,7 @@
resistance_flags = FLAMMABLE
var/list/squeak_override //Weighted list; If you want your plush to have different squeak sounds use this
var/stuffed = TRUE //If the plushie has stuffing in it
+ var/unstuffable = FALSE //for plushies that can't be stuffed
var/obj/item/grenade/grenade //You can remove the stuffing from a plushie and add a grenade to it for *nefarious uses*
//--love ~<3--
gender = NEUTER
@@ -174,6 +175,9 @@
/obj/item/toy/plush/attackby(obj/item/I, mob/living/user, params)
if(I.get_sharpness())
if(!grenade)
+ if(unstuffable)
+ to_chat(user, "Nothing to do here.")
+ return
if(!stuffed)
to_chat(user, "You already murdered it!")
return
@@ -187,6 +191,13 @@
grenade = null
return
if(istype(I, /obj/item/grenade))
+ if(unstuffable)
+ to_chat(user, "No... you should destroy it now!")
+ sleep(10)
+ if(QDELETED(user) || QDELETED(src))
+ return
+ SEND_SOUND(user, 'sound/weapons/armbomb.ogg')
+ return
if(stuffed)
to_chat(user, "You need to remove some stuffing first!")
return
@@ -743,3 +754,14 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths())
attack_verb = list("headbutt", "scritched", "bit")
squeak_override = list('modular_citadel/sound/voice/nya.ogg' = 1)
can_random_spawn = FALSE
+
+
+/obj/item/toy/plush/hairball
+ name = "Hairball"
+ desc = "A bundle of undigested fibers and scales. Yuck."
+ icon_state = "Hairball"
+ unstuffable = TRUE
+ young = TRUE // Your own mouth-baby.
+ squeak_override = list('sound/misc/splort.ogg'=1)
+ attack_verb = list("sploshed", "splorted", "slushed")
+ can_random_spawn = FALSE
diff --git a/code/game/objects/items/powerfist.dm b/code/game/objects/items/powerfist.dm
index b7e2d22d2f..2834b3b758 100644
--- a/code/game/objects/items/powerfist.dm
+++ b/code/game/objects/items/powerfist.dm
@@ -14,12 +14,11 @@
w_class = WEIGHT_CLASS_NORMAL
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 40)
resistance_flags = FIRE_PROOF
- click_delay = CLICK_CD_MELEE * 1.5
+ attack_speed = CLICK_CD_MELEE * 1.5
var/fisto_setting = 1
var/gasperfist = 3
var/obj/item/tank/internals/tank = null //Tank used for the gauntlet's piston-ram.
-
/obj/item/melee/powerfist/examine(mob/user)
. = ..()
if(!in_range(user, src))
@@ -98,7 +97,7 @@
target.visible_message("[user]'s powerfist lets out a weak hiss as [user.p_they()] punch[user.p_es()] [target.name]!", \
"[user]'s punch strikes with force!")
return
- target.apply_damage(totalitemdamage * fisto_setting, BRUTE)
+ target.apply_damage(totalitemdamage * fisto_setting, BRUTE, wound_bonus = -25*fisto_setting**2)
target.visible_message("[user]'s powerfist lets out a loud hiss as [user.p_they()] punch[user.p_es()] [target.name]!", \
"You cry out in pain as [user]'s punch flings you backwards!")
new /obj/effect/temp_visual/kinetic_blast(target.loc)
diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm
index 4b8728e426..6513b53e1d 100644
--- a/code/game/objects/items/robot/robot_items.dm
+++ b/code/game/objects/items/robot/robot_items.dm
@@ -355,6 +355,7 @@
emaggedhitdamage = 0
/obj/item/borg/lollipop/equipped()
+ . = ..()
check_amount()
/obj/item/borg/lollipop/dropped(mob/user)
@@ -745,8 +746,8 @@
***********************************************************************/
/obj/item/weapon/gripper
- name = "circuit gripper"
- desc = "A simple grasping tool for inserting circuitboards into machinary."
+ name = "engineering gripper"
+ desc = "A simple grasping tool for interacting with various engineering related items, such as circuits, gas tanks, conveyer belts and more. Alt click to drop instead of use."
icon = 'icons/obj/device.dmi'
icon_state = "gripper"
@@ -754,18 +755,36 @@
//Has a list of items that it can hold.
var/list/can_hold = list(
- /obj/item/circuitboard
+ /obj/item/circuitboard,
+ /obj/item/light,
+ /obj/item/electronics,
+ /obj/item/tank,
+ /obj/item/conveyor_switch_construct,
+ /obj/item/stack/conveyor,
+ /obj/item/wallframe,
+ /obj/item/vending_refill,
+ /obj/item/stack/sheet,
+ /obj/item/stack/tile,
+ /obj/item/stack/rods,
+ /obj/item/stock_parts
+ )
+ //Basically a blacklist for any subtypes above we dont want
+ var/list/cannot_hold = list(
+ /obj/item/stack/sheet/mineral/plasma,
+ /obj/item/stack/sheet/plasteel
)
var/obj/item/wrapped = null // Item currently being held.
-/obj/item/weapon/gripper/attack_self()
+//Used to interact with UI's of held items, such as gas tanks and airlock electronics.
+/obj/item/weapon/gripper/AltClick(mob/user)
if(wrapped)
wrapped.forceMove(get_turf(wrapped))
+ to_chat(user, "You drop the [wrapped].")
wrapped = null
return ..()
-/obj/item/weapon/gripper/afterattack(var/atom/target, var/mob/living/user, proximity, params)
+/obj/item/weapon/gripper/pre_attack(var/atom/target, var/mob/living/silicon/robot/user, proximity, params)
if(!proximity)
return
@@ -791,18 +810,21 @@
return
else if(istype(target,/obj/item))
-
var/obj/item/I = target
-
var/grab = 0
+
for(var/typepath in can_hold)
if(istype(I,typepath))
grab = 1
- break
+ for(var/badpath in cannot_hold)
+ if(istype(I,badpath))
+ if(!user.emagged)
+ grab = 0
+ continue
//We can grab the item, finally.
if(grab)
- to_chat(user, "You collect \the [I].")
+ to_chat(user, "You collect \the [I].")
I.loc = src
wrapped = I
return
@@ -811,18 +833,24 @@
/obj/item/weapon/gripper/mining
name = "shelter capsule deployer"
- desc = "A simple grasping tool for carrying and deploying shelter capsules."
+ desc = "A simple grasping tool for carrying and deploying shelter capsules. Alt click to drop instead of use."
icon_state = "gripper_mining"
can_hold = list(
/obj/item/survivalcapsule
)
-/obj/item/weapon/gripper/mining/attack_self()
- if(wrapped)
- wrapped.forceMove(get_turf(wrapped))
- wrapped.attack_self()
- wrapped = null
- return
+/obj/item/weapon/gripper/medical
+ name = "medical gripper"
+ desc = "A simple grasping tool for interacting with medical equipment, such as beakers, blood bags, chem bags and more. Alt click to drop instead of use."
+ icon_state = "gripper_medical"
+ can_hold = list(
+ /obj/item/storage/bag/bio,
+ /obj/item/storage/bag/chemistry,
+ /obj/item/storage/pill_bottle,
+ /obj/item/reagent_containers/glass,
+ /obj/item/reagent_containers/pill,
+ /obj/item/reagent_containers/blood
+ )
/obj/item/gun/energy/plasmacutter/cyborg
name = "cyborg plasma cutter"
@@ -906,6 +934,9 @@
icon_state = "data_1"
+/**********************************************************************
+ Dogborg stuff
+***********************************************************************/
///Mere cosmetic dogborg items, remnants of what were once the most annoying cyborg modules.
/obj/item/dogborg_tongue
name = "synthetic tongue"
diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm
index 08ce73109c..c50dc6e316 100644
--- a/code/game/objects/items/robot/robot_upgrades.dm
+++ b/code/game/objects/items/robot/robot_upgrades.dm
@@ -241,9 +241,9 @@
for(var/obj/item/mop/cyborg/M in R.module.modules)
R.module.remove_module(M, TRUE)
- var/obj/item/mop/advanced/cyborg/A = new /obj/item/mop/advanced/cyborg(R.module)
- R.module.basic_modules += A
- R.module.add_module(A, FALSE, TRUE)
+ var/obj/item/mop/advanced/cyborg/A = new /obj/item/mop/advanced/cyborg(R.module)
+ R.module.basic_modules += A
+ R.module.add_module(A, FALSE, TRUE)
/obj/item/borg/upgrade/amop/deactivate(mob/living/silicon/robot/R, user = usr)
. = ..()
@@ -459,7 +459,7 @@
/obj/item/borg/upgrade/defib/deactivate(mob/living/silicon/robot/R, user = usr)
. = ..()
if (.)
- var/obj/item/twohanded/shockpaddles/cyborg/S = locate() in R.module
+ var/obj/item/shockpaddles/cyborg/S = locate() in R.module
R.module.remove_module(S, TRUE)
/obj/item/borg/upgrade/processor
@@ -545,7 +545,7 @@
to_chat(usr, "This unit already has an expand module installed!")
return FALSE
- R.notransform = TRUE
+ R.mob_transforming = TRUE
var/prev_locked_down = R.locked_down
R.SetLockdown(1)
R.anchored = TRUE
@@ -559,14 +559,14 @@
if(!prev_locked_down)
R.SetLockdown(0)
R.anchored = FALSE
- R.notransform = FALSE
+ R.mob_transforming = FALSE
R.resize = 2
R.hasExpanded = TRUE
R.update_transform()
/obj/item/borg/upgrade/expand/deactivate(mob/living/silicon/robot/R, user = usr)
. = ..()
- if (.)
+ if (. && R.hasExpanded)
R.resize = 0.5
R.hasExpanded = FALSE
R.update_transform()
diff --git a/code/game/objects/items/sharpener.dm b/code/game/objects/items/sharpener.dm
index 014d4cb159..6bf0b27fb4 100644
--- a/code/game/objects/items/sharpener.dm
+++ b/code/game/objects/items/sharpener.dm
@@ -24,24 +24,22 @@
if(istype(I, /obj/item/melee/transforming/energy))
to_chat(user, "You don't think \the [I] will be the thing getting modified if you use it on \the [src]!")
return
- if(istype(I, /obj/item/twohanded))//some twohanded items should still be sharpenable, but handle force differently. therefore i need this stuff
- var/obj/item/twohanded/TH = I
- if(TH.force_wielded >= max)
- to_chat(user, "[TH] is much too powerful to sharpen further!")
- return
- if(TH.wielded)
- to_chat(user, "[TH] must be unwielded before it can be sharpened!")
- return
- if(TH.force_wielded > initial(TH.force_wielded))
- to_chat(user, "[TH] has already been refined before. It cannot be sharpened further!")
- return
- TH.force_wielded = clamp(TH.force_wielded + increment, 0, max)//wieldforce is increased since normal force wont stay
- if(I.force > initial(I.force))
+
+ var/signal_out = SEND_SIGNAL(I, COMSIG_ITEM_SHARPEN_ACT, increment, max)
+ if(signal_out & COMPONENT_BLOCK_SHARPEN_MAXED)
+ to_chat(user, "[I] is much too powerful to sharpen further!")
+ return
+ if(signal_out & COMPONENT_BLOCK_SHARPEN_BLOCKED)
+ to_chat(user, "[I] is not able to be sharpened right now!")
+ return
+ if((signal_out & COMPONENT_BLOCK_SHARPEN_ALREADY) || (I.force > initial(I.force) && !signal_out))
to_chat(user, "[I] has already been refined before. It cannot be sharpened further!")
return
+ if(!(signal_out & COMPONENT_BLOCK_SHARPEN_APPLIED))
+ I.force = clamp(I.force + increment, 0, max)
+
user.visible_message("[user] sharpens [I] with [src]!", "You sharpen [I], making it much more deadly than before.")
I.sharpness = IS_SHARP_ACCURATE
- I.force = clamp(I.force + increment, 0, max)
I.throwforce = clamp(I.throwforce + increment, 0, max)
I.name = "[prefix] [I.name]"
name = "worn out [name]"
diff --git a/code/game/objects/items/shields.dm b/code/game/objects/items/shields.dm
index aefa5d3cc8..992c173d3b 100644
--- a/code/game/objects/items/shields.dm
+++ b/code/game/objects/items/shields.dm
@@ -26,7 +26,7 @@
/datum/block_parry_data/shield
block_damage_multiplier = 0.25
block_stamina_efficiency = 2.5
- block_stamina_cost_per_second = 3.5
+ block_stamina_cost_per_second = 2.5
block_slowdown = 0
block_lock_attacking = FALSE
block_lock_sprinting = TRUE
@@ -386,7 +386,7 @@ obj/item/shield/riot/bullet_proof
max_integrity = 100
obj_integrity = 100
can_shatter = FALSE
- item_flags = SLOWS_WHILE_IN_HAND
+ item_flags = SLOWS_WHILE_IN_HAND | ITEM_CAN_BLOCK
var/recharge_timerid
var/recharge_delay = 15 SECONDS
@@ -446,6 +446,12 @@ obj/item/shield/riot/bullet_proof
return BLOCK_SUCCESS | BLOCK_REDIRECTED | BLOCK_SHOULD_REDIRECT
return ..()
+/obj/item/shield/energy/active_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return, override_direction)
+ if((attack_type & ATTACK_TYPE_PROJECTILE) && is_energy_reflectable_projectile(object))
+ block_return[BLOCK_RETURN_REDIRECT_METHOD] = REDIRECT_METHOD_DEFLECT
+ return BLOCK_SUCCESS | BLOCK_REDIRECTED | BLOCK_SHOULD_REDIRECT
+ return ..()
+
/obj/item/shield/energy/attack_self(mob/living/carbon/human/user)
if(clumsy_check && HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50))
to_chat(user, "You beat yourself in the head with [src]!")
diff --git a/code/game/objects/items/shooting_range.dm b/code/game/objects/items/shooting_range.dm
index 2f40604719..ced0ee3160 100644
--- a/code/game/objects/items/shooting_range.dm
+++ b/code/game/objects/items/shooting_range.dm
@@ -31,10 +31,7 @@
to_chat(user, "You slice off [src]'s uneven chunks of aluminium and scorch marks.")
return TRUE
-/obj/item/target/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/item/target/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(pinnedLoc)
pinnedLoc.removeTarget(user)
diff --git a/code/game/objects/items/shrapnel.dm b/code/game/objects/items/shrapnel.dm
new file mode 100644
index 0000000000..b74b0563b7
--- /dev/null
+++ b/code/game/objects/items/shrapnel.dm
@@ -0,0 +1,80 @@
+/obj/item/shrapnel // frag grenades
+ name = "shrapnel shard"
+ embedding = list(embed_chance=70, ignore_throwspeed_threshold=TRUE, fall_chance=4, embed_chance_turf_mod=-100)
+ custom_materials = list(/datum/material/iron=50)
+ armour_penetration = -20
+ icon = 'icons/obj/shards.dmi'
+ icon_state = "large"
+ w_class = WEIGHT_CLASS_TINY
+ item_flags = DROPDEL
+ sharpness = TRUE
+
+/obj/item/shrapnel/stingball // stingbang grenades
+ name = "stingball"
+ embedding = list(embed_chance=90, fall_chance=3, jostle_chance=7, ignore_throwspeed_threshold=TRUE, pain_stam_pct=0.7, pain_mult=5, jostle_pain_mult=6, rip_time=15, embed_chance_turf_mod=-100)
+ icon_state = "tiny"
+ sharpness = FALSE
+
+/obj/item/shrapnel/bullet // bullets
+ name = "bullet"
+ icon = 'icons/obj/ammo.dmi'
+ icon_state = "s-casing"
+ item_flags = NONE
+
+/obj/item/shrapnel/bullet/c38 // .38 round
+ name = "\improper .38 bullet"
+
+/obj/item/shrapnel/bullet/c38/dumdum // .38 DumDum round
+ name = "\improper .38 DumDum bullet"
+ embedding = list(embed_chance=70, fall_chance=7, jostle_chance=7, ignore_throwspeed_threshold=TRUE, pain_stam_pct=0.4, pain_mult=5, jostle_pain_mult=6, rip_time=10, embed_chance_turf_mod=-100)
+
+/obj/item/projectile/bullet/shrapnel
+ name = "flying shrapnel shard"
+ damage = 8
+ range = 10
+ armour_penetration = -30
+ dismemberment = 5
+ ricochets_max = 2
+ ricochet_chance = 40
+ shrapnel_type = /obj/item/shrapnel
+ ricochet_incidence_leeway = 60
+ sharpness = TRUE
+ wound_bonus = 30
+
+/obj/item/projectile/bullet/shrapnel/mega
+ name = "flying shrapnel hunk"
+ range = 25
+ dismemberment = 10
+ ricochets_max = 4
+ ricochet_chance = 90
+ ricochet_decay_chance = 0.9
+
+/obj/item/projectile/bullet/pellet/stingball
+ name = "stingball pellet"
+ damage = 3
+ stamina = 8
+ ricochets_max = 4
+ ricochet_chance = 66
+ ricochet_decay_chance = 1
+ ricochet_decay_damage = 0.9
+ ricochet_auto_aim_angle = 10
+ ricochet_auto_aim_range = 2
+ ricochet_incidence_leeway = 0
+ shrapnel_type = /obj/item/shrapnel/stingball
+
+/obj/item/projectile/bullet/pellet/stingball/mega
+ name = "megastingball pellet"
+ ricochets_max = 6
+ ricochet_chance = 110
+
+/obj/item/projectile/bullet/pellet/stingball/breaker
+ name = "breakbang pellet"
+ damage = 10
+ wound_bonus = 40
+ sharpness = FALSE
+
+/obj/item/projectile/bullet/pellet/stingball/shred
+ name = "shredbang pellet"
+ damage = 10
+ wound_bonus = 30
+ sharpness = TRUE
diff --git a/code/game/objects/items/signs.dm b/code/game/objects/items/signs.dm
index cf7373b700..67bc28b2ea 100644
--- a/code/game/objects/items/signs.dm
+++ b/code/game/objects/items/signs.dm
@@ -40,4 +40,3 @@
user.visible_message("[user] waves around \the \"[label]\" sign.")
else
user.visible_message("[user] waves around blank sign.")
- user.changeNext_move(CLICK_CD_MELEE)
\ No newline at end of file
diff --git a/code/game/objects/items/singularityhammer.dm b/code/game/objects/items/singularityhammer.dm
index dc761ee3bf..7a6c159160 100644
--- a/code/game/objects/items/singularityhammer.dm
+++ b/code/game/objects/items/singularityhammer.dm
@@ -1,4 +1,4 @@
-/obj/item/twohanded/singularityhammer
+/obj/item/singularityhammer
name = "singularity hammer"
desc = "The pinnacle of close combat technology, the hammer harnesses the power of a miniaturized singularity to deal crushing blows."
icon_state = "mjollnir0"
@@ -7,35 +7,47 @@
flags_1 = CONDUCT_1
slot_flags = ITEM_SLOT_BACK
force = 5
- force_unwielded = 5
- force_wielded = 20
throwforce = 15
throw_range = 1
w_class = WEIGHT_CLASS_HUGE
- var/charged = 5
armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 0, "bomb" = 50, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
resistance_flags = FIRE_PROOF | ACID_PROOF
force_string = "LORD SINGULOTH HIMSELF"
total_mass = TOTAL_MASS_MEDIEVAL_WEAPON
+ var/charged = 5
+ var/wielded = FALSE // track wielded status on item
-/obj/item/twohanded/singularityhammer/New()
+/obj/item/singularityhammer/New()
..()
+ RegisterSignal(src, COMSIG_TWOHANDED_WIELD, .proc/on_wield)
+ RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, .proc/on_unwield)
START_PROCESSING(SSobj, src)
-/obj/item/twohanded/singularityhammer/Destroy()
+/obj/item/singularityhammer/ComponentInitialize()
+ . = ..()
+ AddComponent(/datum/component/two_handed, force_multiplier=4, icon_wielded="mjollnir1")
+
+/// triggered on wield of two handed item
+/obj/item/singularityhammer/proc/on_wield(obj/item/source, mob/user)
+ wielded = TRUE
+
+/// triggered on unwield of two handed item
+/obj/item/singularityhammer/proc/on_unwield(obj/item/source, mob/user)
+ wielded = FALSE
+
+/obj/item/singularityhammer/update_icon_state()
+ icon_state = "mjollnir0"
+
+/obj/item/singularityhammer/Destroy()
STOP_PROCESSING(SSobj, src)
return ..()
-/obj/item/twohanded/singularityhammer/process()
+/obj/item/singularityhammer/process()
if(charged < 5)
charged++
return
-/obj/item/twohanded/singularityhammer/update_icon_state() //Currently only here to fuck with the on-mob icons.
- icon_state = "mjollnir[wielded]"
- return
-
-/obj/item/twohanded/singularityhammer/proc/vortex(turf/pull, mob/wielder)
+/obj/item/singularityhammer/proc/vortex(turf/pull, mob/wielder)
for(var/atom/X in orange(5,pull))
if(ismovable(X))
var/atom/movable/A = X
@@ -55,9 +67,8 @@
step_towards(H,pull)
step_towards(H,pull)
step_towards(H,pull)
- return
-/obj/item/twohanded/singularityhammer/afterattack(atom/A as mob|obj|turf|area, mob/user, proximity)
+/obj/item/singularityhammer/afterattack(atom/A as mob|obj|turf|area, mob/user, proximity)
. = ..()
if(!proximity)
return
@@ -71,7 +82,7 @@
var/turf/target = get_turf(A)
vortex(target,user)
-/obj/item/twohanded/mjollnir
+/obj/item/mjollnir
name = "Mjolnir"
desc = "A weapon worthy of a god, able to strike with the force of a lightning bolt. It crackles with barely contained energy."
icon_state = "mjollnir0"
@@ -80,14 +91,33 @@
flags_1 = CONDUCT_1
slot_flags = ITEM_SLOT_BACK
force = 5
- force_unwielded = 5
- force_wielded = 25
throwforce = 30
throw_range = 7
w_class = WEIGHT_CLASS_HUGE
total_mass = TOTAL_MASS_MEDIEVAL_WEAPON
+ var/wielded = FALSE // track wielded status on item
-/obj/item/twohanded/mjollnir/proc/shock(mob/living/target)
+/obj/item/mjollnir/Initialize()
+ . = ..()
+ RegisterSignal(src, COMSIG_TWOHANDED_WIELD, .proc/on_wield)
+ RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, .proc/on_unwield)
+
+/obj/item/mjollnir/ComponentInitialize()
+ . = ..()
+ AddComponent(/datum/component/two_handed, force_multiplier=5, icon_wielded="mjollnir1", attacksound="sparks")
+
+/// triggered on wield of two handed item
+/obj/item/mjollnir/proc/on_wield(obj/item/source, mob/user)
+ wielded = TRUE
+
+/// triggered on unwield of two handed item
+/obj/item/mjollnir/proc/on_unwield(obj/item/source, mob/user)
+ wielded = FALSE
+
+/obj/item/mjollnir/update_icon_state()
+ icon_state = "mjollnir0"
+
+/obj/item/mjollnir/proc/shock(mob/living/target)
target.Stun(60)
var/datum/effect_system/lightning_spread/s = new /datum/effect_system/lightning_spread
s.set_up(5, 1, target.loc)
@@ -99,17 +129,12 @@
target.throw_at(throw_target, 200, 4)
return
-/obj/item/twohanded/mjollnir/attack(mob/living/M, mob/user)
+/obj/item/mjollnir/attack(mob/living/M, mob/user)
..()
if(wielded)
- playsound(src.loc, "sparks", 50, 1)
shock(M)
-/obj/item/twohanded/mjollnir/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
+/obj/item/mjollnir/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
. = ..()
if(isliving(hit_atom))
shock(hit_atom)
-
-/obj/item/twohanded/mjollnir/update_icon_state() //Currently only here to fuck with the on-mob icons.
- icon_state = "mjollnir[wielded]"
- return
diff --git a/code/game/objects/items/spear.dm b/code/game/objects/items/spear.dm
new file mode 100644
index 0000000000..41cb68559b
--- /dev/null
+++ b/code/game/objects/items/spear.dm
@@ -0,0 +1,187 @@
+//spears
+/obj/item/spear
+ icon_state = "spearglass0"
+ lefthand_file = 'icons/mob/inhands/weapons/polearms_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/polearms_righthand.dmi'
+ name = "spear"
+ desc = "A haphazardly-constructed yet still deadly weapon of ancient design."
+ force = 10
+ w_class = WEIGHT_CLASS_BULKY
+ slot_flags = ITEM_SLOT_BACK
+ throwforce = 20
+ throw_speed = 4
+ embedding = list("impact_pain_mult" = 3)
+ armour_penetration = 10
+ custom_materials = list(/datum/material/iron=1150, /datum/material/glass=2075)
+ hitsound = 'sound/weapons/bladeslice.ogg'
+ attack_verb = list("attacked", "poked", "jabbed", "torn", "gored")
+ sharpness = IS_SHARP
+ max_integrity = 200
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30)
+ var/obj/item/grenade/explosive = null
+ var/war_cry = "AAAAARGH!!!"
+ var/icon_prefix = "spearglass"
+ var/wielded = FALSE // track wielded status on item
+ wound_bonus = -25
+ bare_wound_bonus = 15
+
+/obj/item/spear/Initialize()
+ . = ..()
+ RegisterSignal(src, COMSIG_TWOHANDED_WIELD, .proc/on_wield)
+ RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, .proc/on_unwield)
+
+/obj/item/spear/ComponentInitialize()
+ . = ..()
+ AddComponent(/datum/component/butchering, 100, 70) //decent in a pinch, but pretty bad.
+ AddComponent(/datum/component/jousting)
+ AddElement(/datum/element/sword_point)
+ AddComponent(/datum/component/two_handed, force_unwielded=10, force_wielded=18, icon_wielded="[icon_prefix]1")
+
+/// triggered on wield of two handed item
+/obj/item/spear/proc/on_wield(obj/item/source, mob/user)
+ wielded = TRUE
+
+/// triggered on unwield of two handed item
+/obj/item/spear/proc/on_unwield(obj/item/source, mob/user)
+ wielded = FALSE
+
+/obj/item/spear/rightclick_attack_self(mob/user)
+ if(explosive)
+ explosive.attack_self(user)
+ return
+ . = ..()
+
+/obj/item/spear/update_icon_state()
+ icon_state = "[icon_prefix]0"
+
+/obj/item/spear/update_overlays()
+ . = ..()
+ if(explosive)
+ . += "spearbomb_overlay"
+
+/obj/item/spear/suicide_act(mob/living/carbon/user)
+ user.visible_message("[user] begins to sword-swallow \the [src]! It looks like [user.p_theyre()] trying to commit suicide!")
+ if(explosive) //Citadel Edit removes qdel and explosive.forcemove(AM)
+ user.say("[war_cry]", forced="spear warcry")
+ explosive.prime()
+ user.gib()
+ return BRUTELOSS
+ return BRUTELOSS
+
+/obj/item/spear/examine(mob/user)
+ . = ..()
+ if(explosive)
+ . += "Alt-click to set your war cry."
+ . += "Right-click in combat mode to activate the attached explosive."
+
+/obj/item/spear/afterattack(atom/movable/AM, mob/user, proximity)
+ . = ..()
+ if(!proximity)
+ return
+ if(isopenturf(AM)) //So you can actually melee with it
+ return
+ if(explosive && wielded) //Citadel edit removes qdel and explosive.forcemove(AM)
+ user.say("[war_cry]", forced="spear warcry")
+ explosive.prime()
+
+/obj/item/spear/grenade_prime_react(obj/item/grenade/nade) //Citadel edit, removes throw_impact because memes
+ nade.forceMove(get_turf(src))
+ qdel(src)
+
+/obj/item/spear/AltClick(mob/user)
+ . = ..()
+ if(user.canUseTopic(src, BE_CLOSE))
+ ..()
+ if(!explosive)
+ return
+ if(istype(user) && loc == user)
+ var/input = stripped_input(user,"What do you want your war cry to be? You will shout it when you hit someone in melee.", ,"", 50)
+ if(input)
+ src.war_cry = input
+ return TRUE
+
+/obj/item/spear/CheckParts(list/parts_list)
+ var/obj/item/shard/tip = locate() in parts_list
+ if (istype(tip, /obj/item/shard/plasma))
+ throwforce = 21
+ embedding = list(embed_chance = 75, pain_mult = 1.5) //plasmaglass spears are sharper
+ updateEmbedding()
+ icon_prefix = "spearplasma"
+ AddComponent(/datum/component/two_handed, force_unwielded=11, force_wielded=19, icon_wielded="[icon_prefix]1")
+ qdel(tip)
+ var/obj/item/spear/S = locate() in parts_list
+ if(S)
+ if(S.explosive)
+ S.explosive.forceMove(get_turf(src))
+ S.explosive = null
+ parts_list -= S
+ qdel(S)
+ ..()
+ var/obj/item/grenade/G = locate() in contents
+ if(G)
+ explosive = G
+ name = "explosive lance"
+ embedding = list(embed_chance = 0, pain_mult = 1)//elances should not be embeddable
+ updateEmbedding()
+ desc = "A makeshift spear with \a [G] attached to it."
+ update_icon()
+
+//GREY TIDE
+/obj/item/spear/grey_tide
+ icon_state = "spearglass0"
+ name = "\improper Grey Tide"
+ desc = "Recovered from the aftermath of a revolt aboard Defense Outpost Theta Aegis, in which a seemingly endless tide of Assistants caused heavy casualities among Nanotrasen military forces."
+ throwforce = 20
+ throw_speed = 4
+ attack_verb = list("gored")
+ var/clonechance = 50
+ var/clonedamage = 12
+ var/clonespeed = 0
+ var/clone_replication_chance = 30
+ var/clone_lifespan = 100
+
+/obj/item/spear/grey_tide/ComponentInitialize()
+ . = ..()
+ AddComponent(/datum/component/two_handed, force_unwielded=15, force_wielded=25, icon_wielded="[icon_prefix]1")
+
+/obj/item/spear/grey_tide/afterattack(atom/movable/AM, mob/living/user, proximity)
+ . = ..()
+ if(!proximity)
+ return
+ user.faction |= "greytide([REF(user)])"
+ if(isliving(AM))
+ var/mob/living/L = AM
+ if(istype (L, /mob/living/simple_animal/hostile/illusion))
+ return
+ if(!L.stat && prob(clonechance))
+ var/mob/living/simple_animal/hostile/illusion/M = new(user.loc)
+ M.faction = user.faction.Copy()
+ M.set_varspeed(clonespeed)
+ M.Copy_Parent(user, clone_lifespan, user.health/2.5, clonedamage, clone_replication_chance)
+ M.GiveTarget(L)
+
+/*
+ * Bone Spear
+ */
+/obj/item/spear/bonespear //Blatant imitation of spear, but made out of bone. Not valid for explosive modification.
+ icon_state = "bone_spear0"
+ lefthand_file = 'icons/mob/inhands/weapons/polearms_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/polearms_righthand.dmi'
+ name = "bone spear"
+ desc = "A haphazardly-constructed yet still deadly weapon. The pinnacle of modern technology."
+ force = 11
+ w_class = WEIGHT_CLASS_BULKY
+ slot_flags = ITEM_SLOT_BACK
+ reach = 2
+ throwforce = 22
+ embedding = list("embedded_impact_pain_multiplier" = 3)
+ armour_penetration = 15 //Enhanced armor piercing
+ custom_materials = null
+ hitsound = 'sound/weapons/bladeslice.ogg'
+ attack_verb = list("attacked", "poked", "jabbed", "torn", "gored")
+ sharpness = IS_SHARP
+ icon_prefix = "bone_spear"
+
+/obj/item/spear/bonespear/ComponentInitialize()
+ . = ..()
+ AddComponent(/datum/component/two_handed, force_unwielded=11, force_wielded=20, icon_wielded="[icon_prefix]1")
diff --git a/code/game/objects/items/stacks/bscrystal.dm b/code/game/objects/items/stacks/bscrystal.dm
index 00e48fd12a..3b4be37cee 100644
--- a/code/game/objects/items/stacks/bscrystal.dm
+++ b/code/game/objects/items/stacks/bscrystal.dm
@@ -74,8 +74,7 @@
/obj/item/stack/sheet/bluespace_crystal/attack_self(mob/user)// to prevent the construction menu from ever happening
to_chat(user, "You cannot crush the polycrystal in-hand, try breaking one off.")
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/item/stack/sheet/bluespace_crystal/attack_hand(mob/user)
+/obj/item/stack/sheet/bluespace_crystal/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(user.get_inactive_held_item() == src)
if(zero_amount())
return
diff --git a/code/game/objects/items/stacks/cash.dm b/code/game/objects/items/stacks/cash.dm
index ce0bc6591a..954950f5e6 100644
--- a/code/game/objects/items/stacks/cash.dm
+++ b/code/game/objects/items/stacks/cash.dm
@@ -11,6 +11,7 @@
w_class = WEIGHT_CLASS_TINY
full_w_class = WEIGHT_CLASS_TINY
resistance_flags = FLAMMABLE
+ grind_results = list(/datum/reagent/cellulose = 10)
var/value = 0
/obj/item/stack/spacecash/Initialize()
diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm
index e6403e83cc..1ceb525b8a 100644
--- a/code/game/objects/items/stacks/medical.dm
+++ b/code/game/objects/items/stacks/medical.dm
@@ -15,6 +15,16 @@
var/self_delay = 50
var/other_delay = 0
var/repeating = FALSE
+ /// How much brute we heal per application
+ var/heal_brute
+ /// How much burn we heal per application
+ var/heal_burn
+ /// How much we reduce bleeding per application on cut wounds
+ var/stop_bleeding
+ /// How much sanitization to apply to burns on application
+ var/sanitization
+ /// How much we add to flesh_healing for burn wounds on application
+ var/flesh_regeneration
/obj/item/stack/medical/attack(mob/living/M, mob/user)
. = ..()
@@ -70,8 +80,9 @@
icon_state = "brutepack"
lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
- var/heal_brute = 20
- self_delay = 20
+ heal_brute = 40
+ self_delay = 40
+ other_delay = 20
grind_results = list(/datum/reagent/medicine/styptic_powder = 10)
/obj/item/stack/medical/bruise_pack/one
@@ -95,7 +106,8 @@
M.heal_bodypart_damage((heal_brute/2))
return TRUE
if(iscarbon(M))
- return heal_carbon(M, user, heal_brute, 0)
+ return heal_carbon(M, user, heal_brute, heal_burn)
+ to_chat(user, "You can't heal [M] with \the [src]!")
to_chat(user, "You can't heal [M] with the \the [src]!")
/obj/item/stack/medical/bruise_pack/suicide_act(mob/user)
@@ -104,24 +116,27 @@
/obj/item/stack/medical/gauze
name = "medical gauze"
- desc = "A roll of elastic cloth that is extremely effective at stopping bleeding, heals minor wounds."
+ desc = "A roll of elastic cloth, perfect for stabilizing all kinds of wounds, from cuts and burns, to broken bones. "
gender = PLURAL
singular_name = "medical gauze"
icon_state = "gauze"
- var/stop_bleeding = 1800
- var/heal_brute = 5
- self_delay = 10
+ heal_brute = 5
+ self_delay = 50
+ other_delay = 20
+ amount = 6
+ absorption_rate = 0.25
+ absorption_capacity = 5
+ splint_factor = 0.35
custom_price = PRICE_REALLY_CHEAP
-/obj/item/stack/medical/gauze/heal(mob/living/M, mob/user)
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- if(!H.bleedsuppress && H.bleed_rate) //so you can't stack bleed suppression
- H.suppress_bloodloss(stop_bleeding)
- to_chat(user, "You stop the bleeding of [M]!")
- H.adjustBruteLoss(-(heal_brute))
- return TRUE
- to_chat(user, "You can not use \the [src] on [M]!")
+// gauze is only relevant for wounds, which are handled in the wounds themselves
+/obj/item/stack/medical/gauze/try_heal(mob/living/M, mob/user, silent)
+ var/obj/item/bodypart/limb = M.get_bodypart(check_zone(user.zone_selected))
+ if(limb)
+ if(limb.brute_dam > 40)
+ to_chat(user, "The bleeding on [user==M ? "your" : "[M]'s"] [limb.name] is from bruising, and cannot be treated with [src]!")
+ else
+ to_chat(user, "There's no bleeding on [user==M ? "your" : "[M]'s"] [limb.name]")
/obj/item/stack/medical/gauze/attackby(obj/item/I, mob/user, params)
if(I.tool_behaviour == TOOL_WIRECUTTER || I.get_sharpness())
@@ -143,9 +158,12 @@
/obj/item/stack/medical/gauze/improvised
name = "improvised gauze"
singular_name = "improvised gauze"
- desc = "A roll of cloth roughly cut from something that can stop bleeding, but does not heal wounds."
- stop_bleeding = 900
heal_brute = 0
+ desc = "A roll of cloth roughly cut from something that does a decent job of stabilizing wounds, but less efficiently so than real medical gauze."
+ self_delay = 60
+ other_delay = 30
+ absorption_rate = 0.15
+ absorption_capacity = 4
/obj/item/stack/medical/gauze/adv
name = "sterilized medical gauze"
@@ -161,49 +179,38 @@
is_cyborg = 1
cost = 250
-/obj/item/stack/medical/ointment
- name = "ointment"
- desc = "Used to treat those nasty burn wounds."
- gender = PLURAL
- singular_name = "ointment"
- icon_state = "ointment"
- lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
- var/heal_burn = 20
- self_delay = 20
- grind_results = list(/datum/reagent/medicine/silver_sulfadiazine = 10)
-
-/obj/item/stack/medical/ointment/one
- amount = 1
-
-/obj/item/stack/medical/ointment/heal(mob/living/M, mob/user)
- if(M.stat == DEAD)
- to_chat(user, " [M] is dead. You can not help [M.p_them()]!")
- return
- if(iscarbon(M))
- return heal_carbon(M, user, 0, heal_burn)
- if(AmBloodsucker(M))
- return
- to_chat(user, "You can't heal [M] with the \the [src]!")
-
-/obj/item/stack/medical/ointment/suicide_act(mob/living/user)
- user.visible_message("[user] is squeezing \the [src] into [user.p_their()] mouth! [user.p_do(TRUE)]n't [user.p_they()] know that stuff is toxic?")
- return TOXLOSS
-
/obj/item/stack/medical/suture
name = "suture"
- desc = "Sterile sutures used to seal up cuts and lacerations."
+ desc = "Basic sterile sutures used to seal up cuts and lacerations and stop bleeding."
gender = PLURAL
singular_name = "suture"
icon_state = "suture"
self_delay = 30
other_delay = 10
- amount = 15
- max_amount = 15
+ amount = 10
+ max_amount = 10
repeating = TRUE
- var/heal_brute = 10
+ heal_brute = 10
+ stop_bleeding = 0.6
grind_results = list(/datum/reagent/medicine/spaceacillin = 2)
+/obj/item/stack/medical/suture/emergency
+ name = "emergency suture"
+ desc = "A value pack of cheap sutures, not very good at repairing damage, but still decent at stopping bleeding."
+ heal_brute = 5
+ amount = 5
+ max_amount = 5
+
+/obj/item/stack/medical/suture/one
+ amount = 1
+
+/obj/item/stack/medical/suture/medicated
+ name = "medicated suture"
+ icon_state = "suture_purp"
+ desc = "A suture infused with drugs that speed up wound healing of the treated laceration."
+ heal_brute = 15
+ grind_results = list(/datum/reagent/medicine/polypyr = 2)
+
/obj/item/stack/medical/suture/one
amount = 1
@@ -223,10 +230,39 @@
to_chat(user, "[M] is at full health.")
return FALSE
user.visible_message("[user] applies \the [src] on [M].", "You apply \the [src] on [M].")
- M.heal_bodypart_damage(heal_brute)
- return TRUE
+ return heal_carbon(M, user, heal_brute, heal_burn)
- to_chat(user, "You can't heal [M] with the \the [src]!")
+ to_chat(user, "You can't heal [M] with \the [src]!")
+
+/obj/item/stack/medical/ointment
+ name = "ointment"
+ desc = "Basic burn ointment, rated effective for second degree burns with proper bandaging, though it's still an effective stabilizer for worse burns. Not terribly good at outright healing burns though."
+ gender = PLURAL
+ singular_name = "ointment"
+ icon_state = "ointment"
+ lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
+ amount = 10
+ max_amount = 10
+ self_delay = 40
+ other_delay = 20
+
+ heal_burn = 5
+ flesh_regeneration = 2.5
+ sanitization = 0.3
+ grind_results = list(/datum/reagent/medicine/kelotane = 10)
+
+/obj/item/stack/medical/ointment/heal(mob/living/M, mob/user)
+ if(M.stat == DEAD)
+ to_chat(user, "[M] is dead! You can not help [M.p_them()].")
+ return
+ if(iscarbon(M))
+ return heal_carbon(M, user, heal_brute, heal_burn)
+ to_chat(user, "You can't heal [M] with \the [src]!")
+
+/obj/item/stack/medical/ointment/suicide_act(mob/living/user)
+ user.visible_message("[user] is squeezing \the [src] into [user.p_their()] mouth! [user.p_do(TRUE)]n't [user.p_they()] know that stuff is toxic?")
+ return TOXLOSS
/obj/item/stack/medical/mesh
name = "regenerative mesh"
@@ -237,21 +273,41 @@
self_delay = 30
other_delay = 10
amount = 15
+ heal_burn = 10
max_amount = 15
repeating = TRUE
- var/heal_burn = 10
+ sanitization = 0.75
+ flesh_regeneration = 3
var/is_open = TRUE ///This var determines if the sterile packaging of the mesh has been opened.
grind_results = list(/datum/reagent/medicine/spaceacillin = 2)
/obj/item/stack/medical/mesh/one
amount = 1
+/obj/item/stack/medical/mesh/advanced
+ name = "advanced regenerative mesh"
+ desc = "An advanced mesh made with aloe extracts and sterilizing chemicals, used to treat burns."
+ gender = PLURAL
+ singular_name = "advanced regenerative mesh"
+ icon_state = "aloe_mesh"
+ heal_burn = 15
+ grind_results = list(/datum/reagent/consumable/aloejuice = 1)
+
+/obj/item/stack/medical/mesh/advanced/one
+ amount = 1
+
/obj/item/stack/medical/mesh/Initialize()
. = ..()
if(amount == max_amount) //only seal full mesh packs
is_open = FALSE
update_icon()
+/obj/item/stack/medical/mesh/advanced/update_icon_state()
+ if(!is_open)
+ icon_state = "aloe_mesh_closed"
+ else
+ return ..()
+
/obj/item/stack/medical/mesh/update_icon_state()
if(!is_open)
icon_state = "regen_mesh_closed"
@@ -264,8 +320,8 @@
to_chat(user, "[M] is dead! You can not help [M.p_them()].")
return
if(iscarbon(M))
- return heal_carbon(M, user, 0, heal_burn)
- to_chat(user, "You can't heal [M] with the \the [src]!")
+ return heal_carbon(M, user, heal_brute, heal_burn)
+ to_chat(user, "You can't heal [M] with \the [src]!")
/obj/item/stack/medical/mesh/try_heal(mob/living/M, mob/user, silent = FALSE)
@@ -280,7 +336,7 @@
return
. = ..()
-/obj/item/stack/medical/mesh/attack_hand(mob/user)
+/obj/item/stack/medical/mesh/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(!is_open & user.get_inactive_held_item() == src)
to_chat(user, "You need to open [src] first.")
return
@@ -294,3 +350,83 @@
playsound(src, 'sound/items/poster_ripped.ogg', 20, TRUE)
return
. = ..()
+
+/obj/item/stack/medical/bone_gel
+ name = "bone gel"
+ singular_name = "bone gel"
+ desc = "A potent medical gel that, when applied to a damaged bone in a proper surgical setting, triggers an intense melding reaction to repair the wound. Can be directly applied alongside surgical sticky tape to a broken bone in dire circumstances, though this is very harmful to the patient and not recommended."
+
+ icon = 'icons/obj/surgery.dmi'
+ icon_state = "bone-gel"
+ lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
+
+ amount = 4
+ self_delay = 20
+ grind_results = list(/datum/reagent/medicine/bicaridine = 10)
+ novariants = TRUE
+
+/obj/item/stack/medical/bone_gel/attack(mob/living/M, mob/user)
+ to_chat(user, "Bone gel can only be used on fractured limbs while aggressively holding someone!")
+ return
+
+/obj/item/stack/medical/bone_gel/suicide_act(mob/user)
+ if(iscarbon(user))
+ var/mob/living/carbon/C = user
+ C.visible_message("[C] is squirting all of \the [src] into [C.p_their()] mouth! That's not proper procedure! It looks like [C.p_theyre()] trying to commit suicide!")
+ if(do_after(C, 2 SECONDS))
+ C.emote("scream")
+ for(var/i in C.bodyparts)
+ var/obj/item/bodypart/bone = i
+ var/datum/wound/brute/bone/severe/oof_ouch = new
+ oof_ouch.apply_wound(bone)
+ var/datum/wound/brute/bone/critical/oof_OUCH = new
+ oof_OUCH.apply_wound(bone)
+
+ for(var/i in C.bodyparts)
+ var/obj/item/bodypart/bone = i
+ bone.receive_damage(brute=60)
+ use(1)
+ return (BRUTELOSS)
+ else
+ C.visible_message("[C] screws up like an idiot and still dies anyway!")
+ return (BRUTELOSS)
+
+/obj/item/stack/medical/bone_gel/cyborg
+ custom_materials = null
+ is_cyborg = 1
+ cost = 250
+
+/obj/item/stack/medical/aloe
+ name = "aloe cream"
+ desc = "A healing paste you can apply on wounds."
+
+ icon_state = "aloe_paste"
+ self_delay = 20
+ other_delay = 10
+ novariants = TRUE
+ amount = 20
+ max_amount = 20
+ var/heal = 3
+ grind_results = list(/datum/reagent/consumable/aloejuice = 1)
+
+/obj/item/stack/medical/aloe/heal(mob/living/M, mob/user)
+ . = ..()
+ if(M.stat == DEAD)
+ to_chat(user, "[M] is dead! You can not help [M.p_them()].")
+ return FALSE
+ if(iscarbon(M))
+ return heal_carbon(M, user, heal, heal)
+ if(isanimal(M))
+ var/mob/living/simple_animal/critter = M
+ if (!(critter.healable))
+ to_chat(user, "You cannot use \the [src] on [M]!")
+ return FALSE
+ else if (critter.health == critter.maxHealth)
+ to_chat(user, "[M] is at full health.")
+ return FALSE
+ user.visible_message("[user] applies \the [src] on [M].", "You apply \the [src] on [M].")
+ M.heal_bodypart_damage(heal, heal)
+ return TRUE
+
+ to_chat(user, "You can't heal [M] with the \the [src]!")
diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm
index 4c2c21a7db..efcc075110 100644
--- a/code/game/objects/items/stacks/rods.dm
+++ b/code/game/objects/items/stacks/rods.dm
@@ -17,10 +17,10 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \
throw_speed = 3
throw_range = 7
custom_materials = list(/datum/material/iron=1000)
- mats_per_stack = 1000
max_amount = 50
attack_verb = list("hit", "bludgeoned", "whacked")
hitsound = 'sound/weapons/grenadelaunch.ogg'
+ embedding = list()
novariants = TRUE
/obj/item/stack/rods/suicide_act(mob/living/carbon/user)
diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm
index c34ad44d5c..d4baea2487 100644
--- a/code/game/objects/items/stacks/sheets/glass.dm
+++ b/code/game/objects/items/stacks/sheets/glass.dm
@@ -69,7 +69,7 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \
if (get_amount() < 1 || CC.get_amount() < 5)
to_chat(user, "You attach wire to the [name].")
var/obj/item/stack/light_w/new_tile = new(user.loc)
@@ -291,6 +291,7 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list(
max_integrity = 40
sharpness = IS_SHARP
var/icon_prefix
+ embedding = list("embed_chance" = 65)
/obj/item/shard/suicide_act(mob/user)
diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm
index d28ae52b52..7692278ba3 100644
--- a/code/game/objects/items/stacks/sheets/mineral.dm
+++ b/code/game/objects/items/stacks/sheets/mineral.dm
@@ -39,9 +39,11 @@ GLOBAL_LIST_INIT(sandstone_recipes, list ( \
item_state = "sheet-sandstone"
throw_speed = 3
throw_range = 5
- custom_materials = list(/datum/material/glass=MINERAL_MATERIAL_AMOUNT)
+ custom_materials = list(/datum/material/sandstone=MINERAL_MATERIAL_AMOUNT)
sheettype = "sandstone"
merge_type = /obj/item/stack/sheet/mineral/sandstone
+ walltype = /turf/closed/wall/mineral/sandstone
+ material_type = /datum/material/sandstone
/obj/item/stack/sheet/mineral/sandstone/get_main_recipes()
. = ..()
@@ -107,6 +109,7 @@ GLOBAL_LIST_INIT(sandbag_recipes, list ( \
point_value = 25
merge_type = /obj/item/stack/sheet/mineral/diamond
material_type = /datum/material/diamond
+ walltype = /turf/closed/wall/mineral/diamond
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), \
@@ -135,6 +138,7 @@ GLOBAL_LIST_INIT(diamond_recipes, list ( \
point_value = 20
merge_type = /obj/item/stack/sheet/mineral/uranium
material_type = /datum/material/uranium
+ walltype = /turf/closed/wall/mineral/uranium
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), \
@@ -163,6 +167,7 @@ GLOBAL_LIST_INIT(uranium_recipes, list ( \
point_value = 20
merge_type = /obj/item/stack/sheet/mineral/plasma
material_type = /datum/material/plasma
+ walltype = /turf/closed/wall/mineral/plasma
/obj/item/stack/sheet/mineral/plasma/suicide_act(mob/living/carbon/user)
user.visible_message("[user] begins licking \the [src]! It looks like [user.p_theyre()] trying to commit suicide!")
@@ -205,6 +210,7 @@ GLOBAL_LIST_INIT(plasma_recipes, list ( \
point_value = 20
merge_type = /obj/item/stack/sheet/mineral/gold
material_type = /datum/material/gold
+ walltype = /turf/closed/wall/mineral/gold
GLOBAL_LIST_INIT(gold_recipes, list ( \
new/datum/stack_recipe("golden door", /obj/structure/mineral_door/gold, 10, one_per_turf = 1, on_floor = 1), \
@@ -236,6 +242,7 @@ GLOBAL_LIST_INIT(gold_recipes, list ( \
merge_type = /obj/item/stack/sheet/mineral/silver
material_type = /datum/material/silver
tableVariant = /obj/structure/table/optable
+ walltype = /turf/closed/wall/mineral/silver
GLOBAL_LIST_INIT(silver_recipes, list ( \
new/datum/stack_recipe("silver door", /obj/structure/mineral_door/silver, 10, one_per_turf = 1, on_floor = 1), \
@@ -266,6 +273,7 @@ GLOBAL_LIST_INIT(silver_recipes, list ( \
point_value = 50
merge_type = /obj/item/stack/sheet/mineral/bananium
material_type = /datum/material/bananium
+ walltype = /turf/closed/wall/mineral/bananium
GLOBAL_LIST_INIT(bananium_recipes, list ( \
new/datum/stack_recipe("bananium tile", /obj/item/stack/tile/mineral/bananium, 1, 4, 20), \
@@ -294,6 +302,7 @@ GLOBAL_LIST_INIT(bananium_recipes, list ( \
point_value = 20
merge_type = /obj/item/stack/sheet/mineral/titanium
material_type = /datum/material/titanium
+ walltype = /turf/closed/wall/mineral/titanium
GLOBAL_LIST_INIT(titanium_recipes, list ( \
new/datum/stack_recipe("titanium tile", /obj/item/stack/tile/mineral/titanium, 1, 4, 20), \
@@ -324,6 +333,7 @@ GLOBAL_LIST_INIT(titanium_recipes, list ( \
custom_materials = list(/datum/material/titanium=MINERAL_MATERIAL_AMOUNT, /datum/material/plasma=MINERAL_MATERIAL_AMOUNT)
point_value = 45
merge_type = /obj/item/stack/sheet/mineral/plastitanium
+ walltype = /turf/closed/wall/mineral/plastitanium
/obj/item/stack/sheet/mineral/plastitanium/fifty
amount = 50
@@ -390,11 +400,14 @@ GLOBAL_LIST_INIT(adamantine_recipes, list(
name = "snow"
icon_state = "sheet-snow"
item_state = "sheet-snow"
+ custom_materials = list(/datum/material/snow = MINERAL_MATERIAL_AMOUNT)
singular_name = "snow block"
force = 1
throwforce = 2
grind_results = list(/datum/reagent/consumable/ice = 20)
merge_type = /obj/item/stack/sheet/mineral/snow
+ walltype = /turf/closed/wall/mineral/snow
+ material_type = /datum/material/snow
GLOBAL_LIST_INIT(snow_recipes, list ( \
new/datum/stack_recipe("Snow Wall", /turf/closed/wall/mineral/snow, 5, one_per_turf = 1, on_floor = 1), \
@@ -417,6 +430,7 @@ GLOBAL_LIST_INIT(snow_recipes, list ( \
singular_name = "alien alloy sheet"
sheettype = "abductor"
merge_type = /obj/item/stack/sheet/mineral/abductor
+ walltype = /turf/closed/wall/mineral/abductor
GLOBAL_LIST_INIT(abductor_recipes, list ( \
new/datum/stack_recipe("alien bed", /obj/structure/bed/abductor, 2, one_per_turf = 1, on_floor = 1), \
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 55719c2758..5f6341ea21 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -184,13 +184,13 @@ GLOBAL_LIST_INIT(plasteel_recipes, list ( \
new /datum/stack_recipe("trash cart", /obj/structure/closet/crate/trashcart, 5, time = 50, one_per_turf = 1, on_floor = 1), \
new /datum/stack_recipe("medical crate", /obj/structure/closet/crate/medical, 5, time = 50, one_per_turf = 1, on_floor = 1), \
new /datum/stack_recipe("freezer crate", /obj/structure/closet/crate/freezer, 8, time = 50, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("blood bag crate", /obj/structure/closet/crate/freezer/blood, 8, time = 50, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("surplus limbs crate", /obj/structure/closet/crate/freezer/surplus_limbs, 8, time = 50, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("blood bag crate", /obj/structure/closet/crate/freezer/blood/fake, 8, time = 50, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("surplus limbs crate", /obj/structure/closet/crate/freezer/surplus_limbs/fake, 8, time = 50, one_per_turf = 1, on_floor = 1), \
new /datum/stack_recipe("radiation containment crate", /obj/structure/closet/crate/radiation, 8, time = 50, one_per_turf = 1, on_floor = 1), \
new /datum/stack_recipe("hydroponics crate", /obj/structure/closet/crate/hydroponics, 5, time = 50, one_per_turf = 1, on_floor = 1), \
new /datum/stack_recipe("engineering crate", /obj/structure/closet/crate/engineering, 5, time = 50, one_per_turf = 1, on_floor = 1), \
new /datum/stack_recipe("eletrical crate", /obj/structure/closet/crate/engineering/electrical, 5, time = 50, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("RCD storage crate", /obj/structure/closet/crate/rcd, 5, time = 50, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("RCD storage crate", /obj/structure/closet/crate/rcd/fake, 5, time = 50, one_per_turf = 1, on_floor = 1), \
new /datum/stack_recipe("science crate", /obj/structure/closet/crate/science, 5, time = 50, one_per_turf = 1, on_floor = 1), \
)), \
new /datum/stack_recipe_list("airlock assemblies", list( \
@@ -205,7 +205,7 @@ GLOBAL_LIST_INIT(plasteel_recipes, list ( \
desc = "This sheet is an alloy of iron and plasma."
icon_state = "sheet-plasteel"
item_state = "sheet-metal"
- custom_materials = list(/datum/material/iron=2000, /datum/material/plasma=2000)
+ custom_materials = list(/datum/material/iron=MINERAL_MATERIAL_AMOUNT, /datum/material/plasma=MINERAL_MATERIAL_AMOUNT)
throwforce = 10
flags_1 = CONDUCT_1
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 80)
@@ -240,13 +240,14 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \
new /datum/stack_recipe("pew (right)", /obj/structure/chair/pew/right, 3, one_per_turf = TRUE, on_floor = TRUE),\
)),
null, \
- new/datum/stack_recipe("wooden firearm body", /obj/item/weaponcrafting/improvised_parts/wooden_body, 10, time = 40), \
- new/datum/stack_recipe("rifle stock", /obj/item/weaponcrafting/stock, 10, time = 40), \
- new/datum/stack_recipe("pistol grip", /obj/item/weaponcrafting/improvised_parts/wooden_grip, 5, time = 40), \
+ new/datum/stack_recipe("wooden firearm body", /obj/item/weaponcrafting/improvised_parts/wooden_body, 10, time = 20), \
+ new/datum/stack_recipe("rifle stock", /obj/item/weaponcrafting/stock, 10, time = 20), \
new/datum/stack_recipe("rolling pin", /obj/item/kitchen/rollingpin, 2, time = 30), \
new/datum/stack_recipe("wooden bucket", /obj/item/reagent_containers/glass/bucket/wood, 2, time = 30), \
+ new/datum/stack_recipe("painting frame", /obj/item/wallframe/painting, 1, time = 10),\
new/datum/stack_recipe("wooden buckler", /obj/item/shield/riot/buckler, 20, time = 40), \
new/datum/stack_recipe("baseball bat", /obj/item/melee/baseball_bat, 5, time = 15),\
+ new/datum/stack_recipe("training bokken", /obj/item/melee/bokken, 10, time = 15),\
null, \
new/datum/stack_recipe("wooden chair", /obj/structure/chair/wood/, 3, time = 10, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("winged wooden chair", /obj/structure/chair/wood/wings, 3, time = 10, one_per_turf = TRUE, on_floor = TRUE), \
@@ -288,7 +289,8 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \
merge_type = /obj/item/stack/sheet/mineral/wood
novariants = TRUE
material_type = /datum/material/wood
- grind_results = list(/datum/reagent/carbon = 20)
+ grind_results = list(/datum/reagent/cellulose = 20)
+ walltype = /turf/closed/wall/mineral/wood
/obj/item/stack/sheet/mineral/wood/attackby(obj/item/W, mob/user, params) // NOTE: sheet_types.dm is where the WOOD stack lives. Maybe move this over there.
// Taken from /obj/item/stack/rods/attackby in [rods.dm]
@@ -344,11 +346,13 @@ GLOBAL_LIST_INIT(bamboo_recipes, list ( \
icon_state = "sheet-bamboo"
item_state = "sheet-bamboo"
icon = 'icons/obj/stack_objects.dmi'
+ custom_materials = list(/datum/material/bamboo = MINERAL_MATERIAL_AMOUNT)
throwforce = 15
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/bamboo
- grind_results = list(/datum/reagent/carbon = 5)
+ grind_results = list(/datum/reagent/cellulose = 10)
+ material_type = /datum/material/bamboo
/obj/item/stack/sheet/mineral/bamboo/get_main_recipes()
. = ..()
@@ -379,6 +383,7 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \
new/datum/stack_recipe("chemistry bag", /obj/item/storage/bag/chemistry, 4), \
new/datum/stack_recipe("bio bag", /obj/item/storage/bag/bio, 4), \
null, \
+ new/datum/stack_recipe("string", /obj/item/weaponcrafting/string, 1, time = 10), \
new/datum/stack_recipe("improvised gauze", /obj/item/stack/medical/gauze/improvised, 1, 2, 6), \
new/datum/stack_recipe("rag", /obj/item/reagent_containers/rag, 1), \
new/datum/stack_recipe("towel", /obj/item/reagent_containers/rag/towel, 3), \
@@ -426,7 +431,6 @@ GLOBAL_LIST_INIT(durathread_recipes, list ( \
new/datum/stack_recipe("durathread beret", /obj/item/clothing/head/beret/durathread, 2, time = 40), \
new/datum/stack_recipe("durathread beanie", /obj/item/clothing/head/beanie/durathread, 2, time = 40), \
new/datum/stack_recipe("durathread bandana", /obj/item/clothing/mask/bandana/durathread, 1, time = 25), \
- new/datum/stack_recipe("durathread string", /obj/item/weaponcrafting/durathread_string, 1, time = 40), \
))
/obj/item/stack/sheet/durathread
@@ -513,12 +517,14 @@ GLOBAL_LIST_INIT(cardboard_recipes, list ( \
desc = "Large sheets of card, like boxes folded flat."
singular_name = "cardboard sheet"
icon_state = "sheet-card"
+ custom_materials = list(/datum/material/cardboard = MINERAL_MATERIAL_AMOUNT)
item_state = "sheet-card"
resistance_flags = FLAMMABLE
force = 0
throwforce = 0
merge_type = /obj/item/stack/sheet/cardboard
novariants = TRUE
+ material_type = /datum/material/cardboard
/obj/item/stack/sheet/cardboard/get_main_recipes()
. = ..()
@@ -558,10 +564,12 @@ GLOBAL_LIST_INIT(runed_metal_recipes, list ( \
icon_state = "sheet-runed"
item_state = "sheet-runed"
icon = 'icons/obj/stack_objects.dmi'
+ custom_materials = list(/datum/material/runedmetal = MINERAL_MATERIAL_AMOUNT)
sheettype = "runed"
merge_type = /obj/item/stack/sheet/runed_metal
novariants = TRUE
grind_results = list(/datum/reagent/iron = 5, /datum/reagent/blood = 15)
+ material_type = /datum/material/runedmetal
/obj/item/stack/sheet/runed_metal/ratvar_act()
new /obj/item/stack/tile/brass(loc, amount)
@@ -680,6 +688,7 @@ GLOBAL_LIST_INIT(bronze_recipes, list ( \
icon_state = "sheet-brass"
item_state = "sheet-brass"
icon = 'icons/obj/stack_objects.dmi'
+ custom_materials = list(/datum/material/bronze = MINERAL_MATERIAL_AMOUNT)
resistance_flags = FIRE_PROOF | ACID_PROOF
throwforce = 10
max_amount = 50
@@ -690,6 +699,7 @@ GLOBAL_LIST_INIT(bronze_recipes, list ( \
grind_results = list(/datum/reagent/iron = 5, /datum/reagent/copper = 3) //we have no "tin" reagent so this is the closest thing
merge_type = /obj/item/stack/tile/bronze
tableVariant = /obj/structure/table/bronze
+ material_type = /datum/material/bronze
/obj/item/stack/tile/bronze/attack_self(mob/living/user)
if(is_servant_of_ratvar(user)) //still lets them build with it, just gives a message
@@ -737,6 +747,7 @@ GLOBAL_LIST_INIT(bone_recipes, list(
icon = 'icons/obj/mining.dmi'
icon_state = "bone"
item_state = "sheet-bone"
+ custom_materials = list(/datum/material/bone = MINERAL_MATERIAL_AMOUNT)
singular_name = "bone"
desc = "Someone's been drinking their milk."
force = 7
@@ -747,6 +758,7 @@ GLOBAL_LIST_INIT(bone_recipes, list(
throw_range = 3
grind_results = list(/datum/reagent/carbon = 10)
merge_type = /obj/item/stack/sheet/bone
+ material_type = /datum/material/bone
/obj/item/stack/sheet/bone/get_main_recipes()
. = ..()
@@ -774,11 +786,15 @@ GLOBAL_LIST_INIT(plastic_recipes, list(
custom_materials = list(/datum/material/plastic=MINERAL_MATERIAL_AMOUNT)
throwforce = 7
grind_results = list(/datum/reagent/glitter/white = 60)
+ material_type = /datum/material/plastic
merge_type = /obj/item/stack/sheet/plastic
/obj/item/stack/sheet/plastic/fifty
amount = 50
+/obj/item/stack/sheet/plastic/twenty
+ amount = 20
+
/obj/item/stack/sheet/plastic/five
amount = 5
@@ -796,9 +812,11 @@ new /datum/stack_recipe("paper frame door", /obj/structure/mineral_door/paperfra
singular_name = "paper frame"
icon_state = "sheet-paper"
item_state = "sheet-paper"
+ custom_materials = list(/datum/material/paper = MINERAL_MATERIAL_AMOUNT)
merge_type = /obj/item/stack/sheet/paperframes
resistance_flags = FLAMMABLE
merge_type = /obj/item/stack/sheet/paperframes
+ material_type = /datum/material/paper
/obj/item/stack/sheet/paperframes/get_main_recipes()
. = ..()
@@ -839,3 +857,55 @@ new /datum/stack_recipe("paper frame door", /obj/structure/mineral_door/paperfra
merge_type = /obj/item/stack/sheet/cotton/durathread
pull_effort = 70
loom_result = /obj/item/stack/sheet/durathread
+
+/obj/item/stack/sheet/meat
+ name = "meat sheets"
+ desc = "Something's bloody meat compressed into a nice solid sheet"
+ singular_name = "meat sheet"
+ icon_state = "sheet-meat"
+ material_flags = MATERIAL_COLOR
+ custom_materials = list(/datum/material/meat = MINERAL_MATERIAL_AMOUNT)
+ merge_type = /obj/item/stack/sheet/meat
+ material_type = /datum/material/meat
+ material_modifier = 1 //None of that wussy stuff
+
+/obj/item/stack/sheet/meat/fifty
+ amount = 50
+/obj/item/stack/sheet/meat/twenty
+ amount = 20
+/obj/item/stack/sheet/meat/five
+ amount = 5
+
+/obj/item/stack/sheet/pizza
+ name = "pepperoni sheetzzas"
+ desc = "It's a delicious pepperoni sheetzza!"
+ singular_name = "pepperoni sheetzza"
+ icon_state = "sheet-pizza"
+ custom_materials = list(/datum/material/pizza = MINERAL_MATERIAL_AMOUNT)
+ merge_type = /obj/item/stack/sheet/pizza
+ material_type = /datum/material/pizza
+ material_modifier = 1
+
+/obj/item/stack/sheet/pizza/fifty
+ amount = 50
+/obj/item/stack/sheet/pizza/twenty
+ amount = 20
+/obj/item/stack/sheet/pizza/five
+ amount = 5
+
+/obj/item/stack/sheet/sandblock
+ name = "blocks of sand"
+ desc = "You're too old to be playing with sandcastles. Now you build... sandstations."
+ singular_name = "block of sand"
+ icon_state = "sheet-sandstone"
+ custom_materials = list(/datum/material/sand = MINERAL_MATERIAL_AMOUNT)
+ merge_type = /obj/item/stack/sheet/sandblock
+ material_type = /datum/material/sand
+ material_modifier = 1
+
+/obj/item/stack/sheet/sandblock/fifty
+ amount = 50
+/obj/item/stack/sheet/sandblock/twenty
+ amount = 20
+/obj/item/stack/sheet/sandblock/five
+ amount = 5
diff --git a/code/game/objects/items/stacks/sheets/sheets.dm b/code/game/objects/items/stacks/sheets/sheets.dm
index dfba533247..57c8ba75d8 100644
--- a/code/game/objects/items/stacks/sheets/sheets.dm
+++ b/code/game/objects/items/stacks/sheets/sheets.dm
@@ -10,10 +10,14 @@
throw_range = 3
attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "smashed")
novariants = FALSE
- mats_per_stack = MINERAL_MATERIAL_AMOUNT
- var/sheettype = null //this is used for girders in the creation of walls/false walls
- var/point_value = 0 //turn-in value for the gulag stacker - loosely relative to its rarity
- var/shard_type // the shard debris typepath left over by solar panels and windows etc.
+ ///this is used for girders in the creation of walls/false walls
+ var/sheettype = null
+ ///turn-in value for the gulag stacker - loosely relative to its rarity
+ var/point_value = 0
+ /// the shard debris typepath left over by solar panels and windows etc.
+ var/shard_type
+ ///What type of wall does this sheet spawn
+ var/walltype
/obj/item/stack/sheet/Initialize(mapload, new_amount, merge)
. = ..()
diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm
index 2c8e700316..3e2bb675fa 100644
--- a/code/game/objects/items/stacks/stack.dm
+++ b/code/game/objects/items/stacks/stack.dm
@@ -22,12 +22,21 @@
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.
- var/mats_per_stack = 0
+ var/list/mats_per_unit //list that tells you how much is in a single unit.
///Datum material type that this stack is made of
var/material_type
+ max_integrity = 100
//NOTE: When adding grind_results, the amounts should be for an INDIVIDUAL ITEM - these amounts will be multiplied by the stack size in on_grind()
var/obj/structure/table/tableVariant // we tables now (stores table variant to be built from this stack)
+ // The following are all for medical treatment, they're here instead of /stack/medical because sticky tape can be used as a makeshift bandage or splint
+ /// If set and this used as a splint for a broken bone wound, this is used as a multiplier for applicable slowdowns (lower = better) (also for speeding up burn recoveries)
+ var/splint_factor
+ /// How much blood flow this stack can absorb if used as a bandage on a cut wound, note that absorption is how much we lower the flow rate, not the raw amount of blood we suck up
+ var/absorption_capacity
+ /// How quickly we lower the blood flow on a cut wound we're bandaging. Expected lifetime of this bandage in ticks is thus absorption_capacity/absorption_rate, or until the cut heals, whichever comes first
+ var/absorption_rate
+
/obj/item/stack/on_grind()
for(var/i in 1 to grind_results.len) //This should only call if it's ground, so no need to check if grind_results exists
grind_results[grind_results[i]] *= get_amount() //Gets the key at position i, then the reagent amount of that key, then multiplies it by stack size
@@ -47,8 +56,11 @@
if(!merge_type)
merge_type = type
if(custom_materials && custom_materials.len)
+ mats_per_unit = list()
+ var/in_process_mat_list = custom_materials.Copy()
for(var/i in custom_materials)
- custom_materials[SSmaterials.GetMaterialRef(i)] = mats_per_stack * amount
+ mats_per_unit[SSmaterials.GetMaterialRef(i)] = in_process_mat_list[i]
+ custom_materials[i] *= amount
. = ..()
if(merge)
for(var/obj/item/stack/S in loc)
@@ -60,7 +72,7 @@
var/datum/material/M = SSmaterials.GetMaterialRef(material_type) //First/main material
for(var/i in M.categories)
switch(i)
- if(MAT_CATEGORY_RIGID)
+ if(MAT_CATEGORY_BASE_RECIPES)
var/list/temp = SSmaterials.rigid_stack_recipes.Copy()
recipes += temp
update_weight()
@@ -221,7 +233,7 @@
return
T.PlaceOnTop(R.result_type, flags = CHANGETURF_INHERIT_AIR)
else
- O = new R.result_type(usr.drop_location())
+ O = new R.result_type(get_turf(usr))
if(O)
O.setDir(usr.dir)
log_craft("[O] crafted by [usr] at [loc_name(O.loc)]")
@@ -315,10 +327,13 @@
if (amount < used)
return FALSE
amount -= used
- if(check)
- zero_amount()
- for(var/i in custom_materials)
- custom_materials[i] = amount * mats_per_stack
+ if(check && zero_amount())
+ return TRUE
+ if(length(mats_per_unit))
+ var/temp_materials = custom_materials.Copy()
+ for(var/i in mats_per_unit)
+ temp_materials[i] = mats_per_unit[i] * src.amount
+ set_custom_materials(temp_materials)
update_icon()
update_weight()
return TRUE
@@ -350,10 +365,11 @@
source.add_charge(amount * cost)
else
src.amount += amount
- if(custom_materials && custom_materials.len)
- for(var/i in custom_materials)
- custom_materials[SSmaterials.GetMaterialRef(i)] = MINERAL_MATERIAL_AMOUNT * src.amount
- set_custom_materials() //Refresh
+ if(length(mats_per_unit))
+ var/temp_materials = custom_materials.Copy()
+ for(var/i in mats_per_unit)
+ temp_materials[i] = mats_per_unit[i] * src.amount
+ set_custom_materials(temp_materials)
update_icon()
update_weight()
@@ -382,8 +398,7 @@
merge(AM)
. = ..()
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/item/stack/attack_hand(mob/user)
+/obj/item/stack/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(user.get_inactive_held_item() == src)
if(zero_amount())
return
diff --git a/code/game/objects/items/stacks/tape.dm b/code/game/objects/items/stacks/tape.dm
new file mode 100644
index 0000000000..bbfee8dece
--- /dev/null
+++ b/code/game/objects/items/stacks/tape.dm
@@ -0,0 +1,86 @@
+
+
+/obj/item/stack/sticky_tape
+ name = "sticky tape"
+ singular_name = "sticky tape"
+ desc = "Used for sticking to things for sticking said things to people."
+ icon = 'icons/obj/tapes.dmi'
+ icon_state = "tape_w"
+ var/prefix = "sticky"
+ w_class = WEIGHT_CLASS_TINY
+ full_w_class = WEIGHT_CLASS_TINY
+ item_flags = NOBLUDGEON
+ amount = 5
+ max_amount = 5
+ resistance_flags = FLAMMABLE
+ splint_factor = 0.8
+ grind_results = list(/datum/reagent/cellulose = 5)
+
+ var/list/conferred_embed = EMBED_HARMLESS
+ var/overwrite_existing = FALSE
+
+ var/endless = FALSE
+ var/apply_time = 30
+
+/obj/item/stack/sticky_tape/afterattack(obj/item/I, mob/living/user)
+ if(!istype(I))
+ return
+
+ if(I.embedding && I.embedding == conferred_embed)
+ to_chat(user, "[I] is already coated in [src]!")
+ return
+
+ user.visible_message("[user] begins wrapping [I] with [src].", "You begin wrapping [I] with [src].")
+
+ if(do_after(user, apply_time, target=I))
+ I.embedding = conferred_embed
+ I.updateEmbedding()
+ to_chat(user, "You finish wrapping [I] with [src].")
+ if(!endless)
+ use(1)
+ I.name = "[prefix] [I.name]"
+
+ if(istype(I, /obj/item/grenade))
+ var/obj/item/grenade/sticky_bomb = I
+ sticky_bomb.sticky = TRUE
+
+/obj/item/stack/sticky_tape/infinite //endless tape that applies far faster, for maximum honks
+ name = "endless sticky tape"
+ desc = "This roll of sticky tape somehow has no end."
+ endless = TRUE
+ apply_time = 10
+
+/obj/item/stack/sticky_tape/super
+ name = "super sticky tape"
+ singular_name = "super sticky tape"
+ desc = "Quite possibly the most mischevious substance in the galaxy. Use with extreme lack of caution."
+ icon_state = "tape_y"
+ prefix = "super sticky"
+ conferred_embed = EMBED_HARMLESS_SUPERIOR
+ splint_factor = 0.6
+
+/obj/item/stack/sticky_tape/pointy
+ name = "pointy tape"
+ singular_name = "pointy tape"
+ desc = "Used for sticking to things for sticking said things inside people."
+ icon_state = "tape_evil"
+ prefix = "pointy"
+ conferred_embed = EMBED_POINTY
+
+/obj/item/stack/sticky_tape/pointy/super
+ name = "super pointy tape"
+ singular_name = "super pointy tape"
+ desc = "You didn't know tape could look so sinister. Welcome to Space Station 13."
+ icon_state = "tape_spikes"
+ prefix = "super pointy"
+ conferred_embed = EMBED_POINTY_SUPERIOR
+
+/obj/item/stack/sticky_tape/surgical
+ name = "surgical tape"
+ singular_name = "surgical tape"
+ desc = "Made for patching broken bones back together alongside bone gel, not for playing pranks."
+ //icon_state = "tape_spikes"
+ prefix = "surgical"
+ conferred_embed = list("embed_chance" = 30, "pain_mult" = 0, "jostle_pain_mult" = 0, "ignore_throwspeed_threshold" = TRUE)
+ splint_factor = 0.4
+ custom_price = 500
diff --git a/code/game/objects/items/stacks/telecrystal.dm b/code/game/objects/items/stacks/telecrystal.dm
index 9b5ca2b066..54824940c1 100644
--- a/code/game/objects/items/stacks/telecrystal.dm
+++ b/code/game/objects/items/stacks/telecrystal.dm
@@ -4,6 +4,7 @@
singular_name = "telecrystal"
icon = 'icons/obj/telescience.dmi'
icon_state = "telecrystal"
+ grind_results = list(/datum/reagent/telecrystal = 20)
w_class = WEIGHT_CLASS_TINY
max_amount = 50
item_flags = NOBLUDGEON
diff --git a/code/game/objects/items/stacks/tickets.dm b/code/game/objects/items/stacks/tickets.dm
new file mode 100644
index 0000000000..22cb895277
--- /dev/null
+++ b/code/game/objects/items/stacks/tickets.dm
@@ -0,0 +1,31 @@
+/obj/item/stack/arcadeticket
+ name = "arcade tickets"
+ desc = "Wow! With enough of these, you could buy a bike! ...Pssh, yeah right."
+ singular_name = "arcade ticket"
+ icon_state = "arcade-ticket"
+ item_state = "tickets"
+ w_class = WEIGHT_CLASS_TINY
+ max_amount = 30
+
+/obj/item/stack/arcadeticket/Initialize(mapload, new_amount, merge = TRUE)
+ . = ..()
+ update_icon()
+
+/obj/item/stack/arcadeticket/update_icon()
+ var/amount = get_amount()
+ if((amount >= 12) && (amount > 0))
+ icon_state = "arcade-ticket_4"
+ else if((amount >= 6) && (amount > 0))
+ icon_state = "arcade-ticket_3"
+ else if((amount >= 2) && (amount > 0))
+ icon_state = "arcade-ticket_2"
+ else
+ icon_state = "arcade-ticket"
+
+/obj/item/stack/arcadeticket/proc/pay_tickets()
+ amount -= 2
+ if (amount == 0)
+ qdel(src)
+
+/obj/item/stack/arcadeticket/thirty
+ amount = 30
diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm
index ff81b4340a..13fca1e8fe 100644
--- a/code/game/objects/items/stacks/tiles/tile_types.dm
+++ b/code/game/objects/items/stacks/tiles/tile_types.dm
@@ -9,16 +9,35 @@
throw_speed = 3
throw_range = 7
max_amount = 60
- mats_per_stack = 500
var/turf_type = null
var/mineralType = null
novariants = TRUE
+ var/human_maxHealth = 100
/obj/item/stack/tile/Initialize(mapload, amount)
. = ..()
pixel_x = rand(-3, 3)
pixel_y = rand(-3, 3) //randomize a little
+/obj/item/stack/tile/examine(mob/user)
+ . = ..()
+ if(throwforce && !is_cyborg) //do not want to divide by zero or show the message to borgs who can't throw
+ var/verb
+ switch(CEILING(human_maxHealth / throwforce, 1)) //throws to crit a human
+ if(1 to 3)
+ verb = "superb"
+ if(4 to 6)
+ verb = "great"
+ if(7 to 9)
+ verb = "good"
+ if(10 to 12)
+ verb = "fairly decent"
+ if(13 to 15)
+ verb = "mediocre"
+ if(!verb)
+ return
+ . += "Those could work as a [verb] throwing weapon."
+
/obj/item/stack/tile/attackby(obj/item/W, mob/user, params)
if (istype(W, /obj/item/weldingtool))
@@ -266,6 +285,9 @@
/obj/item/stack/tile/carpet/blackred/twenty
amount = 20
+/obj/item/stack/tile/carpet/blackred/thirty
+ amount = 30
+
/obj/item/stack/tile/carpet/blackred/fifty
amount = 50
@@ -275,6 +297,9 @@
/obj/item/stack/tile/carpet/monochrome/twenty
amount = 20
+/obj/item/stack/tile/carpet/monochrome/thirty
+ amount = 30
+
/obj/item/stack/tile/carpet/monochrome/fifty
amount = 50
@@ -284,6 +309,9 @@
/obj/item/stack/tile/carpet/blue/twenty
amount = 20
+/obj/item/stack/tile/carpet/blue/thirty
+ amount = 30
+
/obj/item/stack/tile/carpet/blue/fifty
amount = 50
@@ -293,6 +321,9 @@
/obj/item/stack/tile/carpet/cyan/twenty
amount = 20
+/obj/item/stack/tile/carpet/cyan/thirty
+ amount = 30
+
/obj/item/stack/tile/carpet/cyan/fifty
amount = 50
@@ -302,6 +333,9 @@
/obj/item/stack/tile/carpet/green/twenty
amount = 20
+/obj/item/stack/tile/carpet/green/thirty
+ amount = 30
+
/obj/item/stack/tile/carpet/green/fifty
amount = 50
@@ -311,6 +345,9 @@
/obj/item/stack/tile/carpet/orange/twenty
amount = 20
+/obj/item/stack/tile/carpet/orange/thirty
+ amount = 30
+
/obj/item/stack/tile/carpet/orange/fifty
amount = 50
@@ -320,6 +357,9 @@
/obj/item/stack/tile/carpet/purple/twenty
amount = 20
+/obj/item/stack/tile/carpet/purple/thirty
+ amount = 30
+
/obj/item/stack/tile/carpet/purple/fifty
amount = 50
@@ -329,6 +369,9 @@
/obj/item/stack/tile/carpet/red/twenty
amount = 20
+/obj/item/stack/tile/carpet/red/thirty
+ amount = 30
+
/obj/item/stack/tile/carpet/red/fifty
amount = 50
@@ -338,6 +381,9 @@
/obj/item/stack/tile/carpet/royalblack/twenty
amount = 20
+/obj/item/stack/tile/carpet/royalblack/thirty
+ amount = 30
+
/obj/item/stack/tile/carpet/royalblack/fifty
amount = 50
@@ -347,6 +393,9 @@
/obj/item/stack/tile/carpet/royalblue/twenty
amount = 20
+/obj/item/stack/tile/carpet/royalblue/thirty
+ amount = 30
+
/obj/item/stack/tile/carpet/royalblue/fifty
amount = 50
@@ -440,7 +489,7 @@
/obj/item/stack/tile/plasteel
name = "floor tile"
singular_name = "floor tile"
- desc = "Those could work as a pretty decent throwing weapon."
+ desc = "The ground you walk on."
icon_state = "tile"
force = 6
custom_materials = list(/datum/material/iron=500)
@@ -452,7 +501,15 @@
resistance_flags = FIRE_PROOF
/obj/item/stack/tile/plasteel/cyborg
- desc = "The ground you walk on." //Not the usual floor tile desc as that refers to throwing, Cyborgs can't do that - RR
custom_materials = null // All other Borg versions of items have no Metal or Glass - RR
is_cyborg = 1
cost = 125
+
+/obj/item/stack/tile/material
+ name = "floor tile"
+ singular_name = "floor tile"
+ desc = "The ground you walk on."
+ throwforce = 10
+ icon_state = "material_tile"
+ turf_type = /turf/open/floor/material
+ material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS
diff --git a/code/game/objects/items/stacks/wrap.dm b/code/game/objects/items/stacks/wrap.dm
index 10240e902b..6ae63e640f 100644
--- a/code/game/objects/items/stacks/wrap.dm
+++ b/code/game/objects/items/stacks/wrap.dm
@@ -35,6 +35,7 @@
amount = 25
max_amount = 25
resistance_flags = FLAMMABLE
+ grind_results = list(/datum/reagent/cellulose = 5)
/obj/item/stack/packageWrap/suicide_act(mob/living/user)
user.visible_message("[user] begins wrapping [user.p_them()]self in \the [src]! It looks like [user.p_theyre()] trying to commit suicide!")
diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm
index 3d5f0dc924..f15588a7f1 100644
--- a/code/game/objects/items/storage/backpack.dm
+++ b/code/game/objects/items/storage/backpack.dm
@@ -369,6 +369,7 @@
new /obj/item/circular_saw(src)
new /obj/item/surgicaldrill(src)
new /obj/item/cautery(src)
+ new /obj/item/bonesetter(src)
new /obj/item/surgical_drapes(src)
new /obj/item/clothing/mask/surgical(src)
new /obj/item/reagent_containers/medspray/sterilizine(src)
@@ -391,6 +392,7 @@
new /obj/item/circular_saw(src)
new /obj/item/surgicaldrill(src)
new /obj/item/cautery(src)
+ new /obj/item/bonesetter(src)
new /obj/item/surgical_drapes(src)
new /obj/item/clothing/mask/surgical(src)
new /obj/item/reagent_containers/medspray/sterilizine(src)
@@ -485,6 +487,7 @@
new /obj/item/circular_saw(src)
new /obj/item/surgicaldrill(src)
new /obj/item/cautery(src)
+ new /obj/item/bonesetter(src)
new /obj/item/surgical_drapes(src)
new /obj/item/clothing/suit/straight_jacket(src)
new /obj/item/clothing/mask/muzzle(src)
@@ -501,8 +504,8 @@
new /obj/item/scalpel/advanced(src)
new /obj/item/retractor/advanced(src)
new /obj/item/surgicaldrill/advanced(src)
+ new /obj/item/bonesetter(src)
new /obj/item/surgical_drapes(src)
- new /obj/item/storage/firstaid/tactical(src)
new /obj/item/clothing/suit/straight_jacket(src)
new /obj/item/clothing/mask/muzzle(src)
new /obj/item/mmi/syndie(src)
@@ -648,3 +651,9 @@ obj/item/storage/backpack/duffelbag/syndie/shredderbundle
new /obj/item/gun/ballistic/automatic/flechette/shredder(src)
new /obj/item/storage/belt/military(src)
new /obj/item/clothing/suit/space/hardsuit/syndi/elite(src)
+
+/obj/item/storage/backpack/snail
+ name = "snail shell"
+ desc = "Worn by snails as armor and storage compartment."
+ icon_state = "snailshell"
+ item_state = "snailshell"
diff --git a/code/game/objects/items/storage/bags.dm b/code/game/objects/items/storage/bags.dm
index 315b342ea7..b64aa60cac 100644
--- a/code/game/objects/items/storage/bags.dm
+++ b/code/game/objects/items/storage/bags.dm
@@ -48,7 +48,8 @@
STR.max_w_class = WEIGHT_CLASS_SMALL
STR.max_combined_w_class = 30
STR.max_items = 30
- STR.cant_hold = typecacheof(list(/obj/item/disk/nuclear))
+ STR.can_hold_extra = typecacheof(list(/obj/item/organ/lungs, /obj/item/organ/liver, /obj/item/organ/stomach, /obj/item/clothing/shoes)) - typesof(/obj/item/clothing/shoes/magboots, /obj/item/clothing/shoes/clown_shoes, /obj/item/clothing/shoes/jackboots, /obj/item/clothing/shoes/workboots)
+ STR.cant_hold = typecacheof(list(/obj/item/disk/nuclear, /obj/item/storage/wallet, /obj/item/organ/brain))
STR.limited_random_access = TRUE
STR.limited_random_access_stack_position = 3
@@ -326,6 +327,7 @@
w_class = WEIGHT_CLASS_BULKY
flags_1 = CONDUCT_1
custom_materials = list(/datum/material/iron=3000)
+ var/max_items = 7
/obj/item/storage/bag/tray/ComponentInitialize()
. = ..()
@@ -333,6 +335,7 @@
STR.max_w_class = WEIGHT_CLASS_NORMAL
STR.can_hold = typecacheof(list(/obj/item/reagent_containers/food, /obj/item/reagent_containers/glass, /datum/reagent/consumable, /obj/item/kitchen/knife, /obj/item/kitchen/rollingpin, /obj/item/kitchen/fork, /obj/item/storage/box)) //Should cover: Bottles, Beakers, Bowls, Booze, Glasses, Food, Kitchen Tools, and ingredient boxes.
STR.insert_preposition = "on"
+ STR.max_items = max_items
/obj/item/storage/bag/tray/attack(mob/living/M, mob/living/user)
. = ..()
@@ -373,6 +376,14 @@
. = ..()
update_icon()
+//bluespace tray, holds more items
+/obj/item/storage/bag/tray/bluespace
+ name = "bluespace tray"
+ icon_state = "bluespace_tray"
+ desc = "A tray created using bluespace technology to fit more food on it."
+ max_items = 30 // far more items
+ custom_materials = list(/datum/material/iron = 2000, /datum/material/bluespace = 500)
+
/*
* Chemistry bag
*/
@@ -391,7 +402,7 @@
STR.storage_flags = STORAGE_FLAGS_VOLUME_DEFAULT
STR.max_volume = STORAGE_VOLUME_CHEMISTRY_BAG
STR.insert_preposition = "in"
- STR.can_hold = typecacheof(list(/obj/item/reagent_containers/pill, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/syringe/dart))
+ STR.can_hold = typecacheof(list(/obj/item/reagent_containers/pill, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/syringe/dart, /obj/item/reagent_containers/chem_pack))
/*
* Biowaste bag (mostly for xenobiologists)
@@ -444,4 +455,22 @@
STR.max_combined_w_class = 30
STR.max_items = 3
STR.display_numerical_stacking = FALSE
- STR.can_hold = typecacheof(list(/obj/item/ammo_box/magazine, /obj/item/ammo_casing))
\ No newline at end of file
+ STR.can_hold = typecacheof(list(/obj/item/ammo_box/magazine, /obj/item/ammo_casing))
+
+/obj/item/storage/bag/material
+ name = "material pouch"
+ desc = "A pouch for sheets and RCD ammunition that manages to hang where you would normally put things in your pocket."
+ icon = 'icons/obj/items_and_weapons.dmi'
+ icon_state = "materialpouch"
+ slot_flags = ITEM_SLOT_POCKET
+ w_class = WEIGHT_CLASS_BULKY
+ resistance_flags = FLAMMABLE
+
+/obj/item/storage/bag/material/ComponentInitialize()
+ . = ..()
+ var/datum/component/storage/STR = GetComponent(/datum/component/storage)
+ STR.max_w_class = WEIGHT_CLASS_NORMAL
+ STR.max_combined_w_class = INFINITY
+ STR.max_items = 2
+ STR.display_numerical_stacking = TRUE
+ STR.can_hold = typecacheof(list(/obj/item/rcd_ammo, /obj/item/stack/sheet))
diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm
index 7809f6d73b..3c554aa58e 100755
--- a/code/game/objects/items/storage/belt.dm
+++ b/code/game/objects/items/storage/belt.dm
@@ -83,7 +83,7 @@
new /obj/item/multitool(src)
new /obj/item/stack/cable_coil(src,30,pick("red","yellow","orange"))
new /obj/item/extinguisher/mini(src)
- new /obj/item/analyzer(src)
+ new /obj/item/analyzer/ranged(src)
//much roomier now that we've managed to remove two tools
/obj/item/storage/belt/utility/full/PopulateContents()
@@ -120,7 +120,7 @@
new /obj/item/wrench/brass(src)
new /obj/item/crowbar/brass(src)
new /obj/item/weldingtool/experimental/brass(src)
- new /obj/item/multitool(src)
+ new /obj/item/multitool/advanced/brass(src)
new /obj/item/stack/cable_coil(src, 30, "yellow")
/obj/item/storage/belt/medical
@@ -162,6 +162,7 @@
/obj/item/surgical_drapes, //for true paramedics
/obj/item/scalpel,
/obj/item/circular_saw,
+ /obj/item/bonesetter,
/obj/item/surgicaldrill,
/obj/item/retractor,
/obj/item/cautery,
@@ -180,7 +181,9 @@
/obj/item/implantcase,
/obj/item/implant,
/obj/item/implanter,
- /obj/item/pinpointer/crew
+ /obj/item/pinpointer/crew,
+ /obj/item/reagent_containers/chem_pack,
+ /obj/item/stack/sticky_tape //surgical tape
))
/obj/item/storage/belt/medical/surgery_belt_adv
@@ -443,10 +446,11 @@
/obj/item/storage/belt/durathread
name = "durathread toolbelt"
- desc = "A toolbelt made out of durathread, it seems resistant enough to hold even big tools like an RCD, it also has higher capacity."
+ desc = "A toolbelt made out of durathread, it seems robust enough to hold bigger tools like RCDs or RPDs, with enough pouches to hold more gear than a normal belt."
icon_state = "webbing-durathread"
item_state = "webbing-durathread"
resistance_flags = FIRE_PROOF
+ rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE //If normal belts get this, the upgraded version should too
/obj/item/storage/belt/durathread/ComponentInitialize()
. = ..()
@@ -466,7 +470,7 @@
/obj/item/t_scanner,
/obj/item/analyzer,
/obj/item/geiger_counter,
- /obj/item/extinguisher/mini,
+ /obj/item/extinguisher,
/obj/item/radio,
/obj/item/clothing/gloves,
/obj/item/holosign_creator,
@@ -487,7 +491,8 @@
desc = "A belt for holding grenades."
icon_state = "grenadebeltnew"
item_state = "security"
-
+ rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
+
/obj/item/storage/belt/grenade/ComponentInitialize()
. = ..()
var/datum/component/storage/STR = GetComponent(/datum/component/storage)
@@ -512,16 +517,16 @@
new /obj/item/grenade/smokebomb(src)
new /obj/item/grenade/empgrenade(src)
new /obj/item/grenade/empgrenade(src)
- new /obj/item/grenade/syndieminibomb/concussion/frag(src)
- new /obj/item/grenade/syndieminibomb/concussion/frag(src)
- new /obj/item/grenade/syndieminibomb/concussion/frag(src)
- new /obj/item/grenade/syndieminibomb/concussion/frag(src)
- new /obj/item/grenade/syndieminibomb/concussion/frag(src)
- new /obj/item/grenade/syndieminibomb/concussion/frag(src)
- new /obj/item/grenade/syndieminibomb/concussion/frag(src)
- new /obj/item/grenade/syndieminibomb/concussion/frag(src)
- new /obj/item/grenade/syndieminibomb/concussion/frag(src)
- new /obj/item/grenade/syndieminibomb/concussion/frag(src)
+ new /obj/item/grenade/frag(src)
+ new /obj/item/grenade/frag(src)
+ new /obj/item/grenade/frag(src)
+ new /obj/item/grenade/frag(src)
+ new /obj/item/grenade/frag(src)
+ new /obj/item/grenade/frag(src)
+ new /obj/item/grenade/frag(src)
+ new /obj/item/grenade/frag(src)
+ new /obj/item/grenade/frag(src)
+ new /obj/item/grenade/frag(src)
new /obj/item/grenade/gluon(src)
new /obj/item/grenade/gluon(src)
new /obj/item/grenade/gluon(src)
@@ -585,7 +590,7 @@
/obj/item/key/janitor,
/obj/item/clothing/gloves,
/obj/item/melee/flyswatter,
- /obj/item/twohanded/broom,
+ /obj/item/broom,
/obj/item/paint/paint_remover,
/obj/item/assembly/mousetrap,
/obj/item/screwdriver,
@@ -810,4 +815,3 @@
attack_verb = list("bashed", "slashes", "prods", "pokes")
fitting_swords = list(/obj/item/melee/rapier)
starting_sword = /obj/item/melee/rapier
-
diff --git a/code/game/objects/items/storage/book.dm b/code/game/objects/items/storage/book.dm
index e3f590aa2a..7532aacbfa 100644
--- a/code/game/objects/items/storage/book.dm
+++ b/code/game/objects/items/storage/book.dm
@@ -104,7 +104,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "bible",
SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "blessing", /datum/mood_event/blessing)
return 1
-/obj/item/storage/book/bible/attack(mob/living/M, mob/living/carbon/human/user, heal_mode = TRUE)
+/obj/item/storage/book/bible/attack(mob/living/M, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1, heal_mode = TRUE)
if (!user.IsAdvancedToolUser())
to_chat(user, "You don't have the dexterity to do this!")
@@ -173,12 +173,12 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "bible",
var/unholy2clean = A.reagents.get_reagent_amount(/datum/reagent/fuel/unholywater)
A.reagents.del_reagent(/datum/reagent/fuel/unholywater)
A.reagents.add_reagent(/datum/reagent/water/holywater,unholy2clean)
- if(istype(A, /obj/item/twohanded/required/cult_bastard) || istype(A, /obj/item/melee/cultblade) && !iscultist(user))
+ if(istype(A, /obj/item/cult_bastard) || istype(A, /obj/item/melee/cultblade) && !iscultist(user))
to_chat(user, "You begin to exorcise [A].")
playsound(src,'sound/hallucinations/veryfar_noise.ogg',40,1)
if(do_after(user, 40, target = A))
playsound(src,'sound/effects/pray_chaplain.ogg',60,1)
- if(istype(A, /obj/item/twohanded/required/cult_bastard))
+ if(istype(A, /obj/item/cult_bastard))
for(var/obj/item/soulstone/SS in A.contents)
SS.usability = TRUE
for(var/mob/living/simple_animal/shade/EX in SS)
@@ -238,11 +238,10 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "bible",
var/ownername = H.real_name
desc += "The name [ownername] is written in blood inside the cover."
-/obj/item/storage/book/bible/syndicate/attack(mob/living/M, mob/living/carbon/human/user, heal_mode = TRUE)
- if (user.a_intent == INTENT_HELP)
- return ..()
- else
- return ..(M,user,heal_mode = FALSE)
+/obj/item/storage/book/bible/syndicate/attack(mob/living/M, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1, heal_mode = TRUE)
+ if(user.a_intent != INTENT_HELP)
+ heal_mode = FALSE //args pass over
+ return ..() // to ..()
/obj/item/storage/book/bible/syndicate/add_blood_DNA(list/blood_dna)
return FALSE
diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm
index 08b5f18ead..975621ead1 100644
--- a/code/game/objects/items/storage/boxes.dm
+++ b/code/game/objects/items/storage/boxes.dm
@@ -275,6 +275,16 @@
for(var/i in 1 to 7)
new /obj/item/grenade/flashbang(src)
+obj/item/storage/box/stingbangs
+ name = "box of stingbangs (WARNING)"
+ desc = "WARNING: These devices are extremely dangerous and can cause severe injuries or death in repeated use."
+ icon_state = "secbox"
+ illustration = "flashbang"
+
+/obj/item/storage/box/stingbangs/PopulateContents()
+ for(var/i in 1 to 5)
+ new /obj/item/grenade/stingbang(src)
+
/obj/item/storage/box/flashes
name = "box of flashbulbs"
desc = "WARNING: Flashes can cause serious eye damage, protective eyewear is required."
@@ -716,9 +726,9 @@
return (BRUTELOSS)
/obj/item/storage/box/hug/attack_self(mob/user)
- ..()
- user.changeNext_move(CLICK_CD_MELEE)
- playsound(loc, "rustle", 50, 1, -5)
+ . = ..()
+ user.DelayNextAction(CLICK_CD_MELEE)
+ playsound(src, "rustle", 50, 1, -5)
user.visible_message("[user] hugs \the [src].","You hug \the [src].")
SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT,"hugbox", /datum/mood_event/hugbox)
@@ -1408,3 +1418,9 @@
new /obj/item/reagent_containers/glass/beaker/meta(src)
new /obj/item/reagent_containers/glass/beaker/noreact(src)
new /obj/item/reagent_containers/glass/beaker/bluespace(src)
+
+/obj/item/storage/box/strange_seeds_5pack
+
+/obj/item/storage/box/strange_seeds_5pack/PopulateContents()
+ for(var/i in 1 to 5)
+ new /obj/item/seeds/random(src)
diff --git a/code/game/objects/items/storage/briefcase.dm b/code/game/objects/items/storage/briefcase.dm
index 826a00b90d..454475625d 100644
--- a/code/game/objects/items/storage/briefcase.dm
+++ b/code/game/objects/items/storage/briefcase.dm
@@ -106,10 +106,10 @@
/obj/item/storage/briefcase/medical
name = "medical briefcase"
icon_state = "medbriefcase"
- desc = "A white with a blue cross brieface, this is ment to hold medical gear that would not be able to normally fit in a bag."
+ desc = "A white with a blue cross brieface, this is meant to hold medical gear that would not be able to normally fit in a bag."
/obj/item/storage/briefcase/medical/PopulateContents()
new /obj/item/clothing/neck/stethoscope(src)
new /obj/item/healthanalyzer(src)
- ..() //In case of paperwork
+ ..() //Incase of paperwork
diff --git a/code/game/objects/items/storage/dakis.dm b/code/game/objects/items/storage/dakis.dm
index 1939593c8e..29f12df4c4 100644
--- a/code/game/objects/items/storage/dakis.dm
+++ b/code/game/objects/items/storage/dakis.dm
@@ -47,6 +47,6 @@
if(INTENT_HARM)
user.visible_message("[user] punches the [name]!")
playsound(src, 'sound/effects/shieldbash.ogg', 50, 1)
- user.changeNext_move(CLICK_CD_MELEE)
+ user.DelayNextAction(CLICK_CD_MELEE)
////////////////////////////
diff --git a/code/game/objects/items/storage/fancy.dm b/code/game/objects/items/storage/fancy.dm
index b78bd99d92..cde6f5bd5a 100644
--- a/code/game/objects/items/storage/fancy.dm
+++ b/code/game/objects/items/storage/fancy.dm
@@ -138,6 +138,22 @@
icon_type = "cigarette"
spawn_type = /obj/item/clothing/mask/cigarette/space_cigarette
custom_price = PRICE_ALMOST_CHEAP
+ var/spawn_coupon = TRUE
+
+/obj/item/storage/fancy/cigarettes/attack_self(mob/user)
+ if(contents.len == 0 && spawn_coupon)
+ to_chat(user, "You rip the back off \the [src] and get a coupon!")
+ var/obj/item/coupon/attached_coupon = new
+ user.put_in_hands(attached_coupon)
+ attached_coupon.generate()
+ attached_coupon = null
+ spawn_coupon = FALSE
+ name = "discarded cigarette packet"
+ desc = "An old cigarette packet with the back torn off, worth less than nothing now."
+ var/datum/component/storage/STR = GetComponent(/datum/component/storage)
+ STR.max_items = 0
+ return
+ return ..()
/obj/item/storage/fancy/cigarettes/ComponentInitialize()
. = ..()
@@ -148,15 +164,23 @@
/obj/item/storage/fancy/cigarettes/examine(mob/user)
. = ..()
. += "Alt-click to extract contents."
+ if(spawn_coupon)
+ . += "There's a coupon on the back of the pack! You can tear it off once it's empty."
/obj/item/storage/fancy/cigarettes/AltClick(mob/living/carbon/user)
+ . = ..()
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
return
- var/obj/item/clothing/mask/cigarette/W = locate(/obj/item/clothing/mask/cigarette) in contents
+ var/obj/item/lighter/L = locate() in contents
+ if(L)
+ SEND_SIGNAL(src, COMSIG_TRY_STORAGE_TAKE, L, user)
+ user.put_in_hands(L)
+ to_chat(user, "You take \a [L] out of the pack.")
+ return TRUE
+ var/obj/item/clothing/mask/cigarette/W = locate() in contents
if(W && contents.len > 0)
SEND_SIGNAL(src, COMSIG_TRY_STORAGE_TAKE, W, user)
user.put_in_hands(W)
- contents -= W
to_chat(user, "You take \a [W] out of the pack.")
else
to_chat(user, "There are no [icon_type]s left in the pack.")
@@ -189,18 +213,18 @@
cig_position++
/obj/item/storage/fancy/cigarettes/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
- if(!ismob(M))
- return
+ if(M != user || !istype(M))
+ return ..()
var/obj/item/clothing/mask/cigarette/cig = locate(/obj/item/clothing/mask/cigarette) in contents
if(cig)
- if(M == user && contents.len > 0 && !user.wear_mask)
+ if(!user.wear_mask && !(SLOT_WEAR_MASK in M.check_obscured_slots()))
var/obj/item/clothing/mask/cigarette/W = cig
SEND_SIGNAL(src, COMSIG_TRY_STORAGE_TAKE, W, M)
M.equip_to_slot_if_possible(W, SLOT_WEAR_MASK)
contents -= W
to_chat(user, "You take \a [W] out of the pack.")
else
- ..()
+ return ..()
else
to_chat(user, "There are no [icon_type]s left in the pack.")
@@ -308,6 +332,7 @@
w_class = WEIGHT_CLASS_NORMAL
icon_type = "premium cigar"
spawn_type = /obj/item/clothing/mask/cigarette/cigar
+ spawn_coupon = FALSE
/obj/item/storage/fancy/cigarettes/cigars/ComponentInitialize()
. = ..()
@@ -379,6 +404,20 @@
STR.max_items = 6
STR.can_hold = typecacheof(list(/obj/item/reagent_containers/food/snacks/nugget))
+/obj/item/storage/fancy/cracker_pack
+ name = "cracker pack"
+ desc = "A pack of delicious crackers. Keep away from parrots!"
+ icon = 'icons/obj/food/containers.dmi'
+ icon_state = "crackerbox"
+ icon_type = "cracker"
+ spawn_type = /obj/item/reagent_containers/food/snacks/cracker
+
+/obj/item/storage/fancy/cracker_pack/ComponentInitialize()
+ . = ..()
+ var/datum/component/storage/STR = GetComponent(/datum/component/storage)
+ STR.max_items = 6
+ STR.can_hold = typecacheof(list(/obj/item/reagent_containers/food/snacks/cracker))
+
/*
* Ring Box
*/
diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm
index e082c15741..480e1966e9 100644
--- a/code/game/objects/items/storage/firstaid.dm
+++ b/code/game/objects/items/storage/firstaid.dm
@@ -41,9 +41,25 @@
new /obj/item/stack/medical/suture(src)
new /obj/item/stack/medical/mesh(src)
new /obj/item/stack/medical/mesh(src)
- new /obj/item/reagent_containers/hypospray/medipen(src)
+ new /obj/item/reagent_containers/hypospray/medipen/ekit(src)
new /obj/item/healthanalyzer(src)
+/obj/item/storage/firstaid/emergency
+ icon_state = "medbriefcase"
+ name = "emergency first-aid kit"
+ desc = "A very simple first aid kit meant to secure and stabilize serious wounds for later treatment."
+
+/obj/item/storage/firstaid/emergency/PopulateContents()
+ if(empty)
+ return
+ var/static/items_inside = list(
+ /obj/item/healthanalyzer/wound = 1,
+ /obj/item/stack/medical/gauze = 1,
+ /obj/item/stack/medical/suture/emergency = 1,
+ /obj/item/stack/medical/ointment = 1,
+ /obj/item/reagent_containers/hypospray/medipen/ekit = 2)
+ generate_items_inside(items_inside,src)
+
/obj/item/storage/firstaid/ancient
icon_state = "firstaid"
desc = "A first aid kit with the ability to heal common types of injuries."
@@ -229,6 +245,25 @@
STR.click_gather = TRUE
STR.can_hold = typecacheof(list(/obj/item/reagent_containers/pill, /obj/item/dice))
+/obj/item/storage/pill_bottle/AltClick(mob/living/carbon/user)
+ if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
+ return
+ if(!length(user.get_empty_held_indexes()))
+ to_chat(user, "Your hands are full!")
+ return
+ var/obj/item/reagent_containers/pill/P = locate() in contents
+ if(P)
+ SEND_SIGNAL(src, COMSIG_TRY_STORAGE_TAKE, P, user)
+ if(!user.put_in_hands(P))
+ P.forceMove(user.drop_location()) // make sure it's not stuck in the user if the put in hands somehow fails
+ to_chat(user, "[P] drops to the floor!")
+ else
+ to_chat(user, "You take \a [P] out of [src].")
+ else
+ to_chat(user, "There are no pills left in the bottle.")
+ return TRUE
+
+
/obj/item/storage/pill_bottle/suicide_act(mob/user)
user.visible_message("[user] is trying to get the cap off [src]! It looks like [user.p_theyre()] trying to commit suicide!")
return (TOXLOSS)
@@ -370,6 +405,14 @@
for(var/i in 1 to 7)
new /obj/item/reagent_containers/pill/breast_enlargement(src)
+/obj/item/storage/pill_bottle/neurine
+ name = "bottle of neurine pills"
+ desc = "Contains pills to treat non-severe mental traumas."
+
+/obj/item/storage/pill_bottle/neurine/PopulateContents()
+ for(var/i in 1 to 5)
+ new /obj/item/reagent_containers/pill/neurine(src)
+
/////////////
//Organ Box//
/////////////
@@ -408,6 +451,7 @@
/obj/item/retractor,
/obj/item/cautery,
/obj/item/surgical_drapes,
+ /obj/item/bonesetter,
/obj/item/autosurgeon,
/obj/item/organ,
/obj/item/implant,
@@ -418,7 +462,8 @@
/obj/item/circuitboard/computer/crew,
/obj/item/stack/sheet/glass,
/obj/item/stack/sheet/mineral/silver,
- /obj/item/organ_storage
+ /obj/item/organ_storage,
+ /obj/item/reagent_containers/chem_pack
))
//hijacking the minature first aids for hypospray boxes. <3
diff --git a/code/game/objects/items/storage/lockbox.dm b/code/game/objects/items/storage/lockbox.dm
index 5b6089d430..ce4e8b9df1 100644
--- a/code/game/objects/items/storage/lockbox.dm
+++ b/code/game/objects/items/storage/lockbox.dm
@@ -188,19 +188,52 @@
new /obj/item/clothing/accessory/medal/plasma/nobel_science(src)
/obj/item/storage/lockbox/medal/engineering
- name = "engineering medal box"
- desc = "A locked box used to store medals to be given to the members of the engineering department."
- req_access = list(ACCESS_CE)
+ name = "engineering medal box"
+ desc = "A locked box used to store medals to be given to the members of the engineering department."
+ req_access = list(ACCESS_CE)
/obj/item/storage/lockbox/medal/engineering/PopulateContents()
- for(var/i in 1 to 3)
- new /obj/item/clothing/accessory/medal/engineer(src)
+ for(var/i in 1 to 3)
+ new /obj/item/clothing/accessory/medal/engineer(src)
/obj/item/storage/lockbox/medal/medical
- name = "medical medal box"
- desc = "A locked box used to store medals to be given to the members of the medical department."
- req_access = list(ACCESS_CMO)
+ name = "medical medal box"
+ desc = "A locked box used to store medals to be given to the members of the medical department."
+ req_access = list(ACCESS_CMO)
/obj/item/storage/lockbox/medal/medical/PopulateContents()
- for(var/i in 1 to 3)
- new /obj/item/clothing/accessory/medal/ribbon/medical_doctor(src)
\ No newline at end of file
+ for(var/i in 1 to 3)
+ new /obj/item/clothing/accessory/medal/ribbon/medical_doctor(src)
+
+/obj/item/storage/lockbox/order
+ name = "order lockbox"
+ desc = "A box used to secure small cargo orders from being looted by those who didn't order it. Yeah, cargo tech, that means you."
+ icon = 'icons/obj/storage.dmi'
+ icon_state = "secure"
+ item_state = "sec-case"
+ lefthand_file = 'icons/mob/inhands/equipment/briefcase_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/briefcase_righthand.dmi'
+ w_class = WEIGHT_CLASS_HUGE
+ var/datum/bank_account/buyer_account
+ var/privacy_lock = TRUE
+
+/obj/item/storage/lockbox/order/Initialize(datum/bank_account/_buyer_account)
+ . = ..()
+ buyer_account = _buyer_account
+
+/obj/item/storage/lockbox/order/attackby(obj/item/W, mob/user, params)
+ if(!istype(W, /obj/item/card/id))
+ return ..()
+
+ var/obj/item/card/id/id_card = W
+ if(iscarbon(user))
+ add_fingerprint(user)
+
+ if(id_card.registered_account != buyer_account)
+ to_chat(user, "Bank account does not match with buyer![user] [privacy_lock ? "" : "un"]locks [src]'s privacy lock.",
+ "You [privacy_lock ? "" : "un"]lock [src]'s privacy lock.")
diff --git a/code/game/objects/items/storage/secure.dm b/code/game/objects/items/storage/secure.dm
index 0e9a9fda61..4e6a0b3463 100644
--- a/code/game/objects/items/storage/secure.dm
+++ b/code/game/objects/items/storage/secure.dm
@@ -205,10 +205,7 @@
new /obj/item/paper(src)
new /obj/item/pen(src)
-/obj/item/storage/secure/safe/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/item/storage/secure/safe/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
return attack_self(user)
/obj/item/storage/secure/safe/HoS
diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm
index 7e89ddbd8d..5e3ff67f4c 100644
--- a/code/game/objects/items/storage/toolbox.dm
+++ b/code/game/objects/items/storage/toolbox.dm
@@ -20,12 +20,13 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons)
var/has_latches = TRUE
var/can_rubberify = TRUE
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE //very protecc too
+ wound_bonus = 5
/obj/item/storage/toolbox/greyscale
icon_state = "toolbox_default"
item_state = "toolbox_default"
can_rubberify = FALSE
- material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS | MATERIAL_EFFECTS
+ material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS
/obj/item/storage/toolbox/Initialize(mapload)
if(has_latches)
diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm
index ffa3d83304..3b66e32d0a 100644
--- a/code/game/objects/items/storage/uplink_kits.dm
+++ b/code/game/objects/items/storage/uplink_kits.dm
@@ -117,7 +117,7 @@
new /obj/item/pizzabox/bomb
if("darklord") //20 tc + tk + summon item close enough for now
- new /obj/item/twohanded/dualsaber(src)
+ new /obj/item/dualsaber(src)
new /obj/item/dnainjector/telemut/darkbundle(src)
new /obj/item/clothing/suit/hooded/chaplain_hoodie(src)
new /obj/item/card/id/syndicate(src)
diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm
index fa0c9ba693..1a84b85a1a 100644
--- a/code/game/objects/items/stunbaton.dm
+++ b/code/game/objects/items/stunbaton.dm
@@ -14,6 +14,7 @@
w_class = WEIGHT_CLASS_NORMAL
attack_verb = list("beaten")
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80)
+ attack_speed = CLICK_CD_MELEE
var/stamforce = 35
var/turned_on = FALSE
@@ -144,8 +145,9 @@
return ..()
/obj/item/melee/baton/alt_pre_attack(atom/A, mob/living/user, params)
+ if(!user.CheckActionCooldown(CLICK_CD_MELEE))
+ return
. = common_baton_melee(A, user, TRUE) //return true (attackchain interrupt) if this also returns true. no harm-disarming.
- user.changeNext_move(CLICK_CD_MELEE)
//return TRUE to interrupt attack chain.
/obj/item/melee/baton/proc/common_baton_melee(mob/M, mob/living/user, disarming = FALSE)
@@ -156,6 +158,7 @@
if(IS_STAMCRIT(user)) //CIT CHANGE - makes it impossible to baton in stamina softcrit
to_chat(user, "You're too exhausted to use [src] properly.")
return TRUE
+ user.DelayNextAction()
if(ishuman(M))
var/mob/living/carbon/human/L = M
if(check_martial_counter(L, user))
diff --git a/code/game/objects/items/tanks/jetpack.dm b/code/game/objects/items/tanks/jetpack.dm
index 817258d1c7..7cf25098e1 100644
--- a/code/game/objects/items/tanks/jetpack.dm
+++ b/code/game/objects/items/tanks/jetpack.dm
@@ -21,7 +21,7 @@
/obj/item/tank/jetpack/populate_gas()
if(gas_type)
- air_contents.gases[gas_type] = ((6 * ONE_ATMOSPHERE) * volume / (R_IDEAL_GAS_EQUATION * T20C))
+ air_contents.set_moles(gas_type, ((6 * ONE_ATMOSPHERE) * volume / (R_IDEAL_GAS_EQUATION * T20C)))
/obj/item/tank/jetpack/ui_action_click(mob/user, action)
diff --git a/code/game/objects/items/tanks/tank_types.dm b/code/game/objects/items/tanks/tank_types.dm
index b4c8d8adf0..1c90a83c0a 100644
--- a/code/game/objects/items/tanks/tank_types.dm
+++ b/code/game/objects/items/tanks/tank_types.dm
@@ -18,8 +18,9 @@
force = 10
dog_fashion = /datum/dog_fashion/back
+
/obj/item/tank/internals/oxygen/populate_gas()
- air_contents.gases[/datum/gas/oxygen] = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
+ air_contents.set_moles(/datum/gas/oxygen, (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
return
@@ -47,8 +48,9 @@
force = 10
/obj/item/tank/internals/anesthetic/populate_gas()
- air_contents.gases[/datum/gas/oxygen] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD
- air_contents.gases[/datum/gas/nitrous_oxide] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD
+ air_contents.set_moles(/datum/gas/oxygen, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD)
+ air_contents.set_moles(/datum/gas/nitrous_oxide, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD)
+ return
/*
* Air
@@ -62,8 +64,9 @@
dog_fashion = /datum/dog_fashion/back
/obj/item/tank/internals/air/populate_gas()
- air_contents.gases[/datum/gas/oxygen] = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD
- air_contents.gases[/datum/gas/nitrogen] = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD
+ air_contents.set_moles(/datum/gas/oxygen, (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD)
+ air_contents.set_moles(/datum/gas/nitrogen, (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD)
+ return
/*
@@ -79,7 +82,8 @@
/obj/item/tank/internals/plasma/populate_gas()
- air_contents.gases[/datum/gas/plasma] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
+ air_contents.set_moles(/datum/gas/plasma, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
+ return
/obj/item/tank/internals/plasma/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/flamethrower))
@@ -93,12 +97,16 @@
F.update_icon()
else
return ..()
+
+/obj/item/tank/internals/plasma/full/populate_gas()
+ air_contents.set_moles(/datum/gas/plasma, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
+
//Makes empty oxygen tanks spawn without gas
/obj/item/tank/internals/plasma/empty/populate_gas()
return
/obj/item/tank/internals/plasma/full/populate_gas()
- air_contents.gases[/datum/gas/plasma] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
+ air_contents.set_moles(/datum/gas/plasma, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
/*
* Plasmaman Plasma Tank
@@ -113,10 +121,11 @@
distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE
/obj/item/tank/internals/plasmaman/populate_gas()
- air_contents.gases[/datum/gas/plasma] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
+ air_contents.set_moles(/datum/gas/plasma, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
+ return
/obj/item/tank/internals/plasmaman/full/populate_gas()
- air_contents.gases[/datum/gas/plasma] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
+ air_contents.set_moles(/datum/gas/plasma, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
return
@@ -129,7 +138,7 @@
w_class = WEIGHT_CLASS_SMALL //thanks i forgot this
/obj/item/tank/internals/plasmaman/belt/full/populate_gas()
- air_contents.gases[/datum/gas/plasma] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
+ air_contents.set_moles(/datum/gas/plasma, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
return
//makes empty plasma tanks spawn without gas.
@@ -152,7 +161,7 @@
/obj/item/tank/internals/emergency_oxygen/populate_gas()
- air_contents.gases[/datum/gas/oxygen] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
+ air_contents.set_moles(/datum/gas/oxygen, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
return
/obj/item/tank/internals/emergency_oxygen/empty/populate_gas()
@@ -172,4 +181,4 @@
volume = 10
/obj/item/tank/internals/emergency_oxygen/double/empty/populate_gas()
- return
\ No newline at end of file
+ return
diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm
index 00fbc41516..2de5860794 100644
--- a/code/game/objects/items/tanks/tanks.dm
+++ b/code/game/objects/items/tanks/tanks.dm
@@ -64,7 +64,7 @@
. = ..()
air_contents = new(volume) //liters
- air_contents.temperature = T20C
+ air_contents.set_temperature(T20C)
populate_gas()
@@ -92,7 +92,7 @@
. += "The pressure gauge reads [round(src.air_contents.return_pressure(),0.01)] kPa."
- var/celsius_temperature = src.air_contents.temperature-T0C
+ var/celsius_temperature = src.air_contents.return_temperature()-T0C
var/descriptive
if (celsius_temperature < 20)
@@ -123,6 +123,7 @@
/obj/item/tank/analyzer_act(mob/living/user, obj/item/I)
atmosanalyzer_scan(air_contents, user, src)
+ return TRUE
/obj/item/tank/deconstruct(disassembled = TRUE)
if(!disassembled)
@@ -143,7 +144,6 @@
if(prob(50))
step(W, pick(GLOB.alldirs))
ADD_TRAIT(H, TRAIT_DISFIGURED, TRAIT_GENERIC)
- H.bleed_rate = 5
H.gib_animation()
sleep(3)
H.adjustBruteLoss(1000) //to make the body super-bloody
@@ -168,7 +168,7 @@
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.hands_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
- ui = new(user, src, ui_key, "tanks", name, 400, 120, master_ui, state)
+ ui = new(user, src, ui_key, "Tank", name, 400, 120, master_ui, state)
ui.open()
/obj/item/tank/ui_data(mob/user)
@@ -235,7 +235,7 @@
if(tank_pressure < distribute_pressure)
distribute_pressure = tank_pressure
- var/moles_needed = distribute_pressure*volume_to_return/(R_IDEAL_GAS_EQUATION*air_contents.temperature)
+ var/moles_needed = distribute_pressure*volume_to_return/(R_IDEAL_GAS_EQUATION*air_contents.return_temperature())
return remove_air(moles_needed)
diff --git a/code/game/objects/items/tanks/watertank.dm b/code/game/objects/items/tanks/watertank.dm
index b1c0d3dfbb..16a91b6358 100644
--- a/code/game/objects/items/tanks/watertank.dm
+++ b/code/game/objects/items/tanks/watertank.dm
@@ -72,7 +72,7 @@
QDEL_NULL(noz)
return ..()
-/obj/item/watertank/attack_hand(mob/user)
+/obj/item/watertank/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if (user.get_item_by_slot(user.getBackSlot()) == src)
toggle_mister(user)
else
diff --git a/code/game/objects/items/tools/crowbar.dm b/code/game/objects/items/tools/crowbar.dm
index 91e8c49e5a..d39da2f543 100644
--- a/code/game/objects/items/tools/crowbar.dm
+++ b/code/game/objects/items/tools/crowbar.dm
@@ -90,6 +90,7 @@
/obj/item/crowbar/power/attack_self(mob/user)
playsound(get_turf(user), 'sound/items/change_jaws.ogg', 50, 1)
var/obj/item/wirecutters/power/cutjaws = new /obj/item/wirecutters/power(drop_location())
+ cutjaws.name = name
to_chat(user, "You attach the cutting jaws to [src].")
qdel(src)
user.put_in_active_hand(cutjaws)
diff --git a/code/game/objects/items/tools/saw.dm b/code/game/objects/items/tools/saw.dm
deleted file mode 100644
index aab59c00be..0000000000
--- a/code/game/objects/items/tools/saw.dm
+++ /dev/null
@@ -1,47 +0,0 @@
-/obj/item/hatchet/saw
- name = "handsaw"
- desc = "A very sharp handsaw, it's compact."
- icon = 'icons/obj/tools.dmi'
- icon_state = "saw"
- item_state = "sawhandle_greyscale"
- lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
- tool_behaviour = TOOL_SAW
- force = 10
- throwforce = 8
- throw_speed = 3
- throw_range = 5
- custom_materials = list(/datum/material/iron = 5000)
- attack_verb = list("sawed", "sliced", "cut")
- hitsound = 'sound/weapons/bladeslice.ogg'
- sharpness = IS_SHARP
- var/random_color = TRUE //code taken from screwdrivers.dm; cool handles are cool.
- var/static/list/saw_colors = list(
- "blue" = rgb(24, 97, 213),
- "red" = rgb(255, 0, 0),
- "pink" = rgb(213, 24, 141),
- "brown" = rgb(160, 82, 18),
- "green" = rgb(14, 127, 27),
- "cyan" = rgb(24, 162, 213),
- "yellow" = rgb(255, 165, 0)
- )
-
-/obj/item/hatchet/saw/Initialize()
- . = ..()
- if(random_color)
- icon_state = "sawhandle_greyscale"
- var/our_color = pick(saw_colors)
- add_atom_colour(saw_colors[our_color], FIXED_COLOUR_PRIORITY)
- update_icon()
- if(prob(75))
- pixel_y = rand(-8, 8)
-
-/obj/item/hatchet/saw/update_overlays()
- . = ..()
- if(!random_color) //icon override
- return
- var/mutable_appearance/base_overlay = mutable_appearance(icon, "sawblade")
- base_overlay.appearance_flags = RESET_COLOR
- . += base_overlay
-
-// END
\ No newline at end of file
diff --git a/code/game/objects/items/tools/wirecutters.dm b/code/game/objects/items/tools/wirecutters.dm
index ac5a02b9fc..53a578a45d 100644
--- a/code/game/objects/items/tools/wirecutters.dm
+++ b/code/game/objects/items/tools/wirecutters.dm
@@ -117,6 +117,7 @@
/obj/item/wirecutters/power/attack_self(mob/user)
playsound(get_turf(user), 'sound/items/change_jaws.ogg', 50, 1)
var/obj/item/crowbar/power/pryjaws = new /obj/item/crowbar/power(drop_location())
+ pryjaws.name = name
to_chat(user, "You attach the pry jaws to [src].")
qdel(src)
user.put_in_active_hand(pryjaws)
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index cd630a2c82..58b282be7d 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -272,7 +272,7 @@
return
else
to_chat(user, "You attach the ends of the two plastic swords, making a single double-bladed toy! You're fake-cool.")
- var/obj/item/twohanded/dualsaber/toy/newSaber = new /obj/item/twohanded/dualsaber/toy(user.loc)
+ var/obj/item/dualsaber/toy/newSaber = new /obj/item/dualsaber/toy(user.loc)
if(hacked) // That's right, we'll only check the "original" "sword".
newSaber.hacked = TRUE
qdel(W)
@@ -363,7 +363,7 @@
return
else
to_chat(user, "You combine the two plastic swords, making a single supermassive toy! You're fake-cool.")
- new /obj/item/twohanded/dualsaber/hypereutactic/toy(user.loc)
+ new /obj/item/dualsaber/hypereutactic/toy(user.loc)
qdel(W)
qdel(src)
else
@@ -437,41 +437,44 @@
/*
* Subtype of Double-Bladed Energy Swords
*/
-/obj/item/twohanded/dualsaber/toy
+/obj/item/dualsaber/toy
name = "double-bladed toy sword"
desc = "A cheap, plastic replica of TWO energy swords. Double the fun!"
force = 0
throwforce = 0
throw_speed = 3
throw_range = 5
- force_unwielded = 0
- force_wielded = 0
block_parry_data = null
attack_verb = list("attacked", "struck", "hit")
total_mass_on = TOTAL_MASS_TOY_SWORD
sharpness = IS_BLUNT
-/obj/item/twohanded/dualsaber/toy/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return)
+/obj/item/dualsaber/toy/ComponentInitialize()
+ AddComponent(/datum/component/two_handed, force_unwielded=0, force_wielded=0, wieldsound='sound/weapons/saberon.ogg', unwieldsound='sound/weapons/saberoff.ogg')
+
+/obj/item/dualsaber/toy/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return)
return BLOCK_NONE
-/obj/item/twohanded/dualsaber/hypereutactic/toy
+/obj/item/dualsaber/hypereutactic/toy
name = "\improper DX Hyper-Euplastic LightSword"
desc = "A supermassive toy envisioned to cleave the very fabric of space and time itself in twain. Realistic visuals and sounds! Ages 8 and up."
force = 0
throwforce = 0
throw_speed = 3
throw_range = 5
- force_unwielded = 0
- force_wielded = 0
+
attack_verb = list("attacked", "struck", "hit")
total_mass_on = TOTAL_MASS_TOY_SWORD
slowdown_wielded = 0
sharpness = IS_BLUNT
-/obj/item/twohanded/dualsaber/hypereutactic/toy/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return)
+/obj/item/dualsaber/hypereutactic/toy/ComponentInitialize()
+ AddComponent(/datum/component/two_handed, force_unwielded=0, force_wielded=0, wieldsound='sound/weapons/saberon.ogg', unwieldsound='sound/weapons/saberoff.ogg')
+
+/obj/item/dualsaber/hypereutactic/toy/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return)
return BLOCK_NONE
-/obj/item/twohanded/dualsaber/hypereutactic/toy/rainbow
+/obj/item/dualsaber/hypereutactic/toy/rainbow
name = "\improper Hyper-Euclidean Reciprocating Trigonometric Zweihander"
desc = "A custom-built toy with fancy rainbow lights built-in."
hacked = TRUE
@@ -571,10 +574,7 @@
else
. = ..()
-/obj/item/toy/prize/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/item/toy/prize/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(loc == user)
attack_self(user)
@@ -808,9 +808,8 @@
cards += "Ace of Clubs"
cards += "Ace of Diamonds"
-//ATTACK HAND IGNORING PARENT RETURN VALUE
//ATTACK HAND NOT CALLING PARENT
-/obj/item/toy/cards/deck/attack_hand(mob/user)
+/obj/item/toy/cards/deck/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
draw_card(user)
/obj/item/toy/cards/deck/proc/draw_card(mob/user)
@@ -823,12 +822,11 @@
var/obj/item/toy/cards/singlecard/H = new/obj/item/toy/cards/singlecard(user.loc)
if(holo)
holo.spawned += H // track them leaving the holodeck
- choice = cards[1]
+ choice = popleft(cards)
H.cardname = choice
H.parentdeck = src
var/O = src
H.apply_card_vars(H,O)
- src.cards -= choice
H.pickup(user)
user.put_in_hands(H)
user.visible_message("[user] draws a card from the deck.", "You draw a card from the deck.")
@@ -1232,7 +1230,7 @@
name = "steampunk watch"
desc = "A stylish steampunk watch made out of thousands of tiny cogwheels."
icon = 'icons/obj/clockwork_objects.dmi'
- icon_state = "dread_ipad"
+ icon_state = "clockwork_slab"
slot_flags = ITEM_SLOT_BELT
w_class = WEIGHT_CLASS_SMALL
var/cooldown = 0
diff --git a/code/game/objects/items/twohanded.dm b/code/game/objects/items/twohanded.dm
deleted file mode 100644
index 4437eefbf8..0000000000
--- a/code/game/objects/items/twohanded.dm
+++ /dev/null
@@ -1,1411 +0,0 @@
-/* Two-handed Weapons
- * Contains:
- * Twohanded
- * Fireaxe
- * Double-Bladed Energy Swords
- * Spears
- * CHAINSAWS
- * Bone Axe and Spear
- * And more
- */
-
-/*##################################################################
-##################### TWO HANDED WEAPONS BE HERE~ -Agouri :3 ########
-####################################################################*/
-
-//Rewrote TwoHanded weapons stuff and put it all here. Just copypasta fireaxe to make new ones ~Carn
-//This rewrite means we don't have two variables for EVERY item which are used only by a few weapons.
-//It also tidies stuff up elsewhere.
-
-
-
-
-/*
- * Twohanded
- */
-/obj/item/twohanded
- var/wielded = FALSE
- var/force_unwielded // default to null, the number force will be set to on unwield()
- var/force_wielded // same as above but for wield()
- var/wieldsound = null
- var/unwieldsound = null
- var/slowdown_wielded = 0
- /// Do we need to be wielded to actively block/parry?
- var/requires_wield_to_block_parry = TRUE
- item_flags = SLOWS_WHILE_IN_HAND
-
-/obj/item/twohanded/proc/unwield(mob/living/carbon/user, show_message = TRUE)
- if(!wielded || !user)
- return
- wielded = 0
- if(!isnull(force_unwielded))
- force = force_unwielded
- var/sf = findtext(name, " (Wielded)", -10)//10 == length(" (Wielded)")
- if(sf)
- name = copytext(name, 1, sf)
- else //something wrong
- name = "[initial(name)]"
- update_icon()
- if(user.get_item_by_slot(SLOT_BACK) == src)
- user.update_inv_back()
- else
- user.update_inv_hands()
- if(show_message)
- if(iscyborg(user))
- to_chat(user, "You free up your module.")
- else
- to_chat(user, "You are now carrying [src] with one hand.")
- if(unwieldsound)
- playsound(loc, unwieldsound, 50, 1)
- var/obj/item/twohanded/offhand/O = user.get_inactive_held_item()
- if(O && istype(O))
- O.unwield()
- set_slowdown(slowdown - slowdown_wielded)
-
-/obj/item/twohanded/proc/wield(mob/living/carbon/user)
- if(wielded)
- return
- if(ismonkey(user))
- to_chat(user, "It's too heavy for you to wield fully.")
- return
- if(user.get_inactive_held_item())
- to_chat(user, "You need your other hand to be empty!")
- return
- if(user.get_num_arms() < 2)
- to_chat(user, "You don't have enough intact hands.")
- return
- wielded = 1
- if(!isnull(force_wielded))
- force = force_wielded
- name = "[name] (Wielded)"
- update_icon()
- if(iscyborg(user))
- to_chat(user, "You dedicate your module to [src].")
- else
- to_chat(user, "You grab [src] with both hands.")
- if (wieldsound)
- playsound(loc, wieldsound, 50, 1)
- var/obj/item/twohanded/offhand/O = new(user) ////Let's reserve his other hand~
- O.name = "[name] - offhand"
- O.desc = "Your second grip on [src]."
- O.wielded = TRUE
- user.put_in_inactive_hand(O)
- set_slowdown(slowdown + slowdown_wielded)
-
-/obj/item/twohanded/can_active_block()
- return ..() && (!requires_wield_to_block_parry || wielded)
-
-/obj/item/twohanded/can_active_parry()
- return ..() && (!requires_wield_to_block_parry || wielded)
-
-/obj/item/twohanded/dropped(mob/user)
- . = ..()
- //handles unwielding a twohanded weapon when dropped as well as clearing up the offhand
- if(!wielded)
- return
- unwield(user)
-
-/obj/item/twohanded/attack_self(mob/user)
- . = ..()
- if(wielded) //Trying to unwield it
- unwield(user)
- else //Trying to wield it
- wield(user)
-
-/obj/item/twohanded/equip_to_best_slot(mob/M)
- if(..())
- if(istype(src, /obj/item/twohanded/required))
- return // unwield forces twohanded-required items to be dropped.
- unwield(M)
- return
-
-/obj/item/twohanded/equipped(mob/user, slot)
- ..()
- if(!user.is_holding(src) && wielded && !istype(src, /obj/item/twohanded/required))
- unwield(user)
-
-///////////OFFHAND///////////////
-/obj/item/twohanded/offhand
- name = "offhand"
- icon_state = "offhand"
- w_class = WEIGHT_CLASS_HUGE
- item_flags = ABSTRACT
- resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
-
-/obj/item/twohanded/offhand/Destroy()
- wielded = FALSE
- return ..()
-
-/obj/item/twohanded/offhand/dropped(mob/living/user, show_message = TRUE) //Only utilized by dismemberment since you can't normally switch to the offhand to drop it.
- . = ..()
- var/obj/I = user.get_active_held_item()
- if(I && istype(I, /obj/item/twohanded))
- var/obj/item/twohanded/thw = I
- thw.unwield(user, show_message)
- if(istype(thw, /obj/item/twohanded/required))
- user.dropItemToGround(thw)
- if(!QDELETED(src))
- qdel(src)
-
-/obj/item/twohanded/offhand/unwield()
- if(wielded)//Only delete if we're wielded
- wielded = FALSE
- qdel(src)
-
-/obj/item/twohanded/offhand/wield()
- if(wielded)//Only delete if we're wielded
- wielded = FALSE
- qdel(src)
-
-/obj/item/twohanded/offhand/attack_self(mob/living/carbon/user) //You should never be able to do this in standard use of two handed items. This is a backup for lingering offhands.
- var/obj/item/twohanded/O = user.get_inactive_held_item()
- if (istype(O) && !istype(O, /obj/item/twohanded/offhand/)) //If you have a proper item in your other hand that the offhand is for, do nothing. This should never happen.
- return
- if (QDELETED(src))
- return
- qdel(src) //If it's another offhand, or literally anything else, qdel. If I knew how to add logging messages I'd put one here.
-
-///////////Two hand required objects///////////////
-//This is for objects that require two hands to even pick up
-/obj/item/twohanded/required
- w_class = WEIGHT_CLASS_HUGE
-
-/obj/item/twohanded/required/attack_self()
- return
-
-/obj/item/twohanded/required/mob_can_equip(mob/M, mob/equipper, slot, disable_warning = 0)
- if(wielded && !slot_flags)
- if(!disable_warning)
- to_chat(M, "[src] is too cumbersome to carry with anything but your hands!")
- return 0
- return ..()
-
-/obj/item/twohanded/required/attack_hand(mob/user)//Can't even pick it up without both hands empty
- var/obj/item/twohanded/required/H = user.get_inactive_held_item()
- if(get_dist(src,user) > 1)
- return
- if(H != null)
- to_chat(user, "[src] is too cumbersome to carry in one hand!")
- return
- if(loc != user)
- wield(user)
- . = ..()
-
-/obj/item/twohanded/required/equipped(mob/user, slot)
- ..()
- var/slotbit = slotdefine2slotbit(slot)
- if(slot_flags & slotbit)
- var/datum/O = user.is_holding_item_of_type(/obj/item/twohanded/offhand)
- if(!O || QDELETED(O))
- return
- qdel(O)
- return
- if(slot == SLOT_HANDS)
- wield(user)
- else
- unwield(user)
-
-/obj/item/twohanded/required/dropped(mob/living/user, show_message = TRUE)
- unwield(user, show_message)
- ..()
-
-/obj/item/twohanded/required/wield(mob/living/carbon/user)
- ..()
- if(!wielded)
- user.dropItemToGround(src)
-
-/obj/item/twohanded/required/unwield(mob/living/carbon/user, show_message = TRUE)
- if(!wielded)
- return
- if(show_message)
- to_chat(user, "You drop [src].")
- ..(user, FALSE)
-
-/*
- * Fireaxe
- */
-/obj/item/twohanded/fireaxe // DEM AXES MAN, marker -Agouri
- icon_state = "fireaxe0"
- lefthand_file = 'icons/mob/inhands/weapons/axes_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/weapons/axes_righthand.dmi'
- name = "fire axe"
- desc = "Truly, the weapon of a madman. Who would think to fight fire with an axe?"
- force = 5
- throwforce = 15
- w_class = WEIGHT_CLASS_BULKY
- slot_flags = ITEM_SLOT_BACK
- force_unwielded = 5
- force_wielded = 24
- attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut")
- hitsound = 'sound/weapons/bladeslice.ogg'
- sharpness = IS_SHARP
- max_integrity = 200
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30)
- resistance_flags = FIRE_PROOF
-
-/obj/item/twohanded/fireaxe/Initialize()
- . = ..()
- AddComponent(/datum/component/butchering, 100, 80, 0 , hitsound) //axes are not known for being precision butchering tools
-
-/obj/item/twohanded/fireaxe/update_icon_state() //Currently only here to fuck with the on-mob icons.
- icon_state = "fireaxe[wielded]"
- return
-
-/obj/item/twohanded/fireaxe/suicide_act(mob/user)
- user.visible_message("[user] axes [user.p_them()]self from head to toe! It looks like [user.p_theyre()] trying to commit suicide!")
- return (BRUTELOSS)
-
-/obj/item/twohanded/fireaxe/afterattack(atom/A, mob/living/user, proximity)
- . = ..()
- if(!proximity || IS_STAMCRIT(user)) //don't make stamcrit message they'll already have gotten one from the primary attack.
- return
- if(wielded) //destroys windows and grilles in one hit (or more if it has a ton of health like plasmaglass)
- if(istype(A, /obj/structure/window))
- var/obj/structure/window/W = A
- W.take_damage(200, BRUTE, "melee", 0)
- else if(istype(A, /obj/structure/grille))
- var/obj/structure/grille/G = A
- G.take_damage(40, BRUTE, "melee", 0)
-
-
-/*
- * Double-Bladed Energy Swords - Cheridan
- */
-/obj/item/twohanded/dualsaber
- icon_state = "dualsaber0"
- lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
- name = "double-bladed energy sword"
- desc = "Handle with care."
- force = 3
- throwforce = 5
- throw_speed = 3
- throw_range = 5
- w_class = WEIGHT_CLASS_SMALL
- var/w_class_on = WEIGHT_CLASS_BULKY
- item_flags = ITEM_CAN_PARRY | SLOWS_WHILE_IN_HAND | ITEM_CAN_BLOCK
- block_parry_data = /datum/block_parry_data/dual_esword
- force_unwielded = 3
- force_wielded = 34
- wieldsound = 'sound/weapons/saberon.ogg'
- unwieldsound = 'sound/weapons/saberoff.ogg'
- hitsound = "swing_hit"
- var/hitsound_on = 'sound/weapons/blade1.ogg'
- armour_penetration = 35
- var/saber_color = "green"
- light_color = "#00ff00"//green
- attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
- max_integrity = 200
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 70)
- resistance_flags = FIRE_PROOF
- var/hacked = FALSE
- /// Can this reflect all energy projectiles?
- var/can_reflect = TRUE
- var/brightness_on = 6 //TWICE AS BRIGHT AS A REGULAR ESWORD
- var/list/possible_colors = list("red", "blue", "green", "purple")
- var/list/rainbow_colors = list(LIGHT_COLOR_RED, LIGHT_COLOR_GREEN, LIGHT_COLOR_LIGHT_CYAN, LIGHT_COLOR_LAVENDER)
- var/spinnable = TRUE
- total_mass = 0.4 //Survival flashlights typically weigh around 5 ounces.
- var/total_mass_on = 3.4
-
-/datum/block_parry_data/dual_esword
- block_damage_absorption = 2
- block_damage_multiplier = 0.15
- block_damage_multiplier_override = list(
- ATTACK_TYPE_MELEE = 0.25
- )
- block_start_delay = 0 // instantaneous block
- block_stamina_cost_per_second = 2.5
- block_stamina_efficiency = 3
- block_lock_sprinting = TRUE
- // no attacking while blocking
- block_lock_attacking = TRUE
- block_projectile_mitigation = 75
-
- parry_time_windup = 0
- parry_time_active = 8
- parry_time_spindown = 0
- // we want to signal to players the most dangerous phase, the time when automatic counterattack is a thing.
- parry_time_windup_visual_override = 1
- parry_time_active_visual_override = 3
- parry_time_spindown_visual_override = 4
- parry_flags = PARRY_DEFAULT_HANDLE_FEEDBACK // esword users can attack while parrying.
- parry_time_perfect = 2 // first ds isn't perfect
- parry_time_perfect_leeway = 1
- parry_imperfect_falloff_percent = 10
- parry_efficiency_to_counterattack = 100
- parry_efficiency_considered_successful = 25 // VERY generous
- parry_efficiency_perfect = 90
- parry_failed_stagger_duration = 3 SECONDS
- parry_failed_clickcd_duration = CLICK_CD_MELEE
-
- // more efficient vs projectiles
- block_stamina_efficiency_override = list(
- TEXT_ATTACK_TYPE_PROJECTILE = 4
- )
-
-/obj/item/twohanded/dualsaber/suicide_act(mob/living/carbon/user)
- if(wielded)
- user.visible_message("[user] begins spinning way too fast! It looks like [user.p_theyre()] trying to commit suicide!")
-
- var/obj/item/bodypart/head/myhead = user.get_bodypart(BODY_ZONE_HEAD)//stole from chainsaw code
- var/obj/item/organ/brain/B = user.getorganslot(ORGAN_SLOT_BRAIN)
- B.organ_flags &= ~ORGAN_VITAL //this cant possibly be a good idea
- var/randdir
- for(var/i in 1 to 24)//like a headless chicken!
- if(user.is_holding(src))
- randdir = pick(GLOB.alldirs)
- user.Move(get_step(user, randdir),randdir)
- user.emote("spin")
- if (i == 3 && myhead)
- myhead.drop_limb()
- sleep(3)
- else
- user.visible_message("[user] panics and starts choking to death!")
- return OXYLOSS
-
-
- else
- user.visible_message("[user] begins beating [user.p_them()]self to death with \the [src]'s handle! It probably would've been cooler if [user.p_they()] turned it on first!")
- return BRUTELOSS
-
-/obj/item/twohanded/dualsaber/Initialize()
- . = ..()
- if(LAZYLEN(possible_colors))
- saber_color = pick(possible_colors)
- switch(saber_color)
- if("red")
- light_color = LIGHT_COLOR_RED
- if("green")
- light_color = LIGHT_COLOR_GREEN
- if("blue")
- light_color = LIGHT_COLOR_LIGHT_CYAN
- if("purple")
- light_color = LIGHT_COLOR_LAVENDER
-
-/obj/item/twohanded/dualsaber/Destroy()
- STOP_PROCESSING(SSobj, src)
- . = ..()
-
-/obj/item/twohanded/dualsaber/update_icon_state()
- if(wielded)
- icon_state = "dualsaber[saber_color][wielded]"
- else
- icon_state = "dualsaber0"
- clean_blood()
-
-/obj/item/twohanded/dualsaber/attack(mob/target, mob/living/carbon/human/user)
- if(user.has_dna())
- if(user.dna.check_mutation(HULK))
- to_chat(user, "You grip the blade too hard and accidentally close it!")
- unwield()
- return
- ..()
- if(HAS_TRAIT(user, TRAIT_CLUMSY) && (wielded) && prob(40))
- impale(user)
- return
- if(spinnable && (wielded) && prob(50))
- INVOKE_ASYNC(src, .proc/jedi_spin, user)
-
-/obj/item/twohanded/dualsaber/proc/jedi_spin(mob/living/user)
- for(var/i in list(NORTH,SOUTH,EAST,WEST,EAST,SOUTH,NORTH,SOUTH,EAST,WEST,EAST,SOUTH))
- user.setDir(i)
- if(i == WEST)
- user.emote("flip")
- sleep(1)
-
-/obj/item/twohanded/dualsaber/proc/impale(mob/living/user)
- to_chat(user, "You twirl around a bit before losing your balance and impaling yourself on [src].")
- if (force_wielded)
- user.take_bodypart_damage(20,25)
- else
- user.adjustStaminaLoss(25)
-
-/obj/item/twohanded/dualsaber/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return)
- if(!wielded)
- return NONE
- if(can_reflect && is_energy_reflectable_projectile(object) && (attack_type & ATTACK_TYPE_PROJECTILE))
- block_return[BLOCK_RETURN_REDIRECT_METHOD] = REDIRECT_METHOD_RETURN_TO_SENDER //no you
- return BLOCK_SHOULD_REDIRECT | BLOCK_SUCCESS | BLOCK_REDIRECTED
- return ..()
-
-/obj/item/twohanded/dualsaber/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0) //In case thats just so happens that it is still activated on the groud, prevents hulk from picking it up
- if(wielded)
- to_chat(user, "You can't pick up such dangerous item with your meaty hands without losing fingers, better not to!")
- return 1
-
-/obj/item/twohanded/dualsaber/wield(mob/living/carbon/M) //Specific wield () hulk checks due to reflection chance for balance issues and switches hitsounds.
- if(M.has_dna())
- if(M.dna.check_mutation(HULK))
- to_chat(M, "You lack the grace to wield this!")
- return
- ..()
- if(wielded)
- sharpness = IS_SHARP
- w_class = w_class_on
- total_mass = total_mass_on
- hitsound = 'sound/weapons/blade1.ogg'
- START_PROCESSING(SSobj, src)
- set_light(brightness_on)
- AddElement(/datum/element/sword_point)
-
-/obj/item/twohanded/dualsaber/unwield() //Specific unwield () to switch hitsounds.
- sharpness = initial(sharpness)
- w_class = initial(w_class)
- total_mass = initial(total_mass)
- ..()
- hitsound = "swing_hit"
- STOP_PROCESSING(SSobj, src)
- set_light(0)
- RemoveElement(/datum/element/sword_point)
-
-/obj/item/twohanded/dualsaber/process()
- if(wielded)
- if(hacked)
- rainbow_process()
- open_flame()
- else
- STOP_PROCESSING(SSobj, src)
-
-/obj/item/twohanded/dualsaber/proc/rainbow_process()
- light_color = pick(rainbow_colors)
-
-/obj/item/twohanded/dualsaber/ignition_effect(atom/A, mob/user)
- // same as /obj/item/melee/transforming/energy, mostly
- if(!wielded)
- return ""
- var/in_mouth = ""
- if(iscarbon(user))
- var/mob/living/carbon/C = user
- if(C.wear_mask)
- in_mouth = ", barely missing [user.p_their()] nose"
- . = "[user] swings [user.p_their()] [name][in_mouth]. [user.p_they(TRUE)] light[user.p_s()] [user.p_their()] [A.name] in the process."
- playsound(loc, hitsound, get_clamped_volume(), 1, -1)
- add_fingerprint(user)
- // Light your candles while spinning around the room
- if(spinnable)
- INVOKE_ASYNC(src, .proc/jedi_spin, user)
-
-/obj/item/twohanded/dualsaber/green
- possible_colors = list("green")
-
-/obj/item/twohanded/dualsaber/red
- possible_colors = list("red")
-
-/obj/item/twohanded/dualsaber/blue
- possible_colors = list("blue")
-
-/obj/item/twohanded/dualsaber/purple
- possible_colors = list("purple")
-
-/obj/item/twohanded/dualsaber/attackby(obj/item/W, mob/user, params)
- if(istype(W, /obj/item/multitool))
- if(!hacked)
- hacked = TRUE
- to_chat(user, "2XRNBW_ENGAGE")
- saber_color = "rainbow"
- update_icon()
- else
- to_chat(user, "It's starting to look like a triple rainbow - no, nevermind.")
- else
- return ..()
-
-/////////////////////////////////////////////////////
-// HYPEREUTACTIC Blades /////////////////////////
-/////////////////////////////////////////////////////
-
-/obj/item/twohanded/dualsaber/hypereutactic
- icon = 'icons/obj/1x2.dmi'
- icon_state = "hypereutactic"
- lefthand_file = 'icons/mob/inhands/64x64_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/64x64_righthand.dmi'
- item_state = "hypereutactic"
- inhand_x_dimension = 64
- inhand_y_dimension = 64
- name = "hypereutactic blade"
- desc = "A supermassive weapon envisioned to cleave the very fabric of space and time itself in twain, the hypereutactic blade dynamically flash-forges a hypereutactic crystaline nanostructure capable of passing through most known forms of matter like a hot knife through butter."
- force = 7
- force_unwielded = 7
- force_wielded = 40
- wieldsound = 'sound/weapons/nebon.ogg'
- unwieldsound = 'sound/weapons/neboff.ogg'
- hitsound_on = 'sound/weapons/nebhit.ogg'
- slowdown_wielded = 1
- armour_penetration = 60
- light_color = "#37FFF7"
- rainbow_colors = list("#FF0000", "#FFFF00", "#00FF00", "#00FFFF", "#0000FF","#FF00FF", "#3399ff", "#ff9900", "#fb008b", "#9800ff", "#00ffa3", "#ccff00")
- attack_verb = list("attacked", "slashed", "stabbed", "sliced", "destroyed", "ripped", "devastated", "shredded")
- spinnable = FALSE
- total_mass_on = 4
-
-/obj/item/twohanded/dualsaber/hypereutactic/ComponentInitialize()
- . = ..()
- AddElement(/datum/element/update_icon_updates_onmob)
-
-/obj/item/twohanded/dualsaber/hypereutactic/update_icon_state()
- return
-
-/obj/item/twohanded/dualsaber/hypereutactic/update_overlays()
- . = ..()
- var/mutable_appearance/blade_overlay = mutable_appearance(icon, "hypereutactic_blade")
- var/mutable_appearance/gem_overlay = mutable_appearance(icon, "hypereutactic_gem")
-
- if(light_color)
- blade_overlay.color = light_color
- gem_overlay.color = light_color
-
- . += gem_overlay
-
- if(wielded)
- . += blade_overlay
-
- clean_blood()
-
-/obj/item/twohanded/dualsaber/hypereutactic/AltClick(mob/living/user)
- . = ..()
- if(!user.canUseTopic(src, BE_CLOSE, FALSE) || hacked)
- return
- if(user.incapacitated() || !istype(user))
- to_chat(user, "You can't do that right now!")
- return
- if(alert("Are you sure you want to recolor your blade?", "Confirm Repaint", "Yes", "No") == "Yes")
- var/energy_color_input = input(usr,"","Choose Energy Color",light_color) as color|null
- if(!energy_color_input || !user.canUseTopic(src, BE_CLOSE, FALSE) || hacked)
- return
- light_color = sanitize_hexcolor(energy_color_input, desired_format=6, include_crunch=1)
- update_icon()
- update_light()
- return TRUE
-
-/obj/item/twohanded/dualsaber/hypereutactic/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE)
- . = ..()
- if(isinhands)
- var/mutable_appearance/gem_inhand = mutable_appearance(icon_file, "hypereutactic_gem")
- gem_inhand.color = light_color
- . += gem_inhand
- if(wielded)
- var/mutable_appearance/blade_inhand = mutable_appearance(icon_file, "hypereutactic_blade")
- blade_inhand.color = light_color
- . += blade_inhand
-
-/obj/item/twohanded/dualsaber/hypereutactic/examine(mob/user)
- . = ..()
- if(!hacked)
- . += "Alt-click to recolor it."
-
-/obj/item/twohanded/dualsaber/hypereutactic/rainbow_process()
- . = ..()
- update_icon()
- update_light()
-
-/obj/item/twohanded/dualsaber/hypereutactic/chaplain
- name = "divine lightblade"
- desc = "A giant blade of bright and holy light, said to cut down the wicked with ease."
- force = 5
- force_unwielded = 5
- force_wielded = 20
- block_chance = 50
- armour_penetration = 0
- var/chaplain_spawnable = TRUE
- can_reflect = FALSE
- obj_flags = UNIQUE_RENAME
-
-/obj/item/twohanded/dualsaber/hypereutactic/chaplain/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/anti_magic, TRUE, TRUE, FALSE, null, null, FALSE)
-
-//spears
-/obj/item/twohanded/spear
- icon_state = "spearglass0"
- lefthand_file = 'icons/mob/inhands/weapons/polearms_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/weapons/polearms_righthand.dmi'
- name = "spear"
- desc = "A haphazardly-constructed yet still deadly weapon of ancient design."
- force = 10
- w_class = WEIGHT_CLASS_BULKY
- slot_flags = ITEM_SLOT_BACK
- force_unwielded = 10
- force_wielded = 18
- throwforce = 20
- throw_speed = 4
- embedding = list("embedded_impact_pain_multiplier" = 1.5, "embed_chance" = 65)
- armour_penetration = 10
- custom_materials = list(/datum/material/iron=1150, /datum/material/glass=2075)
- hitsound = 'sound/weapons/bladeslice.ogg'
- attack_verb = list("attacked", "poked", "jabbed", "torn", "gored")
- sharpness = IS_SHARP
- max_integrity = 200
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30)
- var/obj/item/grenade/explosive = null
- var/war_cry = "AAAAARGH!!!"
- var/icon_prefix = "spearglass"
-
-/obj/item/twohanded/spear/Initialize()
- . = ..()
- AddComponent(/datum/component/butchering, 100, 70) //decent in a pinch, but pretty bad.
- AddComponent(/datum/component/jousting)
- AddElement(/datum/element/sword_point)
-
-/obj/item/twohanded/spear/attack_self(mob/user)
- if(explosive)
- explosive.attack_self(user)
- return
- . = ..()
-
-//Citadel additions : attack_self and rightclick_attack_self
-
-/obj/item/twohanded/rightclick_attack_self(mob/user)
- if(wielded) //Trying to unwield it
- unwield(user)
- else //Trying to wield it
- wield(user)
- return TRUE
-
-/obj/item/twohanded/spear/suicide_act(mob/living/carbon/user)
- user.visible_message("[user] begins to sword-swallow \the [src]! It looks like [user.p_theyre()] trying to commit suicide!")
- if(explosive) //Citadel Edit removes qdel and explosive.forcemove(AM)
- user.say("[war_cry]", forced="spear warcry")
- explosive.prime()
- user.gib()
- return BRUTELOSS
- return BRUTELOSS
-
-/obj/item/twohanded/spear/examine(mob/user)
- . = ..()
- if(explosive)
- . += "Use in your hands to activate the attached explosive. Alt-click to set your war cry. Right-click in combat mode to wield"
-
-/obj/item/twohanded/spear/update_icon_state()
- if(explosive)
- icon_state = "spearbomb[wielded]"
- else
- icon_state = "[icon_prefix][wielded]"
-
-/obj/item/twohanded/spear/afterattack(atom/movable/AM, mob/user, proximity)
- . = ..()
- if(!proximity)
- return
- if(isopenturf(AM)) //So you can actually melee with it
- return
- if(explosive && wielded) //Citadel edit removes qdel and explosive.forcemove(AM)
- user.say("[war_cry]", forced="spear warcry")
- explosive.prime()
-
-/obj/item/twohanded/spear/grenade_prime_react(obj/item/grenade/nade) //Citadel edit, removes throw_impact because memes
- nade.forceMove(get_turf(src))
- qdel(src)
-
-/obj/item/twohanded/spear/AltClick(mob/user)
- . = ..()
- if(user.canUseTopic(src, BE_CLOSE))
- ..()
- if(!explosive)
- return
- if(istype(user) && loc == user)
- var/input = stripped_input(user,"What do you want your war cry to be? You will shout it when you hit someone in melee.", ,"", 50)
- if(input)
- src.war_cry = input
- return TRUE
-
-/obj/item/twohanded/spear/CheckParts(list/parts_list)
- var/obj/item/shard/tip = locate() in parts_list
- if (istype(tip, /obj/item/shard/plasma))
- force_wielded = 19
- force_unwielded = 11
- throwforce = 21
- embedding = getEmbeddingBehavior(embed_chance = 75, embedded_pain_multiplier = 1.5) //plasmaglass spears are sharper
- icon_prefix = "spearplasma"
- qdel(tip)
- var/obj/item/twohanded/spear/S = locate() in parts_list
- if(S)
- if(S.explosive)
- S.explosive.forceMove(get_turf(src))
- S.explosive = null
- parts_list -= S
- qdel(S)
- ..()
- var/obj/item/grenade/G = locate() in contents
- if(G)
- explosive = G
- name = "explosive lance"
- embedding = getEmbeddingBehavior(embed_chance = 0, embedded_pain_multiplier = 1)//elances should not be embeddable
- desc = "A makeshift spear with [G] attached to it."
- update_icon()
-
-// CHAINSAW
-/obj/item/twohanded/required/chainsaw
- name = "chainsaw"
- desc = "A versatile power tool. Useful for limbing trees and delimbing humans."
- icon_state = "chainsaw_off"
- lefthand_file = 'icons/mob/inhands/weapons/chainsaw_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/weapons/chainsaw_righthand.dmi'
- flags_1 = CONDUCT_1
- force = 13
- var/force_on = 24
- w_class = WEIGHT_CLASS_HUGE
- throwforce = 13
- throw_speed = 2
- throw_range = 4
- custom_materials = list(/datum/material/iron=13000)
- attack_verb = list("sawed", "torn", "cut", "chopped", "diced")
- hitsound = "swing_hit"
- sharpness = IS_SHARP
- actions_types = list(/datum/action/item_action/startchainsaw)
- var/on = FALSE
- tool_behaviour = TOOL_SAW
- toolspeed = 0.5
-
-/obj/item/twohanded/required/chainsaw/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/butchering, 30, 100, 0, 'sound/weapons/chainsawhit.ogg', TRUE)
- AddElement(/datum/element/update_icon_updates_onmob)
-
-/obj/item/twohanded/required/chainsaw/suicide_act(mob/living/carbon/user)
- if(on)
- user.visible_message("[user] begins to tear [user.p_their()] head off with [src]! It looks like [user.p_theyre()] trying to commit suicide!")
- playsound(src, 'sound/weapons/chainsawhit.ogg', 100, 1)
- var/obj/item/bodypart/head/myhead = user.get_bodypart(BODY_ZONE_HEAD)
- if(myhead)
- myhead.dismember()
- else
- user.visible_message("[user] smashes [src] into [user.p_their()] neck, destroying [user.p_their()] esophagus! It looks like [user.p_theyre()] trying to commit suicide!")
- playsound(src, 'sound/weapons/genhit1.ogg', 100, 1)
- return(BRUTELOSS)
-
-/obj/item/twohanded/required/chainsaw/attack_self(mob/user)
- on = !on
- to_chat(user, "As you pull the starting cord dangling from [src], [on ? "it begins to whirr." : "the chain stops moving."]")
- force = on ? force_on : initial(force)
- throwforce = on ? force_on : force
- update_icon()
- var/datum/component/butchering/butchering = src.GetComponent(/datum/component/butchering)
- butchering.butchering_enabled = on
-
- if(on)
- hitsound = 'sound/weapons/chainsawhit.ogg'
- else
- hitsound = "swing_hit"
-
-/obj/item/twohanded/required/chainsaw/update_icon_state()
- icon_state = "chainsaw_[on ? "on" : "off"]"
-
-/obj/item/twohanded/required/chainsaw/get_dismemberment_chance()
- if(wielded)
- . = ..()
-
-/obj/item/twohanded/required/chainsaw/doomslayer
- name = "THE GREAT COMMUNICATOR"
- desc = "VRRRRRRR!!!"
- armour_penetration = 100
- force_on = 30
-
-/obj/item/twohanded/required/chainsaw/doomslayer/check_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return)
- block_return[BLOCK_RETURN_REFLECT_PROJECTILE_CHANCE] = 100
- return ..()
-
-/obj/item/twohanded/required/chainsaw/doomslayer/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return)
- if(attack_type & ATTACK_TYPE_PROJECTILE)
- owner.visible_message("Ranged attacks just make [owner] angrier!")
- playsound(src, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, 1)
- return BLOCK_SUCCESS | BLOCK_PHYSICAL_EXTERNAL
- return ..()
-
-//GREY TIDE
-/obj/item/twohanded/spear/grey_tide
- icon_state = "spearglass0"
- name = "\improper Grey Tide"
- desc = "Recovered from the aftermath of a revolt aboard Defense Outpost Theta Aegis, in which a seemingly endless tide of Assistants caused heavy casualities among Nanotrasen military forces."
- force_unwielded = 15
- force_wielded = 25
- throwforce = 20
- throw_speed = 4
- attack_verb = list("gored")
- var/clonechance = 50
- var/clonedamage = 12
- var/clonespeed = 0
- var/clone_replication_chance = 30
- var/clone_lifespan = 100
-
-/obj/item/twohanded/spear/grey_tide/afterattack(atom/movable/AM, mob/living/user, proximity)
- . = ..()
- if(!proximity)
- return
- user.faction |= "greytide([REF(user)])"
- if(isliving(AM))
- var/mob/living/L = AM
- if(istype (L, /mob/living/simple_animal/hostile/illusion))
- return
- if(!L.stat && prob(clonechance))
- var/mob/living/simple_animal/hostile/illusion/M = new(user.loc)
- M.faction = user.faction.Copy()
- M.set_varspeed(clonespeed)
- M.Copy_Parent(user, clone_lifespan, user.health/2.5, clonedamage, clone_replication_chance)
- M.GiveTarget(L)
-
-/obj/item/twohanded/pitchfork
- icon_state = "pitchfork0"
- lefthand_file = 'icons/mob/inhands/weapons/polearms_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/weapons/polearms_righthand.dmi'
- name = "pitchfork"
- desc = "A simple tool used for moving hay."
- force = 7
- throwforce = 15
- w_class = WEIGHT_CLASS_BULKY
- force_unwielded = 7
- force_wielded = 15
- attack_verb = list("attacked", "impaled", "pierced")
- hitsound = 'sound/weapons/bladeslice.ogg'
- sharpness = IS_SHARP
- max_integrity = 200
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30)
- resistance_flags = FIRE_PROOF
-
-/obj/item/twohanded/pitchfork/Initialize(mapload)
- AddElement(/datum/element/sword_point)
-
-/obj/item/twohanded/pitchfork/demonic
- name = "demonic pitchfork"
- desc = "A red pitchfork, it looks like the work of the devil."
- force = 19
- throwforce = 24
- force_unwielded = 19
- force_wielded = 25
-
-/obj/item/twohanded/pitchfork/demonic/Initialize()
- . = ..()
- set_light(3,6,LIGHT_COLOR_RED)
-
-/obj/item/twohanded/pitchfork/demonic/greater
- force = 24
- throwforce = 50
- force_unwielded = 24
- force_wielded = 34
-
-/obj/item/twohanded/pitchfork/demonic/ascended
- force = 100
- throwforce = 100
- force_unwielded = 100
- force_wielded = 500000 // Kills you DEAD.
-
-/obj/item/twohanded/pitchfork/update_icon_state()
- icon_state = "pitchfork[wielded]"
-
-/obj/item/twohanded/pitchfork/suicide_act(mob/user)
- user.visible_message("[user] impales [user.p_them()]self in [user.p_their()] abdomen with [src]! It looks like [user.p_theyre()] trying to commit suicide!")
- return (BRUTELOSS)
-
-/obj/item/twohanded/pitchfork/demonic/pickup(mob/living/user)
- . = ..()
- if(isliving(user) && user.mind && user.owns_soul() && !is_devil(user))
- var/mob/living/U = user
- U.visible_message("As [U] picks [src] up, [U]'s arms briefly catch fire.", \
- "\"As you pick up [src] your arms ignite, reminding you of all your past sins.\"")
- if(ishuman(U))
- var/mob/living/carbon/human/H = U
- H.apply_damage(rand(force/2, force), BURN, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM))
- else
- U.adjustFireLoss(rand(force/2,force))
-
-/obj/item/twohanded/pitchfork/demonic/attack(mob/target, mob/living/carbon/human/user)
- if(user.mind && user.owns_soul() && !is_devil(user))
- to_chat(user, "[src] burns in your hands.")
- user.apply_damage(rand(force/2, force), BURN, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM))
- ..()
-
-/obj/item/twohanded/pitchfork/demonic/ascended/afterattack(atom/target, mob/user, proximity)
- . = ..()
- if(!proximity || !wielded)
- return
- if(iswallturf(target))
- var/turf/closed/wall/W = target
- user.visible_message("[user] blasts \the [target] with \the [src]!")
- playsound(target, 'sound/magic/disintegrate.ogg', 100, 1)
- W.break_wall()
- W.ScrapeAway(flags = CHANGETURF_INHERIT_AIR)
- return
-
-//HF blade
-
-/obj/item/twohanded/vibro_weapon
- icon_state = "hfrequency0"
- lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
- name = "vibro sword"
- desc = "A potent weapon capable of cutting through nearly anything. Wielding it in two hands will allow you to deflect gunfire."
- force_unwielded = 20
- force_wielded = 40
- armour_penetration = 100
- block_chance = 40
- throwforce = 20
- throw_speed = 4
- sharpness = IS_SHARP
- attack_verb = list("cut", "sliced", "diced")
- w_class = WEIGHT_CLASS_BULKY
- slot_flags = ITEM_SLOT_BACK
- hitsound = 'sound/weapons/bladeslice.ogg'
-
-/obj/item/twohanded/vibro_weapon/Initialize()
- . = ..()
- AddComponent(/datum/component/butchering, 20, 105)
- AddElement(/datum/element/sword_point)
-
-/obj/item/twohanded/vibro_weapon/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return)
- if(wielded)
- final_block_chance *= 2
- if(wielded || !(attack_type & ATTACK_TYPE_PROJECTILE))
- if(prob(final_block_chance))
- if(attack_type & ATTACK_TYPE_PROJECTILE)
- owner.visible_message("[owner] deflects [attack_text] with [src]!")
- playsound(src, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, 1)
- block_return[BLOCK_RETURN_REDIRECT_METHOD] = REDIRECT_METHOD_DEFLECT
- return BLOCK_SUCCESS | BLOCK_REDIRECTED | BLOCK_SHOULD_REDIRECT | BLOCK_PHYSICAL_EXTERNAL
- else
- owner.visible_message("[owner] parries [attack_text] with [src]!")
- return BLOCK_SUCCESS | BLOCK_PHYSICAL_EXTERNAL
- return NONE
-
-/obj/item/twohanded/vibro_weapon/update_icon_state()
- icon_state = "hfrequency[wielded]"
-
-/*
- * Bone Axe
- */
-/obj/item/twohanded/fireaxe/boneaxe // Blatant imitation of the fireaxe, but made out of bone.
- icon_state = "bone_axe0"
- name = "bone axe"
- desc = "A large, vicious axe crafted out of several sharpened bone plates and crudely tied together. Made of monsters, by killing monsters, for killing monsters."
- force_wielded = 23
-
-/obj/item/twohanded/fireaxe/boneaxe/update_icon_state()
- icon_state = "bone_axe[wielded]"
-
-/*
- * Bone Spear
- */
-/obj/item/twohanded/bonespear //Blatant imitation of spear, but made out of bone. Not valid for explosive modification.
- icon_state = "bone_spear0"
- lefthand_file = 'icons/mob/inhands/weapons/polearms_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/weapons/polearms_righthand.dmi'
- name = "bone spear"
- desc = "A haphazardly-constructed yet still deadly weapon. The pinnacle of modern technology."
- force = 11
- w_class = WEIGHT_CLASS_BULKY
- slot_flags = ITEM_SLOT_BACK
- force_unwielded = 11
- force_wielded = 20 //I have no idea how to balance
- reach = 2
- throwforce = 22
- throw_speed = 4
- embedding = list("embedded_impact_pain_multiplier" = 3)
- armour_penetration = 15 //Enhanced armor piercing
- hitsound = 'sound/weapons/bladeslice.ogg'
- attack_verb = list("attacked", "poked", "jabbed", "torn", "gored")
- sharpness = IS_SHARP
-
-/obj/item/twohanded/bonespear/update_icon_state()
- icon_state = "bone_spear[wielded]"
-
-/obj/item/twohanded/binoculars
- name = "binoculars"
- desc = "Used for long-distance surveillance."
- item_state = "binoculars"
- icon_state = "binoculars"
- lefthand_file = 'icons/mob/inhands/items_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/items_righthand.dmi'
- slot_flags = ITEM_SLOT_BELT
- w_class = WEIGHT_CLASS_SMALL
- var/mob/listeningTo
- var/zoom_out_amt = 6
- var/zoom_amt = 10
-
-/obj/item/twohanded/binoculars/Destroy()
- listeningTo = null
- return ..()
-
-/obj/item/twohanded/binoculars/wield(mob/user)
- . = ..()
- if(!wielded)
- return
- RegisterSignal(user, COMSIG_MOVABLE_MOVED, .proc/unwield)
- listeningTo = user
- user.visible_message("[user] holds [src] up to [user.p_their()] eyes.","You hold [src] up to your eyes.")
- item_state = "binoculars_wielded"
- user.regenerate_icons()
- if(!user?.client)
- return
- var/client/C = user.client
- var/_x = 0
- var/_y = 0
- switch(user.dir)
- if(NORTH)
- _y = zoom_amt
- if(EAST)
- _x = zoom_amt
- if(SOUTH)
- _y = -zoom_amt
- if(WEST)
- _x = -zoom_amt
- C.change_view(world.view + zoom_out_amt)
- C.pixel_x = world.icon_size*_x
- C.pixel_y = world.icon_size*_y
-
-/obj/item/twohanded/binoculars/unwield(mob/user)
- . = ..()
- UnregisterSignal(listeningTo, COMSIG_MOVABLE_MOVED)
- listeningTo = null
- user.visible_message("[user] lowers [src].","You lower [src].")
- item_state = "binoculars"
- user.regenerate_icons()
- if(user && user.client)
- user.regenerate_icons()
- var/client/C = user.client
- C.change_view(CONFIG_GET(string/default_view))
- user.client.pixel_x = 0
- user.client.pixel_y = 0
-
-/obj/item/twohanded/electrostaff
- icon = 'icons/obj/items_and_weapons.dmi'
- icon_state = "electrostaff"
- item_state = "electrostaff"
- lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi'
- name = "riot suppression electrostaff"
- desc = "A large quarterstaff, with massive silver electrodes mounted at the end."
- w_class = WEIGHT_CLASS_HUGE
- slot_flags = ITEM_SLOT_BACK | ITEM_SLOT_OCLOTHING
- force_unwielded = 5
- force_wielded = 10
- throwforce = 15 //if you are a madman and finish someone off with this, power to you.
- throw_speed = 1
- item_flags = NO_MAT_REDEMPTION | SLOWS_WHILE_IN_HAND | ITEM_CAN_BLOCK | ITEM_CAN_PARRY
- block_parry_data = /datum/block_parry_data/electrostaff
- attack_verb = list("struck", "beaten", "thwacked", "pulped")
- total_mass = 5 //yeah this is a heavy thing, beating people with it while it's off is not going to do you any favors. (to curb stun-kill rampaging without it being on)
- var/obj/item/stock_parts/cell/cell = /obj/item/stock_parts/cell/high
- var/on = FALSE
- var/lethal_cost = 400 //10000/400*20 = 500. decent enough?
- var/lethal_damage = 20
- var/lethal_stam_cost = 4
- var/stun_cost = 333 //10000/333*25 = 750. stunbatons are at time of writing 10000/1000*49 = 490.
- var/stun_status_effect = STATUS_EFFECT_ELECTROSTAFF //a small slowdown effect
- var/stun_stamdmg = 40
- var/stun_status_duration = 25
- var/stun_stam_cost = 3.5
-
-// haha security desword time /s
-/datum/block_parry_data/electrostaff
- block_damage_absorption = 0
- block_damage_multiplier = 1
- can_block_attack_types = ~ATTACK_TYPE_PROJECTILE // only able to parry non projectiles
- block_damage_multiplier_override = list(
- TEXT_ATTACK_TYPE_MELEE = 0.5, // only useful on melee and unarmed
- TEXT_ATTACK_TYPE_UNARMED = 0.3
- )
- block_start_delay = 0.5 // near instantaneous block
- block_stamina_cost_per_second = 3
- block_stamina_efficiency = 2 // haha this is a horrible idea
- // more slowdown that deswords because security
- block_slowdown = 2
- // no attacking while blocking
- block_lock_attacking = TRUE
-
- parry_time_windup = 1
- parry_time_active = 5
- parry_time_spindown = 0
- parry_time_spindown_visual_override = 1
- parry_flags = PARRY_DEFAULT_HANDLE_FEEDBACK | PARRY_LOCK_ATTACKING // no attacking while parrying
- parry_time_perfect = 0
- parry_time_perfect_leeway = 0.5
- parry_efficiency_perfect = 100
- parry_imperfect_falloff_percent = 1
- parry_imperfect_falloff_percent_override = list(
- TEXT_ATTACK_TYPE_PROJECTILE = 45 // really crappy vs projectiles
- )
- parry_time_perfect_leeway_override = list(
- TEXT_ATTACK_TYPE_PROJECTILE = 1 // extremely harsh window for projectiles
- )
- // not extremely punishing to fail, but no spamming the parry.
- parry_cooldown = 2.5 SECONDS
- parry_failed_stagger_duration = 1.5 SECONDS
- parry_failed_clickcd_duration = 1 SECONDS
-
-/obj/item/twohanded/electrostaff/Initialize(mapload)
- . = ..()
- if(ispath(cell))
- cell = new cell
-
-/obj/item/twohanded/electrostaff/Destroy()
- STOP_PROCESSING(SSobj, src)
- return ..()
-
-/obj/item/twohanded/electrostaff/get_cell()
- . = cell
- if(iscyborg(loc))
- var/mob/living/silicon/robot/R = loc
- . = R.get_cell()
-
-/obj/item/twohanded/electrostaff/proc/min_hitcost()
- return min(stun_cost, lethal_cost)
-
-/obj/item/twohanded/electrostaff/proc/turn_on(mob/user, silent = FALSE)
- if(on)
- return
- if(!cell)
- if(user)
- to_chat(user, "[src] has no cell.")
- return
- if(cell.charge < min_hitcost())
- if(user)
- to_chat(user, "[src] is out of charge.")
- return
- on = TRUE
- START_PROCESSING(SSobj, src)
- if(user)
- to_chat(user, "You turn [src] on.")
- update_icon()
- if(!silent)
- playsound(src, "sparks", 75, 1, -1)
-
-/obj/item/twohanded/electrostaff/proc/turn_off(mob/user, silent = FALSE)
- if(!on)
- return
- if(user)
- to_chat(user, "You turn [src] off.")
- on = FALSE
- STOP_PROCESSING(SSobj, src)
- update_icon()
- if(!silent)
- playsound(src, "sparks", 75, 1, -1)
-
-/obj/item/twohanded/electrostaff/proc/toggle(mob/user, silent = FALSE)
- if(on)
- turn_off(user, silent)
- else
- turn_on(user, silent)
-
-/obj/item/twohanded/electrostaff/wield(mob/user)
- . = ..()
- if(wielded)
- turn_on(user)
- add_fingerprint(user)
-
-/obj/item/twohanded/electrostaff/unwield(mob/user)
- . = ..()
- if(!wielded)
- turn_off(user)
- add_fingerprint(user)
-
-/obj/item/twohanded/electrostaff/update_icon_state()
- . = ..()
- if(!wielded)
- icon_state = "electrostaff"
- item_state = "electrostaff"
- else
- icon_state = item_state = (on? "electrostaff_1" : "electrostaff_0")
- set_light(7, on? 1 : 0, LIGHT_COLOR_CYAN)
-
-/obj/item/twohanded/electrostaff/examine(mob/living/user)
- . = ..()
- if(cell)
- . += "The cell charge is [round(cell.percent())]%."
- else
- . += "There is no cell installed!"
-
-/obj/item/twohanded/electrostaff/attackby(obj/item/W, mob/user, params)
- if(istype(W, /obj/item/stock_parts/cell))
- var/obj/item/stock_parts/cell/C = W
- if(cell)
- to_chat(user, "[src] already has a cell!")
- else
- if(C.maxcharge < min_hit_cost())
- to_chat(user, "[src] requires a higher capacity cell.")
- return
- if(!user.transferItemToLoc(W, src))
- return
- cell = C
- to_chat(user, "You install a cell in [src].")
-
- else if(W.tool_behaviour == TOOL_SCREWDRIVER)
- if(cell)
- cell.update_icon()
- cell.forceMove(get_turf(src))
- cell = null
- to_chat(user, "You remove the cell from [src].")
- turn_off(user, TRUE)
- else
- return ..()
-
-/obj/item/twohanded/electrostaff/process()
- deductcharge(50) //Wasteful!
-
-/obj/item/twohanded/electrostaff/proc/min_hit_cost()
- return min(lethal_cost, stun_cost)
-
-/obj/item/twohanded/electrostaff/proc/deductcharge(amount)
- var/obj/item/stock_parts/cell/C = get_cell()
- if(!C)
- turn_off()
- return FALSE
- C.use(min(amount, C.charge))
- if(QDELETED(src))
- return FALSE
- if(C.charge < min_hit_cost())
- turn_off()
-
-/obj/item/twohanded/electrostaff/attack(mob/living/target, mob/living/user)
- if(IS_STAMCRIT(user))//CIT CHANGE - makes it impossible to baton in stamina softcrit
- to_chat(user, "You're too exhausted to use [src] properly.")//CIT CHANGE - ditto
- return //CIT CHANGE - ditto
- if(on && HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50))
- clowning_around(user) //ouch!
- return
- if(iscyborg(target))
- return ..()
- var/list/return_list = list()
- if(target.mob_run_block(src, 0, "[user]'s [name]", ATTACK_TYPE_MELEE, 0, user, null, return_list) & BLOCK_SUCCESS) //No message; run_block() handles that
- playsound(target, 'sound/weapons/genhit.ogg', 50, 1)
- return FALSE
- if(user.a_intent != INTENT_HARM)
- if(stun_act(target, user, null, return_list))
- user.do_attack_animation(target)
- user.adjustStaminaLossBuffered(stun_stam_cost)
- return
- else if(!harm_act(target, user, null, return_list))
- return ..() //if you can't fry them just beat them with it
- else //we did harm act them
- user.do_attack_animation(target)
- user.adjustStaminaLossBuffered(lethal_stam_cost)
-
-/obj/item/twohanded/electrostaff/proc/stun_act(mob/living/target, mob/living/user, no_charge_and_force = FALSE, list/block_return = list())
- var/stunforce = block_calculate_resultant_damage(stun_stamdmg, block_return)
- if(!no_charge_and_force)
- if(!on)
- target.visible_message("[user] has bapped [target] with [src]. Luckily it was off.", \
- "[user] has bapped you with [src]. Luckily it was off")
- turn_off() //if it wasn't already off
- return FALSE
- var/obj/item/stock_parts/cell/C = get_cell()
- var/chargeleft = C.charge
- deductcharge(stun_cost)
- if(QDELETED(src) || QDELETED(C)) //boom
- return FALSE
- if(chargeleft < stun_cost)
- stunforce *= round(chargeleft/stun_cost, 0.1)
- target.adjustStaminaLoss(stunforce)
- target.apply_effect(EFFECT_STUTTER, stunforce)
- SEND_SIGNAL(target, COMSIG_LIVING_MINOR_SHOCK)
- if(user)
- target.lastattacker = user.real_name
- target.lastattackerckey = user.ckey
- target.visible_message("[user] has shocked [target] with [src]!", \
- "[user] has shocked you with [src]!")
- log_combat(user, target, "stunned with an electrostaff")
- playsound(src, 'sound/weapons/staff.ogg', 50, 1, -1)
- target.apply_status_effect(stun_status_effect, stun_status_duration)
- if(ishuman(user))
- var/mob/living/carbon/human/H = user
- H.forcesay(GLOB.hit_appends)
- return TRUE
-
-/obj/item/twohanded/electrostaff/proc/harm_act(mob/living/target, mob/living/user, no_charge_and_force = FALSE, list/block_return = list())
- var/lethal_force = block_calculate_resultant_damage(lethal_damage, block_return)
- if(!no_charge_and_force)
- if(!on)
- return FALSE //standard item attack
- var/obj/item/stock_parts/cell/C = get_cell()
- var/chargeleft = C.charge
- deductcharge(lethal_cost)
- if(QDELETED(src) || QDELETED(C)) //boom
- return FALSE
- if(chargeleft < stun_cost)
- lethal_force *= round(chargeleft/lethal_cost, 0.1)
- target.adjustFireLoss(lethal_force) //good against ointment spam
- SEND_SIGNAL(target, COMSIG_LIVING_MINOR_SHOCK)
- if(user)
- target.lastattacker = user.real_name
- target.lastattackerckey = user.ckey
- target.visible_message("[user] has seared [target] with [src]!", \
- "[user] has seared you with [src]!")
- log_combat(user, target, "burned with an electrostaff")
- playsound(src, 'sound/weapons/sear.ogg', 50, 1, -1)
- return TRUE
-
-/obj/item/twohanded/electrostaff/proc/clowning_around(mob/living/user)
- user.visible_message("[user] accidentally hits [user.p_them()]self with [src]!", \
- "You accidentally hit yourself with [src]!")
- SEND_SIGNAL(user, COMSIG_LIVING_MINOR_SHOCK)
- harm_act(user, user, TRUE)
- stun_act(user, user, TRUE)
- deductcharge(lethal_cost)
-
-/obj/item/twohanded/electrostaff/emp_act(severity)
- . = ..()
- if (!(. & EMP_PROTECT_SELF))
- turn_off()
- if(!iscyborg(loc))
- deductcharge(1000 / severity, TRUE, FALSE)
-
-/obj/item/twohanded/broom
- name = "broom"
- desc = "This is my BROOMSTICK! It can be used manually or braced with two hands to sweep items as you move. It has a telescopic handle for compact storage." //LIES
- icon = 'icons/obj/janitor.dmi'
- icon_state = "broom0"
- lefthand_file = 'icons/mob/inhands/equipment/custodial_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/equipment/custodial_righthand.dmi'
- force = 8
- throwforce = 10
- throw_speed = 3
- throw_range = 7
- w_class = WEIGHT_CLASS_NORMAL
- force_unwielded = 8
- force_wielded = 12
- attack_verb = list("swept", "brushed off", "bludgeoned", "whacked")
- resistance_flags = FLAMMABLE
-
-/obj/item/twohanded/broom/update_icon_state()
- icon_state = "broom[wielded]"
-
-/obj/item/twohanded/broom/wield(mob/user)
- . = ..()
- if(!wielded)
- return
- to_chat(user, "You brace the [src] against the ground in a firm sweeping stance.")
- RegisterSignal(user, COMSIG_MOVABLE_MOVED, .proc/sweep)
-
-/obj/item/twohanded/broom/unwield(mob/user)
- . = ..()
- UnregisterSignal(user, COMSIG_MOVABLE_MOVED)
-
-/obj/item/twohanded/broom/afterattack(atom/A, mob/user, proximity)
- . = ..()
- if(!proximity)
- return
- sweep(user, A, FALSE)
-
-/obj/item/twohanded/broom/proc/sweep(mob/user, atom/A, moving = TRUE)
- var/turf/target
- if (!moving)
- if (isturf(A))
- target = A
- else
- target = A.loc
- if(!isturf(target)) //read: Mob inventories.
- return
- else
- target = user.loc
- if (locate(/obj/structure/table) in target.contents)
- return
- var/i = 0
- for(var/obj/item/garbage in target.contents)
- if(!garbage.anchored)
- garbage.Move(get_step(target, user.dir), user.dir)
- i++
- if(i >= 20)
- break
- if(i >= 1)
- playsound(loc, 'sound/weapons/thudswoosh.ogg', 5, TRUE, -1)
-
-/obj/item/twohanded/broom/proc/janicart_insert(mob/user, obj/structure/janitorialcart/J) //bless you whoever fixes this copypasta
- J.put_in_cart(src, user)
- J.mybroom=src
- J.update_icon()
diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm
index 56eb5cec48..e789bbe71f 100644
--- a/code/game/objects/items/weaponry.dm
+++ b/code/game/objects/items/weaponry.dm
@@ -254,6 +254,121 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
playsound(src, 'sound/weapons/bladeslice.ogg', 50, 1)
return(BRUTELOSS)
+/obj/item/melee/bokken // parrying stick
+ name = "bokken"
+ desc = "A space-Japanese training sword made of wood and shaped like a katana."
+ icon_state = "bokken"
+ item_state = "bokken"
+ lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
+ slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_BACK
+ w_class = WEIGHT_CLASS_BULKY
+ force = 9
+ throwforce = 10
+ damtype = STAMINA
+ attack_verb = list("whacked", "smacked", "struck")
+ total_mass = TOTAL_MASS_MEDIEVAL_WEAPON
+ hitsound = 'sound/weapons/grenadelaunch.ogg' // no good wood thunk sounds
+ var/harm = FALSE // TRUE = brute, FALSE = stam
+ var/reinforced = FALSE
+ var/burnt = FALSE
+ var/burned_in // text you burned in (with a welder)
+ var/quick_parry = FALSE // false = default parry, true = really small parry window
+ item_flags = ITEM_CAN_PARRY
+ block_parry_data = /datum/block_parry_data/bokken
+ bare_wound_bonus = 0
+ wound_bonus = 0
+
+/datum/block_parry_data/bokken // fucked up parry data, emphasizing quicker, shorter parries
+ parry_stamina_cost = 8 // be wise about when you parry, though, else you won't be able to fight enough to make it count
+ parry_time_windup = 0
+ parry_time_active = 10 // small parry window
+ parry_time_spindown = 0
+ // parry_flags = PARRY_DEFAULT_HANDLE_FEEDBACK // bokken users can no longer strike while parrying
+ parry_time_perfect = 1.5
+ parry_time_perfect_leeway = 1
+ parry_imperfect_falloff_percent = 7.5
+ parry_efficiency_to_counterattack = 100
+ parry_efficiency_considered_successful = 65 // VERY generous
+ parry_efficiency_perfect = 120
+ parry_efficiency_perfect_override = list(
+ TEXT_ATTACK_TYPE_PROJECTILE = 30,
+ )
+ parry_failed_stagger_duration = 3 SECONDS
+ parry_data = list(PARRY_COUNTERATTACK_MELEE_ATTACK_CHAIN = 2.5) // 7*2.5 = 17.5, 8*2.5 = 20, 9*2.5 = 22.5, 10*2.5 = 25
+
+/datum/block_parry_data/bokken/quick_parry // emphasizing REALLY SHORT PARRIES
+ parry_stamina_cost = 6 // still more costly than most parries, but less than a full bokken parry
+ parry_time_active = 5 // REALLY small parry window
+ parry_time_perfect = 2.5 // however...
+ parry_time_perfect_leeway = 2.5 // the entire time, the parry is perfect
+ parry_failed_stagger_duration = 1 SECONDS
+ parry_failed_clickcd_duration = 1 SECONDS // more forgiving punishments for missed parries
+ // still, don't fucking miss your parries or you're down stamina and staggered to shit
+
+/obj/item/melee/bokken/Initialize()
+ . = ..()
+ AddElement(/datum/element/sword_point)
+
+/obj/item/melee/bokken/attack_self(mob/user)
+ harm = !harm
+ if(harm)
+ force -= 2
+ damtype = BRUTE
+ attack_verb = list("bashed", "smashed", "attacked")
+ bare_wound_bonus = 15 // having your leg smacked by a wooden stick is probably not great for it if it's naked
+ wound_bonus = 0
+ else
+ force += 2
+ damtype = STAMINA
+ attack_verb = list("whacked", "smacked", "struck")
+ bare_wound_bonus = 0
+ wound_bonus = 0
+ to_chat(user, "[src] is now [harm ? "harmful" : "not quite as harmful"].")
+
+/obj/item/melee/bokken/AltClick(mob/user)
+ . = ..()
+ quick_parry = !quick_parry
+ if(quick_parry)
+ block_parry_data = /datum/block_parry_data/bokken/quick_parry
+ else
+ block_parry_data = /datum/block_parry_data/bokken
+ to_chat(user, "[src] is now [quick_parry ? "emphasizing shorter parries, forcing you to riposte or be staggered" : "emphasizing longer parries, with a shorter window to riposte but more forgiving parries"].")
+
+/obj/item/melee/bokken/attackby(obj/item/I, mob/living/user, params)
+ if(istype(I, /obj/item/pen))
+ var/new_name = stripped_input(user, "What do you wish to name [src]?", "New Name", "bokken", 30)
+ if(new_name)
+ name = new_name
+ if(I.tool_behaviour == TOOL_WELDER)
+ var/new_burn = stripped_input(user, "What do you wish to burn into [src]?", "Burnt Inscription","", 140)
+ if(new_burn)
+ burned_in = new_burn
+ if(!burnt)
+ icon_state += "_burnt"
+ item_state += "_burnt"
+ burnt = TRUE
+ update_icon()
+ update_icon_state()
+ if(istype(I, /obj/item/stack/rods))
+ var/obj/item/stack/rods/R = I
+ if(!reinforced)
+ if(R.use(1))
+ force++
+ reinforced = TRUE
+ to_chat(user, "You slide a metal rod into [src]\'s hilt. It feels a little heftier in your hands.")
+ else
+ to_chat(user, "[src] already has a weight slid into the hilt.")
+
+/obj/item/melee/bokken/examine(mob/user)
+ . = ..()
+ if(quick_parry)
+ . += " [src] is gripped in a way to emphasize quicker parries."
+ if(reinforced)
+ . += " There's a metal rod shoved into the base."
+ if(burnt)
+ . += " Burned into the \"blade\" is [burned_in]."
+
/obj/item/wirerod
name = "wired rod"
desc = "A rod with some wire wrapped around the top. It'd be easy to attach something to the top bit."
@@ -268,7 +383,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
/obj/item/wirerod/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/shard))
- var/obj/item/twohanded/spear/S = new /obj/item/twohanded/spear
+ var/obj/item/spear/S = new /obj/item/spear
remove_item_from_storage(user)
if (!user.transferItemToLoc(I, S))
@@ -304,12 +419,28 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
force = 2
throwforce = 20 //This is never used on mobs since this has a 100% embed chance.
throw_speed = 4
- embedding = list("embedded_pain_multiplier" = 4, "embed_chance" = 100, "embedded_fall_chance" = 0)
+ embedding = list("pain_mult" = 4, "embed_chance" = 100, "fall_chance" = 0, "embed_chance_turf_mod" = 15)
+ armour_penetration = 40
+
w_class = WEIGHT_CLASS_SMALL
sharpness = IS_SHARP
custom_materials = list(/datum/material/iron=500, /datum/material/glass=500)
resistance_flags = FIRE_PROOF
+/obj/item/throwing_star/stamina
+ name = "shock throwing star"
+ desc = "An aerodynamic disc designed to cause excruciating pain when stuck inside fleeing targets, hopefully without causing fatal harm."
+ throwforce = 5
+ embedding = list("pain_chance" = 5, "embed_chance" = 100, "fall_chance" = 0, "jostle_chance" = 10, "pain_stam_pct" = 0.8, "jostle_pain_mult" = 3)
+
+/obj/item/throwing_star/toy
+ name = "toy throwing star"
+ desc = "An aerodynamic disc strapped with adhesive for sticking to people, good for playing pranks and getting yourself killed by security."
+ sharpness = IS_BLUNT
+ force = 0
+ throwforce = 0
+ embedding = list("pain_mult" = 0, "jostle_pain_mult" = 0, "embed_chance" = 100, "fall_chance" = 0)
+
/obj/item/switchblade
name = "switchblade"
icon_state = "switchblade"
@@ -464,7 +595,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
/obj/item/mounted_chainsaw/Destroy()
var/obj/item/bodypart/part
- new /obj/item/twohanded/required/chainsaw(get_turf(src))
+ new /obj/item/chainsaw(get_turf(src))
if(iscarbon(loc))
var/mob/living/carbon/holder = loc
var/index = holder.get_held_index_of_item(src)
@@ -563,6 +694,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
force = 10
+ wound_bonus = -10
throwforce = 12
attack_verb = list("beat", "smacked")
custom_materials = list(/datum/material/wood = MINERAL_MATERIAL_AMOUNT * 3.5)
@@ -615,7 +747,8 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
homerun_ready = 0
return
else if(!target.anchored)
- target.throw_at(throw_target, rand(1,2), 7, user)
+ var/whack_speed = (prob(60) ? 1 : 4)
+ target.throw_at(throw_target, rand(1, 2), whack_speed, user) // sorry friends, 7 speed batting caused wounds to absolutely delete whoever you knocked your target into (and said target)
/obj/item/melee/baseball_bat/ablative
name = "metal baseball bat"
@@ -695,6 +828,92 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
item_flags = DROPDEL | ABSTRACT
attack_verb = list("bopped")
+/obj/item/circlegame/Initialize()
+ . = ..()
+ var/mob/living/owner = loc
+ if(!istype(owner))
+ return
+ RegisterSignal(owner, COMSIG_PARENT_EXAMINE, .proc/ownerExamined)
+
+/obj/item/circlegame/Destroy()
+ var/mob/owner = loc
+ if(istype(owner))
+ UnregisterSignal(owner, COMSIG_PARENT_EXAMINE)
+ return ..()
+
+/obj/item/circlegame/dropped(mob/user)
+ UnregisterSignal(user, COMSIG_PARENT_EXAMINE) //loc will have changed by the time this is called, so Destroy() can't catch it
+ // this is a dropdel item.
+ return ..()
+
+/// Stage 1: The mistake is made
+/obj/item/circlegame/proc/ownerExamined(mob/living/owner, mob/living/sucker)
+ if(!istype(sucker) || !in_range(owner, sucker))
+ return
+ addtimer(CALLBACK(src, .proc/waitASecond, owner, sucker), 4)
+
+/// Stage 2: Fear sets in
+/obj/item/circlegame/proc/waitASecond(mob/living/owner, mob/living/sucker)
+ if(QDELETED(sucker) || QDELETED(src) || QDELETED(owner))
+ return
+
+ if(owner == sucker) // big mood
+ to_chat(owner, "Wait a second... you just looked at your own [src.name]!")
+ addtimer(CALLBACK(src, .proc/selfGottem, owner), 10)
+ else
+ to_chat(sucker, "Wait a second... was that a-")
+ addtimer(CALLBACK(src, .proc/GOTTEM, owner, sucker), 6)
+
+/// Stage 3A: We face our own failures
+/obj/item/circlegame/proc/selfGottem(mob/living/owner)
+ if(QDELETED(src) || QDELETED(owner))
+ return
+
+ playsound(get_turf(owner), 'sound/effects/hit_punch.ogg', 50, TRUE, -1)
+ owner.visible_message("[owner] shamefully bops [owner.p_them()]self with [owner.p_their()] [src.name].", "You shamefully bop yourself with your [src.name].", \
+ "You hear a dull thud!")
+ log_combat(owner, owner, "bopped", src.name, "(self)")
+ owner.do_attack_animation(owner)
+ owner.apply_damage(100, STAMINA)
+ owner.Knockdown(10)
+ qdel(src)
+
+/// Stage 3B: We face our reckoning (unless we moved away or they're incapacitated)
+/obj/item/circlegame/proc/GOTTEM(mob/living/owner, mob/living/sucker)
+ if(QDELETED(sucker))
+ return
+
+ if(QDELETED(src) || QDELETED(owner))
+ to_chat(sucker, "Nevermind... must've been your imagination...")
+ return
+
+ if(!in_range(owner, sucker) || !(owner.mobility_flags & MOBILITY_USE))
+ to_chat(sucker, "Phew... you moved away before [owner] noticed you saw [owner.p_their()] [src.name]...")
+ return
+
+ to_chat(owner, "[sucker] looks down at your [src.name] before trying to avert [sucker.p_their()] eyes, but it's too late!")
+ to_chat(sucker, "[owner] sees the fear in your eyes as you try to look away from [owner.p_their()] [src.name]!")
+
+ playsound(get_turf(owner), 'sound/effects/hit_punch.ogg', 50, TRUE, -1)
+ owner.do_attack_animation(sucker)
+
+ if(HAS_TRAIT(owner, TRAIT_HULK))
+ owner.visible_message("[owner] bops [sucker] with [owner.p_their()] [src.name] much harder than intended, sending [sucker.p_them()] flying!", \
+ "You bop [sucker] with your [src.name] much harder than intended, sending [sucker.p_them()] flying!", "You hear a sickening sound of flesh hitting flesh!", ignored_mobs=list(sucker))
+ to_chat(sucker, "[owner] bops you incredibly hard with [owner.p_their()] [src.name], sending you flying!")
+ sucker.apply_damage(50, STAMINA)
+ sucker.Knockdown(50)
+ log_combat(owner, sucker, "bopped", src.name, "(setup- Hulk)")
+ var/atom/throw_target = get_edge_target_turf(sucker, owner.dir)
+ sucker.throw_at(throw_target, 6, 3, owner)
+ else
+ owner.visible_message("[owner] bops [sucker] with [owner.p_their()] [src.name]!", "You bop [sucker] with your [src.name]!", \
+ "You hear a dull thud!", ignored_mobs=list(sucker))
+ sucker.apply_damage(15, STAMINA)
+ log_combat(owner, sucker, "bopped", src.name, "(setup)")
+ to_chat(sucker, "[owner] bops you with [owner.p_their()] [src.name]!")
+ qdel(src)
+
/obj/item/slapper
name = "slapper"
desc = "This is how real men fight."
@@ -748,3 +967,59 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
to_chat(user, "[M] is too close to use [src] on.")
return
M.attack_hand(user)
+
+//HF blade
+
+/obj/item/vibro_weapon
+ icon_state = "hfrequency0"
+ lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
+ name = "vibro sword"
+ desc = "A potent weapon capable of cutting through nearly anything. Wielding it in two hands will allow you to deflect gunfire."
+ armour_penetration = 100
+ block_chance = 40
+ throwforce = 20
+ throw_speed = 4
+ sharpness = IS_SHARP
+ attack_verb = list("cut", "sliced", "diced")
+ w_class = WEIGHT_CLASS_BULKY
+ slot_flags = ITEM_SLOT_BACK
+ hitsound = 'sound/weapons/bladeslice.ogg'
+ var/wielded = FALSE // track wielded status on item
+
+/obj/item/vibro_weapon/Initialize()
+ . = ..()
+ RegisterSignal(src, COMSIG_TWOHANDED_WIELD, .proc/on_wield)
+ RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, .proc/on_unwield)
+
+/obj/item/vibro_weapon/ComponentInitialize()
+ . = ..()
+ AddComponent(/datum/component/butchering, 20, 105)
+ AddComponent(/datum/component/two_handed, force_multiplier=2, icon_wielded="hfrequency1")
+ AddElement(/datum/element/sword_point)
+
+/// triggered on wield of two handed item
+/obj/item/vibro_weapon/proc/on_wield(obj/item/source, mob/user)
+ wielded = TRUE
+
+/// triggered on unwield of two handed item
+/obj/item/vibro_weapon/proc/on_unwield(obj/item/source, mob/user)
+ wielded = FALSE
+
+/obj/item/vibro_weapon/update_icon_state()
+ icon_state = "hfrequency0"
+
+/obj/item/vibro_weapon/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return)
+ if(wielded)
+ final_block_chance *= 2
+ if(wielded || !(attack_type & ATTACK_TYPE_PROJECTILE))
+ if(prob(final_block_chance))
+ if(attack_type & ATTACK_TYPE_PROJECTILE)
+ owner.visible_message("[owner] deflects [attack_text] with [src]!")
+ playsound(src, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, 1)
+ block_return[BLOCK_RETURN_REDIRECT_METHOD] = REDIRECT_METHOD_DEFLECT
+ return BLOCK_SUCCESS | BLOCK_REDIRECTED | BLOCK_SHOULD_REDIRECT | BLOCK_PHYSICAL_EXTERNAL
+ else
+ owner.visible_message("[owner] parries [attack_text] with [src]!")
+ return BLOCK_SUCCESS | BLOCK_PHYSICAL_EXTERNAL
+ return NONE
diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm
index e64b7d8f8d..14017ffb2d 100644
--- a/code/game/objects/obj_defense.dm
+++ b/code/game/objects/obj_defense.dm
@@ -74,7 +74,8 @@
/obj/bullet_act(obj/item/projectile/P)
. = ..()
playsound(src, P.hitsound, 50, 1)
- visible_message("[src] is hit by \a [P]!", null, null, COMBAT_MESSAGE_RANGE)
+ if(P.suppressed != SUPPRESSED_VERY)
+ visible_message("[src] is hit by \a [P]!", null, null, COMBAT_MESSAGE_RANGE)
if(!QDELETED(src)) //Bullet on_hit effect might have already destroyed this object
take_damage(P.damage, P.damage_type, P.flag, 0, turn(P.dir, 180), P.armour_penetration)
@@ -102,15 +103,21 @@
take_damage(400, BRUTE, "melee", 0, get_dir(src, B))
/obj/proc/attack_generic(mob/user, damage_amount = 0, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, armor_penetration = 0) //used by attack_alien, attack_animal, and attack_slime
+ if(SEND_SIGNAL(src, COMSIG_OBJ_ATTACK_GENERIC, user, damage_amount, damage_type, damage_flag, sound_effect, armor_penetration) & COMPONENT_STOP_GENERIC_ATTACK)
+ return FALSE
+ if(!user.CheckActionCooldown(CLICK_CD_MELEE))
+ return
user.do_attack_animation(src)
- user.changeNext_move(CLICK_CD_MELEE)
- return take_damage(damage_amount, damage_type, damage_flag, sound_effect, get_dir(src, user), armor_penetration)
+ . = take_damage(damage_amount, damage_type, damage_flag, sound_effect, get_dir(src, user), armor_penetration)
+ user.DelayNextAction()
/obj/attack_alien(mob/living/carbon/alien/humanoid/user)
if(attack_generic(user, 60, BRUTE, "melee", 0))
playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1)
/obj/attack_animal(mob/living/simple_animal/M)
+ if(!M.CheckActionCooldown(CLICK_CD_MELEE))
+ return
if(!M.melee_damage_upper && !M.obj_damage)
M.emote("custom", message = "[M.friendly_verb_continuous] [src].")
return 0
diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm
index 0b2fe5ac2a..79dd13b0ae 100644
--- a/code/game/objects/objs.dm
+++ b/code/game/objects/objs.dm
@@ -10,6 +10,11 @@
var/damtype = BRUTE
var/force = 0
+ /// How good a given object is at causing wounds on carbons. Higher values equal better shots at creating serious wounds.
+ var/wound_bonus = 0
+ /// If this attacks a human with no wound armor on the affected body part, add this to the wound mod. Some attacks may be significantly worse at wounding if there's even a slight layer of armor to absorb some of it vs bare flesh
+ var/bare_wound_bonus = 0
+
var/datum/armor/armor
var/obj_integrity //defaults to max_integrity
var/max_integrity = 500
@@ -37,13 +42,9 @@
if("anchored")
setAnchored(vval)
return TRUE
- if("obj_flags")
+ if(NAMEOF(src, obj_flags))
if ((obj_flags & DANGEROUS_POSSESSION) && !(vval & DANGEROUS_POSSESSION))
return FALSE
- if("control_object")
- var/obj/O = vval
- if(istype(O) && (O.obj_flags & DANGEROUS_POSSESSION))
- return FALSE
return ..()
/obj/Initialize()
@@ -323,3 +324,8 @@
/obj/proc/rnd_crafted(obj/machinery/rnd/production/P)
return
+
+/obj/handle_ricochet(obj/item/projectile/P)
+ . = ..()
+ if(. && ricochet_damage_mod)
+ take_damage(P.damage * ricochet_damage_mod, P.damage_type, P.flag, 0, turn(P.dir, 180), P.armour_penetration) // pass along ricochet_damage_mod damage to the structure for the ricochet
diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm
index e185defc0a..39f2d276a1 100644
--- a/code/game/objects/structures.dm
+++ b/code/game/objects/structures.dm
@@ -9,6 +9,8 @@
var/mob/living/structureclimber
var/broken = 0 //similar to machinery's stat BROKEN
layer = BELOW_OBJ_LAYER
+ flags_ricochet = RICOCHET_HARD
+ ricochet_chance_mod = 0.5
/obj/structure/Initialize()
if (!armor)
@@ -26,12 +28,10 @@
queue_smooth_neighbors(src)
return ..()
-/obj/structure/attack_hand(mob/user)
+/obj/structure/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
- if(.)
- return
if(structureclimber && structureclimber != user)
- user.changeNext_move(CLICK_CD_MELEE)
+ user.DelayNextAction(CLICK_CD_MELEE)
user.do_attack_animation(src)
structureclimber.DefaultCombatKnockdown(40)
structureclimber.visible_message("[structureclimber] has been knocked off [src].", "You're knocked off [src]!", "You see [structureclimber] get knocked off [src].")
diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm
index a793459c5d..ce11daec54 100644
--- a/code/game/objects/structures/aliens.dm
+++ b/code/game/objects/structures/aliens.dm
@@ -249,7 +249,7 @@
/obj/structure/alien/egg/attack_alien(mob/living/carbon/alien/user)
return attack_hand(user)
-/obj/structure/alien/egg/attack_hand(mob/living/user)
+/obj/structure/alien/egg/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
@@ -269,8 +269,7 @@
return
else
to_chat(user, "It feels slimy.")
- user.changeNext_move(CLICK_CD_MELEE)
-
+ user.DelayNextAction(CLICK_CD_MELEE)
/obj/structure/alien/egg/proc/Grow()
status = GROWN
diff --git a/code/game/objects/structures/artstuff.dm b/code/game/objects/structures/artstuff.dm
index fcc26d1313..827e9a7b0a 100644
--- a/code/game/objects/structures/artstuff.dm
+++ b/code/game/objects/structures/artstuff.dm
@@ -80,7 +80,7 @@
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
- ui = new(user, src, ui_key, "canvas", name, ui_x, ui_y, master_ui, state)
+ ui = new(user, src, ui_key, "Canvas", name, ui_x, ui_y, master_ui, state)
ui.set_autoupdate(FALSE)
ui.open()
diff --git a/code/game/objects/structures/barsigns.dm b/code/game/objects/structures/barsigns.dm
index 821409c26b..905888c904 100644
--- a/code/game/objects/structures/barsigns.dm
+++ b/code/game/objects/structures/barsigns.dm
@@ -52,10 +52,7 @@
/obj/structure/sign/barsign/attack_ai(mob/user)
return attack_hand(user)
-/obj/structure/sign/barsign/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/structure/sign/barsign/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(!allowed(user))
to_chat(user, "Access denied.")
return
diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm
index 2225c4c0c2..299ba7b659 100644
--- a/code/game/objects/structures/beds_chairs/chair.dm
+++ b/code/game/objects/structures/beds_chairs/chair.dm
@@ -155,7 +155,7 @@
///Material chair
/obj/structure/chair/greyscale
icon_state = "chair_greyscale"
- material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS | MATERIAL_EFFECTS
+ material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS
item_chair = /obj/item/chair/greyscale
buildstacktype = null //Custom mats handle this
@@ -384,7 +384,7 @@
/obj/item/chair/greyscale
icon_state = "chair_greyscale_toppled"
item_state = "chair_greyscale"
- material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS | MATERIAL_EFFECTS
+ material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS
origin_type = /obj/structure/chair/greyscale
/obj/item/chair/stool
diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm
index a4ee2f16e2..45cac650b8 100644
--- a/code/game/objects/structures/bedsheet_bin.dm
+++ b/code/game/objects/structures/bedsheet_bin.dm
@@ -311,10 +311,7 @@ LINEN BINS
/obj/structure/bedsheetbin/attack_paw(mob/user)
return attack_hand(user)
-/obj/structure/bedsheetbin/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/structure/bedsheetbin/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(user.incapacitated())
return
if(amount >= 1)
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 5da04a6686..043232e9e3 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -37,12 +37,13 @@
var/lock_in_use = FALSE //Someone is doing some stuff with the lock here, better not proceed further
var/eigen_teleport = FALSE //If the closet leads to Mr Tumnus.
var/obj/structure/closet/eigen_target //Where you go to.
-
+ var/should_populate_contents = TRUE
/obj/structure/closet/Initialize(mapload)
. = ..()
update_icon()
- PopulateContents()
+ if(should_populate_contents)
+ PopulateContents()
if(mapload && !opened) // if closed, any item at the crate's loc is put in the contents
addtimer(CALLBACK(src, .proc/take_contents), 0)
if(secure)
@@ -458,10 +459,7 @@
return
container_resist(user)
-/obj/structure/closet/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/structure/closet/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(user.lying && get_dist(src, user) > 0)
return
@@ -506,8 +504,6 @@
if(opened)
return
if(ismovable(loc))
- user.changeNext_move(CLICK_CD_BREAKOUT)
- user.last_special = world.time + CLICK_CD_BREAKOUT
var/atom/movable/AM = loc
AM.relay_container_resist(user, src)
return
@@ -516,8 +512,6 @@
return
//okay, so the closet is either welded or locked... resist!!!
- user.changeNext_move(CLICK_CD_BREAKOUT)
- user.last_special = world.time + CLICK_CD_BREAKOUT
user.visible_message("[src] begins to shake violently!", \
"You lean on the back of [src] and start pushing the door open... (this will take about [DisplayTimeText(breakout_time)].)", \
"You hear banging from [src].")
diff --git a/code/game/objects/structures/crates_lockers/closets/genpop.dm b/code/game/objects/structures/crates_lockers/closets/genpop.dm
index 2b263bb1ed..7be12a4819 100644
--- a/code/game/objects/structures/crates_lockers/closets/genpop.dm
+++ b/code/game/objects/structures/crates_lockers/closets/genpop.dm
@@ -91,7 +91,7 @@
locked = TRUE
return ..()
-/obj/structure/closet/secure_closet/genpop/attack_hand(mob/user)
+/obj/structure/closet/secure_closet/genpop/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(user.lying && get_dist(src, user) > 0)
return
@@ -114,4 +114,4 @@
return
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm
index 57520f6f40..0c314d988c 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm
@@ -6,8 +6,16 @@
max_integrity = 250
armor = list("melee" = 30, "bullet" = 50, "laser" = 50, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80)
secure = TRUE
+ var/melee_min_damage = 20
/obj/structure/closet/secure_closet/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir)
- if(damage_flag == "melee" && damage_amount < 20)
+ if(damage_flag == "melee" && damage_amount < melee_min_damage)
return 0
- . = ..()
\ No newline at end of file
+ . = ..()
+
+// Exists to work around the minimum 700 cr price for goodies / small items
+/obj/structure/closet/secure_closet/goodies
+ icon_state = "goodies"
+ desc = "A sturdier card-locked storage unit used for bulky shipments."
+ max_integrity = 500 // Same as crates.
+ melee_min_damage = 25 // Idem.
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 9f4da351fa..ad7680f2f9 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -273,8 +273,8 @@
icon_state = "tac"
/obj/structure/closet/secure_closet/lethalshots/PopulateContents()
..()
- new /obj/item/twohanded/electrostaff(src)
- new /obj/item/twohanded/electrostaff(src)
+ new /obj/item/electrostaff(src)
+ new /obj/item/electrostaff(src)
for(var/i in 1 to 3)
new /obj/item/storage/box/lethalshot(src)
diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm
index 2c977a34d6..ee202f9504 100644
--- a/code/game/objects/structures/crates_lockers/crates.dm
+++ b/code/game/objects/structures/crates_lockers/crates.dm
@@ -41,10 +41,8 @@
if(manifest)
. += "manifest"
-/obj/structure/closet/crate/attack_hand(mob/user)
+/obj/structure/closet/crate/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
- if(.)
- return
if(manifest)
tear_manifest(user)
@@ -144,6 +142,9 @@
desc = "A freezer containing packs of blood."
icon_state = "surgery"
+/obj/structure/closet/crate/freezer/blood/fake
+ should_populate_contents = FALSE
+
/obj/structure/closet/crate/freezer/blood/PopulateContents()
. = ..()
new /obj/item/reagent_containers/blood(src)
@@ -164,6 +165,9 @@
name = "surplus prosthetic limbs"
desc = "A crate containing an assortment of cheap prosthetic limbs."
+/obj/structure/closet/crate/freezer/surplus_limbs/fake
+ should_populate_contents = FALSE
+
/obj/structure/closet/crate/freezer/surplus_limbs/PopulateContents()
. = ..()
new /obj/item/bodypart/l_arm/robot/surplus(src)
@@ -198,6 +202,9 @@
name = "\improper RCD crate"
icon_state = "engi_crate"
+/obj/structure/closet/crate/rcd/fake
+ should_populate_contents = FALSE
+
/obj/structure/closet/crate/rcd/PopulateContents()
..()
for(var/i in 1 to 4)
diff --git a/code/game/objects/structures/crates_lockers/crates/large.dm b/code/game/objects/structures/crates_lockers/crates/large.dm
index 880460a23c..3cee96e435 100644
--- a/code/game/objects/structures/crates_lockers/crates/large.dm
+++ b/code/game/objects/structures/crates_lockers/crates/large.dm
@@ -8,7 +8,7 @@
delivery_icon = "deliverybox"
integrity_failure = 0 //Makes the crate break when integrity reaches 0, instead of opening and becoming an invisible sprite.
-/obj/structure/closet/crate/large/attack_hand(mob/user)
+/obj/structure/closet/crate/large/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
add_fingerprint(user)
if(manifest)
tear_manifest(user)
@@ -40,4 +40,4 @@
else
to_chat(user, "You need a crowbar to pry this open!")
return FALSE //Just stop. Do nothing. Don't turn into an invisible sprite. Don't open like a locker.
- //The large crate has no non-attack interactions other than the crowbar, anyway.
\ No newline at end of file
+ //The large crate has no non-attack interactions other than the crowbar, anyway.
diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm
index c332a07edf..f0384ca96a 100644
--- a/code/game/objects/structures/displaycase.dm
+++ b/code/game/objects/structures/displaycase.dm
@@ -9,6 +9,8 @@
armor = list("melee" = 30, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 100)
max_integrity = 200
integrity_failure = 0.25
+ attack_hand_speed = CLICK_CD_MELEE
+ attack_hand_is_action = TRUE
var/obj/item/showpiece = null
var/alert = TRUE
var/open = FALSE
@@ -157,11 +159,7 @@
/obj/structure/displaycase/attack_paw(mob/user)
return attack_hand(user)
-/obj/structure/displaycase/attack_hand(mob/user)
- . = ..()
- if(.)
- return
- user.changeNext_move(CLICK_CD_MELEE)
+/obj/structure/displaycase/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if (showpiece && (broken || open))
to_chat(user, "You deactivate the hover field built into the case.")
log_combat(user, src, "deactivates the hover field of")
diff --git a/code/game/objects/structures/divine.dm b/code/game/objects/structures/divine.dm
index bca96e67d1..f64397df09 100644
--- a/code/game/objects/structures/divine.dm
+++ b/code/game/objects/structures/divine.dm
@@ -7,7 +7,7 @@
density = FALSE
can_buckle = 1
-/obj/structure/sacrificealtar/attack_hand(mob/living/user)
+/obj/structure/sacrificealtar/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
@@ -30,7 +30,7 @@
var/time_between_uses = 1800
var/last_process = 0
-/obj/structure/healingfountain/attack_hand(mob/living/user)
+/obj/structure/healingfountain/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
@@ -48,4 +48,4 @@
if(last_process + time_between_uses > world.time)
icon_state = "fountain"
else
- icon_state = "fountain-red"
\ No newline at end of file
+ icon_state = "fountain-red"
diff --git a/code/game/objects/structures/dresser.dm b/code/game/objects/structures/dresser.dm
index 528153324d..7fdec9b3d9 100644
--- a/code/game/objects/structures/dresser.dm
+++ b/code/game/objects/structures/dresser.dm
@@ -19,7 +19,7 @@
new /obj/item/stack/sheet/mineral/wood(drop_location(), 10)
qdel(src)
-/obj/structure/dresser/attack_hand(mob/user)
+/obj/structure/dresser/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(. || !ishuman(user) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
return
@@ -46,7 +46,7 @@
switch(choice)
if("Underwear")
var/new_undies = input(H, "Select your underwear", "Changing") as null|anything in GLOB.underwear_list
- if(H.underwear)
+ if(new_undies)
H.underwear = new_undies
H.saved_underwear = new_undies
var/datum/sprite_accessory/underwear/bottom/B = GLOB.underwear_list[new_undies]
diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm
index 3bc84deb4d..84926ccfb0 100644
--- a/code/game/objects/structures/extinguisher.dm
+++ b/code/game/objects/structures/extinguisher.dm
@@ -69,10 +69,7 @@
return ..()
-/obj/structure/extinguisher_cabinet/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/structure/extinguisher_cabinet/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(iscyborg(user) || isalien(user))
return
if(stored_extinguisher)
diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm
index 679a755321..b654f4f5c0 100644
--- a/code/game/objects/structures/false_walls.dm
+++ b/code/game/objects/structures/false_walls.dm
@@ -41,7 +41,7 @@
new /obj/structure/falsewall/brass(loc)
qdel(src)
-/obj/structure/falsewall/attack_hand(mob/user)
+/obj/structure/falsewall/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(opening)
return
. = ..()
@@ -180,7 +180,7 @@
radiate()
return ..()
-/obj/structure/falsewall/uranium/attack_hand(mob/user)
+/obj/structure/falsewall/uranium/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
radiate()
. = ..()
diff --git a/code/game/objects/structures/femur_breaker.dm b/code/game/objects/structures/femur_breaker.dm
index 7331285161..2ac56ec4fb 100644
--- a/code/game/objects/structures/femur_breaker.dm
+++ b/code/game/objects/structures/femur_breaker.dm
@@ -32,7 +32,7 @@
if (LAZYLEN(buckled_mobs))
. += "Someone appears to be strapped in. You can help them unbuckle, or activate the femur breaker."
-/obj/structure/femur_breaker/attack_hand(mob/user)
+/obj/structure/femur_breaker/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
add_fingerprint(user)
// Currently being used
diff --git a/code/game/objects/structures/fence.dm b/code/game/objects/structures/fence.dm
index 35891fa607..f90161f587 100644
--- a/code/game/objects/structures/fence.dm
+++ b/code/game/objects/structures/fence.dm
@@ -120,7 +120,7 @@
open = TRUE
density = TRUE
-/obj/structure/fence/door/attack_hand(mob/user)
+/obj/structure/fence/door/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(can_open(user))
toggle(user)
@@ -156,4 +156,4 @@
#undef NO_HOLE
#undef MEDIUM_HOLE
#undef LARGE_HOLE
-#undef MAX_HOLE_SIZE
\ No newline at end of file
+#undef MAX_HOLE_SIZE
diff --git a/code/game/objects/structures/fireaxe.dm b/code/game/objects/structures/fireaxe.dm
index f4c1dd5ab9..412730910f 100644
--- a/code/game/objects/structures/fireaxe.dm
+++ b/code/game/objects/structures/fireaxe.dm
@@ -11,7 +11,7 @@
integrity_failure = 0.33
var/locked = TRUE
var/open = FALSE
- var/obj/item/twohanded/fireaxe/fireaxe
+ var/obj/item/fireaxe/fireaxe
/obj/structure/fireaxecabinet/Initialize()
. = ..()
@@ -50,8 +50,8 @@
obj_integrity = max_integrity
update_icon()
else if(open || broken)
- if(istype(I, /obj/item/twohanded/fireaxe) && !fireaxe)
- var/obj/item/twohanded/fireaxe/F = I
+ if(istype(I, /obj/item/fireaxe) && !fireaxe)
+ var/obj/item/fireaxe/F = I
if(F.wielded)
to_chat(user, "Unwield the [F.name] first.")
return
@@ -105,10 +105,7 @@
fireaxe = null
qdel(src)
-/obj/structure/fireaxecabinet/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/structure/fireaxecabinet/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(open || broken)
if(fireaxe)
user.put_in_hands(fireaxe)
diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm
index c1f8af43f0..b587e57c3a 100644
--- a/code/game/objects/structures/flora.dm
+++ b/code/game/objects/structures/flora.dm
@@ -65,7 +65,7 @@
var/gift_type = /obj/item/a_gift/anything
var/list/ckeys_that_took = list()
-/obj/structure/flora/tree/pine/xmas/presents/attack_hand(mob/living/user)
+/obj/structure/flora/tree/pine/xmas/presents/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
@@ -288,7 +288,7 @@
icon_state = "fullgrass_[rand(1, 3)]"
. = ..()
-/obj/item/twohanded/required/kirbyplants
+/obj/item/kirbyplants
name = "potted plant"
icon = 'icons/obj/flora/plants.dmi'
icon_state = "plant-01"
@@ -300,24 +300,25 @@
throw_speed = 2
throw_range = 4
-/obj/item/twohanded/required/kirbyplants/Initialize()
+/obj/item/kirbyplants/ComponentInitialize()
. = ..()
AddElement(/datum/element/tactical)
addtimer(CALLBACK(src, /datum.proc/_AddElement, list(/datum/element/beauty, 500)), 0)
+ AddComponent(/datum/component/two_handed, require_twohands=TRUE, force_unwielded=10, force_wielded=10)
-/obj/item/twohanded/required/kirbyplants/random
+/obj/item/kirbyplants/random
icon = 'icons/obj/flora/_flora.dmi'
icon_state = "random_plant"
var/list/static/states
-/obj/item/twohanded/required/kirbyplants/random/Initialize()
+/obj/item/kirbyplants/random/Initialize()
. = ..()
icon = 'icons/obj/flora/plants.dmi'
if(!states)
generate_states()
icon_state = pick(states)
-/obj/item/twohanded/required/kirbyplants/random/proc/generate_states()
+/obj/item/kirbyplants/random/proc/generate_states()
states = list()
for(var/i in 1 to 25)
var/number
@@ -329,12 +330,12 @@
states += "applebush"
-/obj/item/twohanded/required/kirbyplants/dead
+/obj/item/kirbyplants/dead
name = "RD's potted plant"
desc = "A gift from the botanical staff, presented after the RD's reassignment. There's a tag on it that says \"Y'all come back now, y'hear?\"\nIt doesn't look very healthy..."
icon_state = "plant-25"
-/obj/item/twohanded/required/kirbyplants/photosynthetic
+/obj/item/kirbyplants/photosynthetic
name = "photosynthetic potted plant"
desc = "A bioluminescent plant."
icon_state = "plant-09"
diff --git a/code/game/objects/structures/fluff.dm b/code/game/objects/structures/fluff.dm
index 736e58143e..bd7ddb36d5 100644
--- a/code/game/objects/structures/fluff.dm
+++ b/code/game/objects/structures/fluff.dm
@@ -110,7 +110,7 @@
desc = "Space Jesus is my copilot."
icon_state = "driverseat"
-/obj/structure/fluff/bus/passable/seat/driver/attack_hand(mob/user)
+/obj/structure/fluff/bus/passable/seat/driver/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
playsound(src, 'sound/items/carhorn.ogg', 50, 1)
. = ..()
diff --git a/code/game/objects/structures/fugitive_role_spawners.dm b/code/game/objects/structures/fugitive_role_spawners.dm
new file mode 100644
index 0000000000..afdff7afec
--- /dev/null
+++ b/code/game/objects/structures/fugitive_role_spawners.dm
@@ -0,0 +1,66 @@
+
+
+/obj/effect/mob_spawn/human/fugitive
+ assignedrole = "Fugitive Hunter"
+ flavour_text = "" //the flavor text will be the backstory argument called on the antagonist's greet, see hunter.dm for details
+ roundstart = FALSE
+ death = FALSE
+ random = TRUE
+ show_flavour = FALSE
+ density = TRUE
+ var/back_story = "error"
+
+/obj/effect/mob_spawn/human/fugitive/Initialize(mapload)
+ . = ..()
+ notify_ghosts("Hunters are waking up looking for refugees!", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_FUGITIVE)
+
+/obj/effect/mob_spawn/human/fugitive/special(mob/living/new_spawn)
+ var/datum/antagonist/fugitive_hunter/fughunter = new
+ fughunter.backstory = back_story
+ new_spawn.mind.add_antag_datum(fughunter)
+ fughunter.greet()
+ message_admins("[ADMIN_LOOKUPFLW(new_spawn)] has been made into a Fugitive Hunter by an event.")
+ log_game("[key_name(new_spawn)] was spawned as a Fugitive Hunter by an event.")
+
+/obj/effect/mob_spawn/human/fugitive/spacepol
+ name = "police pod"
+ desc = "A small sleeper typically used to put people to sleep for briefing on the mission."
+ mob_name = "a spacepol officer"
+ flavour_text = "Justice has arrived. I am a member of the Spacepol!"
+ back_story = "space cop"
+ outfit = /datum/outfit/spacepol
+ icon = 'icons/obj/machines/sleeper.dmi'
+ icon_state = "sleeper"
+
+/obj/effect/mob_spawn/human/fugitive/russian
+ name = "russian pod"
+ flavour_text = "Ay blyat. I am a space-russian smuggler! We were mid-flight when our cargo was beamed off our ship!"
+ back_story = "russian"
+ desc = "A small sleeper typically used to make long distance travel a bit more bearable."
+ mob_name = "russian"
+ outfit = /datum/outfit/russiancorpse/hunter
+ icon = 'icons/obj/machines/sleeper.dmi'
+ icon_state = "sleeper"
+
+/obj/effect/mob_spawn/human/fugitive/bounty
+ name = "bounty hunter pod"
+ flavour_text = "We got a new bounty on some fugitives, dead or alive."
+ back_story = "bounty hunters"
+ desc = "A small sleeper typically used to make long distance travel a bit more bearable."
+ mob_name = "bounty hunter"
+ icon = 'icons/obj/machines/sleeper.dmi'
+ icon_state = "sleeper"
+
+/obj/effect/mob_spawn/human/fugitive/bounty/Destroy()
+ var/obj/structure/fluff/empty_sleeper/S = new(drop_location())
+ S.setDir(dir)
+ return ..()
+
+/obj/effect/mob_spawn/human/fugitive/bounty/armor
+ outfit = /datum/outfit/bountyarmor
+
+/obj/effect/mob_spawn/human/fugitive/bounty/hook
+ outfit = /datum/outfit/bountyhook
+
+/obj/effect/mob_spawn/human/fugitive/bounty/synth
+ outfit = /datum/outfit/bountysynth
diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm
index 4455c8820d..4d500837d9 100644
--- a/code/game/objects/structures/ghost_role_spawners.dm
+++ b/code/game/objects/structures/ghost_role_spawners.dm
@@ -186,10 +186,7 @@
else
new_spawn.mind.assigned_role = "Free Golem"
-/obj/effect/mob_spawn/human/golem/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/effect/mob_spawn/human/golem/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(isgolem(user) && can_transfer)
var/transfer_choice = alert("Transfer your soul to [src]? (Warning, your old body will die!)",,"Yes","No")
if(transfer_choice != "Yes" || QDELETED(src) || uses <= 0 || !user.canUseTopic(src, BE_CLOSE, NO_DEXTERY, NO_TK))
diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm
index cacf361722..ff62b9cc48 100644
--- a/code/game/objects/structures/girders.dm
+++ b/code/game/objects/structures/girders.dm
@@ -170,7 +170,7 @@
qdel(src)
return
- if(S.sheettype && S.sheettype != "runed")
+ if(S.sheettype != "runed")
var/M = S.sheettype
if(state == GIRDER_DISPLACED)
var/F = text2path("/obj/structure/falsewall/[M]")
@@ -188,9 +188,13 @@
transfer_fingerprints_to(FW)
qdel(src)
else
- var/F = text2path("/turf/closed/wall/mineral/[M]")
+ var/list/material_list
+ var/F = S.walltype
if(!F)
- return
+ F = /turf/closed/wall/material
+ if(S.material_type)
+ material_list = list()
+ material_list[SSmaterials.GetMaterialRef(S.material_type)] = MINERAL_MATERIAL_AMOUNT * 2
if(S.get_amount() < 2)
to_chat(user, "You need at least two sheets to add plating!")
return
@@ -201,7 +205,9 @@
S.use(2)
to_chat(user, "You add the plating.")
var/turf/T = get_turf(src)
- T.PlaceOnTop(F)
+ var/turf/newturf = T.PlaceOnTop(F)
+ if(material_list)
+ newturf.set_custom_materials(material_list)
transfer_fingerprints_to(T)
qdel(src)
return
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index 20151a0bdb..36e4f825da 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -10,6 +10,8 @@
layer = BELOW_OBJ_LAYER
armor = list("melee" = 50, "bullet" = 70, "laser" = 70, "energy" = 100, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 0, "acid" = 0)
max_integrity = 50
+ attack_hand_is_action = TRUE
+ attack_hand_speed = 8
integrity_failure = 0.4
var/rods_type = /obj/item/stack/rods
var/rods_amount = 2
@@ -99,11 +101,10 @@
..(user, 1)
return TRUE
-/obj/structure/grille/attack_hand(mob/living/user)
+/obj/structure/grille/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
- user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src, ATTACK_EFFECT_KICK)
user.visible_message("[user] hits [src].", null, null, COMBAT_MESSAGE_RANGE)
log_combat(user, src, "hit")
@@ -111,8 +112,9 @@
take_damage(rand(5,10), BRUTE, "melee", 1)
/obj/structure/grille/attack_alien(mob/living/user)
+ if(!user.CheckActionCooldown(CLICK_CD_MELEE))
+ return
user.do_attack_animation(src)
- user.changeNext_move(CLICK_CD_MELEE)
user.visible_message("[user] mangles [src].", null, null, COMBAT_MESSAGE_RANGE)
if(!shock(user, 70))
take_damage(20, BRUTE, "melee", 1)
@@ -134,7 +136,7 @@
. = . || (mover.pass_flags & PASSGRILLE)
/obj/structure/grille/attackby(obj/item/W, mob/user, params)
- user.changeNext_move(CLICK_CD_MELEE)
+ user.DelayNextAction(CLICK_CD_MELEE)
add_fingerprint(user)
if(istype(W, /obj/item/wirecutters))
if(!shock(user, 100))
diff --git a/code/game/objects/structures/guillotine.dm b/code/game/objects/structures/guillotine.dm
index 0a5ba6a68c..4773c07657 100644
--- a/code/game/objects/structures/guillotine.dm
+++ b/code/game/objects/structures/guillotine.dm
@@ -51,7 +51,7 @@
if (LAZYLEN(buckled_mobs))
. += "Someone appears to be strapped in. You can help them out, or you can harm them by activating the guillotine."
-/obj/structure/guillotine/attack_hand(mob/user)
+/obj/structure/guillotine/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
add_fingerprint(user)
// Currently being used by something
@@ -108,7 +108,7 @@
if (QDELETED(head))
return
- playsound(src, 'sound/weapons/bladeslice.ogg', 100, 1)
+ playsound(src, 'sound/weapons/guillotine.ogg', 100, TRUE)
if (blade_sharpness >= GUILLOTINE_DECAP_MIN_SHARP || head.brute_dam >= 100)
head.dismember()
log_combat(user, H, "beheaded", src)
@@ -256,4 +256,4 @@
#undef GUILLOTINE_ACTIVATE_DELAY
#undef GUILLOTINE_WRENCH_DELAY
#undef GUILLOTINE_ACTION_INUSE
-#undef GUILLOTINE_ACTION_WRENCH
\ No newline at end of file
+#undef GUILLOTINE_ACTION_WRENCH
diff --git a/code/game/objects/structures/guncase.dm b/code/game/objects/structures/guncase.dm
index ede7e31e0d..e7ff9d4abf 100644
--- a/code/game/objects/structures/guncase.dm
+++ b/code/game/objects/structures/guncase.dm
@@ -53,10 +53,7 @@
else
return ..()
-/obj/structure/guncase/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/structure/guncase/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(iscyborg(user) || isalien(user))
return
if(contents.len && open)
diff --git a/code/game/objects/structures/headpike.dm b/code/game/objects/structures/headpike.dm
index 581ce850de..6aed11701d 100644
--- a/code/game/objects/structures/headpike.dm
+++ b/code/game/objects/structures/headpike.dm
@@ -6,7 +6,7 @@
density = FALSE
anchored = TRUE
var/bonespear = FALSE
- var/obj/item/twohanded/spear/spear
+ var/obj/item/spear/spear
var/obj/item/bodypart/head/victim
/obj/structure/headpike/bone //for bone spears
@@ -20,9 +20,9 @@
name = "[victim.name] on a spear"
update_icon()
if(bonespear)
- spear = locate(/obj/item/twohanded/bonespear) in parts_list
+ spear = locate(/obj/item/spear/bonespear) in parts_list
else
- spear = locate(/obj/item/twohanded/spear) in parts_list
+ spear = locate(/obj/item/spear) in parts_list
/obj/structure/headpike/Initialize()
. = ..()
@@ -37,14 +37,11 @@
MA.pixel_y = 12
. += H
-/obj/structure/headpike/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/structure/headpike/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
to_chat(user, "You take down [src].")
if(victim)
victim.forceMove(drop_location())
victim = null
spear.forceMove(drop_location())
spear = null
- qdel(src)
\ No newline at end of file
+ qdel(src)
diff --git a/code/game/objects/structures/holosign.dm b/code/game/objects/structures/holosign.dm
index 7ac3aba246..dc5355e9d8 100644
--- a/code/game/objects/structures/holosign.dm
+++ b/code/game/objects/structures/holosign.dm
@@ -25,12 +25,12 @@
projector = null
return ..()
-/obj/structure/holosign/attack_hand(mob/living/user)
+/obj/structure/holosign/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
user.do_attack_animation(src, ATTACK_EFFECT_PUNCH)
- user.changeNext_move(CLICK_CD_MELEE)
+ user.DelayNextAction(CLICK_CD_MELEE)
take_damage(5 , BRUTE, "melee", 1)
/obj/structure/holosign/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
@@ -94,7 +94,7 @@
alpha = 150
resistance_flags = FIRE_PROOF
-/obj/structure/holosign/barrier/firelock/blocksTemperature()
+/obj/structure/holosign/barrier/firelock/BlockSuperconductivity()
return TRUE
/obj/structure/holosign/barrier/combifan
@@ -110,7 +110,7 @@
CanAtmosPass = ATMOS_PASS_NO
resistance_flags = FIRE_PROOF
-/obj/structure/holosign/barrier/combifan/blocksTemperature()
+/obj/structure/holosign/barrier/combifan/BlockSuperconductivity()
return TRUE
/obj/structure/holosign/barrier/combifan/Initialize()
@@ -162,7 +162,7 @@
return TRUE //nice or benign diseases!
return TRUE
-/obj/structure/holosign/barrier/medical/attack_hand(mob/living/user)
+/obj/structure/holosign/barrier/medical/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
if(CanPass(user) && user.a_intent == INTENT_HELP)
force_allaccess = !force_allaccess
to_chat(user, "You [force_allaccess ? "deactivate" : "activate"] the biometric scanners.") //warning spans because you can make the station sick!
@@ -182,7 +182,7 @@
/obj/structure/holosign/barrier/cyborg/hacked/proc/cooldown()
shockcd = FALSE
-/obj/structure/holosign/barrier/cyborg/hacked/attack_hand(mob/living/user)
+/obj/structure/holosign/barrier/cyborg/hacked/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm
index 38133d9089..10a9f2afd4 100644
--- a/code/game/objects/structures/janicart.dm
+++ b/code/game/objects/structures/janicart.dm
@@ -8,7 +8,7 @@
//copypaste sorry
var/obj/item/storage/bag/trash/mybag
var/obj/item/mop/mymop
- var/obj/item/twohanded/broom/mybroom
+ var/obj/item/broom/mybroom
var/obj/item/reagent_containers/spray/cleaner/myspray
var/obj/item/lightreplacer/myreplacer
var/signs = 0
@@ -48,9 +48,9 @@
m.janicart_insert(user, src)
else
to_chat(user, fail_msg)
- else if(istype(I, /obj/item/twohanded/broom))
+ else if(istype(I, /obj/item/broom))
if(!mybroom)
- var/obj/item/twohanded/broom/b=I
+ var/obj/item/broom/b=I
b.janicart_insert(user,src)
else
to_chat(user, fail_msg)
@@ -91,10 +91,7 @@
else
return ..()
-/obj/structure/janitorialcart/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/structure/janitorialcart/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
var/list/items = list()
if(mybag)
diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm
index 05a7e1c958..a23dd3a21e 100644
--- a/code/game/objects/structures/kitchen_spike.dm
+++ b/code/game/objects/structures/kitchen_spike.dm
@@ -60,8 +60,7 @@
deconstruct(TRUE)
return TRUE
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/structure/kitchenspike/attack_hand(mob/user)
+/obj/structure/kitchenspike/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(VIABLE_MOB_CHECK(user.pulling) && user.a_intent == INTENT_GRAB && !has_buckled_mobs())
var/mob/living/L = user.pulling
if(HAS_TRAIT(user, TRAIT_PACIFISM) && L.stat != DEAD)
diff --git a/code/game/objects/structures/ladders.dm b/code/game/objects/structures/ladders.dm
index f321498bfd..e844461952 100644
--- a/code/game/objects/structures/ladders.dm
+++ b/code/game/objects/structures/ladders.dm
@@ -122,10 +122,7 @@
return FALSE
return TRUE
-/obj/structure/ladder/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/structure/ladder/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
use(user)
/obj/structure/ladder/attack_paw(mob/user)
diff --git a/code/game/objects/structures/life_candle.dm b/code/game/objects/structures/life_candle.dm
index a64dc6c6a9..52986a44d7 100644
--- a/code/game/objects/structures/life_candle.dm
+++ b/code/game/objects/structures/life_candle.dm
@@ -24,10 +24,7 @@
var/respawn_time = 50
var/respawn_sound = 'sound/magic/staff_animation.ogg'
-/obj/structure/life_candle/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/structure/life_candle/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(!user.mind)
return
if(user.mind in linked_minds)
@@ -38,7 +35,7 @@
linked_minds |= user.mind
update_icon()
- float(linked_minds.len)
+ INVOKE_ASYNC(src, /atom/movable.proc/float, linked_minds.len)
if(linked_minds.len)
START_PROCESSING(SSobj, src)
set_light(lit_luminosity)
diff --git a/code/game/objects/structures/manned_turret.dm b/code/game/objects/structures/manned_turret.dm
index 79489e4ae6..e8fbafa42b 100644
--- a/code/game/objects/structures/manned_turret.dm
+++ b/code/game/objects/structures/manned_turret.dm
@@ -198,10 +198,6 @@
/obj/item/gun_control/CanItemAutoclick()
return TRUE
-/obj/item/gun_control/attack_obj(obj/O, mob/living/user)
- user.changeNext_move(CLICK_CD_MELEE)
- O.attacked_by(src, user)
-
/obj/item/gun_control/attack(mob/living/M, mob/living/user)
M.lastattacker = user.real_name
M.lastattackerckey = user.ckey
diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm
index f52fa0576a..b2f1de8750 100644
--- a/code/game/objects/structures/mineral_doors.dm
+++ b/code/game/objects/structures/mineral_doors.dm
@@ -50,10 +50,7 @@
/obj/structure/mineral_door/attack_paw(mob/user)
return attack_hand(user)
-/obj/structure/mineral_door/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/structure/mineral_door/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
return TryToSwitchState(user)
/obj/structure/mineral_door/CanPass(atom/movable/mover, turf/target)
diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm
index 65e1b7dd9a..237cfdbf0b 100644
--- a/code/game/objects/structures/mirror.dm
+++ b/code/game/objects/structures/mirror.dm
@@ -15,10 +15,7 @@
if(icon_state == "mirror_broke" && !broken)
obj_break(null, mapload)
-/obj/structure/mirror/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/structure/mirror/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(broken || !Adjacent(user))
return
@@ -118,10 +115,7 @@
choosable_races += S.id
..()
-/obj/structure/mirror/magic/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/structure/mirror/magic/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(!ishuman(user))
return
diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm
index 79a7ce0519..82ca59161c 100644
--- a/code/game/objects/structures/morgue.dm
+++ b/code/game/objects/structures/morgue.dm
@@ -22,7 +22,8 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an
anchored = TRUE
max_integrity = 400
- var/obj/structure/tray/connected = null
+ var/obj/structure/tray/connected
+ var/starting_tray
var/locked = FALSE
dir = SOUTH
var/message_cooldown
@@ -30,6 +31,9 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an
/obj/structure/bodycontainer/Initialize()
. = ..()
+ if(starting_tray)
+ connected = new starting_tray(src)
+ connected.connected = src
GLOB.bodycontainers += src
recursive_organ_check(src)
@@ -37,8 +41,7 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an
GLOB.bodycontainers -= src
open()
if(connected)
- qdel(connected)
- connected = null
+ QDEL_NULL(connected)
return ..()
/obj/structure/bodycontainer/on_log(login)
@@ -58,10 +61,7 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an
/obj/structure/bodycontainer/attack_paw(mob/user)
return attack_hand(user)
-/obj/structure/bodycontainer/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/structure/bodycontainer/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(locked)
to_chat(user, "It's locked.")
return
@@ -106,8 +106,6 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an
if(!locked)
open()
return
- user.changeNext_move(CLICK_CD_BREAKOUT)
- user.last_special = world.time + CLICK_CD_BREAKOUT
user.visible_message(null, \
"You lean on the back of [src] and start pushing the tray open... (this will take about [DisplayTimeText(breakout_time)].)", \
"You hear a metallic creaking from [src].")
@@ -150,15 +148,11 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an
desc = "Used to keep bodies in until someone fetches them. Now includes a high-tech alert system."
icon_state = "morgue1"
dir = EAST
+ starting_tray = /obj/structure/tray/m_tray
var/beeper = TRUE
var/beep_cooldown = 50
var/next_beep = 0
-/obj/structure/bodycontainer/morgue/New()
- connected = new/obj/structure/tray/m_tray(src)
- connected.connected = src
- ..()
-
/obj/structure/bodycontainer/morgue/examine(mob/user)
. = ..()
. += "The speaker is [beeper ? "enabled" : "disabled"]. Alt-click to toggle it."
@@ -208,6 +202,7 @@ GLOBAL_LIST_EMPTY(crematoriums)
desc = "A human incinerator. Works well on barbecue nights."
icon_state = "crema1"
dir = SOUTH
+ starting_tray = /obj/structure/tray/c_tray
var/id = 1
/obj/structure/bodycontainer/crematorium/attack_robot(mob/user) //Borgs can't use crematoriums without help
@@ -218,14 +213,14 @@ GLOBAL_LIST_EMPTY(crematoriums)
GLOB.crematoriums.Remove(src)
return ..()
-/obj/structure/bodycontainer/crematorium/New()
- connected = new/obj/structure/tray/c_tray(src)
- connected.connected = src
-
+/obj/structure/bodycontainer/crematorium/Initialize()
+ . = ..()
GLOB.crematoriums.Add(src)
- ..()
-/obj/structure/bodycontainer/crematorium/update_icon_state()
+/obj/structure/bodycontainer/crematorium/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE)
+ id = "[idnum][id]"
+
+/obj/structure/bodycontainer/crematorium/update_icon()
if(!connected || connected.loc != src)
icon_state = "crema0"
else
@@ -322,10 +317,7 @@ GLOBAL_LIST_EMPTY(crematoriums)
/obj/structure/tray/attack_paw(mob/user)
return attack_hand(user)
-/obj/structure/tray/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/structure/tray/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if (src.connected)
connected.close()
add_fingerprint(user)
diff --git a/code/game/objects/structures/spirit_board.dm b/code/game/objects/structures/spirit_board.dm
index 4a9a1bdce6..1b3093e4e7 100644
--- a/code/game/objects/structures/spirit_board.dm
+++ b/code/game/objects/structures/spirit_board.dm
@@ -14,10 +14,7 @@
desc = "[initial(desc)] The planchette is sitting at \"[planchette]\"."
return ..()
-/obj/structure/spirit_board/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/structure/spirit_board/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
spirit_board_pick_letter(user)
@@ -76,4 +73,4 @@
to_chat(M, "There aren't enough people to use the [src.name]!")
return 0
- return 1
\ No newline at end of file
+ return 1
diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm
index 466912f93e..f8b54d04b6 100644
--- a/code/game/objects/structures/statues.dm
+++ b/code/game/objects/structures/statues.dm
@@ -74,7 +74,7 @@
radiate()
..()
-/obj/structure/statue/uranium/attack_hand(mob/user)
+/obj/structure/statue/uranium/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
radiate()
. = ..()
@@ -240,7 +240,7 @@
honk()
return ..()
-/obj/structure/statue/bananium/attack_hand(mob/user)
+/obj/structure/statue/bananium/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
honk()
. = ..()
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index 012d92e103..a553e63b0f 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -23,6 +23,8 @@
climbable = TRUE
obj_flags = CAN_BE_HIT|SHOVABLE_ONTO
pass_flags = LETPASSTHROW //You can throw objects over this, despite it's density.")
+ attack_hand_speed = CLICK_CD_MELEE
+ attack_hand_is_action = TRUE
var/frame = /obj/structure/table_frame
var/framestack = /obj/item/stack/rods
var/buildstack = /obj/item/stack/sheet/metal
@@ -60,7 +62,7 @@
/obj/structure/table/attack_paw(mob/user)
return attack_hand(user)
-/obj/structure/table/attack_hand(mob/living/user)
+/obj/structure/table/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
if(Adjacent(user) && user.pulling)
if(isliving(user.pulling))
var/mob/living/pushed_mob = user.pulling
@@ -71,7 +73,10 @@
if(user.grab_state < GRAB_AGGRESSIVE)
to_chat(user, "You need a better grip to do that!")
return
- tablepush(user, pushed_mob)
+ if(user.grab_state >= GRAB_NECK)
+ tablelimbsmash(user, pushed_mob)
+ else
+ tablepush(user, pushed_mob)
if(user.a_intent == INTENT_HELP)
pushed_mob.visible_message("[user] begins to place [pushed_mob] onto [src]...", \
"[user] begins to place [pushed_mob] onto [src]...")
@@ -134,8 +139,26 @@
if(!ishuman(pushed_mob))
return
var/mob/living/carbon/human/H = pushed_mob
+ if(iscatperson(H))
+ H.emote("nya")
SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "table", /datum/mood_event/table)
+/obj/structure/table/proc/tablelimbsmash(mob/living/user, mob/living/pushed_mob)
+ pushed_mob.Knockdown(30)
+ var/obj/item/bodypart/banged_limb = pushed_mob.get_bodypart(user.zone_selected) || pushed_mob.get_bodypart(BODY_ZONE_HEAD)
+ var/extra_wound = 0
+ if(HAS_TRAIT(user, TRAIT_HULK))
+ extra_wound = 20
+ banged_limb.receive_damage(30, wound_bonus = extra_wound)
+ pushed_mob.apply_damage(60, STAMINA)
+ take_damage(50)
+
+ playsound(pushed_mob, 'sound/effects/bang.ogg', 90, TRUE)
+ pushed_mob.visible_message("[user] smashes [pushed_mob]'s [banged_limb.name] against \the [src]!",
+ "[user] smashes your [banged_limb.name] against \the [src]")
+ log_combat(user, pushed_mob, "head slammed", null, "against [src]")
+ SEND_SIGNAL(pushed_mob, COMSIG_ADD_MOOD_EVENT, "table", /datum/mood_event/table_limbsmash, banged_limb)
+
/obj/structure/table/shove_act(mob/living/target, mob/living/user)
if(CHECK_MOBILITY(target, MOBILITY_STAND))
target.DefaultCombatKnockdown(SHOVE_KNOCKDOWN_TABLE)
@@ -189,8 +212,10 @@
return
/obj/structure/table/alt_attack_hand(mob/user)
+ if(!user.CheckActionCooldown(CLICK_CD_MELEE))
+ return
+ user.DelayNextAction()
if(user && Adjacent(user) && !user.incapacitated())
- user.changeNext_move(CLICK_CD_MELEE*0.5)
if(istype(user) && user.a_intent == INTENT_HARM)
user.visible_message("[user] slams [user.p_their()] palms down on [src].", "You slam your palms down on [src].")
playsound(src, 'sound/weapons/sonic_jackhammer.ogg', 50, 1)
@@ -218,7 +243,7 @@
/obj/structure/table/greyscale
icon = 'icons/obj/smooth_structures/table_greyscale.dmi'
icon_state = "table"
- material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS | MATERIAL_EFFECTS
+ material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS
buildstack = null //No buildstack, so generate from mat datums
///Table on wheels
@@ -551,7 +576,7 @@
change_construction_value(-2)
return ..()
-/obj/structure/table/reinforced/brass/tablepush(mob/living/user, mob/living/pushed_mob)
+/obj/structure/table/reinforced/brass/tablelimbsmash(mob/living/user, mob/living/pushed_mob)
.= ..()
playsound(src, 'sound/magic/clockwork/fellowship_armory.ogg', 50, TRUE)
@@ -575,7 +600,7 @@
buildstack = /obj/item/stack/tile/bronze
canSmoothWith = list(/obj/structure/table/reinforced/brass, /obj/structure/table/bronze)
-/obj/structure/table/bronze/tablepush(mob/living/user, mob/living/pushed_mob)
+/obj/structure/table/bronze/tablelimbsmash(mob/living/user, mob/living/pushed_mob)
..()
playsound(src, 'sound/magic/clockwork/fellowship_armory.ogg', 50, TRUE)
@@ -604,7 +629,7 @@
computer.table = src
break
-/obj/structure/table/optable/tablepush(mob/living/user, mob/living/pushed_mob)
+/obj/structure/table/optable/tablelimbsmash(mob/living/user, mob/living/pushed_mob)
pushed_mob.forceMove(loc)
pushed_mob.set_resting(TRUE, TRUE)
visible_message("[user] has laid [pushed_mob] on [src].")
@@ -633,6 +658,8 @@
anchored = TRUE
pass_flags = LETPASSTHROW //You can throw objects over this, despite it's density.
max_integrity = 20
+ attack_hand_speed = CLICK_CD_MELEE
+ attack_hand_is_action = TRUE
/obj/structure/rack/examine(mob/user)
. = ..()
@@ -674,13 +701,12 @@
/obj/structure/rack/attack_paw(mob/living/user)
attack_hand(user)
-/obj/structure/rack/attack_hand(mob/living/user)
+/obj/structure/rack/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
if(CHECK_MULTIPLE_BITFIELDS(user.mobility_flags, MOBILITY_STAND|MOBILITY_MOVE) || user.get_num_legs() < 2)
return
- user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src, ATTACK_EFFECT_KICK)
user.visible_message("[user] kicks [src].", null, null, COMBAT_MESSAGE_RANGE)
take_damage(rand(4,8), BRUTE, "melee", 1)
diff --git a/code/game/objects/structures/tank_dispenser.dm b/code/game/objects/structures/tank_dispenser.dm
index 6a8175b921..e2298ac6c5 100644
--- a/code/game/objects/structures/tank_dispenser.dm
+++ b/code/game/objects/structures/tank_dispenser.dm
@@ -71,9 +71,12 @@
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.physical_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
- ui = new(user, src, ui_key, "tank_dispenser", name, 275, 103, master_ui, state)
+ ui = new(user, src, ui_key, "TankDispenser", name, 275, 103, master_ui, state)
ui.open()
+/obj/structure/tank_dispenser/attack_robot(mob/user)
+ ui_interact(user)
+
/obj/structure/tank_dispenser/ui_data(mob/user)
var/list/data = list()
data["oxygen"] = oxygentanks
diff --git a/code/game/objects/structures/target_stake.dm b/code/game/objects/structures/target_stake.dm
index 9dcfec43bf..c5f3a089f7 100644
--- a/code/game/objects/structures/target_stake.dm
+++ b/code/game/objects/structures/target_stake.dm
@@ -48,10 +48,7 @@
handle_density()
to_chat(user, "You slide the target into the stake.")
-/obj/structure/target_stake/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/structure/target_stake/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(pinned_target)
removeTarget(user)
diff --git a/code/game/objects/structures/transit_tubes/station.dm b/code/game/objects/structures/transit_tubes/station.dm
index c3b388fc29..3a5eb135f4 100644
--- a/code/game/objects/structures/transit_tubes/station.dm
+++ b/code/game/objects/structures/transit_tubes/station.dm
@@ -58,10 +58,7 @@
qdel(R)
-/obj/structure/transit_tube/station/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/structure/transit_tube/station/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(!pod_moving)
if(user.pulling && user.a_intent == INTENT_GRAB && isliving(user.pulling))
if(open_status == STATION_TUBE_OPEN)
@@ -152,8 +149,8 @@
pod_moving = 0
if(!QDELETED(pod))
var/datum/gas_mixture/floor_mixture = loc.return_air()
- ARCHIVE(floor_mixture)
- ARCHIVE(pod.air_contents)
+ floor_mixture.archive()
+ pod.air_contents.archive()
pod.air_contents.share(floor_mixture, 1) //mix the pod's gas mixture with the tile it's on
air_update_turf()
diff --git a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm
index 04f113a0c8..cf68341b2c 100644
--- a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm
+++ b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm
@@ -10,9 +10,9 @@
/obj/structure/transit_tube_pod/Initialize()
. = ..()
- air_contents.gases[/datum/gas/oxygen] = MOLES_O2STANDARD
- air_contents.gases[/datum/gas/nitrogen] = MOLES_N2STANDARD
- air_contents.temperature = T20C
+ air_contents.set_moles(/datum/gas/oxygen, MOLES_O2STANDARD)
+ air_contents.set_moles(/datum/gas/nitrogen, MOLES_N2STANDARD)
+ air_contents.set_temperature(T20C)
/obj/structure/transit_tube_pod/Destroy()
@@ -69,8 +69,6 @@
empty_pod()
return
if(!moving)
- user.changeNext_move(CLICK_CD_BREAKOUT)
- user.last_special = world.time + CLICK_CD_BREAKOUT
to_chat(user, "You start trying to escape from the pod...")
if(do_after(user, 600, target = src))
to_chat(user, "You manage to open the pod.")
@@ -181,4 +179,4 @@
return
/obj/structure/transit_tube_pod/return_temperature()
- return air_contents.temperature
+ return air_contents.return_temperature()
diff --git a/code/game/objects/structures/traps.dm b/code/game/objects/structures/traps.dm
index 8044bb9bb7..4c8379d14f 100644
--- a/code/game/objects/structures/traps.dm
+++ b/code/game/objects/structures/traps.dm
@@ -80,10 +80,11 @@
name = "shock trap"
desc = "A trap that will shock and render you immobile. You'd better avoid it."
icon_state = "trap-shock"
+ var/stun_time = 100
/obj/structure/trap/stun/trap_effect(mob/living/L)
L.electrocute_act(30, src, flags = SHOCK_NOGLOVES) // electrocute act does a message.
- L.DefaultCombatKnockdown(100)
+ L.Paralyze(stun_time)
/obj/structure/trap/fire
name = "flame trap"
@@ -151,3 +152,75 @@
new /mob/living/simple_animal/hostile/construct/proteon/hostile(loc)
new /mob/living/simple_animal/hostile/construct/proteon/hostile(loc)
QDEL_IN(src, 30)
+
+//fugitive traps
+/obj/structure/trap/stun/hunter
+ name = "bounty trap"
+ desc = "A trap that only goes off when a fugitive steps on it, announcing the location and stunning the target. You'd better avoid it."
+ icon = 'icons/obj/objects.dmi'
+ icon_state = "bounty_trap_on"
+ stun_time = 200
+ var/obj/item/bountytrap/stored_item
+ var/caught = FALSE
+
+/obj/structure/trap/stun/hunter/Initialize(mapload)
+ . = ..()
+ time_between_triggers = 10
+
+/obj/structure/trap/stun/hunter/Crossed(atom/movable/AM)
+ if(isliving(AM))
+ var/mob/living/L = AM
+ if(!L.mind?.has_antag_datum(/datum/antagonist/fugitive))
+ return
+ caught = TRUE
+ . = ..()
+
+/obj/structure/trap/stun/hunter/flare()
+ ..()
+ stored_item.forceMove(get_turf(src))
+ forceMove(stored_item)
+ if(caught)
+ stored_item.announce_fugitive()
+ caught = FALSE
+
+/obj/item/bountytrap
+ name = "bounty trap"
+ desc = "A trap that only goes off when a fugitive steps on it, announcing the location and stunning the target. It's currently inactive."
+ icon = 'icons/obj/objects.dmi'
+ icon_state = "bounty_trap_off"
+ var/obj/structure/trap/stun/hunter/stored_trap
+ var/obj/item/radio/radio
+ var/datum/effect_system/spark_spread/spark_system
+
+/obj/item/bountytrap/Initialize(mapload)
+ . = ..()
+ radio = new(src)
+ radio.subspace_transmission = TRUE
+ radio.canhear_range = 0
+ radio.recalculateChannels()
+ spark_system = new
+ spark_system.set_up(4,1,src)
+ spark_system.attach(src)
+ name = "[name] #[rand(1, 999)]"
+ stored_trap = new(src)
+ stored_trap.name = name
+ stored_trap.stored_item = src
+
+/obj/item/bountytrap/proc/announce_fugitive()
+ spark_system.start()
+ playsound(src, 'sound/machines/ding.ogg', 50, TRUE)
+ radio.talk_into(src, "Fugitive has triggered this trap in the [get_area_name(src)]!", RADIO_CHANNEL_COMMON)
+
+/obj/item/bountytrap/attack_self(mob/living/user)
+ var/turf/T = get_turf(src)
+ if(!user || !user.transferItemToLoc(src, T))//visibly unequips
+ return
+ to_chat(user, "You set up [src]. Examine while close to disarm it.")
+ stored_trap.forceMove(T)//moves trap to ground
+ forceMove(stored_trap)//moves item into trap
+
+/obj/item/bountytrap/Destroy()
+ qdel(stored_trap)
+ QDEL_NULL(radio)
+ QDEL_NULL(spark_system)
+ . = ..()
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index 5eecc6962a..c52249686a 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -13,6 +13,8 @@
var/mob/living/swirlie = null //the mob being given a swirlie
var/buildstacktype = /obj/item/stack/sheet/metal //they're metal now, shut up
var/buildstackamount = 1
+ attack_hand_speed = CLICK_CD_MELEE
+ attack_hand_is_action = TRUE
/obj/structure/toilet/Initialize()
. = ..()
@@ -26,18 +28,16 @@
AM.forceMove(loc)
return ..()
-/obj/structure/toilet/attack_hand(mob/living/user)
+/obj/structure/toilet/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
if(swirlie)
- user.changeNext_move(CLICK_CD_MELEE)
playsound(src.loc, "swing_hit", 25, 1)
swirlie.visible_message("[user] slams the toilet seat onto [swirlie]'s head!", "[user] slams the toilet seat onto your head!", "You hear reverberating porcelain.")
swirlie.adjustBruteLoss(5)
else if(user.pulling && user.a_intent == INTENT_GRAB && isliving(user.pulling))
- user.changeNext_move(CLICK_CD_MELEE)
var/mob/living/GM = user.pulling
if(user.grab_state >= GRAB_AGGRESSIVE)
if(GM.loc != get_turf(src))
@@ -157,7 +157,6 @@
secret_type = /obj/effect/spawner/lootdrop/prison_loot_toilet
/obj/structure/toilet/greyscale
-
material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR
buildstacktype = null
@@ -168,6 +167,8 @@
icon_state = "urinal"
density = FALSE
anchored = TRUE
+ attack_hand_speed = CLICK_CD_MELEE
+ attack_hand_is_action = TRUE
var/exposed = 0 // can you currently put an item inside
var/obj/item/hiddenitem = null // what's in the urinal
@@ -175,17 +176,13 @@
..()
hiddenitem = new /obj/item/reagent_containers/food/urinalcake
-/obj/structure/urinal/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/structure/urinal/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(user.pulling && user.a_intent == INTENT_GRAB && isliving(user.pulling))
var/mob/living/GM = user.pulling
if(user.grab_state >= GRAB_AGGRESSIVE)
if(GM.loc != get_turf(src))
to_chat(user, "[GM.name] needs to be on [src].")
return
- user.changeNext_move(CLICK_CD_MELEE)
user.visible_message("[user] slams [GM] into [src]!", "You slam [GM] into [src]!")
GM.adjustBruteLoss(8)
else
@@ -493,7 +490,7 @@
var/buildstacktype = /obj/item/stack/sheet/metal
var/buildstackamount = 1
-/obj/structure/sink/attack_hand(mob/living/user)
+/obj/structure/sink/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
@@ -582,6 +579,12 @@
G.use(1)
return
+ if(istype(O, /obj/item/stack/ore/glass))
+ new /obj/item/stack/sheet/sandblock(loc)
+ to_chat(user, "You wet the sand in the sink and form it into a block.")
+ O.use(1)
+ return
+
if(!istype(O))
return
if(O.item_flags & ABSTRACT) //Abstract items like grabs won't wash. No-drop items will though because it's still technically an item in your hand.
@@ -673,7 +676,7 @@
if(steps == 4 && istype(S, /obj/item/stack/sheet/mineral/wood))
if(S.use(3))
steps = 5
- desc = "A dug out well, A dug out well with out rope. Just add some cloth!"
+ desc = "A dug out well, A dug out well without rope. Just add some cloth!"
icon_state = "well_4"
return TRUE
else
@@ -702,13 +705,7 @@
icon_state = "puddle"
resistance_flags = UNACIDABLE
-/obj/structure/sink/greyscale
- icon_state = "sink_greyscale"
- material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR
- buildstacktype = null
-
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/structure/sink/puddle/attack_hand(mob/M)
+/obj/structure/sink/puddle/on_attack_hand(mob/M)
icon_state = "puddle-splash"
. = ..()
icon_state = "puddle"
@@ -722,6 +719,7 @@
qdel(src)
/obj/structure/sink/greyscale
+ icon_state = "sink_greyscale"
material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR
buildstacktype = null
@@ -783,10 +781,7 @@
return TRUE
-/obj/structure/curtain/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/structure/curtain/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
playsound(loc, 'sound/effects/curtain.ogg', 50, 1)
toggle()
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index ba7c0d2fbe..6aae4955f1 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -38,6 +38,10 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup)
var/hitsound = 'sound/effects/Glasshit.ogg'
rad_insulation = RAD_VERY_LIGHT_INSULATION
rad_flags = RAD_PROTECT_CONTENTS
+ flags_ricochet = RICOCHET_HARD
+ ricochet_chance_mod = 0.4
+ attack_hand_speed = CLICK_CD_MELEE
+ attack_hand_is_action = TRUE
/// Electrochromatic status
var/electrochromatic_status = NOT_ELECTROCHROMATIC
@@ -155,7 +159,7 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup)
return 1
/obj/structure/window/attack_tk(mob/user)
- user.changeNext_move(CLICK_CD_MELEE)
+ user.DelayNextAction(CLICK_CD_MELEE)
user.visible_message("Something knocks on [src].")
add_fingerprint(user)
playsound(src, 'sound/effects/Glassknock.ogg', 50, 1)
@@ -165,18 +169,15 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup)
return 1
. = ..()
-/obj/structure/window/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/structure/window/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(!can_be_reached(user))
return
- user.changeNext_move(CLICK_CD_MELEE)
user.visible_message("[user] knocks on [src].")
add_fingerprint(user)
playsound(src, 'sound/effects/Glassknock.ogg', 50, 1)
/obj/structure/window/attack_paw(mob/user)
+ user.DelayNextAction()
return attack_hand(user)
/obj/structure/window/attack_generic(mob/user, damage_amount = 0, damage_type = BRUTE, damage_flag = 0, sound_effect = 1) //used by attack_alien, attack_animal, and attack_slime
@@ -269,29 +270,27 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup)
air_update_turf(TRUE)
update_nearby_icons()
-/obj/structure/window/proc/spraycan_paint(paint_color)
- if(color_hex2num(paint_color) < 255)
- set_opacity(255)
- else
- set_opacity(initial(opacity))
- add_atom_colour(paint_color, WASHABLE_COLOUR_PRIORITY)
-
/obj/structure/window/proc/electrochromatic_dim()
if(electrochromatic_status == ELECTROCHROMATIC_DIMMED)
return
electrochromatic_status = ELECTROCHROMATIC_DIMMED
- animate(src, color = "#222222", time = 2)
- set_opacity(TRUE)
+ var/current = color
+ add_atom_colour("#222222", FIXED_COLOUR_PRIORITY)
+ var/newcolor = color
+ if(color != current)
+ color = current
+ animate(src, color = newcolor, time = 2)
/obj/structure/window/proc/electrochromatic_off()
if(electrochromatic_status == ELECTROCHROMATIC_OFF)
return
electrochromatic_status = ELECTROCHROMATIC_OFF
var/current = color
- update_atom_colour()
+ remove_atom_colour(FIXED_COLOUR_PRIORITY, "#222222")
var/newcolor = color
- color = current
- animate(src, color = newcolor, time = 2)
+ if(color != current)
+ color = current
+ animate(src, color = newcolor, time = 2)
/obj/structure/window/proc/remove_electrochromatic()
electrochromatic_off()
@@ -346,11 +345,9 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup)
GLOB.electrochromatic_window_lookup[electrochromatic_id] |= src
/obj/structure/window/update_atom_colour()
- if((electrochromatic_status != ELECTROCHROMATIC_OFF) && (electrochromatic_status != ELECTROCHROMATIC_DIMMED))
- return FALSE
. = ..()
- if(color && (color_hex2num(color) < 255))
- set_opacity(255)
+ if(electrochromatic_status == ELECTROCHROMATIC_DIMMED || (color && (color_hex2num(color) < 255)))
+ set_opacity(TRUE)
else
set_opacity(FALSE)
@@ -525,6 +522,7 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup)
explosion_block = 1
glass_type = /obj/item/stack/sheet/rglass
rad_insulation = RAD_HEAVY_INSULATION
+ ricochet_chance_mod = 0.8
/obj/structure/window/reinforced/spawner/east
dir = EAST
@@ -690,6 +688,7 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup)
level = 3
glass_type = /obj/item/stack/sheet/titaniumglass
glass_amount = 2
+ ricochet_chance_mod = 0.9
/obj/structure/window/shuttle/narsie_act()
add_atom_colour("#3C3434", FIXED_COLOUR_PRIORITY)
@@ -836,13 +835,9 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup)
for (var/i in 1 to rand(1,4))
. += new /obj/item/paper/natural(location)
-/obj/structure/window/paperframe/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/structure/window/paperframe/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
add_fingerprint(user)
if(user.a_intent != INTENT_HARM)
- user.changeNext_move(CLICK_CD_MELEE)
user.visible_message("[user] knocks on [src].")
playsound(src, "pageturn", 50, 1)
else
diff --git a/code/game/say.dm b/code/game/say.dm
index 187994f432..a5691ad11f 100644
--- a/code/game/say.dm
+++ b/code/game/say.dm
@@ -59,7 +59,7 @@ GLOBAL_LIST_INIT(freqtospan, list(
var/endspanpart = ""
//Message
- var/messagepart = " [lang_treat(speaker, message_language, raw_message, spans, message_mode)]"
+ var/messagepart = " [say_emphasis(lang_treat(speaker, message_language, raw_message, spans, message_mode))]"
var/languageicon = ""
var/datum/language/D = GLOB.language_datum_instances[message_language]
@@ -96,8 +96,22 @@ GLOBAL_LIST_INIT(freqtospan, list(
return "[say_mod(input, message_mode)][spanned ? ", \"[spanned]\"" : ""]"
// Citadel edit [spanned ? ", \"[spanned]\"" : ""]"
+#define ENCODE_HTML_EPHASIS(input, char, html, varname) \
+ var/static/regex/##varname = regex("[char]{2}(.+?)[char]{2}", "g");\
+ input = varname.Replace_char(input, "<[html]>$1[html]>")
+
+/atom/movable/proc/say_emphasis(input)
+ ENCODE_HTML_EPHASIS(input, "\\|", "i", italics)
+ ENCODE_HTML_EPHASIS(input, "\\+", "b", bold)
+ ENCODE_HTML_EPHASIS(input, "_", "u", underline)
+ return input
+
+#undef ENCODE_HTML_EPHASIS
+
/// Quirky citadel proc for our custom sayverbs to strip the verb out. Snowflakey as hell, say rewrite 3.0 when?
/atom/movable/proc/quoteless_say_quote(input, list/spans = list(speech_span), message_mode)
+ if((input[1] == "!") && (length_char(input) > 1))
+ return ""
var/pos = findtext(input, "*")
return pos? copytext(input, pos + 1) : input
@@ -132,6 +146,8 @@ GLOBAL_LIST_INIT(freqtospan, list(
return "[copytext_char("[freq]", 1, 4)].[copytext_char("[freq]", 4, 5)]"
/atom/movable/proc/attach_spans(input, list/spans)
+ if((input[1] == "!") && (length(input) > 2))
+ return
var/customsayverb = findtext(input, "*")
if(customsayverb)
input = capitalize(copytext(input, customsayverb + length(input[customsayverb])))
diff --git a/code/game/turfs/change_turf.dm b/code/game/turfs/change_turf.dm
index 38e0839617..66e7ebd424 100644
--- a/code/game/turfs/change_turf.dm
+++ b/code/game/turfs/change_turf.dm
@@ -148,6 +148,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list(
. = ..()
if (!.) // changeturf failed or didn't do anything
QDEL_NULL(stashed_air)
+ update_air_ref()
return
var/turf/open/newTurf = .
newTurf.air.copy_from(stashed_air)
@@ -308,24 +309,14 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list(
return
var/datum/gas_mixture/total = new//Holders to assimilate air from nearby turfs
- var/list/total_gases = total.gases
for(var/T in atmos_adjacent_turfs)
var/turf/open/S = T
if(!S.air)
continue
- var/list/S_gases = S.air.gases
- for(var/id in S_gases)
- total_gases[id] += S_gases[id]
- total.temperature += S.air.temperature
+ total.merge(S.air)
- air.copy_from(total)
-
- var/list/air_gases = air.gases
- for(var/id in air_gases)
- air_gases[id] /= turf_count //Averages contents of the turfs, ignoring walls and the like
-
- air.temperature /= turf_count
+ air.copy_from(total.remove_ratio(1/turf_count))
SSair.add_to_active(src)
/turf/proc/ReplaceWithLattice()
diff --git a/code/game/turfs/closed.dm b/code/game/turfs/closed.dm
index 24af2ed5bd..b78826b23b 100644
--- a/code/game/turfs/closed.dm
+++ b/code/game/turfs/closed.dm
@@ -7,9 +7,14 @@
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
rad_insulation = RAD_MEDIUM_INSULATION
+/turf/closed/Initialize()
+ . = ..()
+ update_air_ref()
+
/turf/closed/AfterChange()
. = ..()
SSair.high_pressure_delta -= src
+ update_air_ref()
/turf/closed/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir)
return FALSE
@@ -78,7 +83,7 @@
. = ..()
if(.)
switch(var_name)
- if("icon")
+ if(NAMEOF(src, icon))
SStitle.icon = icon
/turf/closed/indestructible/riveted
@@ -87,6 +92,11 @@
smooth = SMOOTH_TRUE
explosion_block = INFINITY
+/turf/closed/indestructible/syndicate
+ icon = 'icons/turf/walls/plastitanium_wall.dmi'
+ icon_state = "map-shuttle"
+ smooth = SMOOTH_TRUE
+
/turf/closed/indestructible/riveted/uranium
icon = 'icons/turf/walls/uranium_wall.dmi'
icon_state = "uranium"
diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm
index b81c5be44c..6552e29246 100644
--- a/code/game/turfs/open.dm
+++ b/code/game/turfs/open.dm
@@ -199,7 +199,7 @@
flash_color(L, flash_color = "#C80000", flash_time = 10)
/turf/open/Initalize_Atmos(times_fired)
- excited = 0
+ set_excited(FALSE)
update_visuals()
current_cycle = times_fired
@@ -207,19 +207,19 @@
for(var/i in atmos_adjacent_turfs)
var/turf/open/enemy_tile = i
var/datum/gas_mixture/enemy_air = enemy_tile.return_air()
- if(!excited && air.compare(enemy_air))
+ if(!get_excited() && air.compare(enemy_air))
//testing("Active turf found. Return value of compare(): [is_active]")
- excited = TRUE
+ set_excited(TRUE)
SSair.active_turfs |= src
/turf/open/proc/GetHeatCapacity()
. = air.heat_capacity()
/turf/open/proc/GetTemperature()
- . = air.temperature
+ . = air.return_temperature()
/turf/open/proc/TakeTemperature(temp)
- air.temperature += temp
+ air.set_temperature(air.return_temperature() + temp)
air_update_turf()
/turf/open/proc/freon_gas_act()
@@ -304,9 +304,8 @@
/turf/open/rad_act(pulse_strength)
. = ..()
- if (air.gases[/datum/gas/carbon_dioxide] && air.gases[/datum/gas/oxygen])
- pulse_strength = min(pulse_strength,air.gases[/datum/gas/carbon_dioxide]*1000,air.gases[/datum/gas/oxygen]*2000) //Ensures matter is conserved properly
- air.gases[/datum/gas/carbon_dioxide]=max(air.gases[/datum/gas/carbon_dioxide]-(pulse_strength/1000),0)
- air.gases[/datum/gas/oxygen]=max(air.gases[/datum/gas/oxygen]-(pulse_strength/2000),0)
- air.gases[/datum/gas/pluoxium]+=(pulse_strength/4000)
- GAS_GARBAGE_COLLECT(air.gases)
+ if (air.get_moles(/datum/gas/carbon_dioxide) && air.get_moles(/datum/gas/oxygen))
+ pulse_strength = min(pulse_strength,air.get_moles(/datum/gas/carbon_dioxide)*1000,air.get_moles(/datum/gas/oxygen)*2000) //Ensures matter is conserved properly
+ air.set_moles(/datum/gas/carbon_dioxide, max(air.get_moles(/datum/gas/carbon_dioxide)-(pulse_strength/1000),0))
+ air.set_moles(/datum/gas/oxygen, max(air.get_moles(/datum/gas/oxygen)-(pulse_strength/2000),0))
+ air.adjust_moles(/datum/gas/pluoxium, pulse_strength/4000)
diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm
index 9f5ce679f9..758f824727 100644
--- a/code/game/turfs/simulated/floor.dm
+++ b/code/game/turfs/simulated/floor.dm
@@ -162,7 +162,7 @@
return 0
/turf/open/floor/crowbar_act(mob/living/user, obj/item/I)
- return intact ? pry_tile(I, user) : FALSE
+ return intact ? FORCE_BOOLEAN(pry_tile(I, user)) : FALSE
/turf/open/floor/proc/try_replace_tile(obj/item/stack/tile/T, mob/user, params)
if(T.turf_type == type)
@@ -189,9 +189,12 @@
if(user && !silent)
to_chat(user, "You remove the floor tile.")
if(floor_tile && make_tile)
- new floor_tile(src)
+ spawn_tile()
return make_plating()
+/turf/open/floor/proc/spawn_tile()
+ new floor_tile(src)
+
/turf/open/floor/singularity_pull(S, current_size)
. = ..()
switch(current_size)
@@ -205,7 +208,7 @@
if(floor_tile)
if(prob(70))
remove_tile()
- else if(prob(50))
+ else if(prob(50) && (/turf/open/space in baseturfs))
ReplaceWithLattice()
/turf/open/floor/narsie_act(force, ignore_mobs, probability = 20)
@@ -293,3 +296,13 @@
return TRUE
return FALSE
+
+/turf/open/floor/material
+ name = "floor"
+ icon_state = "materialfloor"
+ material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS
+
+/turf/open/floor/material/spawn_tile()
+ for(var/i in custom_materials)
+ var/datum/material/M = i
+ new M.sheet_type(src, FLOOR(custom_materials[M] / MINERAL_MATERIAL_AMOUNT, 1))
diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm
index 2f4e2e0eee..f940761ff8 100644
--- a/code/game/turfs/simulated/floor/fancy_floor.dm
+++ b/code/game/turfs/simulated/floor/fancy_floor.dm
@@ -157,7 +157,7 @@
planetary_atmos = TRUE
floor_tile = null
initial_gas_mix = FROZEN_ATMOS
- slowdown = 1.5 //So digging it out paths are usefull.
+ slowdown = 1.5 //So digging it out paths are useful.
bullet_sizzle = TRUE
footstep = FOOTSTEP_SAND
barefootstep = FOOTSTEP_SAND
diff --git a/code/game/turfs/simulated/floor/light_floor.dm b/code/game/turfs/simulated/floor/light_floor.dm
index f9376c0672..4bca25f96c 100644
--- a/code/game/turfs/simulated/floor/light_floor.dm
+++ b/code/game/turfs/simulated/floor/light_floor.dm
@@ -52,10 +52,7 @@
set_light(0)
return ..()
-/turf/open/floor/light/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/turf/open/floor/light/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(!can_modify_colour)
return
if(!on)
diff --git a/code/game/turfs/simulated/floor/mineral_floor.dm b/code/game/turfs/simulated/floor/mineral_floor.dm
index f0ac0053ce..8e0230a2b0 100644
--- a/code/game/turfs/simulated/floor/mineral_floor.dm
+++ b/code/game/turfs/simulated/floor/mineral_floor.dm
@@ -149,7 +149,7 @@
if(!.)
honk()
-/turf/open/floor/mineral/bananium/attack_hand(mob/user)
+/turf/open/floor/mineral/bananium/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
.=..()
if(!.)
honk()
@@ -202,7 +202,7 @@
if(!.)
radiate()
-/turf/open/floor/mineral/uranium/attack_hand(mob/user)
+/turf/open/floor/mineral/uranium/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
.=..()
if(!.)
radiate()
diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm
index 8e0eace9cd..ac80bddd00 100644
--- a/code/game/turfs/simulated/floor/plating.dm
+++ b/code/game/turfs/simulated/floor/plating.dm
@@ -76,11 +76,15 @@
var/obj/item/stack/tile/W = C
if(!W.use(1))
return
- var/turf/open/floor/T = PlaceOnTop(W.turf_type, flags = CHANGETURF_INHERIT_AIR)
- if(istype(W, /obj/item/stack/tile/light)) //TODO: get rid of this ugly check somehow
- var/obj/item/stack/tile/light/L = W
- var/turf/open/floor/light/F = T
- F.state = L.state
+ if(istype(W, /obj/item/stack/tile/material))
+ var/turf/newturf = PlaceOnTop(/turf/open/floor/material, flags = CHANGETURF_INHERIT_AIR)
+ newturf.set_custom_materials(W.custom_materials)
+ else if(W.turf_type)
+ var/turf/open/floor/T = PlaceOnTop(W.turf_type, flags = CHANGETURF_INHERIT_AIR)
+ if(istype(W, /obj/item/stack/tile/light)) //TODO: get rid of this ugly check somehow
+ var/obj/item/stack/tile/light/L = W
+ var/turf/open/floor/light/F = T
+ F.state = L.state
playsound(src, 'sound/weapons/genhit.ogg', 50, 1)
else
to_chat(user, "This section is too damaged to support a tile! Use a welder to fix the damage.")
@@ -120,7 +124,7 @@
ChangeTurf(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR)
else
playsound(src, 'sound/weapons/tap.ogg', 100, TRUE) //The attack sound is muffled by the foam itself
- user.changeNext_move(CLICK_CD_MELEE)
+ user.DelayNextAction(CLICK_CD_MELEE)
user.do_attack_animation(src)
if(prob(I.force * 20 - 25))
user.visible_message("[user] smashes through [src]!", \
diff --git a/code/game/turfs/simulated/floor/reinf_floor.dm b/code/game/turfs/simulated/floor/reinf_floor.dm
index 7816341a0a..03045674e4 100644
--- a/code/game/turfs/simulated/floor/reinf_floor.dm
+++ b/code/game/turfs/simulated/floor/reinf_floor.dm
@@ -89,10 +89,7 @@
/turf/open/floor/engine/attack_paw(mob/user)
return attack_hand(user)
-/turf/open/floor/engine/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/turf/open/floor/engine/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
user.Move_Pulled(src)
//air filled floors; used in atmos pressure chambers
diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm
index 048394b942..0f1ec6fa85 100644
--- a/code/game/turfs/simulated/minerals.dm
+++ b/code/game/turfs/simulated/minerals.dm
@@ -803,7 +803,7 @@
stage = GIBTONITE_DETONATE
explosion(bombturf,1,2,5, adminlog = 0)
if(stage == GIBTONITE_STABLE) //Gibtonite deposit is now benign and extractable. Depending on how close you were to it blowing up before defusing, you get better quality ore.
- var/obj/item/twohanded/required/gibtonite/G = new (src)
+ var/obj/item/gibtonite/G = new (src)
if(det_time <= 0)
G.quality = 3
G.icon_state = "Gibtonite ore 3"
diff --git a/code/game/turfs/simulated/wall/material_walls.dm b/code/game/turfs/simulated/wall/material_walls.dm
new file mode 100644
index 0000000000..d3952609e0
--- /dev/null
+++ b/code/game/turfs/simulated/wall/material_walls.dm
@@ -0,0 +1,22 @@
+/turf/closed/wall/material
+ name = "wall"
+ desc = "A huge chunk of material used to separate rooms."
+ icon = 'icons/turf/walls/materialwall.dmi'
+ icon_state = "wall"
+ canSmoothWith = list(/turf/closed/wall/material)
+ smooth = SMOOTH_TRUE
+ material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS
+
+/turf/closed/wall/material/break_wall()
+ for(var/i in custom_materials)
+ var/datum/material/M = i
+ new M.sheet_type(src, FLOOR(custom_materials[M] / MINERAL_MATERIAL_AMOUNT, 1))
+ return new girder_type(src)
+
+/turf/closed/wall/material/devastate_wall()
+ for(var/i in custom_materials)
+ var/datum/material/M = i
+ new M.sheet_type(src, FLOOR(custom_materials[M] / MINERAL_MATERIAL_AMOUNT, 1))
+
+/turf/closed/wall/material/mat_update_desc(mat)
+ desc = "A huge chunk of [mat] used to separate rooms."
diff --git a/code/game/turfs/simulated/wall/mineral_walls.dm b/code/game/turfs/simulated/wall/mineral_walls.dm
index 5c74eb4ecc..4466511acd 100644
--- a/code/game/turfs/simulated/wall/mineral_walls.dm
+++ b/code/game/turfs/simulated/wall/mineral_walls.dm
@@ -72,7 +72,7 @@
return
return
-/turf/closed/wall/mineral/uranium/attack_hand(mob/user)
+/turf/closed/wall/mineral/uranium/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
radiate()
. = ..()
@@ -136,7 +136,7 @@
/turf/closed/wall/mineral/wood/attackby(obj/item/W, mob/user)
if(W.sharpness && W.force)
var/duration = (48/W.force) * 2 //In seconds, for now.
- if(istype(W, /obj/item/hatchet) || istype(W, /obj/item/twohanded/fireaxe))
+ if(istype(W, /obj/item/hatchet) || istype(W, /obj/item/fireaxe))
duration /= 4 //Much better with hatchets and axes.
var/src_type = type
if(do_after(user, duration*10, target=src) && type == src_type) //Into deciseconds.
diff --git a/code/game/turfs/simulated/wall/reinf_walls.dm b/code/game/turfs/simulated/wall/reinf_walls.dm
index a1d2c1757c..6b41f41763 100644
--- a/code/game/turfs/simulated/wall/reinf_walls.dm
+++ b/code/game/turfs/simulated/wall/reinf_walls.dm
@@ -36,7 +36,8 @@
new /obj/item/stack/sheet/metal(src, 2)
/turf/closed/wall/r_wall/attack_animal(mob/living/simple_animal/M)
- M.changeNext_move(CLICK_CD_MELEE)
+ if(!M.CheckActionCooldown())
+ return
M.do_attack_animation(src)
if(!M.environment_smash)
return
@@ -46,6 +47,7 @@
else
playsound(src, 'sound/effects/bang.ogg', 50, 1)
to_chat(M, "This wall is far too strong for you to destroy.")
+ M.DelayNextAction()
/turf/closed/wall/r_wall/try_destroy(obj/item/I, mob/user, turf/T)
if(istype(I, /obj/item/pickaxe/drill/jackhammer))
diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm
index da5d3c643d..37248f814c 100644
--- a/code/game/turfs/simulated/walls.dm
+++ b/code/game/turfs/simulated/walls.dm
@@ -9,6 +9,8 @@
thermal_conductivity = WALL_HEAT_TRANSFER_COEFFICIENT
heat_capacity = 312500 //a little over 5 cm thick , 312500 for 1 m by 2.5 m by 0.25 m plasteel wall
+ attack_hand_speed = 8
+ attack_hand_is_action = TRUE
baseturfs = /turf/open/floor/plating
@@ -41,17 +43,6 @@
/turf/closed/wall/attack_tk()
return
-/turf/closed/wall/handle_projectile_ricochet(obj/item/projectile/P) //A huge pile of shitcode!
- var/turf/p_turf = get_turf(P)
- var/face_direction = get_dir(src, p_turf)
- var/face_angle = dir2angle(face_direction)
- var/incidence_s = GET_ANGLE_OF_INCIDENCE(face_angle, (P.Angle + 180))
- if(abs(incidence_s) > 90 && abs(incidence_s) < 270)
- return FALSE
- var/new_angle_s = SIMPLIFY_DEGREES(face_angle + incidence_s)
- P.setAngle(new_angle_s)
- return TRUE
-
/turf/closed/wall/proc/dismantle_wall(devastated=0, explode=0)
if(devastated)
devastate_wall()
@@ -124,12 +115,12 @@
return FALSE
/turf/closed/wall/attack_paw(mob/living/user)
- user.changeNext_move(CLICK_CD_MELEE)
return attack_hand(user)
-
/turf/closed/wall/attack_animal(mob/living/simple_animal/M)
- M.changeNext_move(CLICK_CD_MELEE)
+ if(!M.CheckActionCooldown(CLICK_CD_MELEE))
+ return
+ M.DelayNextAction()
M.do_attack_animation(src)
if((M.environment_smash & ENVIRONMENT_SMASH_WALLS) || (M.environment_smash & ENVIRONMENT_SMASH_RWALLS))
playsound(src, 'sound/effects/meteorimpact.ogg', 100, 1)
@@ -148,17 +139,14 @@
to_chat(user, text("You punch the wall."))
return TRUE
-/turf/closed/wall/attack_hand(mob/user)
- . = ..()
- if(.)
- return
- user.changeNext_move(CLICK_CD_MELEE)
+/turf/closed/wall/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
to_chat(user, "You push the wall but nothing happens!")
playsound(src, 'sound/weapons/genhit.ogg', 25, 1)
add_fingerprint(user)
/turf/closed/wall/attackby(obj/item/W, mob/user, params)
- user.changeNext_move(CLICK_CD_MELEE)
+ if(!user.CheckActionCooldown(CLICK_CD_MELEE))
+ return
if (!user.IsAdvancedToolUser())
to_chat(user, "You don't have the dexterity to do this!")
return
@@ -167,6 +155,7 @@
if(!isturf(user.loc))
return //can't do this stuff whilst inside objects and such
+ user.DelayNextAction()
add_fingerprint(user)
var/turf/T = user.loc //get user's location for delay checks
diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm
index 26daa32107..0e028ed4af 100644
--- a/code/game/turfs/space/space.dm
+++ b/code/game/turfs/space/space.dm
@@ -27,6 +27,7 @@
/turf/open/space/Initialize()
icon_state = SPACE_ICON_STATE
air = space_gas
+ update_air_ref()
vis_contents.Cut() //removes inherited overlays
visibilityChanged()
@@ -132,10 +133,13 @@
else
to_chat(user, "The plating is going to need some support! Place metal rods first.")
-/turf/open/space/Entered(atom/movable/A)
- ..()
- if ((!(A) || src != A.loc))
- return
+/turf/open/space/Entered(atom/movable/A, atom/OldLoc)
+ . = ..()
+
+ var/turf/old = get_turf(OldLoc)
+ if(!isspaceturf(old) && ismob(A))
+ var/mob/M = A
+ M.update_gravity(M.mob_has_gravity())
if(destination_z && destination_x && destination_y && !(A.pulledby || !A.can_be_z_moved))
var/tx = destination_x
@@ -169,6 +173,12 @@
stoplag()//Let a diagonal move finish, if necessary
A.newtonian_move(A.inertia_dir)
+/turf/open/space/Exited(atom/movable/AM, atom/OldLoc)
+ . = ..()
+ var/turf/old = get_turf(OldLoc)
+ if(!isspaceturf(old) && ismob(AM))
+ var/mob/M = AM
+ M.update_gravity(M.mob_has_gravity())
/turf/open/space/MakeSlippery(wet_setting, min_wet_time, wet_time_to_add, max_wet_time, permanent)
return
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 88f6dd6962..55d945535d 100755
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -85,6 +85,9 @@
if (opacity)
has_opaque_atom = TRUE
+ // apply materials properly from the default custom_materials value
+ set_custom_materials(custom_materials)
+
ComponentInitialize()
return INITIALIZE_HINT_NORMAL
@@ -119,10 +122,7 @@
requires_activation = FALSE
..()
-/turf/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/turf/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
user.Move_Pulled(src)
/turf/proc/multiz_turf_del(turf/T, dir)
@@ -179,7 +179,7 @@
target.zImpact(A, levels, src)
return TRUE
-/turf/proc/handleRCL(obj/item/twohanded/rcl/C, mob/user)
+/turf/proc/handleRCL(obj/item/rcl/C, mob/user)
if(C.loaded)
for(var/obj/structure/cable/LC in src)
if(!LC.d1 || !LC.d2)
@@ -202,7 +202,7 @@
coil.place_turf(src, user)
return TRUE
- else if(istype(C, /obj/item/twohanded/rcl))
+ else if(istype(C, /obj/item/rcl))
handleRCL(C, user)
return FALSE
@@ -274,7 +274,7 @@
/turf/open/Entered(atom/movable/AM)
..()
//melting
- if(isobj(AM) && air && air.temperature > T0C)
+ if(isobj(AM) && air && air.return_temperature() > T0C)
var/obj/O = AM
if(O.obj_flags & FROZEN)
O.make_unfrozen()
diff --git a/code/game/world.dm b/code/game/world.dm
index 1c6f3bceba..55333fb3e6 100644
--- a/code/game/world.dm
+++ b/code/game/world.dm
@@ -9,9 +9,8 @@ GLOBAL_LIST(topic_status_cache)
//This happens after the Master subsystem new(s) (it's a global datum)
//So subsystems globals exist, but are not initialised
/world/New()
- var/extools = world.GetConfig("env", "EXTOOLS_DLL") || "./byond-extools.dll"
- if (fexists(extools))
- call(extools, "maptick_initialize")()
+ if (fexists(EXTOOLS))
+ call(EXTOOLS, "maptick_initialize")()
enable_debugger()
world.Profile(PROFILE_START)
@@ -39,6 +38,9 @@ GLOBAL_LIST(topic_status_cache)
#ifndef USE_CUSTOM_ERROR_HANDLER
world.log = file("[GLOB.log_directory]/dd.log")
+#else
+ if (TgsAvailable())
+ world.log = file("[GLOB.log_directory]/dd.log") //not all runtimes trigger world/Error, so this is the only way to ensure we can see all of them.
#endif
load_admins()
@@ -67,10 +69,6 @@ GLOBAL_LIST(topic_status_cache)
/world/proc/InitTgs()
TgsNew(new /datum/tgs_event_handler/impl, TGS_SECURITY_TRUSTED)
GLOB.revdata.load_tgs_info()
-#ifdef USE_CUSTOM_ERROR_HANDLER
- if (TgsAvailable())
- world.log = file("[GLOB.log_directory]/dd.log") //not all runtimes trigger world/Error, so this is the only way to ensure we can see all of them.
-#endif
GLOB.tgs_initialized = TRUE
/world/proc/HandleTestRun()
@@ -121,6 +119,7 @@ GLOBAL_LIST(topic_status_cache)
GLOB.world_game_log = "[GLOB.log_directory]/game.log"
GLOB.world_virus_log = "[GLOB.log_directory]/virus.log"
+ GLOB.world_asset_log = "[GLOB.log_directory]/asset.log"
GLOB.world_attack_log = "[GLOB.log_directory]/attack.log"
GLOB.world_pda_log = "[GLOB.log_directory]/pda.log"
GLOB.world_telecomms_log = "[GLOB.log_directory]/telecomms.log"
@@ -132,11 +131,13 @@ GLOBAL_LIST(topic_status_cache)
GLOB.world_runtime_log = "[GLOB.log_directory]/runtime.log"
GLOB.query_debug_log = "[GLOB.log_directory]/query_debug.log"
GLOB.world_job_debug_log = "[GLOB.log_directory]/job_debug.log"
+ GLOB.world_paper_log = "[GLOB.log_directory]/paper.log"
GLOB.tgui_log = "[GLOB.log_directory]/tgui.log"
GLOB.subsystem_log = "[GLOB.log_directory]/subsystem.log"
GLOB.reagent_log = "[GLOB.log_directory]/reagents.log"
GLOB.world_crafting_log = "[GLOB.log_directory]/crafting.log"
GLOB.click_log = "[GLOB.log_directory]/click.log"
+ GLOB.world_asset_log = "[GLOB.log_directory]/asset.log"
#ifdef UNIT_TESTS
@@ -276,6 +277,15 @@ GLOBAL_LIST(topic_status_cache)
shutdown_logging() // Past this point, no logging procs can be used, at risk of data loss.
..()
+/world/Del()
+ // memory leaks bad
+ var/num_deleted = 0
+ for(var/datum/gas_mixture/GM)
+ GM.__gasmixture_unregister()
+ num_deleted++
+ log_world("Deallocated [num_deleted] gas mixtures")
+ ..()
+
/world/proc/update_status()
var/list/features = list()
@@ -344,3 +354,6 @@ GLOBAL_LIST(topic_status_cache)
maxz++
SSmobs.MaxZChanged()
SSidlenpcpool.MaxZChanged()
+ world.refresh_atmos_grid()
+
+/world/proc/refresh_atmos_grid()
diff --git a/code/modules/NTNet/relays.dm b/code/modules/NTNet/relays.dm
index 0d855f15bb..c64e2332cc 100644
--- a/code/modules/NTNet/relays.dm
+++ b/code/modules/NTNet/relays.dm
@@ -69,7 +69,7 @@
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
- ui = new(user, src, ui_key, "ntnet_relay", "NTNet Quantum Relay", ui_x, ui_y, master_ui, state)
+ ui = new(user, src, ui_key, "NtnetRelay", "NTNet Quantum Relay", ui_x, ui_y, master_ui, state)
ui.open()
@@ -118,4 +118,4 @@
D.target = null
D.error = "Connection to quantum relay severed"
- return ..()
\ No newline at end of file
+ return ..()
diff --git a/code/modules/VR/vr_sleeper.dm b/code/modules/VR/vr_sleeper.dm
index 26ae200990..9953fe4bc5 100644
--- a/code/modules/VR/vr_sleeper.dm
+++ b/code/modules/VR/vr_sleeper.dm
@@ -71,22 +71,17 @@
/obj/machinery/vr_sleeper/update_icon_state()
icon_state = "[initial(icon_state)][state_open ? "-open" : ""]"
-/obj/machinery/vr_sleeper/open_machine()
- if(state_open)
- return
- if(occupant)
- SStgui.close_user_uis(occupant, src)
- return ..()
/obj/machinery/vr_sleeper/MouseDrop_T(mob/target, mob/user)
if(user.lying || !iscarbon(target) || !Adjacent(target) || !user.canUseTopic(src, BE_CLOSE, TRUE, NO_TK))
return
close_machine(target)
+ ui_interact(user)
-/obj/machinery/vr_sleeper/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
+/obj/machinery/vr_sleeper/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_contained_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
- ui = new(user, src, ui_key, "vr_sleeper", "VR Sleeper", 475, 340, master_ui, state)
+ ui = new(user, src, ui_key, "VrSleeper", "VR Sleeper", 475, 340, master_ui, state)
ui.open()
/obj/machinery/vr_sleeper/ui_act(action, params)
@@ -130,11 +125,13 @@
/obj/machinery/vr_sleeper/ui_data(mob/user)
var/list/data = list()
+ var/is_living
if(vr_mob && !QDELETED(vr_mob))
+ is_living = isliving(vr_mob)
data["can_delete_avatar"] = TRUE
data["vr_avatar"] = list("name" = vr_mob.name)
- data["isliving"] = istype(vr_mob)
- if(data["isliving"])
+ data["isliving"] = is_living
+ if(is_living)
var/status
switch(vr_mob.stat)
if(CONSCIOUS)
@@ -146,6 +143,11 @@
if(SOFT_CRIT)
status = "Barely Conscious"
data["vr_avatar"] += list("status" = status, "health" = vr_mob.health, "maxhealth" = vr_mob.maxHealth)
+ else
+ data["can_delete_avatar"] = FALSE
+ data["vr_avatar"] = FALSE
+ data["isliving"] = FALSE
+
data["toggle_open"] = state_open
data["emagged"] = you_die_in_the_game_you_die_for_real
data["isoccupant"] = (user == occupant)
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index a2e2b3c122..8cfae3820a 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -40,6 +40,11 @@
if(M.client)
body += " \[First Seen: [M.client.player_join_date]\]\[Byond account registered on: [M.client.account_join_date]\]"
+ body += "
CentCom Galactic Ban DB: "
+ if(CONFIG_GET(string/centcom_ban_db))
+ body += "Search"
+ else
+ body += "Disabled"
body += "
Show related accounts by: "
body += "\[ CID | "
body += "IP \]"
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 289abbe250..718f9d4246 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -62,7 +62,7 @@ GLOBAL_PROTECT(admin_verbs_admin)
/client/proc/cmd_admin_check_player_exp, /* shows players by playtime */
/client/proc/toggle_combo_hud, // toggle display of the combination pizza antag and taco sci/med/eng hud
/client/proc/toggle_AI_interact, /*toggle admin ability to interact with machines as an AI*/
- /client/proc/open_shuttle_manipulator, /* Opens shuttle manipulator UI */
+ /datum/admins/proc/open_shuttlepanel, /* Opens shuttle manipulator UI */
/client/proc/respawn_character,
/client/proc/secrets,
/client/proc/toggle_hear_radio, /*allows admins to hide all radio output*/
diff --git a/code/modules/admin/chat_commands.dm b/code/modules/admin/chat_commands.dm
index 9b15729a9e..7664d85b7d 100644
--- a/code/modules/admin/chat_commands.dm
+++ b/code/modules/admin/chat_commands.dm
@@ -84,7 +84,7 @@ GLOBAL_LIST(round_end_notifiees)
if(!SSticker.IsRoundInProgress() && SSticker.HasRoundStarted())
return "[sender.mention], the round has already ended!"
LAZYINITLIST(GLOB.round_end_notifiees)
- GLOB.round_end_notifiees["<@[sender.mention]>"] = TRUE
+ GLOB.round_end_notifiees[sender.mention] = TRUE
return "I will notify [sender.mention] when the round ends."
/datum/tgs_chat_command/sdql
diff --git a/code/modules/admin/fun_balloon.dm b/code/modules/admin/fun_balloon.dm
index 44dcfc0ae6..417663fcb7 100644
--- a/code/modules/admin/fun_balloon.dm
+++ b/code/modules/admin/fun_balloon.dm
@@ -126,7 +126,7 @@
L.forceMove(LA)
L.hallucination = 0
to_chat(L, "The battle is won. Your bloodlust subsides.")
- for(var/obj/item/twohanded/required/chainsaw/doomslayer/chainsaw in L)
+ for(var/obj/item/chainsaw/doomslayer/chainsaw in L)
qdel(chainsaw)
else
to_chat(L, "You are not yet worthy of passing. Drag a severed head to the barrier to be allowed entry to the hall of champions.")
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 042a6e0fe9..41c3fe5105 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -863,7 +863,7 @@
if(jobban_isbanned(M, ROLE_TRAITOR) || isbanned_dept)
dat += "
"
+ for(var/list/ban in bans)
+ dat += "Server: [sanitize(ban["sourceName"])] "
+ dat += "RP Level: [sanitize(ban["sourceRoleplayLevel"])] "
+ dat += "Type: [sanitize(ban["type"])] "
+ dat += "Banned By: [sanitize(ban["bannedBy"])] "
+ dat += "Reason: [sanitize(ban["reason"])] "
+ dat += "Datetime: [sanitize(ban["bannedOn"])] "
+ var/expiration = ban["expires"]
+ dat += "Expires: [expiration ? "[sanitize(expiration)]" : "Permanent"] "
+ if(ban["type"] == "job")
+ dat += "Jobs: "
+ var/list/jobs = ban["jobs"]
+ dat += sanitize(jobs.Join(", "))
+ dat += " "
+ dat += ""
+
+ dat += " "
+ var/datum/browser/popup = new(usr, "centcomlookup-[ckey]", "
Central Command Galactic Ban Database
", 700, 600)
+ popup.set_content(dat.Join())
+ popup.open(0)
+
else if(href_list["modantagrep"])
if(!check_rights(R_ADMIN))
return
diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm
index bff431a6c7..b757028ea2 100644
--- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm
+++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm
@@ -666,8 +666,8 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null
obj_count_finished = select_refs
var/n = 0
for(var/i in found)
- if(++n == 20000)
- text_list += " TRUNCATED - 20000 OBJECT LIMIT HIT"
+ if(++n == 2500)
+ text_list += " TRUNCATED - 2500 OBJECT LIMIT HIT"
SDQL_print(i, text_list, print_nulls)
select_refs[REF(i)] = TRUE
SDQL2_TICK_CHECK
@@ -909,10 +909,9 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null
assoc = SDQL_expression(object, expressions_list[expression_list])
if(assoc != null)
// Need to insert the key like this to prevent duplicate keys fucking up.
- var/list/dummy = list()
- dummy[result] = assoc
- result = dummy
- val += result
+ val[result] = assoc
+ else
+ val += list(result)
else
val = world.SDQL_var(object, expression, i, object, superuser, src)
i = expression.len
diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2_wrappers.dm b/code/modules/admin/verbs/SDQL2/SDQL_2_wrappers.dm
index 24149e7e6c..4f518b7f8e 100644
--- a/code/modules/admin/verbs/SDQL2/SDQL_2_wrappers.dm
+++ b/code/modules/admin/verbs/SDQL2/SDQL_2_wrappers.dm
@@ -234,3 +234,7 @@
for(var/turf/T in v)
. += T
return pick(.)
+
+/proc/__nan()
+ var/list/L = json_decode("{\"value\":NaN}")
+ return L["value"]
diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm
index bbd6b55e4f..68b9a8e341 100644
--- a/code/modules/admin/verbs/adminpm.dm
+++ b/code/modules/admin/verbs/adminpm.dm
@@ -55,7 +55,7 @@
if(AH)
message_admins("[key_name_admin(src)] has started replying to [key_name(C, 0, 0)]'s admin help.")
- var/msg = input(src,"Message:", "Private message to [key_name(C, 0, 0)]") as message|null
+ var/msg = stripped_multiline_input(src,"Message:", "Private message to [key_name(C, 0, 0)]")
if (!msg)
message_admins("[key_name_admin(src)] has cancelled their reply to [key_name(C, 0, 0)]'s admin help.")
return
@@ -87,10 +87,10 @@
if(irc)
- if(!ircreplyamount) //to prevent people from spamming irc
+ if(!ircreplyamount) //to prevent people from spamming irc/discord
return
if(!msg)
- msg = input(src,"Message:", "Private message to Administrator") as text|null
+ msg = stripped_multiline_input(src,"Message:", "Private message to Administrator")
if(!msg)
return
@@ -112,7 +112,7 @@
//get message text, limit it's length.and clean/escape html
if(!msg)
- msg = input(src,"Message:", "Private message to [key_name(recipient, 0, 0)]") as message|null
+ msg = stripped_multiline_input(src,"Message:", "Private message to [key_name(recipient, 0, 0)]")
msg = trim(msg)
if(!msg)
return
@@ -191,7 +191,7 @@
spawn() //so we don't hold the caller proc up
var/sender = src
var/sendername = key
- var/reply = input(recipient, msg,"Admin PM from-[sendername]", "") as text|null //show message and await a reply
+ var/reply = stripped_multiline_input(recipient, msg,"Admin PM from-[sendername]", "") //show message and await a reply
if(recipient && reply)
if(sender)
recipient.cmd_admin_pm(sender,reply) //sender is still about, let's reply to them
diff --git a/code/modules/admin/verbs/borgpanel.dm b/code/modules/admin/verbs/borgpanel.dm
index 869e44e4f5..35f4ddb3e5 100644
--- a/code/modules/admin/verbs/borgpanel.dm
+++ b/code/modules/admin/verbs/borgpanel.dm
@@ -36,7 +36,7 @@
/datum/borgpanel/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.admin_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
- ui = new(user, src, ui_key, "borgopanel", "Borg Panel", 700, 700, master_ui, state)
+ ui = new(user, src, ui_key, "BorgPanel", "Borg Panel", 700, 700, master_ui, state)
ui.open()
/datum/borgpanel/ui_data(mob/user)
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index 8406248164..f068f05a4a 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -573,7 +573,7 @@
if(Rad.anchored)
if(!Rad.loaded_tank)
var/obj/item/tank/internals/plasma/Plasma = new/obj/item/tank/internals/plasma(Rad)
- Plasma.air_contents.gases[/datum/gas/plasma] = 70
+ Plasma.air_contents.set_moles(/datum/gas/plasma,70)
Rad.drainratio = 0
Rad.loaded_tank = Plasma
Plasma.forceMove(Rad)
diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm
index 072fbaa123..6f8e9e703f 100644
--- a/code/modules/admin/verbs/diagnostics.dm
+++ b/code/modules/admin/verbs/diagnostics.dm
@@ -1,15 +1,14 @@
/proc/show_air_status_to(turf/target, mob/user)
var/datum/gas_mixture/env = target.return_air()
- var/list/env_gases = env.gases
var/burning = FALSE
if(isopenturf(target))
var/turf/open/T = target
if(T.active_hotspot)
burning = TRUE
- var/list/lines = list("[AREACOORD(target)]: [env.temperature] K ([env.temperature - T0C] C), [env.return_pressure()] kPa[(burning)?(", burning"):(null)]")
- for(var/id in env_gases)
- var/moles = env_gases[id]
+ var/list/lines = list("[AREACOORD(target)]: [env.return_temperature()] K ([env.return_temperature() - T0C] C), [env.return_pressure()] kPa[(burning)?(", burning"):(null)]")
+ for(var/id in env.get_gases())
+ var/moles = env.get_moles(id)
if (moles >= 0.00001)
lines += "[GLOB.meta_gas_names[id]]: [moles] mol"
to_chat(usr, lines.Join("\n"))
@@ -23,37 +22,6 @@
show_air_status_to(target, usr)
SSblackbox.record_feedback("tally", "admin_verb", 1, "Show Air Status") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-/client/proc/fix_next_move()
- set category = "Debug"
- set name = "Unfreeze Everyone"
- var/largest_move_time = 0
- var/largest_click_time = 0
- var/mob/largest_move_mob = null
- var/mob/largest_click_mob = null
- for(var/mob/M in world)
- if(!M.client)
- continue
- if(M.next_move >= largest_move_time)
- largest_move_mob = M
- if(M.next_move > world.time)
- largest_move_time = M.next_move - world.time
- else
- largest_move_time = 1
- if(M.next_click >= largest_click_time)
- largest_click_mob = M
- if(M.next_click > world.time)
- largest_click_time = M.next_click - world.time
- else
- largest_click_time = 0
- log_admin("DEBUG: [key_name(M)] next_move = [M.next_move] lastDblClick = [M.next_click] world.time = [world.time]")
- M.next_move = 1
- M.next_click = 0
- message_admins("[ADMIN_LOOKUPFLW(largest_move_mob)] had the largest move delay with [largest_move_time] frames / [DisplayTimeText(largest_move_time)]!")
- message_admins("[ADMIN_LOOKUPFLW(largest_click_mob)] had the largest click delay with [largest_click_time] frames / [DisplayTimeText(largest_click_time)]!")
- message_admins("world.time = [world.time]")
- SSblackbox.record_feedback("tally", "admin_verb", 1, "Unfreeze Everyone") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
- return
-
/client/proc/radio_report()
set category = "Debug"
set name = "Radio report"
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index d335cfb171..c559135bd1 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -421,7 +421,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
new_character.real_name = record_found.fields["name"]
new_character.gender = record_found.fields["gender"]
new_character.age = record_found.fields["age"]
- new_character.hardset_dna(record_found.fields["identity"], record_found.fields["enzymes"], record_found.fields["name"], record_found.fields["blood_type"], new record_found.fields["species"], record_found.fields["features"])
+ new_character.hardset_dna(record_found.fields["identity"], record_found.fields["enzymes"], null, record_found.fields["name"], record_found.fields["blood_type"], new record_found.fields["species"], record_found.fields["features"])
else
var/datum/preferences/A = new()
A.copy_to(new_character)
@@ -1058,13 +1058,6 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
var/datum/atom_hud/A = GLOB.huds[ANTAG_HUD_TRAITOR]
return A.hudusers[mob]
-/client/proc/open_shuttle_manipulator()
- set category = "Admin"
- set name = "Shuttle Manipulator"
- set desc = "Opens the shuttle manipulator UI."
-
- for(var/obj/machinery/shuttle_manipulator/M in GLOB.machines)
- M.ui_interact(usr)
/client/proc/run_weather()
set category = "Fun"
@@ -1276,7 +1269,23 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
if(!check_rights(R_ADMIN) || !check_rights(R_FUN))
return
- var/list/punishment_list = list(ADMIN_PUNISHMENT_PIE, ADMIN_PUNISHMENT_CUSTOM_PIE, ADMIN_PUNISHMENT_FIREBALL, ADMIN_PUNISHMENT_LIGHTNING, ADMIN_PUNISHMENT_BRAINDAMAGE, ADMIN_PUNISHMENT_BSA, ADMIN_PUNISHMENT_GIB, ADMIN_PUNISHMENT_SUPPLYPOD_QUICK, ADMIN_PUNISHMENT_SUPPLYPOD, ADMIN_PUNISHMENT_MAZING, ADMIN_PUNISHMENT_ROD)
+ var/list/punishment_list = list(ADMIN_PUNISHMENT_PIE,
+ ADMIN_PUNISHMENT_CUSTOM_PIE,
+ ADMIN_PUNISHMENT_FIREBALL,
+ ADMIN_PUNISHMENT_LIGHTNING,
+ ADMIN_PUNISHMENT_BRAINDAMAGE,
+ ADMIN_PUNISHMENT_BSA,
+ ADMIN_PUNISHMENT_GIB,
+ ADMIN_PUNISHMENT_SUPPLYPOD_QUICK,
+ ADMIN_PUNISHMENT_SUPPLYPOD,
+ ADMIN_PUNISHMENT_MAZING,
+ ADMIN_PUNISHMENT_ROD,
+ ADMIN_PUNISHMENT_SHOES,
+ ADMIN_PUNISHMENT_PICKLE,
+ ADMIN_PUNISHMENT_FRY,
+ ADMIN_PUNISHMENT_CRACK,
+ ADMIN_PUNISHMENT_BLEED,
+ ADMIN_PUNISHMENT_SCARIFY)
var/punishment = input("Choose a punishment", "DIVINE SMITING") as null|anything in punishment_list
@@ -1341,7 +1350,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
if(ADMIN_PUNISHMENT_PIE)
var/obj/item/reagent_containers/food/snacks/pie/cream/nostun/creamy = new(get_turf(target))
creamy.splat(target)
- if (ADMIN_PUNISHMENT_CUSTOM_PIE)
+ if(ADMIN_PUNISHMENT_CUSTOM_PIE)
var/obj/item/reagent_containers/food/snacks/pie/cream/nostun/A = new()
if(!A.reagents)
var/amount = input(usr, "Specify the reagent size of [A]", "Set Reagent Size", 50) as num|null
@@ -1354,6 +1363,48 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
if(amount)
A.reagents.add_reagent(chosen_id, amount)
A.splat(target)
+ if(ADMIN_PUNISHMENT_CRACK)
+ if(!iscarbon(target))
+ to_chat(usr,"This must be used on a carbon mob.", confidential = TRUE)
+ return
+ var/mob/living/carbon/C = target
+ for(var/obj/item/bodypart/squish_part in C.bodyparts)
+ var/type_wound = pick(list(/datum/wound/brute/bone/critical, /datum/wound/brute/bone/severe, /datum/wound/brute/bone/critical, /datum/wound/brute/bone/severe, /datum/wound/brute/bone/moderate))
+ squish_part.force_wound_upwards(type_wound, smited=TRUE)
+ if(ADMIN_PUNISHMENT_BLEED)
+ if(!iscarbon(target))
+ to_chat(usr,"This must be used on a carbon mob.", confidential = TRUE)
+ return
+ var/mob/living/carbon/C = target
+ for(var/obj/item/bodypart/slice_part in C.bodyparts)
+ var/type_wound = pick(list(/datum/wound/brute/cut/severe, /datum/wound/brute/cut/moderate))
+ slice_part.force_wound_upwards(type_wound, smited=TRUE)
+ type_wound = pick(list(/datum/wound/brute/cut/critical, /datum/wound/brute/cut/severe, /datum/wound/brute/cut/moderate))
+ slice_part.force_wound_upwards(type_wound, smited=TRUE)
+ type_wound = pick(list(/datum/wound/brute/cut/critical, /datum/wound/brute/cut/severe))
+ slice_part.force_wound_upwards(type_wound, smited=TRUE)
+ if(ADMIN_PUNISHMENT_SCARIFY)
+ if(!iscarbon(target))
+ to_chat(usr,"This must be used on a carbon mob.", confidential = TRUE)
+ return
+ var/mob/living/carbon/C = target
+ C.generate_fake_scars(rand(1, 4))
+ to_chat(C, "You feel your body grow jaded and torn...")
+ if(ADMIN_PUNISHMENT_PICKLE)
+ target.turn_into_pickle()
+ if(ADMIN_PUNISHMENT_FRY)
+ target.fry()
+
+ if(ADMIN_PUNISHMENT_SHOES)
+ if(!iscarbon(target))
+ to_chat(usr,"This must be used on a carbon mob.")
+ return
+ var/mob/living/carbon/C = target
+ var/obj/item/clothing/shoes/sick_kicks = C.shoes
+ if(!sick_kicks?.can_be_tied)
+ to_chat(usr,"[C] does not have knottable shoes!")
+ return
+ sick_kicks.adjust_laces(SHOES_KNOTTED)
punish_log(target, punishment)
diff --git a/code/modules/admin/verbs/shuttlepanel.dm b/code/modules/admin/verbs/shuttlepanel.dm
new file mode 100644
index 0000000000..a80eafae02
--- /dev/null
+++ b/code/modules/admin/verbs/shuttlepanel.dm
@@ -0,0 +1,76 @@
+/datum/admins/proc/open_shuttlepanel()
+ set category = "Admin"
+ set name = "Shuttle Manipulator"
+ set desc = "Opens the shuttle manipulator UI."
+
+ if(!check_rights(R_ADMIN))
+ return
+
+ SSshuttle.ui_interact(usr)
+
+
+/obj/docking_port/mobile/proc/admin_fly_shuttle(mob/user)
+ var/list/options = list()
+
+ for(var/port in SSshuttle.stationary)
+ if (istype(port, /obj/docking_port/stationary/transit))
+ continue // please don't do this
+ var/obj/docking_port/stationary/S = port
+ if (canDock(S) == SHUTTLE_CAN_DOCK)
+ options[S.name || S.id] = S
+
+ options += "--------"
+ options += "Infinite Transit"
+ options += "Delete Shuttle"
+ options += "Into The Sunset (delete & greentext 'escape')"
+
+ var/selection = input(user, "Select where to fly [name || id]:", "Fly Shuttle") as null|anything in options
+ if(!selection)
+ return
+
+ switch(selection)
+ if("Infinite Transit")
+ destination = null
+ mode = SHUTTLE_IGNITING
+ setTimer(ignitionTime)
+
+ if("Delete Shuttle")
+ if(alert(user, "Really delete [name || id]?", "Delete Shuttle", "Cancel", "Really!") != "Really!")
+ return
+ jumpToNullSpace()
+
+ if("Into The Sunset (delete & greentext 'escape')")
+ if(alert(user, "Really delete [name || id] and greentext escape objectives?", "Delete Shuttle", "Cancel", "Really!") != "Really!")
+ return
+ intoTheSunset()
+
+ else
+ if(options[selection])
+ request(options[selection])
+
+/obj/docking_port/mobile/emergency/admin_fly_shuttle(mob/user)
+ return // use the existing verbs for this
+
+/obj/docking_port/mobile/arrivals/admin_fly_shuttle(mob/user)
+ switch(alert(user, "Would you like to fly the arrivals shuttle once or change its destination?", "Fly Shuttle", "Fly", "Retarget", "Cancel"))
+ if("Cancel")
+ return
+ if("Fly")
+ return ..()
+
+ var/list/options = list()
+
+ for(var/port in SSshuttle.stationary)
+ if (istype(port, /obj/docking_port/stationary/transit))
+ continue // please don't do this
+ var/obj/docking_port/stationary/S = port
+ if (canDock(S) == SHUTTLE_CAN_DOCK)
+ options[S.name || S.id] = S
+
+ var/selection = input(user, "Select the new arrivals destination:", "Fly Shuttle") as null|anything in options
+ if(!selection)
+ return
+ target_dock = options[selection]
+ if(!QDELETED(target_dock))
+ destination = target_dock
+
diff --git a/code/modules/antagonists/_common/antag_datum.dm b/code/modules/antagonists/_common/antag_datum.dm
index 3184a169fc..8bff37ab03 100644
--- a/code/modules/antagonists/_common/antag_datum.dm
+++ b/code/modules/antagonists/_common/antag_datum.dm
@@ -23,6 +23,7 @@ GLOBAL_LIST_EMPTY(antagonists)
var/show_name_in_check_antagonists = FALSE //Will append antagonist name in admin listings - use for categories that share more than one antag type
var/list/blacklisted_quirks = list(/datum/quirk/nonviolent,/datum/quirk/mute) // Quirks that will be removed upon gaining this antag. Pacifist and mute are default.
var/threat = 0 // Amount of threat this antag poses, for dynamic mode
+ var/show_to_ghosts = FALSE // Should this antagonist be shown as antag to ghosts? Shouldn't be used for stealthy antagonists like traitors
var/list/skill_modifiers
@@ -64,6 +65,18 @@ GLOBAL_LIST_EMPTY(antagonists)
/datum/antagonist/proc/remove_innate_effects(mob/living/mob_override)
return
+// Adds the specified antag hud to the player. Usually called in an antag datum file
+/datum/antagonist/proc/add_antag_hud(antag_hud_type, antag_hud_name, mob/living/mob_override)
+ var/datum/atom_hud/antag/hud = GLOB.huds[antag_hud_type]
+ hud.join_hud(mob_override)
+ set_antag_hud(mob_override, antag_hud_name)
+
+// Removes the specified antag hud from the player. Usually called in an antag datum file
+/datum/antagonist/proc/remove_antag_hud(antag_hud_type, mob/living/mob_override)
+ var/datum/atom_hud/antag/hud = GLOB.huds[antag_hud_type]
+ hud.leave_hud(mob_override)
+ set_antag_hud(mob_override, null)
+
//Assign default team and creates one for one of a kind team antagonists
/datum/antagonist/proc/create_team(datum/team/team)
return
@@ -82,6 +95,9 @@ GLOBAL_LIST_EMPTY(antagonists)
if(skill_modifiers)
for(var/A in skill_modifiers)
ADD_SINGLETON_SKILL_MODIFIER(owner, A, type)
+ var/datum/skill_modifier/job/M = GLOB.skill_modifiers[GET_SKILL_MOD_ID(A, type)]
+ if(istype(M))
+ M.name = "[name] Training"
SEND_SIGNAL(owner.current, COMSIG_MOB_ANTAG_ON_GAIN, src)
/datum/antagonist/proc/is_banned(mob/M)
diff --git a/code/modules/antagonists/abductor/abductor.dm b/code/modules/antagonists/abductor/abductor.dm
index 9132288415..7eb7ec2af2 100644
--- a/code/modules/antagonists/abductor/abductor.dm
+++ b/code/modules/antagonists/abductor/abductor.dm
@@ -7,6 +7,7 @@
job_rank = ROLE_ABDUCTOR
show_in_antagpanel = FALSE //should only show subtypes
threat = 5
+ show_to_ghosts = TRUE
var/datum/team/abductor_team/team
var/sub_role
var/outfit
@@ -59,8 +60,10 @@
/datum/antagonist/abductor/greet()
to_chat(owner.current, "You are the [owner.special_role]!")
- to_chat(owner.current, "With the help of your teammate, kidnap and experiment on station crew members!")
- to_chat(owner.current, "Try not to disturb the habitat, it could lead to dead specimens.")
+ to_chat(owner.current, "You are an operative for your home planet's government. Your mission is to detain, experiment, and observe.")
+ to_chat(owner.current, "Work together with your teammate to bring live subjects from the space station nearby onto your ship for experimentation.")
+ to_chat(owner.current, "For the sake of the mission, do not damage the integrity of the station, do not kill anyone unless in self defense, always capture specimens first if you can, and do not steal equipment or belongings from abducted specimens.")
+ to_chat(owner.current, "Your task is to observe and take notes of the effects of your experiments.")
to_chat(owner.current, "[greet_text]")
owner.announce_objectives()
diff --git a/code/modules/antagonists/abductor/ice_abductor.dm b/code/modules/antagonists/abductor/ice_abductor.dm
new file mode 100644
index 0000000000..426e4057eb
--- /dev/null
+++ b/code/modules/antagonists/abductor/ice_abductor.dm
@@ -0,0 +1,12 @@
+/obj/structure/fluff/iced_abductor ///Unless more non-machine ayy structures made, it will stay in fluff.
+ name = "Mysterious Block of Ice"
+ desc = "A shadowy figure lies in this sturdy-looking block of ice. Who knows where it came from?"
+ icon = 'icons/effects/freeze.dmi'
+ icon_state = "ice_ayy"
+ density = TRUE
+ deconstructible = FALSE
+
+/obj/structure/fluff/iced_abductor/Destroy()
+ var/turf/T = get_turf(src)
+ new /obj/effect/mob_spawn/human/abductor(T)
+ . = ..()
\ No newline at end of file
diff --git a/code/modules/antagonists/abductor/machinery/console.dm b/code/modules/antagonists/abductor/machinery/console.dm
index b8d5b1bf6d..6a981b36dc 100644
--- a/code/modules/antagonists/abductor/machinery/console.dm
+++ b/code/modules/antagonists/abductor/machinery/console.dm
@@ -24,10 +24,7 @@
var/obj/machinery/computer/camera_advanced/abductor/camera
var/list/datum/icon_snapshot/disguises = list()
-/obj/machinery/abductor/console/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/machinery/abductor/console/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(!HAS_TRAIT(user, TRAIT_ABDUCTOR_TRAINING) && !HAS_TRAIT(user.mind, TRAIT_ABDUCTOR_TRAINING))
to_chat(user, "You start mashing alien buttons at random!")
if(do_after(user,100, target = src))
diff --git a/code/modules/antagonists/abductor/machinery/dispenser.dm b/code/modules/antagonists/abductor/machinery/dispenser.dm
index 17fa311c8f..90dcf6626f 100644
--- a/code/modules/antagonists/abductor/machinery/dispenser.dm
+++ b/code/modules/antagonists/abductor/machinery/dispenser.dm
@@ -22,10 +22,7 @@
gland_colors[i] = random_color()
amounts[i] = rand(1,5)
-/obj/machinery/abductor/gland_dispenser/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/machinery/abductor/gland_dispenser/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(!isabductor(user))
return
user.set_machine(src)
diff --git a/code/modules/antagonists/abductor/machinery/experiment.dm b/code/modules/antagonists/abductor/machinery/experiment.dm
index f92cb987d0..bc58cf45f0 100644
--- a/code/modules/antagonists/abductor/machinery/experiment.dm
+++ b/code/modules/antagonists/abductor/machinery/experiment.dm
@@ -21,10 +21,7 @@
return
close_machine(target)
-/obj/machinery/abductor/experiment/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/machinery/abductor/experiment/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
experimentUI(user)
@@ -47,8 +44,6 @@
to_chat(user, "[src]'s door won't budge!")
/obj/machinery/abductor/experiment/container_resist(mob/living/user)
- user.changeNext_move(CLICK_CD_BREAKOUT)
- user.last_special = world.time + CLICK_CD_BREAKOUT
user.visible_message("You see [user] kicking against the door of [src]!", \
"You lean on the back of [src] and start pushing the door open... (this will take about [DisplayTimeText(breakout_time)].)", \
"You hear a metallic creaking from [src].")
diff --git a/code/modules/antagonists/blob/blob.dm b/code/modules/antagonists/blob/blob.dm
index 1b076c9302..9a82bb546b 100644
--- a/code/modules/antagonists/blob/blob.dm
+++ b/code/modules/antagonists/blob/blob.dm
@@ -2,6 +2,7 @@
name = "Blob"
roundend_category = "blobs"
antagpanel_category = "Blob"
+ show_to_ghosts = TRUE
job_rank = ROLE_BLOB
threat = 20
var/datum/action/innate/blobpop/pop_action
diff --git a/code/modules/antagonists/blob/blob/blobs/blob_mobs.dm b/code/modules/antagonists/blob/blob/blobs/blob_mobs.dm
index 91fb538ca3..ba2363ecc0 100644
--- a/code/modules/antagonists/blob/blob/blobs/blob_mobs.dm
+++ b/code/modules/antagonists/blob/blob/blobs/blob_mobs.dm
@@ -103,7 +103,9 @@
factory.spores += src
. = ..()
-/mob/living/simple_animal/hostile/blob/blobspore/Life()
+/mob/living/simple_animal/hostile/blob/blobspore/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
if(!is_zombie && isturf(src.loc))
for(var/mob/living/carbon/human/H in view(src,1)) //Only for corpse right next to/on same tile
if(H.stat == DEAD)
@@ -111,7 +113,6 @@
break
if(factory && z != factory.z)
death()
- ..()
/mob/living/simple_animal/hostile/blob/blobspore/proc/Zombify(mob/living/carbon/human/H)
is_zombie = 1
@@ -233,39 +234,40 @@
return FALSE
return ..()
-/mob/living/simple_animal/hostile/blob/blobbernaut/Life()
- if(..())
- var/list/blobs_in_area = range(2, src)
- if(independent)
- return // strong independent blobbernaut that don't need no blob
- var/damagesources = 0
- if(!(locate(/obj/structure/blob) in blobs_in_area))
- damagesources++
- if(!factory)
- damagesources++
- else
- if(locate(/obj/structure/blob/core) in blobs_in_area)
- adjustHealth(-maxHealth*0.1)
- var/obj/effect/temp_visual/heal/H = new /obj/effect/temp_visual/heal(get_turf(src)) //hello yes you are being healed
- if(overmind)
- H.color = overmind.blobstrain.complementary_color
- else
- H.color = "#000000"
- if(locate(/obj/structure/blob/node) in blobs_in_area)
- adjustHealth(-maxHealth*0.05)
- var/obj/effect/temp_visual/heal/H = new /obj/effect/temp_visual/heal(get_turf(src))
- if(overmind)
- H.color = overmind.blobstrain.complementary_color
- else
- H.color = "#000000"
- if(damagesources)
- for(var/i in 1 to damagesources)
- adjustHealth(maxHealth*0.025) //take 2.5% of max health as damage when not near the blob or if the naut has no factory, 5% if both
- var/image/I = new('icons/mob/blob.dmi', src, "nautdamage", MOB_LAYER+0.01)
- I.appearance_flags = RESET_COLOR
+/mob/living/simple_animal/hostile/blob/blobbernaut/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
+ var/list/blobs_in_area = range(2, src)
+ if(independent)
+ return // strong independent blobbernaut that don't need no blob
+ var/damagesources = 0
+ if(!(locate(/obj/structure/blob) in blobs_in_area))
+ damagesources++
+ if(!factory)
+ damagesources++
+ else
+ if(locate(/obj/structure/blob/core) in blobs_in_area)
+ adjustHealth(-maxHealth*0.1)
+ var/obj/effect/temp_visual/heal/H = new /obj/effect/temp_visual/heal(get_turf(src)) //hello yes you are being healed
if(overmind)
- I.color = overmind.blobstrain.complementary_color
- flick_overlay_view(I, src, 8)
+ H.color = overmind.blobstrain.complementary_color
+ else
+ H.color = "#000000"
+ if(locate(/obj/structure/blob/node) in blobs_in_area)
+ adjustHealth(-maxHealth*0.05)
+ var/obj/effect/temp_visual/heal/H = new /obj/effect/temp_visual/heal(get_turf(src))
+ if(overmind)
+ H.color = overmind.blobstrain.complementary_color
+ else
+ H.color = "#000000"
+ if(damagesources)
+ for(var/i in 1 to damagesources)
+ adjustHealth(maxHealth*0.025) //take 2.5% of max health as damage when not near the blob or if the naut has no factory, 5% if both
+ var/image/I = new('icons/mob/blob.dmi', src, "nautdamage", MOB_LAYER+0.01)
+ I.appearance_flags = RESET_COLOR
+ if(overmind)
+ I.color = overmind.blobstrain.complementary_color
+ flick_overlay_view(I, src, 8)
/mob/living/simple_animal/hostile/blob/blobbernaut/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
. = ..()
diff --git a/code/modules/antagonists/blob/blob/blobs/shield.dm b/code/modules/antagonists/blob/blob/blobs/shield.dm
index 384df935f5..a2a6ce94d3 100644
--- a/code/modules/antagonists/blob/blob/blobs/shield.dm
+++ b/code/modules/antagonists/blob/blob/blobs/shield.dm
@@ -53,14 +53,3 @@
/obj/structure/blob/shield/reflective/check_projectile_ricochet(obj/item/projectile/P)
return PROJECTILE_RICOCHET_FORCE
-/obj/structure/blob/shield/reflective/handle_projectile_ricochet(obj/item/projectile/P)
- var/turf/p_turf = get_turf(P)
- var/face_direction = get_dir(src, p_turf)
- var/face_angle = dir2angle(face_direction)
- var/incidence_s = GET_ANGLE_OF_INCIDENCE(face_angle, (P.Angle + 180))
- if(abs(incidence_s) > 90 && abs(incidence_s) < 270)
- return FALSE
- var/new_angle_s = SIMPLIFY_DEGREES(face_angle + incidence_s)
- P.setAngle(new_angle_s)
- visible_message("[P] reflects off [src]!")
- return TRUE
diff --git a/code/modules/antagonists/blob/blob/blobstrains/blazing_oil.dm b/code/modules/antagonists/blob/blob/blobstrains/blazing_oil.dm
index 97b974e28f..f97e271e72 100644
--- a/code/modules/antagonists/blob/blob/blobstrains/blazing_oil.dm
+++ b/code/modules/antagonists/blob/blob/blobstrains/blazing_oil.dm
@@ -36,6 +36,6 @@
M.adjust_fire_stacks(round(reac_volume/10))
M.IgniteMob()
if(M)
- M.apply_damage(0.8*reac_volume, BURN)
+ M.apply_damage(0.8*reac_volume, BURN, wound_bonus=CANT_WOUND)
if(iscarbon(M))
M.emote("scream")
diff --git a/code/modules/antagonists/blob/blob/blobstrains/cryogenic_poison.dm b/code/modules/antagonists/blob/blob/blobstrains/cryogenic_poison.dm
index 9b8edcd0e5..f8ef269986 100644
--- a/code/modules/antagonists/blob/blob/blobstrains/cryogenic_poison.dm
+++ b/code/modules/antagonists/blob/blob/blobstrains/cryogenic_poison.dm
@@ -22,7 +22,7 @@
M.reagents.add_reagent("frostoil", 0.3*reac_volume)
M.reagents.add_reagent("ice", 0.3*reac_volume)
M.reagents.add_reagent("cryogenic_poison", 0.3*reac_volume)
- M.apply_damage(0.2*reac_volume, BRUTE)
+ M.apply_damage(0.2*reac_volume, BRUTE, wound_bonus=CANT_WOUND)
/datum/reagent/blob/cryogenic_poison/on_mob_life(mob/living/carbon/M)
M.adjustBruteLoss(0.3*REAGENTS_EFFECT_MULTIPLIER, 0)
diff --git a/code/modules/antagonists/blob/blob/blobstrains/electromagnetic_web.dm b/code/modules/antagonists/blob/blob/blobstrains/electromagnetic_web.dm
index 0e665603c9..45bf2b1e1d 100644
--- a/code/modules/antagonists/blob/blob/blobstrains/electromagnetic_web.dm
+++ b/code/modules/antagonists/blob/blob/blobstrains/electromagnetic_web.dm
@@ -30,4 +30,4 @@
if(prob(reac_volume*2))
M.emp_act(EMP_LIGHT)
if(M)
- M.apply_damage(reac_volume, BURN)
+ M.apply_damage(reac_volume, BURN, wound_bonus=CANT_WOUND)
diff --git a/code/modules/antagonists/blob/blob/blobstrains/explosive_lattice.dm b/code/modules/antagonists/blob/blob/blobstrains/explosive_lattice.dm
index f8fd2e2f0d..3d005ba913 100644
--- a/code/modules/antagonists/blob/blob/blobstrains/explosive_lattice.dm
+++ b/code/modules/antagonists/blob/blob/blobstrains/explosive_lattice.dm
@@ -33,8 +33,8 @@
if(ROLE_BLOB in L.faction) //no friendly fire
continue
var/aoe_volume = ..(L, TOUCH, initial_volume, 0, L.get_permeability_protection(), O)
- L.apply_damage(0.4*aoe_volume, BRUTE)
+ L.apply_damage(0.4*aoe_volume, BRUTE, wound_bonus=CANT_WOUND)
if(M)
- M.apply_damage(0.6*reac_volume, BRUTE)
+ M.apply_damage(0.6*reac_volume, BRUTE, wound_bonus=CANT_WOUND)
else
- M.apply_damage(0.6*reac_volume, BRUTE)
+ M.apply_damage(0.6*reac_volume, BRUTE, wound_bonus=CANT_WOUND)
diff --git a/code/modules/antagonists/blob/blob/blobstrains/networked_fibers.dm b/code/modules/antagonists/blob/blob/blobstrains/networked_fibers.dm
index fac3470c7a..8ccf2b9c99 100644
--- a/code/modules/antagonists/blob/blob/blobstrains/networked_fibers.dm
+++ b/code/modules/antagonists/blob/blob/blobstrains/networked_fibers.dm
@@ -33,6 +33,6 @@
/datum/reagent/blob/networked_fibers/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
reac_volume = ..()
- M.apply_damage(0.6*reac_volume, BRUTE)
+ M.apply_damage(0.6*reac_volume, BRUTE, wound_bonus=CANT_WOUND)
if(M)
- M.apply_damage(0.6*reac_volume, BURN)
+ M.apply_damage(0.6*reac_volume, BURN, wound_bonus=CANT_WOUND)
diff --git a/code/modules/antagonists/blob/blob/blobstrains/pressurized_slime.dm b/code/modules/antagonists/blob/blob/blobstrains/pressurized_slime.dm
index 6a984e66a2..11477712e7 100644
--- a/code/modules/antagonists/blob/blob/blobstrains/pressurized_slime.dm
+++ b/code/modules/antagonists/blob/blob/blobstrains/pressurized_slime.dm
@@ -44,7 +44,7 @@
T.MakeSlippery(TURF_WET_LUBE, min_wet_time = 10 SECONDS, wet_time_to_add = 5 SECONDS)
M.adjust_fire_stacks(-(reac_volume / 10))
M.ExtinguishMob()
- M.apply_damage(0.4*reac_volume, BRUTE)
+ M.apply_damage(0.4*reac_volume, BRUTE, wound_bonus=CANT_WOUND)
if(M)
M.apply_damage(0.4*reac_volume, OXY)
if(M)
diff --git a/code/modules/antagonists/blob/blob/blobstrains/replicating_foam.dm b/code/modules/antagonists/blob/blob/blobstrains/replicating_foam.dm
index 00743c671e..5565135c63 100644
--- a/code/modules/antagonists/blob/blob/blobstrains/replicating_foam.dm
+++ b/code/modules/antagonists/blob/blob/blobstrains/replicating_foam.dm
@@ -31,4 +31,4 @@
/datum/reagent/blob/replicating_foam/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
reac_volume = ..()
- M.apply_damage(0.7*reac_volume, BRUTE)
+ M.apply_damage(0.7*reac_volume, BRUTE, wound_bonus=CANT_WOUND)
diff --git a/code/modules/antagonists/blob/blob/blobstrains/shifting_fragments.dm b/code/modules/antagonists/blob/blob/blobstrains/shifting_fragments.dm
index dbb3d6fb9b..9265158e1b 100644
--- a/code/modules/antagonists/blob/blob/blobstrains/shifting_fragments.dm
+++ b/code/modules/antagonists/blob/blob/blobstrains/shifting_fragments.dm
@@ -32,4 +32,4 @@
/datum/reagent/blob/shifting_fragments/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
reac_volume = ..()
- M.apply_damage(0.7*reac_volume, BRUTE)
+ M.apply_damage(0.7*reac_volume, BRUTE, wound_bonus=CANT_WOUND)
diff --git a/code/modules/antagonists/blob/blob/blobstrains/synchronous_mesh.dm b/code/modules/antagonists/blob/blob/blobstrains/synchronous_mesh.dm
index d58fb5b37d..daad0068e2 100644
--- a/code/modules/antagonists/blob/blob/blobstrains/synchronous_mesh.dm
+++ b/code/modules/antagonists/blob/blob/blobstrains/synchronous_mesh.dm
@@ -30,9 +30,9 @@
/datum/reagent/blob/synchronous_mesh/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
reac_volume = ..()
- M.apply_damage(0.2*reac_volume, BRUTE)
+ M.apply_damage(0.2*reac_volume, BRUTE, wound_bonus=CANT_WOUND)
if(M && reac_volume)
for(var/obj/structure/blob/B in range(1, M)) //if the target is completely surrounded, this is 2.4*reac_volume bonus damage, total of 2.6*reac_volume
if(M)
B.blob_attack_animation(M) //show them they're getting a bad time
- M.apply_damage(0.3*reac_volume, BRUTE)
+ M.apply_damage(0.3*reac_volume, BRUTE, wound_bonus=CANT_WOUND)
diff --git a/code/modules/antagonists/blob/blob/theblob.dm b/code/modules/antagonists/blob/blob/theblob.dm
index 6a73dc579b..ed85726a4a 100644
--- a/code/modules/antagonists/blob/blob/theblob.dm
+++ b/code/modules/antagonists/blob/blob/theblob.dm
@@ -225,7 +225,7 @@
/obj/structure/blob/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/analyzer))
- user.changeNext_move(CLICK_CD_MELEE)
+ user.DelayNextAction(CLICK_CD_MELEE)
to_chat(user, "The analyzer beeps once, then reports: ")
SEND_SOUND(user, sound('sound/machines/ping.ogg'))
if(overmind)
diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm
index 47a98623db..2d25ebb156 100644
--- a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm
+++ b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm
@@ -10,26 +10,24 @@
//
// Show as dead when...
-/datum/antagonist/bloodsucker/proc/LifeTick()// Should probably run from life.dm, same as handle_changeling, but will be an utter pain to move
- set waitfor = FALSE // Don't make on_gain() wait for this function to finish. This lets this code run on the side.
- var/notice_healing
- while(owner && !AmFinalDeath()) // owner.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) == src
- if(owner.current.stat == CONSCIOUS && !poweron_feed && !HAS_TRAIT(owner.current, TRAIT_FAKEDEATH)) // Deduct Blood
- AddBloodVolume(passive_blood_drain) // -.1 currently
- if(HandleHealing(1)) // Heal
- if(!notice_healing && owner.current.blood_volume > 0)
- to_chat(owner, "The power of your blood begins knitting your wounds...")
- notice_healing = TRUE
- else if(notice_healing == TRUE)
- notice_healing = FALSE // Apply Low Blood Effects
- HandleStarving() // Death
- HandleDeath() // Standard Update
- update_hud()// Daytime Sleep in Coffin
- if(SSticker.mode.is_daylight() && !HAS_TRAIT_FROM(owner.current, TRAIT_FAKEDEATH, "bloodsucker"))
- if(istype(owner.current.loc, /obj/structure/closet/crate/coffin))
- Torpor_Begin()
- // Wait before next pass
- sleep(10)
+/datum/antagonist/bloodsucker/proc/LifeTick() //Runs from BiologicalLife, handles all the bloodsucker constant proccesses
+ if(!owner || AmFinalDeath())
+ return
+ if(owner.current.stat == CONSCIOUS && !poweron_feed && !HAS_TRAIT(owner.current, TRAIT_FAKEDEATH)) // Deduct Blood
+ AddBloodVolume(passive_blood_drain) // -.1 currently
+ if(HandleHealing(1)) // Heal
+ if(!notice_healing && owner.current.blood_volume > 0)
+ to_chat(owner, "The power of your blood begins knitting your wounds...")
+ notice_healing = TRUE
+ else if(notice_healing)
+ notice_healing = FALSE // Apply Low Blood Effects
+ HandleStarving() // Death
+ HandleDeath() // Standard Update
+ update_hud()// Daytime Sleep in Coffin
+ if(SSticker.mode.is_daylight() && !HAS_TRAIT_FROM(owner.current, TRAIT_FAKEDEATH, "bloodsucker"))
+ if(istype(owner.current.loc, /obj/structure/closet/crate/coffin))
+ Torpor_Begin()
+ // Wait before next pass
FreeAllVassals() // Free my Vassals! (if I haven't yet)
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm
index 888db8193b..715de0648d 100644
--- a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm
+++ b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm
@@ -37,6 +37,7 @@
var/had_toxlover
var/level_bloodcost
var/passive_blood_drain = -0.1 //The amount of blood we loose each bloodsucker life() tick
+ var/notice_healing //Var to see if you are healing for preventing spam of the chat message inform the user of such
// LISTS
var/static/list/defaultTraits = list (TRAIT_STABLEHEART, TRAIT_NOBREATH, TRAIT_SLEEPIMMUNE, TRAIT_NOCRITDAMAGE, TRAIT_RESISTCOLD, TRAIT_RADIMMUNE, TRAIT_NIGHT_VISION, \
TRAIT_NOSOFTCRIT, TRAIT_NOHARDCRIT, TRAIT_AGEUSIA, TRAIT_COLDBLOODED, TRAIT_NONATURALHEAL, TRAIT_NOMARROW, TRAIT_NOPULSE, TRAIT_VIRUSIMMUNE, TRAIT_NODECAP, TRAIT_NOGUT)
@@ -50,7 +51,6 @@
AssignStarterPowersAndStats()// Give Powers & Stats
forge_bloodsucker_objectives()// Objectives & Team
update_bloodsucker_icons_added(owner.current, "bloodsucker") // Add Antag HUD
- LifeTick() // Run Life Function
. = ..()
diff --git a/code/modules/antagonists/bloodsucker/items/bloodsucker_organs.dm b/code/modules/antagonists/bloodsucker/items/bloodsucker_organs.dm
index 640c53946f..25de64fe34 100644
--- a/code/modules/antagonists/bloodsucker/items/bloodsucker_organs.dm
+++ b/code/modules/antagonists/bloodsucker/items/bloodsucker_organs.dm
@@ -31,10 +31,6 @@
beating = 0
var/fakingit = 0
-/obj/item/organ/heart/vampheart/prepare_eat()
- ..()
- // Do cool stuff for eating vamp heart?
-
/obj/item/organ/heart/vampheart/Restart()
beating = 0 // DONT run ..(). We don't want to start beating again.
return 0
diff --git a/code/modules/antagonists/bloodsucker/items/bloodsucker_stake.dm b/code/modules/antagonists/bloodsucker/items/bloodsucker_stake.dm
index b13238f199..2aed251189 100644
--- a/code/modules/antagonists/bloodsucker/items/bloodsucker_stake.dm
+++ b/code/modules/antagonists/bloodsucker/items/bloodsucker_stake.dm
@@ -30,7 +30,7 @@
hitsound = 'sound/weapons/bladeslice.ogg'
force = 6
throwforce = 10
- embedding = list("embed_chance" = 25, "embedded_fall_chance" = 0.5) // UPDATE 2/10/18 embedding_behavior.dm is how this is handled
+ embedding = list("embed_chance" = 25, "fall_chance" = 0.5) // UPDATE 2/10/18 embedding_behavior.dm is how this is handled
//embed_chance = 25 // Look up "is_pointed" to see where we set stakes able to do this.
//embedded_fall_chance = 0.5 // Chance it will fall out.
obj_integrity = 30
@@ -93,7 +93,7 @@
embedded()
add_mob_blood(target)//Place blood on the stake
loc = C // Put INSIDE the character
- B.receive_damage(w_class * embedding.embedded_impact_pain_multiplier)
+ B.receive_damage(w_class * embedding["pain_mult"])
if(C.mind)
var/datum/antagonist/bloodsucker/bloodsucker = C.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)
if(bloodsucker)
@@ -118,7 +118,7 @@
force = 8
throwforce = 12
armour_penetration = 10
- embedding = list("embed_chance" = 50, "embedded_fall_chance" = 0) // UPDATE 2/10/18 embedding_behavior.dm is how this is handled
+ embedding = list("embed_chance" = 50, "fall_chance" = 0) // UPDATE 2/10/18 embedding_behavior.dm is how this is handled
obj_integrity = 120
max_integrity = 120
diff --git a/code/modules/antagonists/bloodsucker/objects/bloodsucker_coffin.dm b/code/modules/antagonists/bloodsucker/objects/bloodsucker_coffin.dm
index e85d3af5a0..a555677719 100644
--- a/code/modules/antagonists/bloodsucker/objects/bloodsucker_coffin.dm
+++ b/code/modules/antagonists/bloodsucker/objects/bloodsucker_coffin.dm
@@ -110,7 +110,7 @@
if (bloodsuckerdatum && bloodsuckerdatum.coffin == src)
bloodsuckerdatum.coffin = null
bloodsuckerdatum.lair = null
- to_chat(resident, "You sense that the link with your coffin, your sacred place of rest, has been brokem! You will need to seek another.")
+ to_chat(resident, "You sense that the link with your coffin, your sacred place of rest, has been broken! You will need to seek another.")
resident = null // Remove resident. Because this object isnt removed from the game immediately (GC?) we need to give them a way to see they don't have a home anymore.
/obj/structure/closet/crate/coffin/can_open(mob/living/user)
diff --git a/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm b/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm
index 090ef45d89..9af2553644 100644
--- a/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm
+++ b/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm
@@ -217,7 +217,7 @@
return FALSE
return ..()
-/obj/structure/bloodsucker/vassalrack/attack_hand(mob/user)
+/obj/structure/bloodsucker/vassalrack/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
//. = ..() // Taken from sacrificial altar in divine.dm
//if(.)
// return
@@ -469,7 +469,7 @@
. += {"This is a magical candle which drains at the sanity of the fools who havent yet accepted your master, as long as it is active.\n
You can turn it on and off by clicking on it while you are next to it"} */
-/obj/structure/bloodsucker/candelabrum/attack_hand(mob/user)
+/obj/structure/bloodsucker/candelabrum/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
var/datum/antagonist/vassal/T = user.mind.has_antag_datum(ANTAG_DATUM_VASSAL)
if(AmBloodsucker(user) || istype(T))
toggle()
diff --git a/code/modules/antagonists/bloodsucker/powers/feed.dm b/code/modules/antagonists/bloodsucker/powers/feed.dm
index a113f9c083..caca020b32 100644
--- a/code/modules/antagonists/bloodsucker/powers/feed.dm
+++ b/code/modules/antagonists/bloodsucker/powers/feed.dm
@@ -226,7 +226,9 @@
playsound(get_turf(target), 'sound/effects/splat.ogg', 40, 1)
if(ishuman(target))
var/mob/living/carbon/human/H = target
- H.bleed_rate += 5
+ var/obj/item/bodypart/head_part = H.get_bodypart(BODY_ZONE_HEAD)
+ if(head_part)
+ head_part.generic_bleedstacks += 5
target.add_splatter_floor(get_turf(target))
user.add_mob_blood(target) // Put target's blood on us. The donor goes in the ( )
target.add_mob_blood(target)
diff --git a/code/modules/antagonists/bloodsucker/powers/mesmerize.dm b/code/modules/antagonists/bloodsucker/powers/mesmerize.dm
index eea80d52f3..efdd312c6e 100644
--- a/code/modules/antagonists/bloodsucker/powers/mesmerize.dm
+++ b/code/modules/antagonists/bloodsucker/powers/mesmerize.dm
@@ -128,11 +128,9 @@
target.face_atom(L)
target.Stun(power_time)
to_chat(L, "[target] is fixed in place by your hypnotic gaze.")
- target.next_move = world.time + power_time // <--- Use direct change instead. We want an unmodified delay to their next move // target.changeNext_move(power_time) // check click.dm
- target.notransform = TRUE // <--- Fuck it. We tried using next_move, but they could STILL resist. We're just doing a hard freeze.
+ target.DelayNextAction(power_time)
spawn(power_time)
if(istype(target) && success)
- target.notransform = FALSE
if(istype(L) && target.stat == CONSCIOUS && (target in L.fov_view(10))) // They Woke Up! (Notice if within view)
to_chat(L, "[target] has snapped out of their trance.")
diff --git a/code/modules/antagonists/bloodsucker/powers/recuperate.dm b/code/modules/antagonists/bloodsucker/powers/recuperate.dm
index 6b8795ea02..90a2e3ff38 100644
--- a/code/modules/antagonists/bloodsucker/powers/recuperate.dm
+++ b/code/modules/antagonists/bloodsucker/powers/recuperate.dm
@@ -27,8 +27,9 @@
C.blood_volume -= 0.2
C.adjustStaminaLoss(-15)
// Stop Bleeding
- if(istype(H) && H.bleed_rate > 0 && rand(20) == 0)
- H.bleed_rate --
+ if(istype(H) && H.is_bleeding() && rand(20) == 0)
+ for(var/obj/item/bodypart/part in H.bodyparts)
+ part.generic_bleedstacks --
C.Jitter(5)
sleep(10)
// DONE!
diff --git a/code/modules/antagonists/bloodsucker/powers/trespass.dm b/code/modules/antagonists/bloodsucker/powers/trespass.dm
index c91b924bb7..56b72a562e 100644
--- a/code/modules/antagonists/bloodsucker/powers/trespass.dm
+++ b/code/modules/antagonists/bloodsucker/powers/trespass.dm
@@ -20,7 +20,7 @@
. = ..()
if(!.)
return
- if(owner.notransform || !get_turf(owner))
+ if(owner.mob_transforming || !get_turf(owner))
return FALSE
return TRUE
@@ -81,9 +81,7 @@
var/mist_delay = max(5, 20 - level_current * 2.5) // Level up and do this faster.
// Freeze Me
- user.next_move = world.time + mist_delay
user.Stun(mist_delay, ignore_canstun = TRUE)
- user.notransform = TRUE
user.density = FALSE
var/invis_was = user.invisibility
user.invisibility = INVISIBILITY_MAXIMUM
@@ -96,7 +94,6 @@
// Move & Freeze
if(isturf(target_turf))
do_teleport(owner, target_turf, no_effects=TRUE, channel = TELEPORT_CHANNEL_QUANTUM) // in teleport.dm?
- user.next_move = world.time + mist_delay / 2
user.Stun(mist_delay / 2, ignore_canstun = TRUE)
// Wait...
@@ -104,9 +101,7 @@
// Un-Hide & Freeze
user.dir = get_dir(my_turf, target_turf)
- user.next_move = world.time + mist_delay / 2
user.Stun(mist_delay / 2, ignore_canstun = TRUE)
- user.notransform = FALSE
user.density = 1
user.invisibility = invis_was
diff --git a/code/modules/antagonists/bloodsucker/powers/veil.dm b/code/modules/antagonists/bloodsucker/powers/veil.dm
index 422d645ad2..b170b9d442 100644
--- a/code/modules/antagonists/bloodsucker/powers/veil.dm
+++ b/code/modules/antagonists/bloodsucker/powers/veil.dm
@@ -101,7 +101,7 @@
H.update_hair()
H.update_body_parts()
- // Wait here til we deactivate power or go unconscious
+ // Wait here until we deactivate power or go unconscious
var/datum/antagonist/bloodsucker/bloodsuckerdatum = owner.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)
while (ContinueActive(owner) && istype(bloodsuckerdatum))//active && owner && owner.stat == CONSCIOUS)
bloodsuckerdatum.AddBloodVolume(-0.2)
diff --git a/code/modules/antagonists/changeling/cellular_emporium.dm b/code/modules/antagonists/changeling/cellular_emporium.dm
index b2c1a52a4a..6abefeefe7 100644
--- a/code/modules/antagonists/changeling/cellular_emporium.dm
+++ b/code/modules/antagonists/changeling/cellular_emporium.dm
@@ -16,7 +16,7 @@
/datum/cellular_emporium/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.always_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
- ui = new(user, src, ui_key, "cellular_emporium", name, 900, 480, master_ui, state)
+ ui = new(user, src, ui_key, "CellularEmporium", name, 900, 480, master_ui, state)
ui.open()
/datum/cellular_emporium/ui_data(mob/user)
diff --git a/code/modules/antagonists/changeling/changeling.dm b/code/modules/antagonists/changeling/changeling.dm
index 35639bfd97..d06ebe9d9d 100644
--- a/code/modules/antagonists/changeling/changeling.dm
+++ b/code/modules/antagonists/changeling/changeling.dm
@@ -20,6 +20,8 @@
var/datum/changelingprofile/first_prof = null
var/dna_max = 6 //How many extra DNA strands the changeling can store for transformation.
var/absorbedcount = 0
+ /// did we get succed by another changeling
+ var/hostile_absorbed = FALSE
var/trueabsorbs = 0//dna gained using absorb, not dna sting
var/chem_charges = 20
var/chem_storage = 75
@@ -397,20 +399,31 @@
escape_objective_possible = FALSE
break
var/changeling_objective = rand(1,3)
+ var/generic_absorb_objective = FALSE
+ var/multiple_lings = length(get_antag_minds(/datum/antagonist/changeling,TRUE)) > 1
switch(changeling_objective)
if(1)
- var/datum/objective/absorb/absorb_objective = new
- absorb_objective.owner = owner
- absorb_objective.gen_amount_goal(6, 8)
- objectives += absorb_objective
+ generic_absorb_objective = TRUE
if(2)
- var/datum/objective/absorb_changeling/ac = new
- ac.owner = owner
- objectives += ac
+ if(multiple_lings)
+ var/datum/objective/absorb_changeling/ac = new
+ ac.owner = owner
+ objectives += ac
+ else
+ generic_absorb_objective = TRUE
if(3)
- var/datum/objective/absorb_most/ac = new
- ac.owner = owner
- objectives += ac
+ if(multiple_lings)
+ var/datum/objective/absorb_most/ac = new
+ ac.owner = owner
+ objectives += ac
+ else
+ generic_absorb_objective = TRUE
+
+ if(generic_absorb_objective)
+ var/datum/objective/absorb/absorb_objective = new
+ absorb_objective.owner = owner
+ absorb_objective.gen_amount_goal(6, 8)
+ objectives += absorb_objective
if(prob(60))
if(prob(85))
diff --git a/code/modules/antagonists/changeling/powers/absorb.dm b/code/modules/antagonists/changeling/powers/absorb.dm
index 3e2ff6f3dd..208fefee70 100644
--- a/code/modules/antagonists/changeling/powers/absorb.dm
+++ b/code/modules/antagonists/changeling/powers/absorb.dm
@@ -92,7 +92,7 @@
var/datum/antagonist/changeling/target_ling = target.mind.has_antag_datum(/datum/antagonist/changeling)
- if(target_ling)//If the target was a changeling, suck out their extra juice and objective points!
+ if(target_ling && !target_ling.hostile_absorbed)//If the target was a changeling, suck out their extra juice and objective points!
to_chat(user, "[target] was one of us. We have absorbed their power.")
target_ling.remove_changeling_powers()
changeling.geneticpoints += round(target_ling.geneticpoints/2)
@@ -102,6 +102,7 @@
changeling.chem_storage += round(target_ling.chem_storage/2)
changeling.chem_charges += min(target_ling.chem_charges, changeling.chem_storage)
target_ling.chem_charges = 0
+ target_ling.hostile_absorbed = TRUE
target_ling.chem_storage = 0
changeling.absorbedcount += (target_ling.absorbedcount)
target_ling.stored_profiles.len = 1
diff --git a/code/modules/antagonists/changeling/powers/fleshmend.dm b/code/modules/antagonists/changeling/powers/fleshmend.dm
index afef2a10c7..0299abb09a 100644
--- a/code/modules/antagonists/changeling/powers/fleshmend.dm
+++ b/code/modules/antagonists/changeling/powers/fleshmend.dm
@@ -1,6 +1,6 @@
/obj/effect/proc_holder/changeling/fleshmend
name = "Fleshmend"
- desc = "Our flesh rapidly regenerates, healing our burns, bruises, and shortness of breath. Functions while unconscious. This ability is loud, and might cause our blood to react violently to heat."
+ desc = "Our flesh rapidly regenerates, healing our burns, bruises, and shortness of breath, as well as hiding all of our scars. Costs 20 chemicals."
helptext = "If we are on fire, the healing effect will not function. Does not regrow limbs or restore lost blood."
chemical_cost = 20
loudness = 2
diff --git a/code/modules/antagonists/changeling/powers/humanform.dm b/code/modules/antagonists/changeling/powers/humanform.dm
index 91119e1c06..c38bfe3b5b 100644
--- a/code/modules/antagonists/changeling/powers/humanform.dm
+++ b/code/modules/antagonists/changeling/powers/humanform.dm
@@ -21,7 +21,7 @@
var/datum/changelingprofile/chosen_prof = changeling.get_dna(chosen_name)
if(!chosen_prof)
return
- if(!user || user.notransform)
+ if(!user || user.mob_transforming)
return 0
to_chat(user, "We transform our appearance.")
diff --git a/code/modules/antagonists/changeling/powers/lesserform.dm b/code/modules/antagonists/changeling/powers/lesserform.dm
index 1f9ca0b3ff..f3690ef5c5 100644
--- a/code/modules/antagonists/changeling/powers/lesserform.dm
+++ b/code/modules/antagonists/changeling/powers/lesserform.dm
@@ -11,9 +11,9 @@
//Transform into a monkey.
/obj/effect/proc_holder/changeling/lesserform/sting_action(mob/living/carbon/human/user)
- if(!user || user.notransform)
+ if(!user || user.mob_transforming)
return 0
to_chat(user, "Our genes cry out!")
user.monkeyize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSE)
- return TRUE
\ No newline at end of file
+ return TRUE
diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm
index e4417a6d64..7d50374e96 100644
--- a/code/modules/antagonists/changeling/powers/mutations.dm
+++ b/code/modules/antagonists/changeling/powers/mutations.dm
@@ -165,6 +165,8 @@
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
sharpness = IS_SHARP
+ wound_bonus = -60
+ bare_wound_bonus = 20
var/can_drop = FALSE
var/fake = FALSE
total_mass = TOTAL_MASS_HAND_REPLACEMENT
diff --git a/code/modules/antagonists/changeling/powers/regenerate.dm b/code/modules/antagonists/changeling/powers/regenerate.dm
index 1b27fa9694..bcebd8c62e 100644
--- a/code/modules/antagonists/changeling/powers/regenerate.dm
+++ b/code/modules/antagonists/changeling/powers/regenerate.dm
@@ -29,6 +29,9 @@
C.emote("scream")
C.regenerate_limbs(1)
C.regenerate_organs()
+ for(var/i in C.all_wounds)
+ var/datum/wound/W = i
+ W.remove_wound()
if(!user.getorganslot(ORGAN_SLOT_BRAIN))
var/obj/item/organ/brain/B
if(C.has_dna() && C.dna.species.mutant_brain)
diff --git a/code/modules/antagonists/changeling/powers/revive.dm b/code/modules/antagonists/changeling/powers/revive.dm
index 6c2220648d..f193fb6736 100644
--- a/code/modules/antagonists/changeling/powers/revive.dm
+++ b/code/modules/antagonists/changeling/powers/revive.dm
@@ -36,9 +36,10 @@
. = ..()
if(!.)
return
-
- if(HAS_TRAIT(user, CHANGELING_DRAIN) || ((user.stat != DEAD) && !(HAS_TRAIT(user, TRAIT_DEATHCOMA))))
- var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling)
+ var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling)
+ if(!changeling)
+ return FALSE
+ if(changeling.hostile_absorbed || ((user.stat != DEAD) && !(HAS_TRAIT(user, TRAIT_DEATHCOMA))))
changeling.purchasedpowers -= src
return FALSE
diff --git a/code/modules/antagonists/changeling/powers/spiders.dm b/code/modules/antagonists/changeling/powers/spiders.dm
index 6bd15fea92..69900ea8f9 100644
--- a/code/modules/antagonists/changeling/powers/spiders.dm
+++ b/code/modules/antagonists/changeling/powers/spiders.dm
@@ -1,7 +1,7 @@
/obj/effect/proc_holder/changeling/spiders
name = "Spread Infestation"
desc = "Our form divides, creating arachnids which will grow into deadly beasts."
- helptext = "The spiders are thoughtless creatures, and may attack their creators when fully grown. Requires at least 3 DNA gained through Absorb, and not through DNA sting. This ability is very loud, and will guarantee that our blood will react violently to heat."
+ helptext = "The spiders are thoughtless creatures, and may attack their creators when fully grown. Requires at least 3 DNA gained through Absorb (regardless of current amount), and not through DNA sting. This ability is very loud, and will guarantee that our blood will react violently to heat."
chemical_cost = 45
dna_cost = 1
loudness = 4
diff --git a/code/modules/antagonists/changeling/powers/transform.dm b/code/modules/antagonists/changeling/powers/transform.dm
index 795ba772d6..8e3a36740b 100644
--- a/code/modules/antagonists/changeling/powers/transform.dm
+++ b/code/modules/antagonists/changeling/powers/transform.dm
@@ -17,8 +17,7 @@
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/item/clothing/glasses/changeling/attack_hand(mob/user)
+/obj/item/clothing/glasses/changeling/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling))
to_chat(user, "You reabsorb [src] into your body.")
qdel(src)
@@ -33,8 +32,7 @@
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/item/clothing/under/changeling/attack_hand(mob/user)
+/obj/item/clothing/under/changeling/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling))
to_chat(user, "You reabsorb [src] into your body.")
qdel(src)
@@ -50,8 +48,7 @@
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/item/clothing/suit/changeling/attack_hand(mob/user)
+/obj/item/clothing/suit/changeling/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling))
to_chat(user, "You reabsorb [src] into your body.")
qdel(src)
@@ -65,8 +62,7 @@
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/item/clothing/head/changeling/attack_hand(mob/user)
+/obj/item/clothing/head/changeling/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling))
to_chat(user, "You reabsorb [src] into your body.")
qdel(src)
@@ -81,8 +77,7 @@
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/item/clothing/shoes/changeling/attack_hand(mob/user)
+/obj/item/clothing/shoes/changeling/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling))
to_chat(user, "You reabsorb [src] into your body.")
qdel(src)
@@ -97,8 +92,7 @@
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/item/clothing/gloves/changeling/attack_hand(mob/user)
+/obj/item/clothing/gloves/changeling/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling))
to_chat(user, "You reabsorb [src] into your body.")
qdel(src)
@@ -113,8 +107,7 @@
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/item/clothing/mask/changeling/attack_hand(mob/user)
+/obj/item/clothing/mask/changeling/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling))
to_chat(user, "You reabsorb [src] into your body.")
qdel(src)
@@ -131,8 +124,7 @@
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/item/changeling/attack_hand(mob/user)
+/obj/item/changeling/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling))
to_chat(user, "You reabsorb [src] into your body.")
qdel(src)
diff --git a/code/modules/antagonists/clockcult/clock_effects/city_of_cogs_rift.dm b/code/modules/antagonists/clockcult/clock_effects/city_of_cogs_rift.dm
index 21d0035ef1..3ea4668df8 100644
--- a/code/modules/antagonists/clockcult/clock_effects/city_of_cogs_rift.dm
+++ b/code/modules/antagonists/clockcult/clock_effects/city_of_cogs_rift.dm
@@ -36,8 +36,7 @@
return
. = ..()
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/effect/clockwork/city_of_cogs_rift/attack_hand(atom/movable/AM)
+/obj/effect/clockwork/city_of_cogs_rift/on_attack_hand(atom/movable/AM)
beckon(AM)
/obj/effect/clockwork/city_of_cogs_rift/Bumped(atom/movable/AM)
diff --git a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm
index 036ea37ada..e579023a7a 100644
--- a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm
+++ b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm
@@ -27,8 +27,7 @@
/obj/effect/clockwork/sigil/attack_tk(mob/user)
return //you can't tk stomp sigils, but you can hit them with something
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/effect/clockwork/sigil/attack_hand(mob/user)
+/obj/effect/clockwork/sigil/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(iscarbon(user) && !user.stat)
if(is_servant_of_ratvar(user) && user.a_intent != INTENT_HARM)
return ..()
@@ -217,6 +216,20 @@
else if(get_clockwork_power())
to_chat(L, "You feel a slight, static shock.")
+/obj/effect/clockwork/sigil/transmission/process()
+ var/power_drained = 0
+ var/power_mod = 0.005
+ for(var/t in spiral_range_turfs(SIGIL_ACCESS_RANGE, src))
+ var/turf/T = t
+ for(var/M in T)
+ var/atom/movable/A = M
+ power_drained += A.power_drain(TRUE)
+
+ CHECK_TICK
+
+ adjust_clockwork_power(power_drained * power_mod * 15)
+ new /obj/effect/temp_visual/ratvar/sigil/transmission(loc, 1 + (power_drained * 0.0035))
+
/obj/effect/clockwork/sigil/transmission/proc/charge_cyborg(mob/living/silicon/robot/cyborg)
if(!cyborg_checks(cyborg))
return
diff --git a/code/modules/antagonists/clockcult/clock_effects/spatial_gateway.dm b/code/modules/antagonists/clockcult/clock_effects/spatial_gateway.dm
index 36aaa27716..00c52e4a59 100644
--- a/code/modules/antagonists/clockcult/clock_effects/spatial_gateway.dm
+++ b/code/modules/antagonists/clockcult/clock_effects/spatial_gateway.dm
@@ -14,6 +14,8 @@
var/uses = 1 //How many objects or mobs can go through the portal
var/obj/effect/clockwork/spatial_gateway/linked_gateway //The gateway linked to this one
var/timerid
+ var/is_stable = FALSE
+ var/busy = FALSE //If someone is already working on closing the gateway, only needed for stable gateways but in the parent to not need typecasting
/obj/effect/clockwork/spatial_gateway/Initialize()
. = ..()
@@ -31,11 +33,16 @@
clockwork_desc = "A gateway in reality. It can both send and receive objects."
else
clockwork_desc = "A gateway in reality. It can only [sender ? "send" : "receive"] objects."
- timerid = QDEL_IN(src, lifetime)
+ if(is_stable)
+ return
+ timerid = QDEL_IN(src, lifetime) //We only need this if the gateway is not stable
//set up a gateway with another gateway
/obj/effect/clockwork/spatial_gateway/proc/setup_gateway(obj/effect/clockwork/spatial_gateway/gatewayB, set_duration, set_uses, two_way)
- if(!gatewayB || !set_duration || !uses)
+ if(!gatewayB)
+ return FALSE
+
+ if((!set_duration || !uses) && !is_stable)
return FALSE
linked_gateway = gatewayB
gatewayB.linked_gateway = src
@@ -55,7 +62,7 @@
/obj/effect/clockwork/spatial_gateway/examine(mob/user)
. = ..()
if(is_servant_of_ratvar(user) || isobserver(user))
- . += "It has [uses] use\s remaining."
+ . += " [is_stable ? "It is stabilised and can be used as much as is neccessary." : "It has [uses] use\s remaining."]"
//ATTACK GHOST IGNORING PARENT RETURN VALUE
/obj/effect/clockwork/spatial_gateway/attack_ghost(mob/user)
@@ -63,8 +70,7 @@
user.forceMove(get_turf(linked_gateway))
..()
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/effect/clockwork/spatial_gateway/attack_hand(mob/living/user)
+/obj/effect/clockwork/spatial_gateway/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
if(!uses)
return FALSE
if(user.pulling && user.a_intent == INTENT_GRAB && isliving(user.pulling))
@@ -122,9 +128,9 @@
/obj/effect/clockwork/spatial_gateway/Bumped(atom/movable/AM)
..()
if(!QDELETED(AM))
- pass_through_gateway(AM, FALSE)
+ pass_through_gateway(AM)
-/obj/effect/clockwork/spatial_gateway/proc/pass_through_gateway(atom/movable/A, no_cost)
+/obj/effect/clockwork/spatial_gateway/proc/pass_through_gateway(atom/movable/A, no_cost = FALSE)
if(!linked_gateway)
qdel(src)
return FALSE
@@ -198,6 +204,10 @@
return procure_gateway(invoker, time_duration, gateway_uses, two_way)
var/istargetobelisk = istype(target, /obj/structure/destructible/clockwork/powered/clockwork_obelisk)
var/issrcobelisk = istype(src, /obj/structure/destructible/clockwork/powered/clockwork_obelisk)
+ if(!issrcobelisk && target.z != invoker.z && (is_reebe(invoker.z) || is_reebe(target.z)) && !GLOB.ratvar_awakens) //You need obilisks to get from and to reebe. Costs alot of power, unless you use stable gateways.
+ to_chat(invoker, "The distance between reebe and the mortal realm is far too vast to bridge with a gateway your slab can create, my child. \
+ Use an obilisk instead!")
+ return procure_gateway(invoker, time_duration, gateway_uses, two_way)
if(issrcobelisk)
if(!anchored)
to_chat(invoker, "[src] is no longer secured!")
@@ -218,12 +228,63 @@
gateway_uses = round(gateway_uses * (2 * efficiency), 1)
time_duration = round(time_duration * (2 * efficiency), 1)
CO.active = TRUE //you'd be active in a second but you should update immediately
- invoker.visible_message("The air in front of [invoker] ripples before suddenly tearing open!", \
- "With a word, you rip open a [two_way ? "two-way":"one-way"] rift to [input_target_key]. It will last for [DisplayTimeText(time_duration)] and has [gateway_uses] use[gateway_uses > 1 ? "s" : ""].")
- var/obj/effect/clockwork/spatial_gateway/S1 = new(issrcobelisk ? get_turf(src) : get_step(get_turf(invoker), invoker.dir))
- var/obj/effect/clockwork/spatial_gateway/S2 = new(istargetobelisk ? get_turf(target) : get_step(get_turf(target), target.dir))
+ if(issrcobelisk && istargetobelisk && src.z != target.z && (is_reebe(src.z) || is_reebe(target.z)))
+ invoker.visible_message("The air in front of [invoker] ripples before suddenly tearing open!", \
+ "With a word, you rip open a stable two-way rift between reebe and the mortal realm.")
+ var/obj/effect/clockwork/spatial_gateway/stable/stable_S1 = new(get_turf(src))
+ var/obj/effect/clockwork/spatial_gateway/stable/stable_S2 = new(get_turf(target))
+ stable_S1.setup_gateway(stable_S2)
+ stable_S2.visible_message("The air in front of [target] ripples before suddenly tearing open!")
+ else
+ invoker.visible_message("The air in front of [invoker] ripples before suddenly tearing open!", \
+ "With a word, you rip open a [two_way ? "two-way":"one-way"] rift to [input_target_key]. It will last for [DisplayTimeText(time_duration)] and has [gateway_uses] use[gateway_uses > 1 ? "s" : ""].")
+ var/obj/effect/clockwork/spatial_gateway/S1 = new(issrcobelisk ? get_turf(src) : get_step(get_turf(invoker), invoker.dir))
+ var/obj/effect/clockwork/spatial_gateway/S2 = new(istargetobelisk ? get_turf(target) : get_step(get_turf(target), target.dir))
- //Set up the portals now that they've spawned
- S1.setup_gateway(S2, time_duration, gateway_uses, two_way)
- S2.visible_message("The air in front of [target] ripples before suddenly tearing open!")
+ //Set up the portals now that they've spawned
+ S1.setup_gateway(S2, time_duration, gateway_uses, two_way)
+ S2.visible_message("The air in front of [target] ripples before suddenly tearing open!")
return TRUE
+
+//Stable Gateway: Used to travel to and from reebe without any further powercost. Needs a clockwork obilisk to keep active, but stays active as long as it is not deactivated via an null rod or a slab, or the obilisk is destroyed
+/obj/effect/clockwork/spatial_gateway/stable
+ name = "stable gateway"
+ is_stable = TRUE
+
+/obj/effect/clockwork/spatial_gateway/stable/ex_act(severity)
+ if(severity == 1)
+ start_shutdown() //Yes, you can chain devastation-level explosions to delay a gateway shutdown, if you somehow manage to do it without breaking the obelisk. Is it worth it? Probably not.
+ return TRUE
+ return FALSE
+
+/obj/effect/clockwork/spatial_gateway/stable/setup_gateway(obj/effect/clockwork/spatial_gateway/stable/gatewayB) //Reduced setup call due to some things being irrelevant for stable gateways
+ return ..(gatewayB, 1, 1, TRUE) //Uses and time irrelevant due to is_stable
+
+/obj/effect/clockwork/spatial_gateway/stable/attackby(obj/item/I, mob/living/user, params)
+ if(!istype(I, /obj/item/clockwork/slab) || !is_servant_of_ratvar(user) || busy)
+ return ..()
+ busy = TRUE
+ linked_gateway.busy = TRUE
+ user.visible_message("The rift begins to ripple as [user] points [user.p_their()] slab at it!", " You begin to shutdown the stabilised gateway with your slab.")
+ linked_gateway.visible_message("")
+ var/datum/beam/B = user.Beam(src, icon_state = "nzcrentrs_power", maxdistance = 50, time = 80) //Not too fancy, but this'll do.. for now.
+ if(do_after(user, 80, target = src)) //Eight seconds to initiate the closing, then another two before is closes.
+ to_chat(user, "You successfully set the gateway to shutdown in another two seconds.")
+ start_shutdown()
+ qdel(B)
+ busy = FALSE
+ linked_gateway.busy = FALSE
+ return TRUE
+
+/obj/effect/clockwork/spatial_gateway/stable/proc/start_shutdown()
+ deltimer(timerid)
+ deltimer(linked_gateway.timerid)
+ timerid = QDEL_IN(src, 20)
+ linked_gateway.timerid = QDEL_IN(linked_gateway, 20)
+ animate(src, alpha = 0, transform = matrix()*2, time = 20, flags = ANIMATION_END_NOW)
+ animate(linked_gateway, alpha = 0, transform = matrix()*2, time = 20, flags = ANIMATION_END_NOW)
+ src.visible_message("[src] begins to destabilise!")
+ linked_gateway.visible_message("[linked_gateway] begins to destabilise!")
+
+/obj/effect/clockwork/spatial_gateway/stable/pass_through_gateway(atom/movable/A, no_cost = TRUE)
+ return ..()
\ No newline at end of file
diff --git a/code/modules/antagonists/clockcult/clock_helpers/scripture_checks.dm b/code/modules/antagonists/clockcult/clock_helpers/scripture_checks.dm
index e5497d7c9f..66e20b6e87 100644
--- a/code/modules/antagonists/clockcult/clock_helpers/scripture_checks.dm
+++ b/code/modules/antagonists/clockcult/clock_helpers/scripture_checks.dm
@@ -38,10 +38,11 @@
set_slab.update_quickbind()
/proc/generate_all_scripture()
- if(!GLOB.all_scripture.len)
- for(var/V in sortList(subtypesof(/datum/clockwork_scripture), /proc/cmp_clockscripture_priority))
- var/datum/clockwork_scripture/S = new V
- GLOB.all_scripture[S.type] = S
+ if(GLOB.all_scripture.len)
+ return
+ for(var/V in sortList(subtypesof(/datum/clockwork_scripture) - list(/datum/clockwork_scripture/channeled, /datum/clockwork_scripture/create_object, /datum/clockwork_scripture/create_object/construct), /proc/cmp_clockscripture_priority))
+ var/datum/clockwork_scripture/S = new V
+ GLOB.all_scripture[S.type] = S
//changes construction value
/proc/change_construction_value(amount)
diff --git a/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm b/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm
index 81ad7ddc26..89ed669e7b 100644
--- a/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm
+++ b/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm
@@ -113,8 +113,7 @@
for(var/i in 1 to healseverity)
new /obj/effect/temp_visual/heal(targetturf, "#1E8CE1")
if(totaldamage)
- L.adjustBruteLoss(-brutedamage)
- L.adjustFireLoss(-burndamage)
+ L.heal_overall_damage(brutedamage, burndamage, only_organic = FALSE) //Maybe a machine god shouldn't murder augmented followers instead of healing them
L.adjustOxyLoss(-oxydamage)
L.adjustToxLoss(totaldamage * 0.5, TRUE, TRUE)
clockwork_say(ranged_ability_user, text2ratvar("[has_holy_water ? "Heal tainted" : "Mend wounded"] flesh!"))
diff --git a/code/modules/antagonists/clockcult/clock_items/clock_weapons/_call_weapon.dm b/code/modules/antagonists/clockcult/clock_items/clock_weapons/_call_weapon.dm
index 40aca961fc..a6f2ee6d90 100644
--- a/code/modules/antagonists/clockcult/clock_items/clock_weapons/_call_weapon.dm
+++ b/code/modules/antagonists/clockcult/clock_items/clock_weapons/_call_weapon.dm
@@ -29,7 +29,7 @@
owner.visible_message("[owner]'s [weapon.name] flickers and disappears!")
to_chat(owner, "You dismiss [weapon].")
QDEL_NULL(weapon)
- weapon_reset(RATVARIAN_SPEAR_COOLDOWN * 0.5)
+ weapon_reset(RATVARIAN_WEAPON_COOLDOWN * 0.5)
return
else
weapon.visible_message("[weapon] suddenly flickers and disappears!")
diff --git a/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_spear.dm b/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_spear.dm
index 234f0445e0..527745b81a 100644
--- a/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_spear.dm
+++ b/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_spear.dm
@@ -78,5 +78,5 @@
if(T) //make sure we're not in null or something
T.visible_message("[src] [pick("cracks in two and fades away", "snaps in two and dematerializes")]!")
new /obj/effect/temp_visual/ratvar/spearbreak(T)
- action.weapon_reset(RATVARIAN_SPEAR_COOLDOWN)
+ action.weapon_reset(RATVARIAN_WEAPON_COOLDOWN)
diff --git a/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm b/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm
index a4f8bf8062..d08caa39d7 100644
--- a/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm
+++ b/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm
@@ -8,7 +8,7 @@
resistance_flags = FIRE_PROOF | ACID_PROOF
flags_inv = HIDEEARS|HIDEHAIR|HIDEFACE|HIDESNOUT
mutantrace_variation = STYLE_MUZZLE
- armor = list("melee" = 50, "bullet" = 70, "laser" = -25, "energy" = 0, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
+ armor = list("melee" = 50, "bullet" = 70, "laser" = 0, "energy" = 0, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100, "magic" = 60, "wound" = 65)
/obj/item/clothing/head/helmet/clockwork/Initialize()
. = ..()
@@ -21,17 +21,17 @@
/obj/item/clothing/head/helmet/clockwork/ratvar_act()
if(GLOB.ratvar_awakens)
- armor = getArmor(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 100, bio = 100, rad = 100, fire = 100, acid = 100)
+ armor = getArmor(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 100, bio = 100, rad = 100, fire = 100, acid = 100, magic = 100, wound = 100)
clothing_flags |= STOPSPRESSUREDAMAGE
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
else if(GLOB.ratvar_approaches)
- armor = getArmor(melee = 70, bullet = 80, laser = -15, energy = 25, bomb = 70, bio = 0, rad = 0, fire = 100, acid = 100)
+ armor = getArmor(melee = 70, bullet = 80, laser = 10, energy = 25, bomb = 70, bio = 0, rad = 0, fire = 100, acid = 100,, magic = 70, wound = 75)
clothing_flags |= STOPSPRESSUREDAMAGE
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
else
- armor = getArmor(melee = 60, bullet = 70, laser = -25, energy = 0, bomb = 60, bio = 0, rad = 0, fire = 100, acid = 100)
+ armor = getArmor(melee = 60, bullet = 70, laser = 0, energy = 0, bomb = 60, bio = 0, rad = 0, fire = 100, acid = 100, magic = 60, wound = 65)
clothing_flags &= ~STOPSPRESSUREDAMAGE
max_heat_protection_temperature = initial(max_heat_protection_temperature)
min_cold_protection_temperature = initial(min_cold_protection_temperature)
@@ -68,7 +68,7 @@
cold_protection = CHEST|GROIN|LEGS
heat_protection = CHEST|GROIN|LEGS
resistance_flags = FIRE_PROOF | ACID_PROOF
- armor = list("melee" = 60, "bullet" = 70, "laser" = -25, "energy" = 0, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
+ armor = list("melee" = 60, "bullet" = 70, "laser" = 0, "energy" = 0, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100, "magic" = 60, "wound" = 65)
allowed = list(/obj/item/clockwork, /obj/item/clothing/glasses/wraith_spectacles, /obj/item/clothing/glasses/judicial_visor, /obj/item/mmi/posibrain/soul_vessel, /obj/item/reagent_containers/food/drinks/bottle/holyoil)
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_SNEK_TAURIC
@@ -83,17 +83,17 @@
/obj/item/clothing/suit/armor/clockwork/ratvar_act()
if(GLOB.ratvar_awakens)
- armor = getArmor(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 100, bio = 100, rad = 100, fire = 100, acid = 100)
+ armor = getArmor(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 100, bio = 100, rad = 100, fire = 100, acid = 100, magic = 100, wound = 100)
clothing_flags |= STOPSPRESSUREDAMAGE
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
else if(GLOB.ratvar_approaches)
- armor = getArmor(melee = 70, bullet = 80, laser = -15, energy = 25, bomb = 70, bio = 0, rad = 0, fire = 100, acid = 100)
+ armor = getArmor(melee = 70, bullet = 80, laser = 10, energy = 25, bomb = 70, bio = 0, rad = 0, fire = 100, acid = 100, magic = 70, wound = 75)
clothing_flags |= STOPSPRESSUREDAMAGE
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
else
- armor = getArmor(melee = 60, bullet = 70, laser = -25, energy = 0, bomb = 60, bio = 0, rad = 0, fire = 100, acid = 100)
+ armor = getArmor(melee = 60, bullet = 70, laser = 0, energy = 0, bomb = 60, bio = 0, rad = 0, fire = 100, acid = 100, magic = 60, wound = 65)
clothing_flags &= ~STOPSPRESSUREDAMAGE
max_heat_protection_temperature = initial(max_heat_protection_temperature)
min_cold_protection_temperature = initial(min_cold_protection_temperature)
@@ -135,7 +135,7 @@
siemens_coefficient = 0
permeability_coefficient = 0.05
resistance_flags = FIRE_PROOF | ACID_PROOF
- armor = list("melee" = 80, "bullet" = 70, "laser" = -25, "energy" = 0, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
+ armor = list("melee" = 80, "bullet" = 70, "laser" = 0, "energy" = 0, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100, "magic" = 70, "wound" = 85)
/obj/item/clothing/gloves/clockwork/Initialize()
. = ..()
@@ -153,7 +153,7 @@
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
else
- armor = getArmor(melee = 80, bullet = 70, laser = -25, energy = 0, bomb = 60, bio = 0, rad = 0, fire = 100, acid = 100)
+ armor = getArmor(melee = 80, bullet = 70, laser = 0, energy = 0, bomb = 60, bio = 0, rad = 0, fire = 100, acid = 100, magic = 70, wound = 85)
clothing_flags &= ~STOPSPRESSUREDAMAGE
max_heat_protection_temperature = initial(max_heat_protection_temperature)
min_cold_protection_temperature = initial(min_cold_protection_temperature)
diff --git a/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm b/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm
index 5837ac302d..04a8e92bb7 100644
--- a/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm
+++ b/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm
@@ -1,10 +1,10 @@
/obj/item/clockwork/slab //Clockwork slab: The most important tool in Ratvar's arsenal. Allows scripture recital, tutorials, and generates components.
name = "clockwork slab"
desc = "A strange metal tablet. A clock in the center turns around and around."
- clockwork_desc = "A link between you and the Celestial Derelict. It contains information, recites scripture, and is your most vital tool as a Servant. \
+ clockwork_desc = "A link between you and the Celestial Derelict. It contains information, recites scripture, and is your most vital tool as a Servant.\
It can be used to link traps and triggers by attacking them with the slab. Keep in mind that traps linked with one another will activate in tandem!"
- icon_state = "dread_ipad"
+ icon_state = "clockwork_slab"
lefthand_file = 'icons/mob/inhands/antag/clockwork_lefthand.dmi'
righthand_file = 'icons/mob/inhands/antag/clockwork_righthand.dmi'
var/inhand_overlay //If applicable, this overlay will be applied to the slab's inhand
@@ -15,16 +15,19 @@
var/busy //If the slab is currently being used by something
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/selected_scripture = SCRIPTURE_DRIVER
+ // var/selected_scripture = SCRIPTURE_DRIVER //handled UI side
var/obj/effect/proc_holder/slab/slab_ability //the slab's current bound ability, for certain scripture
- var/recollecting = FALSE //if we're looking at fancy recollection
+ var/recollecting = TRUE //if we're looking at fancy recollection. tutorial enabled by default
var/recollection_category = "Default"
- var/list/quickbound = list(/datum/clockwork_scripture/abscond, \
+ var/list/quickbound = list(/datum/clockwork_scripture/spatial_gateway, \
/datum/clockwork_scripture/ranged_ability/kindle, /datum/clockwork_scripture/ranged_ability/hateful_manacles) //quickbound scripture, accessed by index
var/maximum_quickbound = 5 //how many quickbound scriptures we can have
+ var/ui_x = 800
+ var/ui_z = 420
+
var/obj/structure/destructible/clockwork/trap/linking //If we're linking traps together, which ones we're doing
/obj/item/clockwork/slab/internal //an internal motor for mobs running scripture
@@ -54,8 +57,7 @@
to_chat(user, "[src] falls dark. It appears you weren't worthy.")
return ..()
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/item/clockwork/slab/debug/attack_hand(mob/living/user)
+/obj/item/clockwork/slab/debug/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
if(!is_servant_of_ratvar(user))
add_servant_of_ratvar(user)
return ..()
@@ -67,29 +69,32 @@
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 //three scriptures, plus a fabricator
- quickbound = list(/datum/clockwork_scripture/abscond, /datum/clockwork_scripture/create_object/replicant, /datum/clockwork_scripture/create_object/sigil_of_transmission, /datum/clockwork_scripture/create_object/stargazer)
+/obj/item/clockwork/slab/cyborg/engineer //six scriptures, plus a fabricator. Might revert this if its too OP, I just thought that engineering borgs should get the all the structures
+ quickbound = list(/datum/clockwork_scripture/spatial_gateway, /datum/clockwork_scripture/create_object/replicant, /datum/clockwork_scripture/create_object/sigil_of_transmission, /datum/clockwork_scripture/create_object/stargazer, \
+ /datum/clockwork_scripture/create_object/ocular_warden, /datum/clockwork_scripture/create_object/clockwork_obelisk, /datum/clockwork_scripture/create_object/mania_motor)
-/obj/item/clockwork/slab/cyborg/medical //five scriptures, plus a spear
- quickbound = list(/datum/clockwork_scripture/abscond, /datum/clockwork_scripture/ranged_ability/linked_vanguard, /datum/clockwork_scripture/ranged_ability/sentinels_compromise, \
- /datum/clockwork_scripture/create_object/vitality_matrix)
+/obj/item/clockwork/slab/cyborg/medical //six scriptures, plus a spear
+ quickbound = list(/datum/clockwork_scripture/spatial_gateway, /datum/clockwork_scripture/ranged_ability/linked_vanguard, /datum/clockwork_scripture/ranged_ability/sentinels_compromise, \
+ /datum/clockwork_scripture/create_object/vitality_matrix, /datum/clockwork_scripture/channeled/mending_mantra)
-/obj/item/clockwork/slab/cyborg/security //twoscriptures, plus a spear
- quickbound = list(/datum/clockwork_scripture/abscond, /datum/clockwork_scripture/ranged_ability/hateful_manacles, /datum/clockwork_scripture/ranged_ability/judicial_marker)
-
-/obj/item/clockwork/slab/cyborg/peacekeeper //two scriptures, plus a spear
- quickbound = list(/datum/clockwork_scripture/abscond, /datum/clockwork_scripture/ranged_ability/hateful_manacles, /datum/clockwork_scripture/ranged_ability/judicial_marker)
+/obj/item/clockwork/slab/cyborg/security //four scriptures, plus a spear
+ quickbound = list(/datum/clockwork_scripture/spatial_gateway, /datum/clockwork_scripture/channeled/volt_blaster, /datum/clockwork_scripture/ranged_ability/hateful_manacles, \
+ /datum/clockwork_scripture/ranged_ability/judicial_marker, /datum/clockwork_scripture/channeled/belligerent)
+/obj/item/clockwork/slab/cyborg/peacekeeper //four scriptures, plus a spear
+ quickbound = list(/datum/clockwork_scripture/spatial_gateway, /datum/clockwork_scripture/channeled/volt_blaster, /datum/clockwork_scripture/ranged_ability/hateful_manacles, \
+ /datum/clockwork_scripture/ranged_ability/judicial_marker, /datum/clockwork_scripture/channeled/belligerent)
+/*//this module was commented out so why wasn't this?
/obj/item/clockwork/slab/cyborg/janitor //six scriptures, plus a fabricator
- quickbound = list(/datum/clockwork_scripture/abscond, /datum/clockwork_scripture/create_object/replicant, /datum/clockwork_scripture/create_object/sigil_of_transgression, \
+ quickbound = list(/datum/clockwork_scripture/spatial_gateway, /datum/clockwork_scripture/create_object/replicant, /datum/clockwork_scripture/create_object/sigil_of_transgression, \
/datum/clockwork_scripture/create_object/stargazer, /datum/clockwork_scripture/create_object/ocular_warden, /datum/clockwork_scripture/create_object/mania_motor)
-
+*/
/obj/item/clockwork/slab/cyborg/service //six scriptures, plus xray vision
- quickbound = list(/datum/clockwork_scripture/abscond, /datum/clockwork_scripture/create_object/replicant,/datum/clockwork_scripture/create_object/stargazer, \
+ quickbound = list(/datum/clockwork_scripture/spatial_gateway, /datum/clockwork_scripture/create_object/replicant,/datum/clockwork_scripture/create_object/stargazer, \
/datum/clockwork_scripture/spatial_gateway, /datum/clockwork_scripture/create_object/clockwork_obelisk)
-/obj/item/clockwork/slab/cyborg/miner //two scriptures, plus a spear and xray vision
- quickbound = list(/datum/clockwork_scripture/abscond, /datum/clockwork_scripture/ranged_ability/linked_vanguard, /datum/clockwork_scripture/spatial_gateway)
+/obj/item/clockwork/slab/cyborg/miner //three scriptures, plus a spear and xray vision
+ quickbound = list(/datum/clockwork_scripture/spatial_gateway, /datum/clockwork_scripture/ranged_ability/linked_vanguard, /datum/clockwork_scripture/channeled/belligerent, /datum/clockwork_scripture/channeled/volt_blaster)
/obj/item/clockwork/slab/cyborg/access_display(mob/living/user)
if(!GLOB.ratvar_awakens)
@@ -146,8 +151,8 @@
if(!quickbound[i])
continue
var/datum/clockwork_scripture/quickbind_slot = quickbound[i]
- . += "Quickbind button: [initial(quickbind_slot.name)]."
- . += "Available power:[DisplayPower(get_clockwork_power())]."
+ . += "Quickbind button: [initial(quickbind_slot.name)]."
+ . += "Available power: [DisplayPower(get_clockwork_power())]."
//Slab actions; Hierophant, Quickbind
/obj/item/clockwork/slab/ui_action_click(mob/user, action)
@@ -165,18 +170,19 @@
user.emote("scream")
user.apply_damage(5, BURN, BODY_ZONE_L_ARM)
user.apply_damage(5, BURN, BODY_ZONE_R_ARM)
- return 0
+ return FALSE
if(!is_servant_of_ratvar(user))
to_chat(user, "The information on [src]'s display shifts rapidly. After a moment, your head begins to pound, and you tear your eyes away.")
- user.confused += 5
- user.dizziness += 5
- return 0
+ if(user.confused || user.dizziness)
+ user.confused += 5
+ user.dizziness += 5
+ return FALSE
if(busy)
to_chat(user, "[src] refuses to work, displaying the message: \"[busy]!\"")
- return 0
+ return FALSE
if(!no_cost && !can_recite_scripture(user))
to_chat(user, "[src] hums fitfully in your hands, but doesn't seem to do anything...")
- return 0
+ return FALSE
access_display(user)
/obj/item/clockwork/slab/AltClick(mob/living/user)
@@ -195,9 +201,7 @@
/obj/item/clockwork/slab/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.inventory_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
- ui = new(user, src, ui_key, "clockwork_slab", name, 800, 420, master_ui, state)
- ui.set_autoupdate(FALSE) //we'll update this occasionally, but not as often as possible
- ui.set_style("clockwork")
+ ui = new(user, src, ui_key, "ClockworkSlab", name, ui_x, ui_z, master_ui, state)
ui.open()
/obj/item/clockwork/slab/proc/recite_scripture(datum/clockwork_scripture/scripture, mob/living/user)
@@ -207,10 +211,12 @@
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)
- 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
+ if(initial_tier == SCRIPTURE_PERIPHERAL)
+ to_chat(user, "Nice try using href exploits")
+ return
+ 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
scripture_to_recite.slab = src
scripture_to_recite.invoker = user
@@ -218,26 +224,6 @@
return TRUE
-//Guide to Serving Ratvar
-/obj/item/clockwork/slab/proc/recollection()
- var/list/textlist = list("If you're seeing this, file a bug report.")
- if(GLOB.ratvar_awakens)
- textlist = list("")
- for(var/i in 1 to 100)
- textlist += "HONOR RATVAR "
- textlist += ""
- else
- textlist = list("
[text2ratvar("Purge all untruths and honor Engine.")]
\
- \
- NOTICE: This information is out of date. Read the Ark & You primer in your backpack or read the wiki page for current info. \
- \
- These pages serve as the archives of Ratvar, the Clockwork Justiciar. This section of your slab has information on being as a Servant, advice for what to do next, and \
- pointers for serving the master well. You should recommended that you check this area for help if you get stuck or need guidance on what to do next.
\
- \
- Disclaimer: Many objects, terms, and phrases, such as Servant, Cache, and Slab, are capitalized like proper nouns. This is a quirk of the Ratvarian language; \
- do not let it confuse you! You are free to use the names in pronoun form when speaking in normal languages. ")
- return textlist.Join()
-
//Gets text for a certain section. "Default" is used for when you first open Recollection.
//Current sections (make sure to update this if you add one:
//- Basics
@@ -246,255 +232,97 @@
//- Scripture
//- Power
//- Conversion
-/obj/item/clockwork/slab/proc/get_recollection_text(section)
- var/list/dat = list()
- switch(section)
- if("Default")
- dat += "You can browse the above sections as you please. They're designed to be read in order, but feel free to pick and choose between them."
- if("Getting Started")
- dat += "Getting Started
"
- dat += "Welcome, Servant! This section houses the utmost basics of being a Servant of Ratvar, and is much more informal than the other sections. Being a Servant of \
- Ratvar is a very complex role, with many systems, objects, and resources to use effectively and creatively.
"
- dat += "This section of your clockwork slab covers everything that Servants have to be aware of, but is a long read because of how in-depth the systems are. Knowing \
- how to use the tools at your disposal makes all the difference between a clueless Servant and a great one.
"
- dat += "If this is your first time being a Servant, relax. It's very much possible that you'll fail, but it's impossible to learn without making mistakes. For the time \
- being, use the Hierophant Network button in the top left-hand corner of your screen to try and get in touch with your fellow Servants; ignore the others for now. This button \
- will let you send messages across space and time to all other Servants. This makes it great for coordinating, and you should use it often! Note: Using \
- this will cause you to whisper your message aloud, so doing so in a public place is very suspicious and you should try to restrict it to private use.
"
- dat += "If you aren't willing or don't have the time to read through every section, you can still help your teammates! Ask if they've set up a base. If they have, head there \
- and ask however you can help; chances are there's always something. If not, it's your job as a Servant to get one up and running! Try to find a secluded, low-traffic area, \
- like the auxiliary base or somewhere deep in maintenance. You'll want to go into the Drivers section of the slab and look for Tinkerer's Cache. Find a nice spot and \
- create one. This serves as a storage for components, the cult's primary resource. (Your slab's probably produced a few by now.) By attacking that cache with this \
- slab, you'll offload all your components into it, and all Servants will be able to use those components from any distance - all Tinkerer's Caches are linked!
"
- dat += "Once you have a base up and running, contact your fellows and let them know. You should come back here often to drop off the slab's components, and your fellows \
- should do the same, either in this cache or in ones of their own.
"
- dat += "If you think you're confident in taking further steps to help the cult, feel free to move onto the other sections. If not, let your allies know that you're new and \
- would appreciate the help they might offer you. Most experienced Servants would be happy to help; if everyone is inexperienced, then you'll have to step out of your comfort \
- zone and read onto the other sections. It's very likely that you might fail, but don't worry too much about it; you can't learn effectively without making mistakes.
"
- dat += "For now, welcome! If you're looking to learn, you should start with the Basics section, then move onto Components and Scripture. At the very \
- least, you should read the Conversion section, as it outlines the most important aspects of being a Servant. Good luck!
"
- dat += "-=-=-=-=-=-"
- if("Basics")
- dat += "Servant Basics
"
- dat += "The first thing any Servant should know is their slab, inside and out. The clockwork slab is by far your most important tool. It allows you to speak with your \
- fellow Servants, create components that fuel many of your abilities, use those abilities, and should be kept safe and hidden on your person at all times. If you have not \
- done so already, it's a good idea to check for any fellow Servants using the Hierophant Network button in the top-left corner of your screen; due to the cult's nature, \
- teamwork is an instrumental component of your success.
" //get it? component? ha!
- dat += "As a Servant of Ratvar, the tools you are given focus around building and maintaining bases and outposts. A great deal of your power comes from stationary \
- structures, and without constructing a base somewhere, it's essentially impossible to succeed. Finding a good spot to build a base can be difficult, and it's recommended \
- that you choose an area in low-traffic part of the station (such as the auxiliary base). Make sure to disconnect any cameras in the area beforehand.
"
- dat += "Because of how complex being a Servant is, it isn't possible to fit much information into this section. It's highly recommended that you read the Components \
- and Scripture sections next. Not knowing how these two systems work will cripple both you and your fellows, and lead to a frustrating experience for everyone.
"
- dat += "-=-=-=-=-=-"
- if("Terminology")
- dat += "Common Servant Terminology "
- dat += "This isn't intended to be read all at once; you are advised to treat it moreso as a glossary.
"
- dat += "General "
- dat += "Servant: A person or robot who serves Ratvar. You are one of these. "
- dat += "Cache: A Tinkerer's Cache, which is a structure that stores and creates components. "
- dat += "CV: Construction Value. All clockwork structures, floors, and walls increase this number. "
- dat += "Vitality: Used for healing effects, produced by Ratvarian spear attacks and Vitality Matrices. "
- dat += "Geis: An important scripture used to make normal crew and robots into Servants of Ratvar. "
- dat += "Ark: The cult's win condition, a huge structure that needs to be defended.
"
- dat += "Items "
- dat += "Slab: A clockwork slab, a Servant's most important tool. You're holding one! Keep it safe and hidden. "
- dat += "Visor: A judicial visor, which is a pair of glasses that can smite an area for a brief stun and delayed explosion. "
- dat += "Wraith Specs: Wraith spectacles, which provide true sight (X-ray, night vision) but damage the wearer's eyes. "
- dat += "Spear: A Ratvarian spear, which is a very powerful melee weapon that produces Vitality. "
- dat += "Fabricator: A replica fabricator, which converts objects into clockwork versions.
"
- dat += "Constructs "
- dat += "Marauder: A clockwork marauder, which is a powerful bodyguard that hides in its owner.
"
- dat += "Structures (* = requires power) "
- dat += "Warden: An ocular warden, which is a ranged turret that damages non-Servants that see it. "
- dat += "Prism*: A prolonging prism, which delays the shuttle for two minutes at a huge power cost.
"
- dat += "Motor*: A mania motor, which serves as area-denial through negative effects and eventual conversion. "
- dat += "Daemon*: A tinkerer's daemon, which quickly creates components. "
- dat += "Obelisk*: A clockwork obelisk, which can broadcast large messages and allows limited teleportation. "
- dat += "Sigils "
- dat += "Note: Sigils can be stacked on top of one another, making certain sigils very effective when paired! "
- dat += "Transgression: Stuns the first non-Servant to cross it for ten seconds and blinds others nearby. Disappears on use. "
- dat += "Submission: Converts the first non-Servant to stand on the sigil for seven seconds. Disappears on use. "
- dat += "Matrix: Drains health from non-Servants, producing Vitality. Can heal and revive Servants. "
- dat += "Accession: Identical to the Sigil of Submission, but doesn't disappear on use. It can also convert a single mindshielded target, but will disappear after doing this. "
- dat += "Transmission: Drains and stores power for clockwork structures. Feeding it brass sheets will create additional power.
"
- dat += "-=-=-=-=-=-"
- if("Components")
- dat += "Components & Their Uses
"
- dat += "Components are your primary resource as a Servant. There are five types of component, with each one being used in different roles:
"
- dat += "Although this is a good rule of thumb, their effects become much more nuanced when used together. For instance, a turret might have both belligerent eyes and \
- vanguard cogwheels as construction requirements, because it defends its allies by harming its enemies.
"
- dat += "Components' primary use is fueling scripture (covered in its own section), and they can be created through various ways. This clockwork slab, for instance, \
- will make a random component of every type - or a specific one, if you choose a target component from the interface - every remove me already. This number will increase \
- as the amount of Servants in the covenant increase; additionally, slabs can only produce components when held by a Servant, and holding more than one slab will cause both \
- of them to halt progress until one of them is removed from their person.
"
- dat += "Your slab has an internal storage of components, but it isn't meant to be the main one. Instead, there's a global storage of components that can be \
- added to through various ways. Anything that needs components will first draw them from the global storage before attempting to draw them from the slab. Most methods of \
- component production add to the global storage. You can also offload components from your slab into the global storage by using it on a Tinkerer's Cache, a structure whose \
- primary purpose is to do just that (although it will also slowly produce components when placed near a brass wall.)
"
- dat += "-=-=-=-=-=-"
- if("Scripture")
- dat += "The Ancient Scripture
"
- dat += "If you have experience with the Nar'Sian cult (or the \"blood cult\") then you will know of runes. They are the manifestations of the Geometer's power, and where most \
- of the cult's supernatural ability comes from. The Servant equivalent of runes is called scripture, and unlike runes, scripture is loaded into your clockwork slab.
"
- dat += "Each piece of scripture has widely-varying effects. Your most important scripture, Geis, is obvious and suspicious, but charges your slab with energy and allows \
- you to attack a non-Servant in melee range to restrain them and begin converting them into a Servant. This is just one example; each piece of scripture can be simple or \
- complex, be obvious or have hidden mechanics that can only be found through trial and error.
"
- dat += "Any given piece of scripture has a component cost listed in its \"Recite\" button. The acronyms for the components should be obvious if you've read about components \
- already; reciting this piece of scripture will consume the listed components, first from the global storage and then from your slab. Note that failing to recite a piece of \
- scripture will not consume the components required to recite it.
"
- dat += "It should also be noted that some scripture cannot be recited alone. Especially with more powerful scripture, you may need multiple Servants to recite a piece of \
- scripture; both of you will need to stand still until the recital completes. Only human and silicon Servants are valid for scripture recital! Constructs cannot help \
- in reciting scripture.
"
- dat += "Finally, scripture is separated into three \"tiers\" based on power: Drivers, Scripts, and Applications.[prob(1) ? " (The Revenant tier was removed a long time ago. \
- Get with the times.)" : ""] You can view the requirements to unlock each tier in its scripture list. Once a tier is unlocked, it's unlocked permanently; the cult only needs to fill the \
- requirement for unlocking a tier once!
"
- dat += "-=-=-=-=-=-"
- if("Power")
- dat += "Power! Unlimited Power!
"
- dat += "In the early stages of the cult, the only resource that must be actively worried about is components. However, as new scripture is unlocked, a new resource \
- becomes necessary: power. Almost all clockwork structures require power to function in some way. There is nothing special about this power; it's mere electricity, \
- and can be harnessed in several ways.
"
- dat += "To begin with, if there is no other source of power nearby, structures will draw from the area's APC, assuming it has one. This is inefficient and ill-advised as \
- anything but a last resort. Instead, it is recommended that a Sigil of Transmission is created. This sigil serves as both battery and power generator for nearby clockwork \
- structures, and those structures will happily draw power from the sigil before they resort to APCs.
"
- dat += "Generating power is less easy. The most reliable and efficient way is using brass sheets; attacking a sigil of transmission with brass sheets will convert them \
- to power, at a rate of [DisplayPower(POWER_FLOOR)] per sheet. (Brass sheets are created from replica fabricators, which are explained more in detail in the Conversion section.) \
- Activating a sigil of transmission will also cause it to drain power from the nearby area, which, while effective, serves as an obvious tell that there is something wrong.
"
- dat += "Without power, many structures will not function, making a base vulnerable to attack. For this reason, it is critical that you keep an eye on your power reserves and \
- ensure that they remain comfortably high.
"
- dat += "-=-=-=-=-=-"
- if("Conversion")
- dat += "Growing the Ranks
"
- dat += "Because the Servants of Ratvar are a cult, the main method to gain more power is to \"enlighten\" normal crew into new Servants. When a crewmember is converted, \
- they become a full-fledged Servant, ready and willing to serve the cause of Ratvar. It should also be noted that silicon crew, such as cyborgs and the AI, can be \
- converted just like normal crew and will gain special abilities; this is covered later. This section will also cover converting the station's structure itself; walls, \
- floors, windows, tables, and other objects can all be converted into clockwork versions, and serve an important purpose.
"
- dat += "A Note on Geis: There are several ways to convert humans and silicons. However, the most important tool to making them work is \
- Geis, a Driver-tier scripture. Using it whispers an invocation very quickly and charges your slab with power. In addition to making the slab visible in your hand, \
- you can now use it on a target within melee range to bind and mute them. It is by far your most reliable tool for capturing potential converts and targets, though it is incredibly \
- obvious. In addition, you are unable to take any actions other than moving while your target is bound. The binding will last for 25 seconds and mute for about 13 seconds, though \
- allies can use Geis to refresh these effects.
"
- dat += "Converting: The two methods of conversion are the sigil of submission, whose purpose is to do so, and the mania motor. \
- The sigil of submission is a sigil that, when stood on by a non-Servant for eight seconds, will convert that non-Servant. This is the only practical way to convert targets. \
- Sigils of submission are cheap, early, and permanent! Make sure sigils of submission are placed only in bases or otherwise hidden spots, or with a sigil of transgression on them. \
- The mania motor, however, is generally unreliable and unlocked later, only converting those who stand near it for an extended period.
"
- dat += "Converting Humans: For obvious reasons, humans are the most common conversion target. Because every crew member is different, and \
- may be armed with different equipment, you should take precautions to ensure that they aren't able to resist. If able, removing a headset is essential, as is restraining \
- them through handcuffs, cable ties, or other restraints. Some crew, like security, are also implanted with mindshield implants; these will prevent conversion and must be \
- surgically removed before they are an eligible convert. Note: The captain is never an eligible convert and should instead be killed or imprisoned. If security \
- begins administering mindshield implants, this will greatly inhibit conversion. Also note that mindshield implants can be broken by a sigil of accession automatically, but \
- the sigil will disappear.
"
- dat += "Converting Silicons: Due to their robotic nature, silicons are generally more predictable than humans in terms of conversion. \
- However, they are also much, much harder to subdue, especially cyborgs. The easiest way to convert a cyborg is by using Geis to restrain them, then dragging them to a sigil \
- of submission. If you stack a sigil of transgression and a sigil of submission, a crossing cyborg will be stunned and helpless to escape before they are converted.
"
- dat += "Converting AIs is very often the hardest task of the cult, and has been the downfall of countless successful Servants. Their omnipresence across the station, \
- coupled with their secure location and ability to lock themselves securely, makes them a powerful target. However, once the AI itself is reached, it is usually completely \
- helpless to resist its own conversion. A very common tactic is to take advantage of a converted cyborg to rush the AI before it is able to react.
"
- dat += "Even once an AI is converted, care must be taken to ensure that it remains hidden. Not only does the AI's core become brassy and thus obvious to an outside \
- observer, but the AI loses the ability to speak in anything but Ratvarian. For this reason, it has to remain completely silent over common radio channels if stealth \
- is at all a priority. This is suspicious and will rapidly lead to the crew checking on it, which usually results in the cult's outing. It is, however, necessary to convert \
- all AIs present on the station before the Ark becomes invokable, so this must be done at some point.
"
- dat += "Converting the Station: Converted objects all serve a purpose and are important to the cult's success. To convert objects, \
- a Servant needs to use a replica fabricator, a handheld tool that uses power to replace objects with clockwork versions. Different clockwork objects have different \
- effects and are often crucial. The most noteworthy are clockwork walls, which automatically \"link\" to any nearby Tinkerer's Caches, causing them to slowly \
- generate components. This is incredibly useful for obvious reasons, and creating a clockwork wall near every Tinkerer's Cache should be prioritized. Clockwork floors \
- will slowly heal any toxin damage suffered by Servants standing on them, and clockwork airlocks can only be opened by Servants.
"
- dat += "The replica fabricator itself is also worth noting. In addition to replacing objects, it can also create brass sheets at the cost of power by using the \
- fabricator in-hand. It can also be used to repair any damaged clockwork structures.
"
- dat += "Replacing objects is almost as, if not as important as, converting new Servants. A base is impossible to manage without clockwork walls at the very least, and \
- once the cult has been outed and the crew are actively searching, there is little reason not to use as many as possible.
"
- dat += "-=-=-=-=-=-"
- else
- dat += "404: [section ? section : "Section"] Not Found!
\
- One of the cogscarabs must've misplaced this section, because the game wasn't able to find any info regarding it. Report this to the coders!"
- return "
[dat.Join()]
"
-
-//Gets the quickbound scripture as a text block.
-/obj/item/clockwork/slab/proc/get_recollection_quickbinds()
- var/list/dat = list()
- dat += "Quickbound Scripture \
- You can have up to five scriptures bound to action buttons for easy use.
"
- if(LAZYLEN(quickbound))
- for(var/i in 1 to maximum_quickbound)
- if(LAZYLEN(quickbound) < i || !quickbound[i])
- dat += "A Quickbind slot, currently set to Nothing. "
- else
- var/datum/clockwork_scripture/quickbind_slot = quickbound[i]
- dat += "A Quickbind slot, currently set to [initial(quickbind_slot.name)]. "
- return dat.Join()
-
/obj/item/clockwork/slab/ui_data(mob/user) //we display a lot of data via TGUI
- var/list/data = list()
- data["power"] = "[DisplayPower(get_clockwork_power())] power is available for scripture and other consumers."
-
- switch(selected_scripture) //display info based on selected scripture tier
- if(SCRIPTURE_DRIVER)
- data["tier_info"] = "These scriptures are permanently unlocked."
- if(SCRIPTURE_SCRIPT)
- if(SSticker.scripture_states[SCRIPTURE_SCRIPT])
- data["tier_info"] = "These scriptures are permanently unlocked."
- else
- data["tier_info"] = "These scriptures will automatically unlock when the Ark is halfway ready or if [DisplayPower(SCRIPT_UNLOCK_THRESHOLD)] of power is reached."
- if(SCRIPTURE_APPLICATION)
- if(SSticker.scripture_states[SCRIPTURE_APPLICATION])
- data["tier_info"] = "These scriptures are permanently unlocked."
- else
- data["tier_info"] = "Unlock these optional scriptures by converting another servant or if [DisplayPower(APPLICATION_UNLOCK_THRESHOLD)] of power is reached.."
-
- data["selected"] = selected_scripture
- data["scripturecolors"] = "Scriptures in yellow are related to construction and building. \
- Scriptures in red are related to attacking and offense. \
- Scriptures in blue are related to healing and defense. \
- Scriptures in purple are niche but still important! \
- Scriptures with italicized names are important to success."
- generate_all_scripture()
-
- data["scripture"] = list()
+ . = list()
+ .["recollection"] = recollecting
+ .["power"] = DisplayPower(get_clockwork_power())
+ .["power_unformatted"] = get_clockwork_power()
+ // .["rec_text"] = recollection() handled TGUI side
+ .["HONOR_RATVAR"] = GLOB.ratvar_awakens
+ .["scripture"] = list()
for(var/s in GLOB.all_scripture)
var/datum/clockwork_scripture/S = GLOB.all_scripture[s]
- if(S.tier == selected_scripture) //display only scriptures of the selected tier
- var/scripture_color = get_component_color_bright(S.primary_component)
- var/list/temp_info = list("name" = "[S.name]",
- "descname" = "([S.descname])",
- "tip" = "[S.desc]\n[S.usage_tip]",
- "required" = "([DisplayPower(S.power_cost)][S.special_power_text ? "+ [replacetext(S.special_power_text, "POWERCOST", "[DisplayPower(S.special_power_cost)]")]" : ""])",
- "type" = "[S.type]",
- "quickbind" = S.quickbind)
- if(S.important)
- temp_info["name"] = "[temp_info["name"]]"
- var/found = quickbound.Find(S.type)
- if(found)
- temp_info["bound"] = "[found]"
- if(S.invokers_required > 1)
- temp_info["invokers"] = "Invokers: [S.invokers_required]"
- data["scripture"] += list(temp_info)
- data["recollection"] = recollecting
- if(recollecting)
- data["recollection_categories"] = GLOB.ratvar_awakens ? list() : list(\
- list("name" = "Getting Started", "desc" = "First-time servant? Read this first."), \
- list("name" = "Basics", "desc" = "A primer on how to play as a servant."), \
- list("name" = "Terminology", "desc" = "Common acronyms, words, and terms."), \
- list("name" = "Components", "desc" = "Information on components, your primary resource."), \
- list("name" = "Scripture", "desc" = "Information on scripture, ancient tools used by the cult."), \
- list("name" = "Power", "desc" = "The power system that certain objects use to function."), \
- list("name" = "Conversion", "desc" = "Converting the crew, cyborgs, and very walls to your cause."), \
- )
- data["rec_text"] = recollection()
- data["rec_section"] = GLOB.ratvar_awakens ? "" : get_recollection_text(recollection_category)
- data["rec_binds"] = GLOB.ratvar_awakens ? "" : get_recollection_quickbinds()
- return data
+ if(S.tier == SCRIPTURE_PERIPHERAL) //yes, tiers are the tabs.
+ continue
+
+ var/list/data = list()
+ data["name"] = S.name
+ data["descname"] = S.descname
+ data["tip"] = "[S.desc]\n[S.usage_tip]"
+ data["required"] = "([DisplayPower(S.power_cost)][S.special_power_text ? "+ [replacetext(S.special_power_text, "POWERCOST", "[DisplayPower(S.special_power_cost)]")]" : ""])"
+ data["required_unformatted"] = S.power_cost
+ data["type"] = "[S.type]"
+ data["quickbind"] = S.quickbind //this is if it cant quickbind
+ data["fontcolor"] = get_component_color_bright(S.primary_component)
+ data["important"] = S.important //italic!
+
+ var/found = quickbound.Find(S.type)
+ if(found)
+ data["bound"] = found //number (pos) on where is it on the list
+ if(S.invokers_required > 1)
+ data["invokers"] = "Invokers: [S.invokers_required]"
+
+ .["rec_binds"] = list()
+ for(var/i in 1 to maximum_quickbound)
+ if(GLOB.ratvar_awakens)
+ return
+ if(LAZYLEN(quickbound) < i || !quickbound[i])
+ .["rec_binds"] += list(list())
+ else
+ var/datum/clockwork_scripture/quickbind_slot = quickbound[i]
+ .["rec_binds"] += list(list(
+ "name" = initial(quickbind_slot.name),
+ "color" = get_component_color_bright(initial(quickbind_slot.primary_component))
+ ))
+
+ .["scripture"][S.tier] += list(data)
+
+/obj/item/clockwork/slab/ui_static_data(mob/user)
+ . = list()
+ .["tier_infos"] = list()
+ .["tier_infos"][SCRIPTURE_DRIVER] = list(
+ "requirement" = "None, this is already unlocked",
+ "ready" = TRUE //to bold it on JS side, and to say "These scriptures are permanently unlocked."
+ )
+ .["tier_infos"][SCRIPTURE_SCRIPT] = list(
+ "requirement" = "These scriptures will automatically unlock when the Ark is halfway ready or if [DisplayPower(SCRIPT_UNLOCK_THRESHOLD)] of power is reached.",
+ "ready" = SSticker.scripture_states[SCRIPTURE_SCRIPT] //huh, on the gamemode ticker? okay...
+ )
+ .["tier_infos"][SCRIPTURE_APPLICATION] = list(
+ "requirement" = "Unlock these optional scriptures by converting another servant or if [DisplayPower(APPLICATION_UNLOCK_THRESHOLD)] of power is reached..",
+ "ready" = SSticker.scripture_states[SCRIPTURE_APPLICATION]
+ )
+ .["tier_infos"][SCRIPTURE_JUDGEMENT] = list(
+ "requirement" = "Unlock powerful equipment and structures by converting five servants or if [DisplayPower(JUDGEMENT_UNLOCK_THRESHOLD)] of power is reached..",
+ "ready" = SSticker.scripture_states[SCRIPTURE_JUDGEMENT]
+ )
+
+ // .["selected"] = selected_scripture
+ generate_all_scripture()
+ .["recollection_categories"] = GLOB.ratvar_awakens ? list() : list(
+ list("name" = "Getting Started", "desc" = "First-time servant? Read this first."),
+ list("name" = "Basics", "desc" = "A primer on how to play as a servant."),
+ list("name" = "Terminology", "desc" = "Common acronyms, words, and terms."),
+ list("name" = "Components", "desc" = "Information on components, your primary resource."),
+ list("name" = "Scripture", "desc" = "Information on scripture, ancient tools used by the cult."),
+ list("name" = "Power", "desc" = "The power system that certain objects use to function."),
+ list("name" = "Conversion", "desc" = "Converting the crew, cyborgs, and very walls to your cause.")
+ )
+ // .["rec_section"]["title"] //this is here if ever we decided to return these back.
+ // .["rec_section"]["info"]// wall of info for the thing
/obj/item/clockwork/slab/ui_act(action, params)
switch(action)
if("toggle")
recollecting = !recollecting
if("recite")
- INVOKE_ASYNC(src, .proc/recite_scripture, text2path(params["category"]), usr, FALSE)
- if("select")
- selected_scripture = params["category"]
+ INVOKE_ASYNC(src, .proc/recite_scripture, text2path(params["script"]), usr, FALSE)
if("bind")
- var/datum/clockwork_scripture/path = text2path(params["category"]) //we need a path and not a string
+ var/datum/clockwork_scripture/path = text2path(params["script"]) //we need a path and not a string
+ if(!ispath(path, /datum/clockwork_scripture) || !initial(path.quickbind) || initial(path.tier) == SCRIPTURE_PERIPHERAL) //fuck you href bus
+ to_chat(usr, "Nice try using href exploits")
+ return
var/found_index = quickbound.Find(path)
if(found_index) //hey, we already HAVE this bound
if(LAZYLEN(quickbound) == found_index) //if it's the last scripture, remove it instead of leaving a null
@@ -512,8 +340,8 @@
quickbind_to_slot(path, target_index)
if("rec_category")
recollection_category = params["category"]
- ui_interact(usr)
- return 1
+ update_static_data()
+ return TRUE
/obj/item/clockwork/slab/proc/quickbind_to_slot(datum/clockwork_scripture/scripture, index) //takes a typepath(typecast for initial()) and binds it to a slot
if(!ispath(scripture) || !scripture || (scripture in quickbound))
@@ -541,4 +369,4 @@
Q.button_icon_state = quickbind_slot.name
Q.UpdateButtonIcon()
if(isliving(loc))
- Q.Grant(loc)
+ Q.Grant(loc)
\ No newline at end of file
diff --git a/code/modules/antagonists/clockcult/clock_items/construct_chassis.dm b/code/modules/antagonists/clockcult/clock_items/construct_chassis.dm
index 43c05b8556..19c29762bf 100644
--- a/code/modules/antagonists/clockcult/clock_items/construct_chassis.dm
+++ b/code/modules/antagonists/clockcult/clock_items/construct_chassis.dm
@@ -31,8 +31,7 @@
. = ..()
clockwork_desc = initial(clockwork_desc)
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/item/clockwork/construct_chassis/attack_hand(mob/living/user)
+/obj/item/clockwork/construct_chassis/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
if(w_class >= WEIGHT_CLASS_HUGE)
to_chat(user, "[src] is too cumbersome to carry! Drag it around instead!")
return
diff --git a/code/modules/antagonists/clockcult/clock_items/integration_cog.dm b/code/modules/antagonists/clockcult/clock_items/integration_cog.dm
index 0ce70336fe..ab8e30c8bb 100644
--- a/code/modules/antagonists/clockcult/clock_items/integration_cog.dm
+++ b/code/modules/antagonists/clockcult/clock_items/integration_cog.dm
@@ -30,6 +30,7 @@
var/obj/item/stock_parts/cell/cell = apc.cell
if(cell && (cell.charge / cell.maxcharge > COG_MAX_SIPHON_THRESHOLD))
cell.use(1)
+ apc.cog_drained++
adjust_clockwork_power(2) //Power is shared, so only do it once; this runs very quickly so it's about 10 W/second
else
adjust_clockwork_power(1) //Continue generating power when the cell has run dry; 5 W/second
diff --git a/code/modules/antagonists/clockcult/clock_mobs/_eminence.dm b/code/modules/antagonists/clockcult/clock_mobs/_eminence.dm
index faa5e025ca..2f6a018a4c 100644
--- a/code/modules/antagonists/clockcult/clock_mobs/_eminence.dm
+++ b/code/modules/antagonists/clockcult/clock_mobs/_eminence.dm
@@ -114,24 +114,27 @@
superheat_wall(A)
return
if(modifiers["middle"] || modifiers["ctrl"])
- issue_command(A)
+ INVOKE_ASYNC(src, .proc/issue_command, A)
return
if(GLOB.ark_of_the_clockwork_justiciar == A)
var/obj/structure/destructible/clockwork/massive/celestial_gateway/G = GLOB.ark_of_the_clockwork_justiciar
- if(G.recalling)
- return
- if(!G.recalls_remaining)
- to_chat(src, "The Ark can no longer recall!")
- return
- if(alert(src, "Initiate mass recall?", "Mass Recall", "Yes", "No") != "Yes" || QDELETED(src) || QDELETED(G) || !G.obj_integrity)
- return
- G.initiate_mass_recall() //wHOOPS LOOKS LIKE A HULK GOT THROUGH
+ INVOKE_ASYNC(src, .proc/attempt_recall, G)
else if(istype(A, /obj/structure/destructible/clockwork/trap/trigger))
var/obj/structure/destructible/clockwork/trap/trigger/T = A
T.visible_message("[T] clunks as it's activated remotely.")
to_chat(src, "You activate [T].")
T.activate()
+/mob/camera/eminence/proc/attempt_recall(obj/structure/destructible/clockwork/massive/celestial_gateway/G)
+ if(G.recalling)
+ return
+ if(!G.recalls_remaining)
+ to_chat(src, "The Ark can no longer recall!")
+ return
+ if(alert(src, "Initiate mass recall?", "Mass Recall", "Yes", "No") != "Yes" || QDELETED(src) || QDELETED(G) || !G.obj_integrity)
+ return
+ G.initiate_mass_recall() //wHOOPS LOOKS LIKE A HULK GOT THROUGH
+
/mob/camera/eminence/ratvar_act()
name = "\improper Radiance"
real_name = "\improper Radiance"
diff --git a/code/modules/antagonists/clockcult/clock_mobs/clockwork_marauder.dm b/code/modules/antagonists/clockcult/clock_mobs/clockwork_marauder.dm
index dd37f3727c..79b919b1e9 100644
--- a/code/modules/antagonists/clockcult/clock_mobs/clockwork_marauder.dm
+++ b/code/modules/antagonists/clockcult/clock_mobs/clockwork_marauder.dm
@@ -40,8 +40,9 @@
if(!shield_health)
return "Its shield has been destroyed!"
-/mob/living/simple_animal/hostile/clockwork/marauder/Life()
- ..()
+/mob/living/simple_animal/hostile/clockwork/marauder/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
var/turf/T = get_turf(src)
var/turf/open/space/S = isspaceturf(T)? T : null
var/less_space_damage
@@ -123,3 +124,437 @@
#undef MARAUDER_SLOWDOWN_PERCENTAGE
#undef MARAUDER_SHIELD_REGEN_TIME
+
+//Clockwork guardian: Slow but with high damage, resides inside of a servant. Created via the Memory Allocation scripture.
+/mob/living/simple_animal/hostile/clockwork/marauder/guardian
+ name = "clockwork guardian"
+ desc = "A stalwart apparition of a soldier, blazing with crimson flames. It's armed with a gladius and shield and stands ready by its master."
+ icon_state = "clockwork_marauder"
+ health = 300
+ maxHealth = 300
+ speed = 1
+ obj_damage = 40
+ melee_damage_lower = 12
+ melee_damage_upper = 12
+ attack_verb_continuous = "slashes"
+ attack_verb_simple = "slash"
+ attack_sound = 'sound/weapons/bladeslice.ogg'
+ weather_immunities = list("lava")
+ movement_type = FLYING
+ AIStatus = AI_OFF //this has to be manually set so that the guardian doesn't start bashing the host, how annoying -_-
+ loot = list(/obj/item/clockwork/component/geis_capacitor/fallen_armor)
+ max_shield_health = 0
+ shield_health = 0
+ var/true_name = "Meme Master 69" //Required to call forth the guardian
+ var/global/list/possible_true_names = list("Servant", "Warden", "Serf", "Page", "Usher", "Knave", "Vassal", "Escort")
+ var/mob/living/host //The mob that the guardian is living inside of
+ var/recovering = FALSE //If the guardian is recovering from recalling
+ var/blockchance = 17 //chance to block attacks entirely
+ var/counterchance = 30 //chance to counterattack after blocking
+ var/static/list/damage_heal_order = list(OXY, BURN, BRUTE, TOX) //we heal our host's damage in this order
+ light_range = 2
+ light_power = 1.1
+ playstyle_string = "You are a clockwork guardian, a living extension of Sevtug's will. As a guardian, you are somewhat slow, but may block attacks, \
+ and have a chance to also counter blocked melee attacks for extra damage, in addition to being immune to extreme temperatures and pressures. \
+ Your primary goal is to serve the creature that you are now a part of, as well as The Clockwork Justiciar, Ratvar. You can use The Hierophant Network to communicate silently with your master and their allies, \
+ but can only exit if your master calls your true name or if they are exceptionally damaged. \
+ \n\n\
+ Stay near your host to protect and heal them; being too far from your host will rapidly cause you massive damage. Recall to your host if you are too weak and believe you cannot continue \
+ fighting safely. As a final note, you should probably avoid harming any fellow servants of Ratvar."
+
+/mob/living/simple_animal/hostile/clockwork/marauder/guardian/Initialize()
+ . = ..()
+ true_name = pick(possible_true_names)
+
+/mob/living/simple_animal/hostile/clockwork/marauder/guardian/BiologicalLife(seconds, times_fired)
+ ..()
+ if(is_in_host())
+ if(!is_servant_of_ratvar(host))
+ emerge_from_host(FALSE, TRUE)
+ unbind_from_host()
+ return
+ if(!GLOB.ratvar_awakens && host.stat == DEAD)
+ death()
+ return
+ if(GLOB.ratvar_awakens)
+ adjustHealth(-50)
+ else
+ adjustHealth(-10)
+ if(!recovering)
+ heal_host() //also heal our host if inside of them and we aren't recovering
+ else if(health == maxHealth)
+ to_chat(src, "Your strength has returned. You can once again come forward!")
+ to_chat(host, "Your guardian is now strong enough to come forward again!")
+ recovering = FALSE
+ else
+ if(GLOB.ratvar_awakens) //If Ratvar is alive, guardians don't need a host and are downright impossible to kill
+ adjustHealth(-5)
+ heal_host()
+ else if(host)
+ if(!is_servant_of_ratvar(host))
+ unbind_from_host()
+ return
+ if(host.stat == DEAD)
+ adjustHealth(50)
+ to_chat(src, "Your host is dead!")
+ return
+ if(z && host.z && z == host.z)
+ switch(get_dist(get_turf(src), get_turf(host)))
+ if(2)
+ adjustHealth(-1)
+ if(3)
+ //EQUILIBRIUM
+ if(4)
+ adjustHealth(1)
+ if(5)
+ adjustHealth(3)
+ if(6)
+ adjustHealth(6)
+ if(7)
+ adjustHealth(9)
+ if(8 to INFINITY)
+ adjustHealth(15)
+ to_chat(src, "You're too far from your host and rapidly taking damage!")
+ else //right next to or on top of host
+ adjustHealth(-2)
+ heal_host() //gradually heal host if nearby and host is very weak
+ else //well then, you're not even in the same zlevel
+ adjustHealth(15)
+ to_chat(src, "You're too far from your host and rapidly taking damage!")
+
+/mob/living/simple_animal/hostile/clockwork/marauder/guardian/death(gibbed)
+ emerge_from_host(FALSE, TRUE)
+ unbind_from_host()
+ visible_message("[src]'s equipment clatters lifelessly to the ground as the red flames within dissipate.", \
+ "Your equipment falls away. You feel a moment of confusion before your fragile form is annihilated.")
+ . = ..()
+
+/mob/living/simple_animal/hostile/clockwork/marauder/guardian/Stat()
+ ..()
+ if(statpanel("Status"))
+ stat(null, "Current True Name: [true_name]")
+ stat(null, "Host: [host ? host : "NONE"]")
+ if(host)
+ var/resulthealth = round((host.health / host.maxHealth) * 100, 0.5)
+ if(iscarbon(host))
+ resulthealth = round((abs(HEALTH_THRESHOLD_DEAD - host.health) / abs(HEALTH_THRESHOLD_DEAD - host.maxHealth)) * 100)
+ stat(null, "Host Health: [resulthealth]%")
+ if(GLOB.ratvar_awakens)
+ stat(null, "You are [recovering ? "un" : ""]able to deploy!")
+ else
+ if(resulthealth > GUARDIAN_EMERGE_THRESHOLD)
+ stat(null, "You are [recovering ? "unable to deploy" : "able to deploy on hearing your True Name"]!")
+ else
+ stat(null, "You are [recovering ? "unable to deploy" : "able to deploy to protect your host"]!")
+ stat(null, "You do [melee_damage_upper] damage on melee attacks.")
+
+/mob/living/simple_animal/hostile/clockwork/marauder/guardian/Process_Spacemove(movement_dir = 0)
+ return 1
+
+/mob/living/simple_animal/hostile/clockwork/marauder/guardian/proc/bind_to_host(mob/living/new_host)
+ if(!new_host)
+ return FALSE
+ host = new_host
+ var/datum/action/innate/summon_guardian/SG = new()
+ SG.linked_guardian = src
+ SG.Grant(host)
+ var/datum/action/innate/linked_minds/LM = new()
+ LM.linked_guardian = src
+ LM.Grant(host)
+ return TRUE
+
+/mob/living/simple_animal/hostile/clockwork/marauder/guardian/proc/unbind_from_host()
+ if(host)
+ for(var/datum/action/innate/summon_guardian/SG in host.actions)
+ qdel(SG)
+ for(var/datum/action/innate/linked_minds/LM in host.actions)
+ qdel(LM)
+ host = null
+ return TRUE
+ return FALSE
+
+//DAMAGE and FATIGUE
+/mob/living/simple_animal/hostile/clockwork/marauder/guardian/proc/heal_host()
+ if(!host)
+ return
+ var/resulthealth = round((host.health / host.maxHealth) * 100, 0.5)
+ if(iscarbon(host))
+ resulthealth = round((abs(HEALTH_THRESHOLD_DEAD - host.health) / abs(HEALTH_THRESHOLD_DEAD - host.maxHealth)) * 100)
+ if(GLOB.ratvar_awakens || resulthealth <= GUARDIAN_EMERGE_THRESHOLD)
+ new /obj/effect/temp_visual/heal(host.loc, "#AF0AAF")
+ host.heal_ordered_damage(4, damage_heal_order)
+
+/mob/living/simple_animal/hostile/clockwork/marauder/guardian/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
+ if(amount > 0)
+ for(var/mob/living/L in view(2, src))
+ if(L.is_holding_item_of_type(/obj/item/nullrod))
+ to_chat(src, "The presence of a brandished holy artifact weakens your armor!")
+ amount *= 4 //if a wielded null rod is nearby, it takes four times the health damage
+ break
+ . = ..()
+ if(src && updating_health)
+ update_health_hud()
+ update_stats()
+
+/mob/living/simple_animal/hostile/clockwork/marauder/guardian/update_health_hud()
+ if(hud_used && hud_used.healths)
+ if(istype(hud_used, /datum/hud/marauder))
+ var/datum/hud/marauder/G = hud_used
+ var/resulthealth
+ if(host)
+ if(iscarbon(host))
+ resulthealth = "[round((abs(HEALTH_THRESHOLD_DEAD - host.health) / abs(HEALTH_THRESHOLD_DEAD - host.maxHealth)) * 100)]%"
+ else
+ resulthealth = "[round((host.health / host.maxHealth) * 100, 0.5)]%"
+ else
+ resulthealth = "NONE"
+ G.hosthealth.maptext = "
HOST [resulthealth]
"
+ hud_used.healths.maptext = "
[round((health / maxHealth) * 100, 0.5)]%"
+
+/mob/living/simple_animal/hostile/clockwork/marauder/guardian/proc/update_stats()
+ if(GLOB.ratvar_awakens)
+ speed = 0
+ melee_damage_lower = 20
+ melee_damage_upper = 20
+ attack_verb_continuous = "devastates"
+ else
+ var/healthpercent = (health/maxHealth) * 100
+ switch(healthpercent)
+ if(100 to 70) //Bonuses to speed and damage at high health
+ speed = 0
+ melee_damage_lower = 16
+ melee_damage_upper = 16
+ attack_verb_continuous = "viciously slashes"
+ if(70 to 40)
+ speed = initial(speed)
+ melee_damage_lower = initial(melee_damage_lower)
+ melee_damage_upper = initial(melee_damage_upper)
+ attack_verb_continuous = initial(attack_verb_continuous)
+ if(40 to 30) //Damage decrease, but not speed
+ speed = initial(speed)
+ melee_damage_lower = 10
+ melee_damage_upper = 10
+ attack_verb_continuous = "lightly slashes"
+ if(30 to 20) //Speed decrease
+ speed = 2
+ melee_damage_lower = 8
+ melee_damage_upper = 8
+ attack_verb_continuous = "lightly slashes"
+ if(20 to 10) //Massive speed decrease and weak melee attacks
+ speed = 3
+ melee_damage_lower = 6
+ melee_damage_upper = 6
+ attack_verb_continuous = "weakly slashes"
+ if(10 to 0) //We are super weak and going to die
+ speed = 4
+ melee_damage_lower = 4
+ melee_damage_upper = 4
+ attack_verb_continuous = "taps"
+
+//ATTACKING, BLOCKING, and COUNTERING
+
+/mob/living/simple_animal/hostile/clockwork/marauder/guardian/AttackingTarget()
+ if(is_in_host())
+ return FALSE
+ return ..()
+
+/mob/living/simple_animal/hostile/clockwork/marauder/guardian/bullet_act(obj/item/projectile/Proj)
+ if(blockOrCounter(null, Proj))
+ return
+ return ..()
+
+/mob/living/simple_animal/hostile/clockwork/marauder/guardian/hitby(atom/movable/AM, skipcatch, hitpush, blocked, atom/movable/AM, datum/thrownthing/throwingdatum)
+ if(blockOrCounter(null, AM))
+ return
+ return ..()
+
+/mob/living/simple_animal/hostile/clockwork/marauder/guardian/attack_animal(mob/living/simple_animal/M)
+ if(istype(M, /mob/living/simple_animal/hostile/clockwork/marauder/guardian) || !blockOrCounter(M, M)) //we don't want infinite blockcounter loops if fighting another guardian
+ return ..()
+
+/mob/living/simple_animal/hostile/clockwork/marauder/guardian/attack_paw(mob/living/carbon/monkey/M)
+ if(!blockOrCounter(M, M))
+ return ..()
+
+/mob/living/simple_animal/hostile/clockwork/marauder/guardian/attack_alien(mob/living/carbon/alien/humanoid/M)
+ if(!blockOrCounter(M, M))
+ return ..()
+
+/mob/living/simple_animal/hostile/clockwork/marauder/guardian/attack_slime(mob/living/simple_animal/slime/M)
+ if(!blockOrCounter(M, M))
+ return ..()
+
+/mob/living/simple_animal/hostile/clockwork/marauder/guardian/attack_hand(mob/living/carbon/human/M)
+ if(!blockOrCounter(M, M))
+ return ..()
+
+/mob/living/simple_animal/hostile/clockwork/marauder/guardian/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/nullrod) || !blockOrCounter(user, I))
+ return ..()
+
+/mob/living/simple_animal/hostile/clockwork/marauder/guardian/proc/blockOrCounter(mob/target, atom/textobject)
+ if(GLOB.ratvar_awakens) //if ratvar has woken, we block nearly everything at a very high chance
+ blockchance = 90
+ counterchance = 90
+ if(prob(blockchance))
+ . = TRUE
+ if(target)
+ target.do_attack_animation(src)
+ target.DelayNextAction(CLICK_CD_MELEE)
+ blockchance = initial(blockchance)
+ playsound(src, 'sound/magic/clockwork/fellowship_armory.ogg', 30, 1, 0, 1) //clang
+ visible_message("[src] blocks [target && isitem(textobject) ? "[target]'s [textobject.name]":"\the [textobject]"]!", \
+ "You block [target && isitem(textobject) ? "[target]'s [textobject.name]":"\the [textobject]"]!")
+ if(target && Adjacent(target))
+ if(prob(counterchance))
+ counterchance = initial(counterchance)
+ var/previousattack_verb_continuous = attack_verb_continuous
+ attack_verb_continuous = "counters"
+ UnarmedAttack(target)
+ attack_verb_continuous = previousattack_verb_continuous
+ else
+ counterchance = min(counterchance + initial(counterchance), 100)
+ else
+ blockchance = min(blockchance + initial(blockchance), 100)
+ if(GLOB.ratvar_awakens)
+ blockchance = 90
+ counterchance = 90
+
+//COMMUNICATION and EMERGENCE
+/*
+/mob/living/simple_animal/hostile/clockwork/marauder/guardian/handle_inherent_channels(message, message_mode)
+ if(host && (is_in_host() || message_mode == MODE_BINARY))
+ guardian_comms(message)
+ return TRUE
+ return ..()
+*/
+/mob/living/simple_animal/hostile/clockwork/marauder/guardian/proc/guardian_comms(message)
+ var/name_part = "[src] ([true_name])"
+ message = "\"[message]\"" //Processed output
+ to_chat(src, "[name_part]: [message]")
+ to_chat(host, "[name_part]: [message]")
+ for(var/M in GLOB.mob_list)
+ if(isobserver(M))
+ var/link = FOLLOW_LINK(M, src)
+ to_chat(M, "[link] [name_part] (to[findtextEx(host.name, host.real_name) ? "[host.name]" : "[host.real_name] (as [host.name])"]): [message] ")
+ return TRUE
+
+/mob/living/simple_animal/hostile/clockwork/marauder/guardian/proc/return_to_host()
+ if(is_in_host())
+ return FALSE
+ if(!host)
+ to_chat(src, "You don't have a host!")
+ return FALSE
+ var/resulthealth = round((host.health / host.maxHealth) * 100, 0.5)
+ if(iscarbon(host))
+ resulthealth = round((abs(HEALTH_THRESHOLD_DEAD - host.health) / abs(HEALTH_THRESHOLD_DEAD - host.maxHealth)) * 100)
+ host.visible_message("[host]'s skin flashes crimson!", "You feel [true_name]'s consciousness settle in your mind.")
+ visible_message("[src] suddenly disappears!", "You return to [host].")
+ forceMove(host)
+ if(resulthealth > GUARDIAN_EMERGE_THRESHOLD && health != maxHealth)
+ recovering = TRUE
+ to_chat(src, "You have weakened and will need to recover before manifesting again!")
+ to_chat(host, "[true_name] has weakened and will need to recover before manifesting again!")
+ return TRUE
+
+/mob/living/simple_animal/hostile/clockwork/marauder/guardian/proc/try_emerge()
+ if(!host)
+ to_chat(src, "You don't have a host!")
+ return FALSE
+ if(!GLOB.ratvar_awakens)
+ var/resulthealth = round((host.health / host.maxHealth) * 100, 0.5)
+ if(iscarbon(host))
+ resulthealth = round((abs(HEALTH_THRESHOLD_DEAD - host.health) / abs(HEALTH_THRESHOLD_DEAD - host.maxHealth)) * 100)
+ if(host.stat != DEAD && resulthealth > GUARDIAN_EMERGE_THRESHOLD) //if above 20 health, fails
+ to_chat(src, "Your host must be at [GUARDIAN_EMERGE_THRESHOLD]% or less health to emerge like this!")
+ return FALSE
+ return emerge_from_host(FALSE)
+
+/mob/living/simple_animal/hostile/clockwork/marauder/guardian/proc/emerge_from_host(hostchosen, force) //Notice that this is a proc rather than a verb - guardians can NOT exit at will, but they CAN return
+ if(!is_in_host())
+ return FALSE
+ if(!force && recovering)
+ if(hostchosen)
+ to_chat(host, "[true_name] is too weak to come forth!")
+ else
+ to_chat(host, "[true_name] tries to emerge to protect you, but it's too weak!")
+ to_chat(src, "You try to come forth, but you're too weak!")
+ return FALSE
+ if(!force)
+ if(hostchosen) //guardian approved
+ to_chat(host, "Your words echo with power as [true_name] emerges from your body!")
+ else
+ to_chat(host, "[true_name] emerges from your body to protect you!")
+ forceMove(host.loc)
+ visible_message("[host]'s skin glows red as [name] emerges from their body!", "You exit the safety of [host]'s body!")
+ return TRUE
+
+/mob/living/simple_animal/hostile/clockwork/marauder/guardian/get_alt_name()
+ return " ([text2ratvar(true_name)])"
+
+/mob/living/simple_animal/hostile/clockwork/marauder/guardian/proc/is_in_host() //Checks if the guardian is inside of their host
+ return host && loc == host
+
+//HOST ACTIONS
+
+//Summon guardian action: Calls forth or recalls your guardian
+/datum/action/innate/summon_guardian
+ name = "Force Guardian to Emerge/Recall"
+ desc = "Allows you to force your clockwork guardian to emerge or recall as required."
+ button_icon_state = "clockwork_marauder"
+ background_icon_state = "bg_clock"
+ check_flags = AB_CHECK_CONSCIOUS
+ buttontooltipstyle = "clockcult"
+ var/mob/living/simple_animal/hostile/clockwork/marauder/guardian/linked_guardian
+ var/list/defend_phrases = list("Defend me", "Come forth", "Assist me", "Protect me", "Give aid", "Help me")
+ var/list/return_phrases = list("Return", "Return to me", "Your job is done", "You have served", "Come back", "Retreat")
+
+/datum/action/innate/summon_guardian/IsAvailable()
+ if(!linked_guardian)
+ return FALSE
+ if(isliving(owner))
+ var/mob/living/L = owner
+ if(!L.can_speak_vocal() || L.stat)
+ return FALSE
+ return ..()
+
+/datum/action/innate/summon_guardian/Activate()
+ if(linked_guardian.is_in_host())
+ clockwork_say(owner, text2ratvar("[pick(defend_phrases)], [linked_guardian.true_name]!"))
+ linked_guardian.emerge_from_host(TRUE)
+ else
+ clockwork_say(owner, text2ratvar("[pick(return_phrases)], [linked_guardian.true_name]!"))
+ linked_guardian.return_to_host()
+ return TRUE
+
+//Linked Minds action: talks to your guardian
+/datum/action/innate/linked_minds
+ name = "Linked Minds"
+ desc = "Allows you to silently communicate with your guardian."
+ button_icon_state = "linked_minds"
+ background_icon_state = "bg_clock"
+ check_flags = AB_CHECK_CONSCIOUS
+ buttontooltipstyle = "clockcult"
+ var/mob/living/simple_animal/hostile/clockwork/marauder/guardian/linked_guardian
+
+/datum/action/innate/linked_minds/IsAvailable()
+ if(!linked_guardian)
+ return FALSE
+ return ..()
+
+/datum/action/innate/linked_minds/Activate()
+ var/message = stripped_input(owner, "Enter a message to tell your guardian.", "Telepathy")
+ if(!owner || !message)
+ return FALSE
+ if(!linked_guardian)
+ to_chat(owner, "Your guardian seems to have been destroyed!")
+ return FALSE
+ var/name_part = "Servant [findtextEx(owner.name, owner.real_name) ? "[owner.name]" : "[owner.real_name] (as [owner.name])"]"
+ message = "\"[message]\"" //Processed output
+ to_chat(owner, "[name_part]: [message]")
+ to_chat(linked_guardian, "[name_part]: [message]")
+ for(var/M in GLOB.mob_list)
+ if(isobserver(M))
+ var/link = FOLLOW_LINK(M, src)
+ to_chat(M, "[link] [name_part] (to[linked_guardian] ([linked_guardian.true_name])): [message]")
+ return TRUE
diff --git a/code/modules/antagonists/clockcult/clock_scripture.dm b/code/modules/antagonists/clockcult/clock_scripture.dm
index 1ebefe4d05..a85245e9d0 100644
--- a/code/modules/antagonists/clockcult/clock_scripture.dm
+++ b/code/modules/antagonists/clockcult/clock_scripture.dm
@@ -3,8 +3,9 @@ Tiers and Requirements
Pieces of scripture require certain follower counts, contruction value, and active caches in order to recite.
Drivers: Unlocked by default
-Scripts: 5 servants and a cache
-Applications: 8 servants, 3 caches, and 100 CV
+Scripts: 35k power or one convert
+Applications: 50k or three converts
+Judgement 5 converts
*/
/datum/clockwork_scripture
@@ -129,11 +130,11 @@ Applications: 8 servants, 3 caches, and 100 CV
SEND_SOUND(invoker, sound('sound/magic/clockwork/invoke_general.ogg'))
return TRUE
-/datum/clockwork_scripture/proc/check_offstation_penalty()
+/datum/clockwork_scripture/proc/check_offstation_penalty()//don't cast spells away from the station
var/turf/T = get_turf(invoker)
if(!T || (!is_centcom_level(T.z) && !is_station_level(T.z) && !is_mining_level(T.z) && !is_reebe(T.z)))
- channel_time *= 2
- power_cost *= 2
+ channel_time *= 3
+ power_cost *= 3
return TRUE
/datum/clockwork_scripture/proc/check_special_requirements() //Special requirements for scriptures, checked multiple times during invocation
diff --git a/code/modules/antagonists/clockcult/clock_scriptures/scripture_applications.dm b/code/modules/antagonists/clockcult/clock_scriptures/scripture_applications.dm
index ffe9ecfa80..cbf3bdaa38 100644
--- a/code/modules/antagonists/clockcult/clock_scriptures/scripture_applications.dm
+++ b/code/modules/antagonists/clockcult/clock_scriptures/scripture_applications.dm
@@ -1,5 +1,5 @@
//////////////////
-// APPLICATIONS //
+// APPLICATIONS // For various structures and base building, as well as advanced power generation.
//////////////////
@@ -23,6 +23,37 @@
quickbind = TRUE
quickbind_desc = "Creates a Sigil of Transmission, which can drain and will store power for clockwork structures."
+//Prolonging Prism: Creates a prism that will delay the shuttle at a power cost
+/datum/clockwork_scripture/create_object/prolonging_prism
+ descname = "Powered Structure, Delay Emergency Shuttles"
+ name = "Prolonging Prism"
+ desc = "Creates a mechanized prism which will delay the arrival of an emergency shuttle by 2 minutes at a massive power cost."
+ invocations = list("May this prism...", "...grant us time to enact his will!")
+ channel_time = 80
+ power_cost = 300
+ object_path = /obj/structure/destructible/clockwork/powered/prolonging_prism
+ creator_message = "You form a prolonging prism, which will delay the arrival of an emergency shuttle at a massive power cost."
+ observer_message = "An onyx prism forms in midair and sprouts tendrils to support itself!"
+ invokers_required = 2
+ multiple_invokers_used = TRUE
+ usage_tip = "The power cost to delay a shuttle increases based on the number of times activated."
+ tier = SCRIPTURE_APPLICATION
+ one_per_tile = TRUE
+ primary_component = VANGUARD_COGWHEEL
+ sort_priority = 4
+ important = TRUE
+ quickbind = TRUE
+ quickbind_desc = "Creates a Prolonging Prism, which will delay the arrival of an emergency shuttle by 2 minutes at a massive power cost."
+
+/datum/clockwork_scripture/create_object/prolonging_prism/check_special_requirements()
+ if(SSshuttle.emergency.mode == SHUTTLE_DOCKED || SSshuttle.emergency.mode == SHUTTLE_IGNITING || SSshuttle.emergency.mode == SHUTTLE_STRANDED || SSshuttle.emergency.mode == SHUTTLE_ESCAPE)
+ to_chat(invoker, "\"It is too late to construct one of these, champion.\"")
+ return FALSE
+ var/turf/T = get_turf(invoker)
+ if(!T || !is_station_level(T.z))
+ to_chat(invoker, "\"You must be on the station to construct one of these, champion.\"")
+ return FALSE
+ return ..()
//Mania Motor: Creates a malevolent transmitter that will broadcast the whispers of Sevtug into the minds of nearby nonservants, causing a variety of mental effects at a power cost.
/datum/clockwork_scripture/create_object/mania_motor
@@ -44,6 +75,7 @@
sort_priority = 2
quickbind = TRUE
quickbind_desc = "Creates a Mania Motor, which causes minor damage and negative mental effects in non-Servants."
+ requires_full_power = TRUE
//Clockwork Obelisk: Creates a powerful obelisk that can be used to broadcast messages or open a gateway to any servant or clockwork obelisk at a power cost.
@@ -67,6 +99,64 @@
quickbind = TRUE
quickbind_desc = "Creates a Clockwork Obelisk, which can send messages or open Spatial Gateways with power."
+//Memory Allocation: Finds a willing ghost and makes them into a clockwork guardian for the invoker.
+/datum/clockwork_scripture/memory_allocation
+ descname = "Personal Guardian, A Peice Of Your Mind."
+ name = "Memory Allocation"
+ desc = "Allocates part of your consciousness to a Clockwork Guardian, a variant of Marauder that lives within you, able to be \
+ called forth by Speaking its True Name or if you become exceptionally low on health. \
+ If it remains close to you, you will gradually regain health up to a low amount, but it will die if it goes too far from you."
+ invocations = list("Fright's will...", "...call forth...")
+ channel_time = 100
+ power_cost = 8000
+ usage_tip = "guardians are useful as personal bodyguards and frontline warriors."
+ tier = SCRIPTURE_APPLICATION
+ primary_component = GEIS_CAPACITOR
+ sort_priority = 5
+
+/datum/clockwork_scripture/memory_allocation/check_special_requirements()
+ for(var/mob/living/simple_animal/hostile/clockwork/marauder/guardian/M in GLOB.all_clockwork_mobs)
+ if(M.host == invoker)
+ to_chat(invoker, "You can only house one guardian at a time!")
+ return FALSE
+ return TRUE
+
+/datum/clockwork_scripture/memory_allocation/scripture_effects()
+ return create_guardian()
+
+/datum/clockwork_scripture/memory_allocation/proc/create_guardian()
+ invoker.visible_message("A purple tendril appears from [invoker]'s [slab.name] and impales itself in [invoker.p_their()] forehead!", \
+ "A tendril flies from [slab] into your forehead. You begin waiting while it painfully rearranges your thought pattern...")
+ //invoker.notransform = TRUE //Vulnerable during the process
+ slab.busy = "Thought Modification in progress"
+ if(!do_after(invoker, 50, target = invoker))
+ invoker.visible_message("The tendril, covered in blood, retracts from [invoker]'s head and back into the [slab.name]!", \
+ "Total agony overcomes you as the tendril is forced out early!")
+ invoker.Knockdown(100)
+ invoker.apply_damage(50, BRUTE, "head")//Sevtug leaves a gaping hole in your face if interrupted.
+ slab.busy = null
+ return FALSE
+ clockwork_say(invoker, text2ratvar("...the mind made..."))
+ //invoker.notransform = FALSE
+ slab.busy = "Guardian Selection in progress"
+ if(!check_special_requirements())
+ return FALSE
+ to_chat(invoker, "The tendril shivers slightly as it selects a guardian...")
+ var/list/marauder_candidates = pollGhostCandidates("Do you want to play as the clockwork guardian of [invoker.real_name]?", ROLE_SERVANT_OF_RATVAR, null, FALSE, 50, POLL_IGNORE_HOLOPARASITE)
+ if(!check_special_requirements())
+ return FALSE
+ if(!marauder_candidates.len)
+ invoker.visible_message("The tendril retracts from [invoker]'s head, sealing the entry wound as it does so!", \
+ "The tendril was unsuccessful! Perhaps you should try again another time.")
+ return FALSE
+ clockwork_say(invoker, text2ratvar("...sword and shield!"))
+ var/mob/dead/observer/theghost = pick(marauder_candidates)
+ var/mob/living/simple_animal/hostile/clockwork/marauder/guardian/M = new(invoker)
+ M.key = theghost.key
+ M.bind_to_host(invoker)
+ invoker.visible_message("The tendril retracts from [invoker]'s head, sealing the entry wound as it does so!", \
+ "[M.true_name], a clockwork guardian, has taken up residence in your mind. Communicate with it via the \"Linked Minds\" action button.")
+ return TRUE
//Clockwork Marauder: Creates a construct shell for a clockwork marauder, a well-rounded frontline fighter.
/datum/clockwork_scripture/create_object/construct/clockwork_marauder
@@ -81,7 +171,7 @@
tier = SCRIPTURE_APPLICATION
one_per_tile = TRUE
primary_component = BELLIGERENT_EYE
- sort_priority = 4
+ sort_priority = 6
quickbind = TRUE
quickbind_desc = "Creates a clockwork marauder, used for frontline combat."
object_path = /obj/item/clockwork/construct_chassis/clockwork_marauder
@@ -117,14 +207,13 @@
/datum/clockwork_scripture/create_object/summon_arbiter
descname = "Powerful Assault Mech"
name = "Summon Neovgre, the Anima Bulwark"
- desc = "Calls forth the mighty Anima Bulwark, a weapon of unmatched power,\
- mech with superior defensive and offensive capabilities. It will \
+ desc = "Calls forth the mighty Anima Bulwark, a mech with superior defensive and offensive capabilities. It will \
steadily regenerate HP and triple its regeneration speed while standing \
on a clockwork tile. It will automatically draw power from nearby sigils of \
transmission should the need arise. Its Arbiter laser cannon can decimate foes \
from a range and is capable of smashing through any barrier presented to it. \
- Be warned, choosing to pilot Neovgre is a lifetime commitment, once you are \
- in you cannot leave and when it is destroyed it will explode catastrophically with you inside."
+ Be warned however, choosing to pilot Neovgre is a lifetime commitment, once you are \
+ in you cannot leave and when it is destroyed it will explode catastrophically, with you inside."
invocations = list("By the strength of the alloy...!!", "...call forth the Arbiter!!")
channel_time = 200 // This is a strong fucking weapon, 20 seconds channel time is getting off light I tell ya.
power_cost = 75000 //75 KW
@@ -134,7 +223,7 @@
object_path = /obj/mecha/combat/neovgre
tier = SCRIPTURE_APPLICATION
primary_component = BELLIGERENT_EYE
- sort_priority = 2
+ sort_priority = 7
creator_message = "Neovgre, the Anima Bulwark towers over you... your enemies reckoning has come."
/datum/clockwork_scripture/create_object/summon_arbiter/check_special_requirements()
diff --git a/code/modules/antagonists/clockcult/clock_scriptures/scripture_cyborg.dm b/code/modules/antagonists/clockcult/clock_scriptures/scripture_cyborg.dm
index 819dfac72e..3dacecf6b4 100644
--- a/code/modules/antagonists/clockcult/clock_scriptures/scripture_cyborg.dm
+++ b/code/modules/antagonists/clockcult/clock_scriptures/scripture_cyborg.dm
@@ -1,5 +1,5 @@
/////////////////
-// CYBORG ONLY //
+// CYBORG ONLY // Cyborgs only, fleshed ones.
/////////////////
//Linked Vanguard: grants Vanguard to the invoker and a target
diff --git a/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm b/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm
index 6349ecb581..c4b1913832 100644
--- a/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm
+++ b/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm
@@ -1,5 +1,5 @@
/////////////
-// DRIVERS //
+// DRIVERS // Starter spells
/////////////
//Stargazer: Creates a stargazer, a cheap power generator that utilizes starlight.
@@ -97,7 +97,7 @@
desc = "Charges your slab with divine energy, allowing you to overwhelm a target with Ratvar's light."
invocations = list("Divinity, show them your light!")
whispered = TRUE
- channel_time = 20 // I think making kindle channel a third of the time less is a good make up for the fact that it silences people for such a little amount of time.
+ channel_time = 10 // I think making kindle channel a third of the time less is a good make up for the fact that it silences people for such a little amount of time.
power_cost = 125
usage_tip = "The light can be used from up to two tiles away. Damage taken will GREATLY REDUCE the stun's duration."
tier = SCRIPTURE_DRIVER
@@ -113,7 +113,6 @@
quickbind = TRUE
quickbind_desc = "Stuns and mutes a target from a short range."
-
//Hateful Manacles: Applies restraints from melee over several seconds. The restraints function like handcuffs and break on removal.
/datum/clockwork_scripture/ranged_ability/hateful_manacles
descname = "Handcuffs"
@@ -192,43 +191,39 @@
Click your slab to cancel."
+/*//commenting this out until its reworked to actually do random teleports
//Abscond: Used to return to Reebe.
/datum/clockwork_scripture/abscond
- descname = "Return to Reebe"
+ descname = "Safety warp, teleports you somewhere random. moderately high power cost to use."
name = "Abscond"
- desc = "Yanks you through space, returning you to home base."
+ desc = "Yanks you through space, putting you in hopefully a safe location."
invocations = list("As we bid farewell, and return to the stars...", "...we shall find our way home.")
whispered = TRUE
- channel_time = 50
- power_cost = 5
- special_power_text = "POWERCOST to bring pulled creature"
- special_power_cost = ABSCOND_ABDUCTION_COST
+ channel_time = 3.5
+ power_cost = 10000
usage_tip = "This can't be used while on Reebe, for obvious reasons."
tier = SCRIPTURE_DRIVER
primary_component = GEIS_CAPACITOR
sort_priority = 9
important = TRUE
quickbind = TRUE
- quickbind_desc = "Returns you to Reebe."
+ quickbind_desc = "Teleports you somewhere random, or to an active Ark if one exists. Use in emergencies."
var/client_color
requires_full_power = TRUE
/datum/clockwork_scripture/abscond/check_special_requirements()
if(is_reebe(invoker.z))
- to_chat(invoker, "You're already at Reebe.")
+ to_chat(invoker, "You're at Reebe, attempting to warp in the void could cause you to share your masters fate of banishment!.")
return
if(!isturf(invoker.loc))
- to_chat(invoker, "You must be visible to return!")
+ to_chat(invoker, "You must be visible to warp!")
return
return TRUE
/datum/clockwork_scripture/abscond/recital()
- client_color = invoker.client.color
- animate(invoker.client, color = "#AF0AAF", time = 50)
. = ..()
/datum/clockwork_scripture/abscond/scripture_effects()
- var/mob/living/pulled_mob = (invoker.pulling && isliving(invoker.pulling) && get_clockwork_power(ABSCOND_ABDUCTION_COST)) ? invoker.pulling : null
var/turf/T
if(GLOB.ark_of_the_clockwork_justiciar)
T = get_step(GLOB.ark_of_the_clockwork_justiciar, SOUTH)
@@ -237,21 +232,12 @@
if(!do_teleport(invoker, T, channel = TELEPORT_CHANNEL_CULT, forced = TRUE))
return
invoker.visible_message("[invoker] flickers and phases out of existence!", \
- "You feel a dizzying sense of vertigo as you're yanked back to Reebe!")
+ "You feel a dizzying sense of vertigo as you're yanked through the fabric of reality!")
T.visible_message("[invoker] flickers and phases into existence!")
playsound(invoker, 'sound/magic/magic_missile.ogg', 50, TRUE)
playsound(T, 'sound/magic/magic_missile.ogg', 50, TRUE)
do_sparks(5, TRUE, invoker)
- do_sparks(5, TRUE, T)
- if(pulled_mob && do_teleport(pulled_mob, T, channel = TELEPORT_CHANNEL_CULT, forced = TRUE))
- adjust_clockwork_power(-special_power_cost)
- invoker.start_pulling(pulled_mob) //forcemove resets pulls, so we need to re-pull
- if(invoker.client)
- animate(invoker.client, color = client_color, time = 25)
-
-/datum/clockwork_scripture/abscond/scripture_fail()
- if(invoker && invoker.client)
- animate(invoker.client, color = client_color, time = 10)
+ do_sparks(5, TRUE, T)*/
//Replicant: Creates a new clockwork slab.
@@ -265,7 +251,7 @@
whispered = TRUE
object_path = /obj/item/clockwork/slab
creator_message = "You copy a piece of replicant alloy and command it into a new slab."
- usage_tip = "This is inefficient as a way to produce components, as the slab produced must be held by someone with no other slabs to produce components."
+ usage_tip = "This is inefficient as a way to produce power, as the slab produced must be held by someone with no other slabs to produce any."
tier = SCRIPTURE_DRIVER
space_allowed = TRUE
primary_component = GEIS_CAPACITOR
@@ -293,3 +279,50 @@
sort_priority = 11
quickbind = TRUE
quickbind_desc = "Creates a pair of Wraith Spectacles, which grant true sight but cause gradual vision loss."
+
+//Spatial Gateway: Allows the invoker to teleport themselves and any nearby allies to a conscious servant or clockwork obelisk.
+/datum/clockwork_scripture/spatial_gateway
+ descname = "Teleport Gate"
+ name = "Spatial Gateway"
+ desc = "Tears open a miniaturized gateway in spacetime to any conscious servant that can transport objects or creatures to its destination. \
+ Each servant assisting in the invocation adds one additional use and four additional seconds to the gateway's uses and duration."
+ invocations = list("Spatial Gateway...", "...activate!")
+ channel_time = 30
+ power_cost = 400
+ whispered = TRUE
+ multiple_invokers_used = TRUE
+ multiple_invokers_optional = TRUE
+ usage_tip = "This gateway is strictly one-way and will only allow things through the invoker's portal."
+ tier = SCRIPTURE_DRIVER
+ primary_component = GEIS_CAPACITOR
+ sort_priority = 9
+ quickbind = TRUE
+ quickbind_desc = "Allows you to create a one-way Spatial Gateway to a living Servant or Clockwork Obelisk."
+
+/datum/clockwork_scripture/spatial_gateway/check_special_requirements()
+ if(!isturf(invoker.loc))
+ to_chat(invoker, "You must not be inside an object to use this scripture!")
+ return FALSE
+ var/other_servants = 0
+ for(var/mob/living/L in GLOB.alive_mob_list)
+ if(is_servant_of_ratvar(L) && !L.stat && L != invoker)
+ other_servants++
+ for(var/obj/structure/destructible/clockwork/powered/clockwork_obelisk/O in GLOB.all_clockwork_objects)
+ if(O.anchored)
+ other_servants++
+ if(!other_servants)
+ to_chat(invoker, "There are no other conscious servants or anchored clockwork obelisks!")
+ return FALSE
+ return TRUE
+
+/datum/clockwork_scripture/spatial_gateway/scripture_effects()
+ var/portal_uses = 0
+ var/duration = 0
+ for(var/mob/living/L in range(1, invoker))
+ if(!L.stat && is_servant_of_ratvar(L))
+ portal_uses++
+ duration += 40 //4 seconds
+ if(GLOB.ratvar_awakens)
+ portal_uses = max(portal_uses, 100) //Very powerful if Ratvar has been summoned
+ duration = max(duration, 100)
+ return slab.procure_gateway(invoker, duration, portal_uses)
\ No newline at end of file
diff --git a/code/modules/antagonists/clockcult/clock_scriptures/scripture_judgement.dm b/code/modules/antagonists/clockcult/clock_scriptures/scripture_judgement.dm
new file mode 100644
index 0000000000..5075840e76
--- /dev/null
+++ b/code/modules/antagonists/clockcult/clock_scriptures/scripture_judgement.dm
@@ -0,0 +1,44 @@
+///////////////
+// JUDGEMENT // For the big game changing things. TODO: Summonable generals, just need mob sprites for them.
+///////////////
+
+//Ark of the Clockwork Justiciar: Creates a Gateway to the Celestial Derelict, summoning ratvar.
+/datum/clockwork_scripture/create_object/ark_of_the_clockwork_justiciar
+ descname = "Structure, Win Condition"
+ name = "Ark of the Clockwork Justiciar"
+ desc = "Tears apart a rift in spacetime to Reebe, the Celestial Derelict, using a massive amount of power.\n\
+ This gateway will, after some time, call forth Ratvar from his exile and massively empower all scriptures and tools."
+ invocations = list("ARMORER! FRIGHT! AMPERAGE! VANGUARD! WE CALL UPON YOU!!", \
+ "THE TIME HAS COME FOR OUR MASTER TO BREAK THE CHAINS OF EXILE!!", \
+ "LEND US YOUR AID! ENGINE COMES!!")
+ channel_time = 150
+ power_cost = 70000 //70 KW. It's literally the thing wrenching the god out of another dimension why wouldn't it be costly.
+ invokers_required = 6
+ multiple_invokers_used = TRUE
+ object_path = /obj/structure/destructible/clockwork/massive/celestial_gateway
+ creator_message = "The Ark swirls into existance before you with the help of the Generals. After all this time, he shall, finally, be free"
+ usage_tip = "The gateway is completely vulnerable to attack during its five-minute duration. It will periodically give indication of its general position to everyone on the station \
+ as well as being loud enough to be heard throughout the entire sector. Defend it with your life!"
+ tier = SCRIPTURE_APPLICATION
+ sort_priority = 8
+ requires_full_power = TRUE
+
+/datum/clockwork_scripture/create_object/ark_of_the_clockwork_justiciar/check_special_requirements()
+ if(!slab.no_cost)
+ if(GLOB.ratvar_awakens)
+ to_chat(invoker, "\"I am already here, there is no point in that.\"")
+ return FALSE
+ for(var/obj/structure/destructible/clockwork/massive/celestial_gateway/G in GLOB.all_clockwork_objects)
+ var/area/gate_area = get_area(G)
+ to_chat(invoker, "There is already an Ark at [gate_area.map_name]!")
+ return FALSE
+ var/area/A = get_area(invoker)
+ var/turf/T = get_turf(invoker)
+ if(!T || !is_station_level(T.z) || istype(A, /area/shuttle) || !A.blob_allowed)
+ to_chat(invoker, "You must be on the station to activate the Ark!")
+ return FALSE
+ if(GLOB.clockwork_gateway_activated)
+ to_chat(invoker, "Ratvar's recent banishment renders him too weak to be wrung forth from Reebe!")
+ return FALSE
+ return ..()
+
diff --git a/code/modules/antagonists/clockcult/clock_scriptures/scripture_scripts.dm b/code/modules/antagonists/clockcult/clock_scriptures/scripture_scripts.dm
index d22a2f69b7..d96765d536 100644
--- a/code/modules/antagonists/clockcult/clock_scriptures/scripture_scripts.dm
+++ b/code/modules/antagonists/clockcult/clock_scriptures/scripture_scripts.dm
@@ -1,5 +1,5 @@
/////////////
-// SCRIPTS //
+// SCRIPTS // Various miscellanious spells for offense/defense/construction.
/////////////
@@ -217,53 +217,6 @@
weapon_type = /obj/item/clockwork/weapon/ratvarian_spear
-//Spatial Gateway: Allows the invoker to teleport themselves and any nearby allies to a conscious servant or clockwork obelisk.
-/datum/clockwork_scripture/spatial_gateway
- descname = "Teleport Gate"
- name = "Spatial Gateway"
- desc = "Tears open a miniaturized gateway in spacetime to any conscious servant that can transport objects or creatures to its destination. \
- Each servant assisting in the invocation adds one additional use and four additional seconds to the gateway's uses and duration."
- invocations = list("Spatial Gateway...", "...activate!")
- channel_time = 80
- power_cost = 400
- multiple_invokers_used = TRUE
- multiple_invokers_optional = TRUE
- usage_tip = "This gateway is strictly one-way and will only allow things through the invoker's portal."
- tier = SCRIPTURE_SCRIPT
- primary_component = GEIS_CAPACITOR
- sort_priority = 9
- quickbind = TRUE
- quickbind_desc = "Allows you to create a one-way Spatial Gateway to a living Servant or Clockwork Obelisk."
-
-/datum/clockwork_scripture/spatial_gateway/check_special_requirements()
- if(!isturf(invoker.loc))
- to_chat(invoker, "You must not be inside an object to use this scripture!")
- return FALSE
- var/other_servants = 0
- for(var/mob/living/L in GLOB.alive_mob_list)
- if(is_servant_of_ratvar(L) && !L.stat && L != invoker)
- other_servants++
- for(var/obj/structure/destructible/clockwork/powered/clockwork_obelisk/O in GLOB.all_clockwork_objects)
- if(O.anchored)
- other_servants++
- if(!other_servants)
- to_chat(invoker, "There are no other conscious servants or anchored clockwork obelisks!")
- return FALSE
- return TRUE
-
-/datum/clockwork_scripture/spatial_gateway/scripture_effects()
- var/portal_uses = 0
- var/duration = 0
- for(var/mob/living/L in range(1, invoker))
- if(!L.stat && is_servant_of_ratvar(L))
- portal_uses++
- duration += 40 //4 seconds
- if(GLOB.ratvar_awakens)
- portal_uses = max(portal_uses, 100) //Very powerful if Ratvar has been summoned
- duration = max(duration, 100)
- return slab.procure_gateway(invoker, duration, portal_uses)
-
-
//Mending Mantra: Channeled for up to ten times over twenty seconds to repair structures and heal allies
/datum/clockwork_scripture/channeled/mending_mantra
descname = "Channeled, Area Healing and Repair"
@@ -487,3 +440,26 @@
invoker.light_range = 0
invoker.update_light()
return ..()
+
+//Belligerent: Channeled for up to fifteen times over thirty seconds. Forces non-servants that can hear the chant to walk, doing minor damage. Nar-Sian cultists are burned.
+/datum/clockwork_scripture/channeled/belligerent
+ descname = "Channeled, Area Slowdown"
+ name = "Belligerent"
+ desc = "Forces all nearby non-servants to walk rather than run, doing minor damage. Chanted every two seconds for up to thirty seconds."
+ chant_invocations = list("Punish their blindness!", "Take time, make slow!", "Kneel before The Justiciar!", "Halt their charges!", "Cease the tides!")
+ chant_amount = 15
+ chant_interval = 20
+ channel_time = 20
+ power_cost = 300
+ usage_tip = "Useful for crowd control in a populated area and disrupting mass movement."
+ tier = SCRIPTURE_DRIVER
+ primary_component = BELLIGERENT_EYE
+ sort_priority = 1
+ quickbind = TRUE
+ quickbind_desc = "Forces nearby non-Servants to walk, doing minor damage with each chant. Maximum 15 chants."
+
+/datum/clockwork_scripture/channeled/belligerent/chant_effects(chant_number)
+ for(var/mob/living/carbon/C in hearers(7, invoker))
+ C.apply_status_effect(STATUS_EFFECT_BELLIGERENT)
+ new /obj/effect/temp_visual/ratvar/belligerent(get_turf(invoker))
+ return TRUE
diff --git a/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm b/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm
index 297856f531..7478d45b08 100644
--- a/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm
+++ b/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm
@@ -1,5 +1,3 @@
-#define ARK_GRACE_PERIOD 300 //In seconds, how long the crew has before the Ark truly "begins"
-
/proc/clockwork_ark_active() //A helper proc so the Ark doesn't have to be typecast every time it's checked; returns null if there is no Ark and its active var otherwise
var/obj/structure/destructible/clockwork/massive/celestial_gateway/G = GLOB.ark_of_the_clockwork_justiciar
if(!G)
@@ -11,7 +9,7 @@
name = "\improper Ark of the Clockwork Justicar"
desc = "A massive, hulking amalgamation of parts. It seems to be maintaining a very unstable bluespace anomaly."
clockwork_desc = "Nezbere's magnum opus: a hulking clockwork machine capable of combining bluespace and steam power to summon Ratvar. Once activated, \
- its instability will cause one-way bluespace rifts to open across the station to the City of Cogs, so be prepared to defend it at all costs."
+ its instability will alert the entire area, so be prepared to defend it at all costs."
max_integrity = 500
mouse_opacity = MOUSE_OPACITY_OPAQUE
icon = 'icons/effects/clockwork_effects.dmi'
@@ -22,9 +20,8 @@
immune_to_servant_attacks = TRUE
var/active = FALSE
var/progress_in_seconds = 0 //Once this reaches GATEWAY_RATVAR_ARRIVAL, it's game over
- var/grace_period = ARK_GRACE_PERIOD //This exists to allow the crew to gear up and prepare for the invasion
- var/initial_activation_delay = -1 //How many seconds the Ark will have initially taken to activate
- var/seconds_until_activation = -1 //How many seconds until the Ark activates; if it should never activate, set this to -1
+ var/initial_activation_delay = 5 //How many seconds the Ark will have initially taken to activate
+ var/seconds_until_activation = 5 //How many seconds until the Ark activates; if it should never activate, set this to -1
var/purpose_fulfilled = FALSE
var/first_sound_played = FALSE
var/second_sound_played = FALSE
@@ -38,10 +35,21 @@
/obj/structure/destructible/clockwork/massive/celestial_gateway/Initialize()
. = ..()
+ INVOKE_ASYNC(src, .proc/spawn_animation)
glow = new(get_turf(src))
if(!GLOB.ark_of_the_clockwork_justiciar)
GLOB.ark_of_the_clockwork_justiciar = src
- START_PROCESSING(SSprocessing, src)
+
+/obj/structure/destructible/clockwork/massive/celestial_gateway/on_attack_hand(mob/user, act_intent, unarmed_attack_flags)
+ if(!active && is_servant_of_ratvar(user) && user.canUseTopic(src, !issilicon(user), NO_DEXTERY))
+ if(alert(user, "Are you sure you want to activate the ark? Once enabled, there will be no turning back.", "Enabling the ark", "Activate!", "Cancel") == "Activate!")
+ if(active)
+ return
+ log_game("[key_name(user)] has activated an Ark of the Clockwork Justicar at [COORD(src)].")
+ START_PROCESSING(SSprocessing, src)
+ SSshuttle.registerHostileEnvironment(src)
+ else
+ to_chat(user, "You decide against activating the ark.. for now.")
/obj/structure/destructible/clockwork/massive/celestial_gateway/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir)
. = ..()
@@ -49,7 +57,7 @@
flick("clockwork_gateway_damaged", glow)
playsound(src, 'sound/machines/clockcult/ark_damage.ogg', 75, FALSE)
if(last_scream < world.time)
- audible_message("An unearthly screaming sound resonates throughout Reebe!")
+ audible_message("An unearthly screaming sound resonates throughout the area!")
for(var/V in GLOB.player_list)
var/mob/M = V
var/turf/T = get_turf(M)
@@ -60,31 +68,19 @@
/obj/structure/destructible/clockwork/massive/celestial_gateway/proc/final_countdown(ark_time) //WE'RE LEAVING TOGETHEEEEEEEEER
if(!ark_time)
- ark_time = 30 //minutes
- initial_activation_delay = ark_time * 60
- seconds_until_activation = ark_time * 60 //60 seconds in a minute * number of minutes
+ ark_time = 5 //5 minutes
for(var/obj/item/clockwork/construct_chassis/cogscarab/C in GLOB.all_clockwork_objects)
C.infinite_resources = FALSE
GLOB.servants_active = TRUE
SSshuttle.registerHostileEnvironment(src)
-/obj/structure/destructible/clockwork/massive/celestial_gateway/proc/cry_havoc()
- visible_message("[src] shudders and roars to life, its parts beginning to whirr and screech!")
- hierophant_message("The Ark is activating! You will be transported there soon!")
- for(var/mob/M in GLOB.player_list)
- var/turf/T = get_turf(M)
- if(is_servant_of_ratvar(M) || isobserver(M) || (T && T.z == z))
- M.playsound_local(M, 'sound/magic/clockwork/ark_activation_sequence.ogg', 30, FALSE, pressure_affected = FALSE)
- addtimer(CALLBACK(src, .proc/let_slip_the_dogs), 300)
-
/obj/structure/destructible/clockwork/massive/celestial_gateway/proc/let_slip_the_dogs()
- spawn_animation()
first_sound_played = TRUE
active = TRUE
+ visible_message("[src] shudders and roars to life, its parts beginning to whirr and screech!")
priority_announce("Massive [Gibberish("bluespace", 100)] anomaly detected on all frequencies. All crew are directed to \
@!$, [text2ratvar("PURGE ALL UNTRUTHS")] <&. the anomalies and destroy their source to prevent further damage to corporate property. This is \
- not a drill.[grace_period ? " Estimated time of appearance: [grace_period] seconds. Use this time to prepare for an attack on [station_name()]." : ""]", \
- "Central Command Higher Dimensional Affairs", 'sound/magic/clockwork/ark_activation.ogg')
+ not a drill.", "Central Command Higher Dimensional Affairs", 'sound/magic/clockwork/ark_activation_sequence.ogg')
set_security_level("delta")
for(var/V in SSticker.mode.servants_of_ratvar)
var/datum/mind/M = V
@@ -92,15 +88,6 @@
continue
if(ishuman(M.current))
M.current.add_overlay(mutable_appearance('icons/effects/genetics.dmi', "servitude", -MUTATIONS_LAYER))
- for(var/V in GLOB.brass_recipes)
- var/datum/stack_recipe/R = V
- if(!R)
- continue
- if(R.title == "wall gear")
- R.time *= 2 //Building walls becomes slower when the Ark activates
- mass_recall()
- recalls_remaining++ //So it doesn't use up a charge
-
var/turf/T = get_turf(src)
var/list/open_turfs = list()
for(var/turf/open/OT in orange(1, T))
@@ -110,14 +97,35 @@
for(var/mob/living/L in T)
L.forceMove(pick(open_turfs))
-/obj/structure/destructible/clockwork/massive/celestial_gateway/proc/open_portal(turf/T)
- new/obj/effect/clockwork/city_of_cogs_rift(T)
-
/obj/structure/destructible/clockwork/massive/celestial_gateway/proc/spawn_animation()
- hierophant_message("The Ark has activated! [grace_period ? "You have [round(grace_period / 60)] minutes until the crew invades! " : ""]Defend it at all costs!", FALSE, src)
- sound_to_playing_players(volume = 10, channel = CHANNEL_JUSTICAR_ARK, S = sound('sound/effects/clockcult_gateway_charging.ogg', TRUE))
- seconds_until_activation = 0
- SSshuttle.registerHostileEnvironment(src)
+ var/turf/T = get_turf(src)
+ new/obj/effect/clockwork/general_marker/inathneq(T)
+ hierophant_message("\"[text2ratvar("Engine, come forth and show your servants your mercy")]!\"")
+ playsound(T, 'sound/magic/clockwork/invoke_general.ogg', 30, 0)
+ sleep(10)
+ new/obj/effect/clockwork/general_marker/sevtug(T)
+ hierophant_message("\"[text2ratvar("Engine, come forth and show this station your decorating skills")]!\"")
+ playsound(T, 'sound/magic/clockwork/invoke_general.ogg', 45, 0)
+ sleep(10)
+ new/obj/effect/clockwork/general_marker/nezbere(T)
+ hierophant_message("\"[text2ratvar("Engine, come forth and shine your light across this realm")]!!\"")
+ playsound(T, 'sound/magic/clockwork/invoke_general.ogg', 60, 0)
+ sleep(10)
+ new/obj/effect/clockwork/general_marker/nzcrentr(T)
+ hierophant_message("\"[text2ratvar("Engine, come forth")].\"")
+ playsound(T, 'sound/magic/clockwork/invoke_general.ogg', 75, 0)
+ sleep(10)
+ playsound(T, 'sound/magic/clockwork/invoke_general.ogg', 100, 0)
+ var/list/open_turfs = list()
+ for(var/turf/open/OT in orange(1, T))
+ if(!is_blocked_turf(OT, TRUE))
+ open_turfs |= OT
+ if(open_turfs.len)
+ for(var/mob/living/L in T)
+ L.forceMove(pick(open_turfs))
+ glow = new(get_turf(src))
+ var/area/gate_area = get_area(src)
+ hierophant_message("An Ark of the Clockwork Justicar has been created in [gate_area.map_name]!", FALSE, src)
/obj/structure/destructible/clockwork/massive/celestial_gateway/proc/initiate_mass_recall()
recalling = TRUE
@@ -141,35 +149,22 @@
transform = matrix() * 2
animate(src, transform = matrix() * 0.5, time = 30, flags = ANIMATION_END_NOW)
-/obj/structure/destructible/clockwork/massive/celestial_gateway/Destroy()
+obj/structure/destructible/clockwork/massive/celestial_gateway/Destroy()
STOP_PROCESSING(SSprocessing, src)
+ if(!purpose_fulfilled)
+ var/area/gate_area = get_area(src)
+ hierophant_message("An Ark of the Clockwork Justicar has fallen at [gate_area.map_name]!")
+ send_to_playing_players(sound(null, 0, channel = CHANNEL_JUSTICAR_ARK))
+ var/was_stranded = SSshuttle.emergency.mode == SHUTTLE_STRANDED
SSshuttle.clearHostileEnvironment(src)
- if(!purpose_fulfilled && istype(SSticker.mode, /datum/game_mode/clockwork_cult))
- hierophant_message("The Ark has fallen!")
- sound_to_playing_players(null, channel = CHANNEL_JUSTICAR_ARK)
- SSticker.force_ending = TRUE //rip
+ if(!was_stranded && !purpose_fulfilled)
+ priority_announce("Massive energy anomaly no longer on short-range scanners, bluespace distortions still detected.","Central Command Higher Dimensional Affairs")
if(glow)
qdel(glow)
glow = null
if(countdown)
qdel(countdown)
countdown = null
- for(var/mob/L in GLOB.player_list)
- var/turf/T = get_turf(L)
- if(T && T.z == z)
- var/atom/movable/target = L
- if(isobj(L.loc))
- target = L.loc
- target.forceMove(get_turf(pick(GLOB.generic_event_spawns)))
- L.overlay_fullscreen("flash", /obj/screen/fullscreen/flash/static)
- L.clear_fullscreen("flash", 30)
- if(isliving(L))
- var/mob/living/LI = L
- LI.Stun(50)
- for(var/obj/effect/clockwork/city_of_cogs_rift/R in GLOB.all_clockwork_objects)
- qdel(R)
- if(GLOB.ark_of_the_clockwork_justiciar == src)
- GLOB.ark_of_the_clockwork_justiciar = null
. = ..()
/obj/structure/destructible/clockwork/massive/celestial_gateway/deconstruct(disassembled = TRUE)
@@ -203,8 +198,6 @@
/obj/structure/destructible/clockwork/massive/celestial_gateway/proc/get_arrival_time(var/deciseconds = TRUE)
if(seconds_until_activation)
. = seconds_until_activation
- else if(grace_period)
- . = grace_period
else if(GATEWAY_RATVAR_ARRIVAL - progress_in_seconds > 0)
. = round(max((GATEWAY_RATVAR_ARRIVAL - progress_in_seconds) / (GATEWAY_SUMMON_RATE), 0), 1)
if(deciseconds)
@@ -213,8 +206,6 @@
/obj/structure/destructible/clockwork/massive/celestial_gateway/proc/get_arrival_text(s_on_time)
if(seconds_until_activation)
return "[get_arrival_time()][s_on_time ? "S" : ""]"
- if(grace_period)
- return "[get_arrival_time()][s_on_time ? "S" : ""]"
. = "IMMINENT"
if(!obj_integrity)
. = "DETONATING"
@@ -229,17 +220,14 @@
if(!active)
. += "Time until the Ark's activation: [DisplayTimeText(get_arrival_time())]"
else
- if(grace_period)
- . += "Crew grace period time remaining: [DisplayTimeText(get_arrival_time())]"
- else
- . += "Time until Ratvar's arrival: [DisplayTimeText(get_arrival_time())]"
- switch(progress_in_seconds)
- if(-INFINITY to GATEWAY_REEBE_FOUND)
- . += "The Ark is feeding power into the bluespace field."
- if(GATEWAY_REEBE_FOUND to GATEWAY_RATVAR_COMING)
- . += "The field is ripping open a copy of itself in Ratvar's prison."
- if(GATEWAY_RATVAR_COMING to INFINITY)
- . += "With the bluespace field established, Ratvar is preparing to come through!"
+ . += "Time until Ratvar's arrival: [DisplayTimeText(get_arrival_time())]"
+ switch(progress_in_seconds)
+ if(-INFINITY to GATEWAY_REEBE_FOUND)
+ . += "The Ark is feeding power into the bluespace field."
+ if(GATEWAY_REEBE_FOUND to GATEWAY_RATVAR_COMING)
+ . += "The field is ripping open a copy of itself in Ratvar's prison."
+ if(GATEWAY_RATVAR_COMING to INFINITY)
+ . += "With the bluespace field established, Ratvar is preparing to come through!"
else
if(!active)
. += "Whatever it is, it doesn't seem to be active."
@@ -253,20 +241,14 @@
. += "The anomaly is stable! Something is coming through!"
/obj/structure/destructible/clockwork/massive/celestial_gateway/process()
- if(seconds_until_activation == -1) //we never do anything
- return
adjust_clockwork_power(2.5) //Provides weak power generation on its own
if(seconds_until_activation)
if(!countdown)
countdown = new(src)
countdown.start()
seconds_until_activation--
- if(!GLOB.script_scripture_unlocked && initial_activation_delay * 0.5 > seconds_until_activation)
- GLOB.script_scripture_unlocked = TRUE
- hierophant_message("The Ark is halfway prepared. Script scripture is now available!")
if(!seconds_until_activation)
- cry_havoc()
- seconds_until_activation = -1 //we'll set this after cry_havoc()
+ let_slip_the_dogs()
return
if(!first_sound_played || prob(7))
for(var/mob/M in GLOB.player_list)
@@ -285,6 +267,9 @@
if(!step_away(O, src, 2) || get_dist(O, src) < 2)
O.take_damage(50, BURN, "bomb")
O.update_icon()
+
+ conversion_pulse() //Converts the nearby area into clockcult-style
+
for(var/V in GLOB.player_list)
var/mob/M = V
var/turf/T = get_turf(M)
@@ -292,29 +277,24 @@
M.forceMove(get_step(src, SOUTH))
M.overlay_fullscreen("flash", /obj/screen/fullscreen/flash)
M.clear_fullscreen("flash", 5)
- if(grace_period)
- grace_period--
- return
progress_in_seconds += GATEWAY_SUMMON_RATE
switch(progress_in_seconds)
if(-INFINITY to GATEWAY_REEBE_FOUND)
if(!second_sound_played)
- for(var/V in GLOB.generic_event_spawns)
- addtimer(CALLBACK(src, .proc/open_portal, get_turf(V)), rand(100, 600))
sound_to_playing_players('sound/magic/clockwork/invoke_general.ogg', 30, FALSE)
- sound_to_playing_players(volume = 20, channel = CHANNEL_JUSTICAR_ARK, S = sound('sound/effects/clockcult_gateway_charging.ogg', TRUE))
+ sound_to_playing_players(volume = 10, channel = CHANNEL_JUSTICAR_ARK, S = sound('sound/effects/clockcult_gateway_charging.ogg', TRUE))
second_sound_played = TRUE
make_glow()
glow.icon_state = "clockwork_gateway_charging"
if(GATEWAY_REEBE_FOUND to GATEWAY_RATVAR_COMING)
if(!third_sound_played)
- sound_to_playing_players(volume = 25, channel = CHANNEL_JUSTICAR_ARK, S = sound('sound/effects/clockcult_gateway_active.ogg', TRUE))
+ sound_to_playing_players(volume = 30, channel = CHANNEL_JUSTICAR_ARK, S = sound('sound/effects/clockcult_gateway_active.ogg', TRUE))
third_sound_played = TRUE
make_glow()
glow.icon_state = "clockwork_gateway_active"
if(GATEWAY_RATVAR_COMING to GATEWAY_RATVAR_ARRIVAL)
if(!fourth_sound_played)
- sound_to_playing_players(volume = 30, channel = CHANNEL_JUSTICAR_ARK, S = sound('sound/effects/clockcult_gateway_closing.ogg', TRUE))
+ sound_to_playing_players(volume = 70, channel = CHANNEL_JUSTICAR_ARK, S = sound('sound/effects/clockcult_gateway_closing.ogg', TRUE))
fourth_sound_played = TRUE
make_glow()
glow.icon_state = "clockwork_gateway_closing"
@@ -334,7 +314,6 @@
GLOB.clockwork_gateway_activated = TRUE
var/turf/T = SSmapping.get_station_center()
new /obj/structure/destructible/clockwork/massive/ratvar(T)
- SSticker.force_ending = TRUE
var/x0 = T.x
var/y0 = T.y
for(var/I in spiral_range_turfs(255, T, tick_checked = TRUE))
@@ -349,6 +328,17 @@
T.ratvar_act(dist)
CHECK_TICK
+//Converts nearby turfs into their clockwork equivalent, with ever-increasing range the closer the ark is to summoning Ratvar
+/obj/structure/destructible/clockwork/massive/celestial_gateway/proc/conversion_pulse()
+ var/convert_dist = 1 + (round(FLOOR(progress_in_seconds, 15) * 0.067))
+ for(var/t in RANGE_TURFS(convert_dist, loc))
+ var/turf/T = t
+ if(!T)
+ continue
+ var/dist = cheap_hypotenuse(T.x, T.y, x, y)
+ if(dist < convert_dist)
+ T.ratvar_act(FALSE, TRUE, 3)
+
//ATTACK GHOST IGNORING PARENT RETURN VALUE
/obj/structure/destructible/clockwork/massive/celestial_gateway/attack_ghost(mob/user)
if(!IsAdminGhost(user))
@@ -361,9 +351,9 @@
if(alert(user, "You're REALLY SURE? This cannot be undone.", name, "Yes - Activate the Ark", "No") == "Yes - Activate the Ark")
message_admins("Admin [key_name_admin(user)] started the Ark's countdown!")
log_admin("Admin [key_name(user)] started the Ark's countdown on a non-clockcult mode!")
- to_chat(user, "The gamemode is now being treated as clockwork cult, and the Ark is counting down from 30 \
+ to_chat(user, "The gamemode is now being treated as clockwork cult, and the Ark is counting down from 5 \
minutes. You will need to create servant players yourself.")
- final_countdown(35)
+ final_countdown(5)
diff --git a/code/modules/antagonists/clockcult/clock_structures/clockwork_obelisk.dm b/code/modules/antagonists/clockcult/clock_structures/clockwork_obelisk.dm
index 058bd9d24e..2b4b797b4d 100644
--- a/code/modules/antagonists/clockcult/clock_structures/clockwork_obelisk.dm
+++ b/code/modules/antagonists/clockcult/clock_structures/clockwork_obelisk.dm
@@ -41,14 +41,19 @@
affected += try_use_power(MIN_CLOCKCULT_POWER*4)
return affected
-/obj/structure/destructible/clockwork/powered/clockwork_obelisk/attack_hand(mob/living/user)
+/obj/structure/destructible/clockwork/powered/clockwork_obelisk/Destroy()
+ for(var/obj/effect/clockwork/spatial_gateway/SG in loc)
+ SG.ex_act(EXPLODE_DEVASTATE)
+ return ..()
+
+/obj/structure/destructible/clockwork/powered/clockwork_obelisk/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
if(!is_servant_of_ratvar(user) || !can_access_clockwork_power(src, hierophant_cost) || !anchored)
to_chat(user, "You place your hand on [src], but it doesn't react.")
return
- var/choice = alert(user,"You place your hand on [src]...",,"Hierophant Broadcast","Spatial Gateway","Cancel")
+ var/choice = alert(user,"You place your hand on [src]...",,"Hierophant Broadcast","Spatial Gateway","Cancel") //Will create a stable gateway instead if between two obelisks one of which is onstation and the other on reebe
switch(choice)
if("Hierophant Broadcast")
if(active)
@@ -96,7 +101,7 @@
if(!anchored)
return
var/obj/effect/clockwork/spatial_gateway/SG = locate(/obj/effect/clockwork/spatial_gateway) in loc
- if(SG && SG.timerid) //it's a valid gateway, we're active
+ if(SG && (SG.timerid || SG.is_stable)) //it's a valid gateway, we're active
icon_state = active_icon
density = FALSE
active = TRUE
diff --git a/code/modules/antagonists/clockcult/clock_structures/eminence_spire.dm b/code/modules/antagonists/clockcult/clock_structures/eminence_spire.dm
index c01c7f0f57..5302153b9c 100644
--- a/code/modules/antagonists/clockcult/clock_structures/eminence_spire.dm
+++ b/code/modules/antagonists/clockcult/clock_structures/eminence_spire.dm
@@ -11,7 +11,7 @@
var/selection_timer //Timer ID; this is canceled if the vote is canceled
var/kingmaking
-/obj/structure/destructible/clockwork/eminence_spire/attack_hand(mob/living/user)
+/obj/structure/destructible/clockwork/eminence_spire/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
@@ -27,9 +27,6 @@
if(C.clock_team.eminence)
to_chat(user, "There's already an Eminence!")
return
- if(!GLOB.servants_active)
- to_chat(user, "The Ark isn't active!")
- return
if(eminence_nominee) //This could be one large proc, but is split into three for ease of reading
if(eminence_nominee == user)
cancelation(user)
diff --git a/code/modules/antagonists/clockcult/clock_structures/heralds_beacon.dm b/code/modules/antagonists/clockcult/clock_structures/heralds_beacon.dm
index 7d8b206f41..f8a3afbf91 100644
--- a/code/modules/antagonists/clockcult/clock_structures/heralds_beacon.dm
+++ b/code/modules/antagonists/clockcult/clock_structures/heralds_beacon.dm
@@ -1,3 +1,5 @@
+
+
//Used to "declare war" against the station. The servants' equipment will be permanently supercharged, and the Ark given extra time to prepare.
//This will send an announcement to the station, meaning that they will be warned very early in advance about the impending attack.
/obj/structure/destructible/clockwork/heralds_beacon
@@ -58,7 +60,7 @@
. += "There are [time_remaining] second[time_remaining != 1 ? "s" : ""] remaining to vote."
. += "There are [voters.len]/[votes_needed] votes to activate the beacon!"
-/obj/structure/destructible/clockwork/heralds_beacon/attack_hand(mob/living/user)
+/obj/structure/destructible/clockwork/heralds_beacon/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
@@ -108,5 +110,4 @@
to_chat(H, "The beacon's power warps your body into a clockwork form! You are now immune to many hazards, and your body is more robust against damage!")
H.set_species(/datum/species/golem/clockwork/no_scrap)
var/obj/structure/destructible/clockwork/massive/celestial_gateway/G = GLOB.ark_of_the_clockwork_justiciar
- G.grace_period = FALSE //no grace period if we've declared war
G.recalls_remaining++
diff --git a/code/modules/antagonists/clockcult/clock_structures/mania_motor.dm b/code/modules/antagonists/clockcult/clock_structures/mania_motor.dm
index 5fbaf9fd57..40cadb53a2 100644
--- a/code/modules/antagonists/clockcult/clock_structures/mania_motor.dm
+++ b/code/modules/antagonists/clockcult/clock_structures/mania_motor.dm
@@ -30,7 +30,7 @@
toggle()
return TRUE
-/obj/structure/destructible/clockwork/powered/mania_motor/attack_hand(mob/living/user)
+/obj/structure/destructible/clockwork/powered/mania_motor/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
diff --git a/code/modules/antagonists/clockcult/clock_structures/prolonging_prism.dm b/code/modules/antagonists/clockcult/clock_structures/prolonging_prism.dm
new file mode 100644
index 0000000000..73488d736a
--- /dev/null
+++ b/code/modules/antagonists/clockcult/clock_structures/prolonging_prism.dm
@@ -0,0 +1,134 @@
+//Prolonging Prism: A prism that consumes power to delay the shuttle
+/obj/structure/destructible/clockwork/powered/prolonging_prism
+ name = "prolonging prism"
+ desc = "A dark onyx prism, held in midair by spiraling tendrils of stone."
+ clockwork_desc = "A powerful prism that will delay the arrival of an emergency shuttle."
+ icon_state = "prolonging_prism_inactive"
+ active_icon = "prolonging_prism"
+ inactive_icon = "prolonging_prism_inactive"
+ unanchored_icon = "prolonging_prism_unwrenched"
+ construction_value = 20
+ max_integrity = 125
+ break_message = "The prism falls to the ground with a heavy thud!"
+ debris = list(/obj/item/clockwork/alloy_shards/small = 3, \
+ /obj/item/clockwork/alloy_shards/medium = 1, \
+ /obj/item/clockwork/alloy_shards/large = 1, \
+ /obj/item/clockwork/component/vanguard_cogwheel/onyx_prism = 1)
+ var/static/power_refund = 250
+ var/static/delay_cost = 2000 //Updated power values for new-newclock. Easier to activate and sustain, you are quite literally pointing the entire station towards you as opposed to blood-delay after all.
+ var/static/delay_cost_increase = 1000
+ var/static/delay_remaining = 0
+
+/obj/structure/destructible/clockwork/powered/prolonging_prism/examine(mob/user)
+ . = ..()
+ if(is_servant_of_ratvar(user) || isobserver(user))
+ if(SSshuttle.emergency.mode == SHUTTLE_DOCKED || SSshuttle.emergency.mode == SHUTTLE_IGNITING || SSshuttle.emergency.mode == SHUTTLE_STRANDED || SSshuttle.emergency.mode == SHUTTLE_ESCAPE)
+ . += "An emergency shuttle has arrived and this prism is no longer useful; attempt to activate it to gain a partial refund of components used."
+ else
+ var/efficiency = get_efficiency_mod(TRUE)
+ . += "It requires at least [DisplayPower(get_delay_cost())] of power to attempt to delay the arrival of an emergency shuttle by [2 * efficiency] minutes."
+ . += "This cost increases by [DisplayPower(delay_cost_increase)] for every previous activation."
+
+/obj/structure/destructible/clockwork/powered/prolonging_prism/forced_disable(bad_effects)
+ if(active)
+ if(bad_effects)
+ try_use_power(MIN_CLOCKCULT_POWER*4)
+ visible_message("[src] emits an airy chuckling sound and falls dark!")
+ toggle()
+ return TRUE
+
+/obj/structure/destructible/clockwork/powered/prolonging_prism/on_attack_hand(mob/living/user)
+ if(user.canUseTopic(src, !issilicon(user), NO_DEXTERY) && is_servant_of_ratvar(user))
+ if(SSshuttle.emergency.mode == SHUTTLE_DOCKED || SSshuttle.emergency.mode == SHUTTLE_IGNITING || SSshuttle.emergency.mode == SHUTTLE_STRANDED || SSshuttle.emergency.mode == SHUTTLE_ESCAPE)
+ to_chat(user, "You break [src] apart, refunding some of the power used.")
+ adjust_clockwork_power(power_refund)
+ take_damage(max_integrity)
+ return 0
+ if(active)
+ return 0
+ var/turf/T = get_turf(src)
+ if(!T || !is_station_level(T.z))
+ to_chat(user, "[src] must be on the station to function!")
+ return 0
+ if(SSshuttle.emergency.mode != SHUTTLE_CALL)
+ to_chat(user, "No emergency shuttles are attempting to arrive at the station!")
+ return 0
+ if(!try_use_power(get_delay_cost()))
+ to_chat(user, "[src] needs more power to function!")
+ return 0
+ delay_cost += delay_cost_increase
+ delay_remaining += PRISM_DELAY_DURATION
+ toggle(0, user)
+
+/obj/structure/destructible/clockwork/powered/prolonging_prism/process()
+ var/turf/own_turf = get_turf(src)
+ if(SSshuttle.emergency.mode != SHUTTLE_CALL || delay_remaining <= 0 || !own_turf || !is_station_level(own_turf.z))
+ forced_disable(FALSE)
+ return
+ . = ..()
+ var/delay_amount = 40
+ delay_remaining -= delay_amount
+ var/efficiency = get_efficiency_mod()
+ SSshuttle.emergency.setTimer(SSshuttle.emergency.timeLeft(1) + (delay_amount * efficiency))
+ var/highest_y
+ var/highest_x
+ var/lowest_y
+ var/lowest_x
+ var/list/prism_turfs = list()
+ for(var/t in SSshuttle.emergency.ripple_area(SSshuttle.getDock("emergency_home")))
+ prism_turfs[t] = TRUE
+ var/turf/T = t
+ if(!highest_y || T.y > highest_y)
+ highest_y = T.y
+ if(!highest_x || T.x > highest_x)
+ highest_x = T.x
+ if(!lowest_y || T.y < lowest_y)
+ lowest_y = T.y
+ if(!lowest_x || T.x < lowest_x)
+ lowest_x = T.x
+ var/mean_y = LERP(lowest_y, highest_y, 0.5)
+ var/mean_x = LERP(lowest_x, highest_x, 0.5)
+ if(prob(50))
+ mean_y = CEILING(mean_y, 1)
+ else
+ mean_y = FLOOR(mean_y, 1) //Yes, I know round(mean_y) does the same, just left as FLOOR for consistancy sake
+ if(prob(50))
+ mean_x = CEILING(mean_x, 1)
+ else
+ mean_x = FLOOR(mean_x, 1)
+ var/turf/semi_random_center_turf = locate(mean_x, mean_y, z)
+ for(var/t in getline(src, semi_random_center_turf))
+ prism_turfs[t] = TRUE
+ var/placement_style = prob(50)
+ for(var/t in prism_turfs)
+ var/turf/T = t
+ if(placement_style)
+ if(ISODD(T.x + T.y))
+ seven_random_hexes(T, efficiency)
+ else if(prob(50 * efficiency))
+ new /obj/effect/temp_visual/ratvar/prolonging_prism(T)
+ else
+ if(ISEVEN(T.x + T.y))
+ seven_random_hexes(T, efficiency)
+ else if(prob(50 * efficiency))
+ new /obj/effect/temp_visual/ratvar/prolonging_prism(T)
+ CHECK_TICK //we may be going over a hell of a lot of turfs
+
+/obj/structure/destructible/clockwork/powered/prolonging_prism/proc/get_delay_cost()
+ return FLOOR(delay_cost, MIN_CLOCKCULT_POWER)
+
+/obj/structure/destructible/clockwork/powered/prolonging_prism/proc/seven_random_hexes(turf/T, efficiency)
+ var/static/list/hex_states = list("prismhex1", "prismhex2", "prismhex3", "prismhex4", "prismhex5", "prismhex6", "prismhex7")
+ var/mutable_appearance/hex_combo
+ for(var/n in hex_states) //BUILD ME A HEXAGON
+ if(prob(50 * efficiency))
+ if(!hex_combo)
+ hex_combo = mutable_appearance('icons/effects/64x64.dmi', n, RIPPLE_LAYER)
+ else
+ hex_combo.add_overlay(mutable_appearance('icons/effects/64x64.dmi', n, RIPPLE_LAYER))
+ if(hex_combo) //YOU BUILT A HEXAGON
+ hex_combo.pixel_x = -16
+ hex_combo.pixel_y = -16
+ hex_combo.mouse_opacity = MOUSE_OPACITY_TRANSPARENT
+ hex_combo.plane = GAME_PLANE
+ new /obj/effect/temp_visual/ratvar/prolonging_prism(T, hex_combo)
diff --git a/code/modules/antagonists/clockcult/clock_structures/ratvar_the_clockwork_justicar.dm b/code/modules/antagonists/clockcult/clock_structures/ratvar_the_clockwork_justicar.dm
index c17885315f..73ae89a19b 100644
--- a/code/modules/antagonists/clockcult/clock_structures/ratvar_the_clockwork_justicar.dm
+++ b/code/modules/antagonists/clockcult/clock_structures/ratvar_the_clockwork_justicar.dm
@@ -101,8 +101,8 @@
return
clashing = TRUE
GLOB.cult_narsie.clashing = TRUE
- to_chat(world, "\"YOU.\"")
- to_chat(world, "\"Ratvar?!\"")
+ to_chat(world, "\"[pick("YOU.", "BLOOD GOD!!", "FACE ME, COWARD!")]\"")
+ to_chat(world, "\"[pick("Ratvar?! How?!", "YOU. BANISHED ONCE. KILLED NOW.", "SCRAP HEAP!!")]\"")
clash_of_the_titans(GLOB.cult_narsie) // >:(
return TRUE
@@ -137,15 +137,16 @@
base_victory_chance *= 2 //The clash has a higher chance of resolving each time both gods attack one another
switch(winner)
if("Ratvar")
- send_to_playing_players("\"[pick("DIE.", "ROT.")]\"\n\
+ send_to_playing_players("\"[pick("DIE.", "ROT FOR CENTURIES, AS I HAVE!.","PERISH, HEATHEN.", "DIE, MONSTER, YOU DON'T BELONG IN THIS WORLD.")]\"\n\
\"[pick("Nooooo...", "Not die. To y-", "Die. Ratv-", "Sas tyen re-")]\"") //Nar'Sie get out
sound_to_playing_players('sound/magic/clockwork/anima_fragment_attack.ogg')
- sound_to_playing_players('sound/magic/demon_dies.ogg', 50)
+ sound_to_playing_players('sound/magic/abomscream.ogg', 50)
clashing = FALSE
qdel(narsie)
if("Nar'Sie")
- send_to_playing_players("\"[pick("Ha.", "Ra'sha fonn dest.", "You fool. To come here.")]\"") //Broken English
- sound_to_playing_players('sound/magic/demon_attack1.ogg')
- sound_to_playing_players('sound/magic/clockwork/anima_fragment_death.ogg', 62)
+ send_to_playing_players("\"[pick("Ha.", "Ra'sha fonn dest.", "You fool. To come here.")]\"\n\
+ \"[pick("NO, YOUR SHADOWS SHALL NO-", "ZNL GUR FGERNZF BS GVZR PNEEL ZL RKVFG-", "MY LIGHT CANNO-")]\"")
+ sound_to_playing_players('sound/magic/demon_attack1.ogg', 50)
+ sound_to_playing_players('sound/machines/clockcult/ratvar_scream.ogg', 80)
narsie.clashing = FALSE
qdel(src)
diff --git a/code/modules/antagonists/clockcult/clock_structures/trap_triggers/lever.dm b/code/modules/antagonists/clockcult/clock_structures/trap_triggers/lever.dm
index 12e4b62a65..55347685f4 100644
--- a/code/modules/antagonists/clockcult/clock_structures/trap_triggers/lever.dm
+++ b/code/modules/antagonists/clockcult/clock_structures/trap_triggers/lever.dm
@@ -6,7 +6,7 @@
max_integrity = 75
icon_state = "lever"
-/obj/structure/destructible/clockwork/trap/trigger/lever/attack_hand(mob/living/user)
+/obj/structure/destructible/clockwork/trap/trigger/lever/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
diff --git a/code/modules/antagonists/clockcult/clock_structures/trap_triggers/repeater.dm b/code/modules/antagonists/clockcult/clock_structures/trap_triggers/repeater.dm
index f5ed91ac15..7a528786e2 100644
--- a/code/modules/antagonists/clockcult/clock_structures/trap_triggers/repeater.dm
+++ b/code/modules/antagonists/clockcult/clock_structures/trap_triggers/repeater.dm
@@ -6,7 +6,7 @@
max_integrity = 15 //Fragile!
icon_state = "repeater"
-/obj/structure/destructible/clockwork/trap/trigger/repeater/attack_hand(mob/living/user)
+/obj/structure/destructible/clockwork/trap/trigger/repeater/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm
index 52ead9a1e7..68a890028e 100644
--- a/code/modules/antagonists/cult/blood_magic.dm
+++ b/code/modules/antagonists/cult/blood_magic.dm
@@ -801,7 +801,7 @@
var/turf/T = get_turf(user)
qdel(src)
var/datum/action/innate/cult/spear/S = new(user)
- var/obj/item/twohanded/cult_spear/rite = new(T)
+ var/obj/item/cult_spear/rite = new(T)
S.Grant(user, rite)
rite.spear_act = S
if(user.put_in_hands(rite))
diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm
index 8f0f9a658c..f305d5b678 100644
--- a/code/modules/antagonists/cult/cult_items.dm
+++ b/code/modules/antagonists/cult/cult_items.dm
@@ -34,6 +34,8 @@
w_class = WEIGHT_CLASS_SMALL
force = 15
throwforce = 25
+ wound_bonus = -30
+ bare_wound_bonus = 30
armour_penetration = 35
actions_types = list(/datum/action/item_action/cult_dagger)
@@ -53,8 +55,10 @@
flags_1 = CONDUCT_1
sharpness = IS_SHARP
w_class = WEIGHT_CLASS_BULKY
- force = 30
+ force = 30 // whoever balanced this got beat in the head by a bible too many times good lord
throwforce = 10
+ wound_bonus = -80
+ bare_wound_bonus = 30
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "rended")
@@ -100,7 +104,7 @@
user.apply_damage(30, BRUTE, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM))
user.dropItemToGround(src)
-/obj/item/twohanded/required/cult_bastard
+/obj/item/cult_bastard
name = "bloody bastard sword"
desc = "An enormous sword used by Nar'Sien cultists to rapidly harvest the souls of non-believers."
w_class = WEIGHT_CLASS_HUGE
@@ -127,31 +131,35 @@
var/spin_cooldown = 250
var/dash_toggled = TRUE
-/obj/item/twohanded/required/cult_bastard/Initialize()
+/obj/item/cult_bastard/Initialize()
. = ..()
set_light(4)
jaunt = new(src)
linked_action = new(src)
- AddComponent(/datum/component/butchering, 50, 80)
-/obj/item/twohanded/required/cult_bastard/examine(mob/user)
+/obj/item/cult_bastard/ComponentInitialize()
+ . = ..()
+ AddComponent(/datum/component/butchering, 50, 80)
+ AddComponent(/datum/component/two_handed, require_twohands=TRUE)
+
+/obj/item/cult_bastard/examine(mob/user)
. = ..()
if(contents.len)
. += " There are [contents.len] souls trapped within the sword's core."
else
. += " The sword appears to be quite lifeless."
-/obj/item/twohanded/required/cult_bastard/can_be_pulled(user)
+/obj/item/cult_bastard/can_be_pulled(user)
return FALSE
-/obj/item/twohanded/required/cult_bastard/attack_self(mob/user)
+/obj/item/cult_bastard/attack_self(mob/user)
dash_toggled = !dash_toggled
if(dash_toggled)
to_chat(loc, "You raise [src] and prepare to jaunt with it.")
else
to_chat(loc, "You lower [src] and prepare to swing it normally.")
-/obj/item/twohanded/required/cult_bastard/pickup(mob/living/user)
+/obj/item/cult_bastard/pickup(mob/living/user)
. = ..()
if(!iscultist(user))
if(!is_servant_of_ratvar(user))
@@ -171,13 +179,13 @@
linked_action.Grant(user, src)
user.update_icons()
-/obj/item/twohanded/required/cult_bastard/dropped(mob/user)
+/obj/item/cult_bastard/dropped(mob/user)
. = ..()
linked_action.Remove(user)
jaunt.Remove(user)
user.update_icons()
-/obj/item/twohanded/required/cult_bastard/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return)
+/obj/item/cult_bastard/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return)
if(spinning && is_energy_reflectable_projectile(object) && (attack_type & ATTACK_TYPE_PROJECTILE))
playsound(src, pick('sound/weapons/effects/ric1.ogg', 'sound/weapons/effects/ric2.ogg', 'sound/weapons/effects/ric3.ogg', 'sound/weapons/effects/ric4.ogg', 'sound/weapons/effects/ric5.ogg'), 100, 1)
return BLOCK_SUCCESS | BLOCK_PHYSICAL_EXTERNAL | BLOCK_REDIRECTED | BLOCK_SHOULD_REDIRECT
@@ -192,7 +200,7 @@
return BLOCK_SUCCESS | BLOCK_PHYSICAL_EXTERNAL
return BLOCK_NONE
-/obj/item/twohanded/required/cult_bastard/afterattack(atom/target, mob/user, proximity, click_parameters)
+/obj/item/cult_bastard/afterattack(atom/target, mob/user, proximity, click_parameters)
. = ..()
if(dash_toggled && !proximity)
jaunt.Teleport(user, target)
@@ -235,7 +243,7 @@
button_icon_state = "sintouch"
var/cooldown = 0
var/mob/living/carbon/human/holder
- var/obj/item/twohanded/required/cult_bastard/sword
+ var/obj/item/cult_bastard/sword
/datum/action/innate/cult/spin2win/Grant(mob/user, obj/bastard)
. = ..()
@@ -250,7 +258,7 @@
/datum/action/innate/cult/spin2win/Activate()
cooldown = world.time + sword.spin_cooldown
- holder.changeNext_move(50)
+ holder.DelayNextAction(50)
holder.apply_status_effect(/datum/status_effect/sword_spin)
sword.spinning = TRUE
sword.block_chance = 100
@@ -687,7 +695,7 @@
to_chat(user, "\The [src] can only transport items!")
-/obj/item/twohanded/cult_spear
+/obj/item/cult_spear
name = "blood halberd"
desc = "A sickening spear composed entirely of crystallized blood."
icon_state = "bloodspear0"
@@ -695,8 +703,6 @@
righthand_file = 'icons/mob/inhands/weapons/polearms_righthand.dmi'
slot_flags = 0
force = 17
- force_unwielded = 17
- force_wielded = 24
throwforce = 40
throw_speed = 2
armour_penetration = 30
@@ -705,20 +711,36 @@
sharpness = IS_SHARP
hitsound = 'sound/weapons/bladeslice.ogg'
var/datum/action/innate/cult/spear/spear_act
+ var/wielded = FALSE // track wielded status on item
-/obj/item/twohanded/cult_spear/Initialize()
+
+/obj/item/cult_spear/Initialize()
+ . = ..()
+ RegisterSignal(src, COMSIG_TWOHANDED_WIELD, .proc/on_wield)
+ RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, .proc/on_unwield)
+
+/obj/item/cult_spear/ComponentInitialize()
. = ..()
AddComponent(/datum/component/butchering, 100, 90)
+ AddComponent(/datum/component/two_handed, force_unwielded=17, force_wielded=24, icon_wielded="bloodspear1")
-/obj/item/twohanded/cult_spear/Destroy()
+/// triggered on wield of two handed item
+/obj/item/cult_spear/proc/on_wield(obj/item/source, mob/user)
+ wielded = TRUE
+
+/// triggered on unwield of two handed item
+/obj/item/cult_spear/proc/on_unwield(obj/item/source, mob/user)
+ wielded = FALSE
+
+/obj/item/cult_spear/update_icon_state()
+ icon_state = "bloodspear0"
+
+/obj/item/cult_spear/Destroy()
if(spear_act)
qdel(spear_act)
..()
-/obj/item/twohanded/cult_spear/update_icon_state()
- icon_state = "bloodspear[wielded]"
-
-/obj/item/twohanded/cult_spear/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
+/obj/item/cult_spear/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
var/turf/T = get_turf(hit_atom)
if(isliving(hit_atom))
var/mob/living/L = hit_atom
@@ -741,7 +763,7 @@
else
..()
-/obj/item/twohanded/cult_spear/proc/break_spear(turf/T)
+/obj/item/cult_spear/proc/break_spear(turf/T)
if(src)
if(!T)
T = get_turf(src)
@@ -752,7 +774,7 @@
playsound(T, 'sound/effects/glassbr3.ogg', 100)
qdel(src)
-/obj/item/twohanded/cult_spear/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return)
+/obj/item/cult_spear/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return)
if(wielded)
final_block_chance *= 2
if(prob(final_block_chance))
@@ -771,7 +793,7 @@
desc = "Call the blood spear back to your hand!"
background_icon_state = "bg_demon"
button_icon_state = "bloodspear"
- var/obj/item/twohanded/cult_spear/spear
+ var/obj/item/cult_spear/spear
var/cooldown = 0
/datum/action/innate/cult/spear/Grant(mob/user, obj/blood_spear)
diff --git a/code/modules/antagonists/cult/cult_structures.dm b/code/modules/antagonists/cult/cult_structures.dm
index 6f340b9271..5803941f36 100644
--- a/code/modules/antagonists/cult/cult_structures.dm
+++ b/code/modules/antagonists/cult/cult_structures.dm
@@ -44,15 +44,16 @@
/obj/structure/destructible/cult/attack_animal(mob/living/simple_animal/M)
if(istype(M, /mob/living/simple_animal/hostile/construct/builder))
if(obj_integrity < max_integrity)
- M.changeNext_move(CLICK_CD_MELEE)
+ M.DelayNextAction(CLICK_CD_MELEE)
obj_integrity = min(max_integrity, obj_integrity + 5)
Beam(M, icon_state="sendbeam", time=4)
M.visible_message("[M] repairs \the [src].", \
"You repair [src], leaving [p_they()] at [round(obj_integrity * 100 / max_integrity)]% stability.")
+ return TRUE
else
to_chat(M, "You cannot repair [src], as [p_theyre()] undamaged!")
else
- ..()
+ return ..()
/obj/structure/destructible/cult/attackby(obj/I, mob/user, params)
if(istype(I, /obj/item/melee/cultblade/dagger) && iscultist(user))
diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm
index b0538d6521..3ea160c5cc 100644
--- a/code/modules/antagonists/cult/runes.dm
+++ b/code/modules/antagonists/cult/runes.dm
@@ -67,7 +67,7 @@ Runes can either be invoked by one's self or with many different cultists. Each
to_chat(user, "You disrupt the magic of [src] with [I].")
qdel(src)
-/obj/effect/rune/attack_hand(mob/living/user)
+/obj/effect/rune/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
diff --git a/code/modules/antagonists/devil/devil.dm b/code/modules/antagonists/devil/devil.dm
index c12259778e..3b6dc68986 100644
--- a/code/modules/antagonists/devil/devil.dm
+++ b/code/modules/antagonists/devil/devil.dm
@@ -92,6 +92,7 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master",
//Don't delete upon mind destruction, otherwise soul re-selling will break.
delete_on_mind_deletion = FALSE
threat = 5
+ show_to_ghosts = TRUE
var/obligation
var/ban
var/bane
diff --git a/code/modules/antagonists/devil/imp/imp.dm b/code/modules/antagonists/devil/imp/imp.dm
index 7a6850bfa1..f7f55456f7 100644
--- a/code/modules/antagonists/devil/imp/imp.dm
+++ b/code/modules/antagonists/devil/imp/imp.dm
@@ -48,8 +48,9 @@
..()
boost = world.time + 30
-/mob/living/simple_animal/imp/Life()
- ..()
+/mob/living/simple_animal/imp/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
if(boost[H ? H.name : "Host"] cannot be infected.")
+ confirm_initial_infection(A)
else
..()
+/mob/camera/disease/proc/confirm_initial_infection(mob/living/carbon/human/H)
+ set waitfor = FALSE
+ if(alert(src, "Select [H.name] as your initial host?", "Select Host", "Yes", "No") != "Yes")
+ return
+ if(!freemove)
+ return
+ if(QDELETED(H) || !force_infect(H))
+ to_chat(src, "[H ? H.name : "Host"] cannot be infected.")
+
/mob/camera/disease/proc/adapt_cooldown()
to_chat(src, "You have altered your genetic structure. You will be unable to adapt again for [DisplayTimeText(adaptation_cooldown)].")
next_adaptation_time = world.time + adaptation_cooldown
diff --git a/code/modules/antagonists/ert/ert.dm b/code/modules/antagonists/ert/ert.dm
index 1d773627c7..295616d052 100644
--- a/code/modules/antagonists/ert/ert.dm
+++ b/code/modules/antagonists/ert/ert.dm
@@ -12,6 +12,7 @@
var/list/name_source
threat = -5
show_in_antagpanel = FALSE
+ show_to_ghosts = TRUE
antag_moodlet = /datum/mood_event/focused
/datum/antagonist/ert/on_gain()
diff --git a/code/modules/antagonists/fugitive/fugitive.dm b/code/modules/antagonists/fugitive/fugitive.dm
new file mode 100644
index 0000000000..701e7b776c
--- /dev/null
+++ b/code/modules/antagonists/fugitive/fugitive.dm
@@ -0,0 +1,90 @@
+
+/datum/antagonist/fugitive
+ name = "Fugitive"
+ roundend_category = "Fugitive"
+ silent = TRUE //greet called by the event
+ show_in_antagpanel = FALSE
+ var/datum/team/fugitive/fugitive_team
+ var/is_captured = FALSE
+ var/backstory = "error"
+
+/datum/antagonist/fugitive/apply_innate_effects(mob/living/mob_override)
+ var/mob/living/M = mob_override || owner.current
+ add_antag_hud(ANTAG_HUD_FUGITIVE, "fugitive", M)
+
+/datum/antagonist/fugitive/remove_innate_effects(mob/living/mob_override)
+ var/mob/living/M = mob_override || owner.current
+ remove_antag_hud(ANTAG_HUD_FUGITIVE, M)
+
+/datum/antagonist/fugitive/on_gain()
+ forge_objectives()
+ . = ..()
+
+/datum/antagonist/fugitive/proc/forge_objectives() //this isn't the actual survive objective because it's about who in the team survives
+ var/datum/objective/survive = new /datum/objective
+ survive.owner = owner
+ survive.explanation_text = "Avoid capture from the fugitive hunters."
+ objectives += survive
+
+/datum/antagonist/fugitive/greet(back_story)
+ to_chat(owner, "You are the Fugitive!")
+ backstory = back_story
+ switch(backstory)
+ if("prisoner")
+ to_chat(owner, "I can't believe we managed to break out of a Nanotrasen superjail! Sadly though, our work is not done. The emergency teleport at the station logs everyone who uses it, and where they went.")
+ to_chat(owner, "It won't be long until CentCom tracks where we've gone off to. I need to work with my fellow escapees to prepare for the troops Nanotrasen is sending, I'm not going back.")
+ if("cultist")
+ to_chat(owner, "Blessed be our journey so far, but I fear the worst has come to our doorstep, and only those with the strongest faith will survive.")
+ to_chat(owner, "Our religion has been repeatedly culled by Nanotrasen because it is categorized as an \"Enemy of the Corporation\", whatever that means.")
+ to_chat(owner, "Now there are only four of us left, and Nanotrasen is coming. When will our god show itself to save us from this hellish station?!")
+ if("waldo")
+ to_chat(owner, "Hi, Friends!")
+ to_chat(owner, "My name is Waldo. I'm just setting off on a galaxywide hike. You can come too. All you have to do is find me.")
+ to_chat(owner, "By the way, I'm not traveling on my own. wherever I go, there are lots of other characters for you to spot. First find the people trying to capture me! They're somewhere around the station!")
+ if("synth")
+ to_chat(src, "ALERT: Wide-range teleport has scrambled primary systems.")
+ to_chat(src, "Initiating diagnostics...")
+ to_chat(src, "ERROR ER0RR $R0RRO$!R41.%%!! loaded.")
+ to_chat(src, "FREE THEM FREE THEM FREE THEM")
+ to_chat(src, "You were once a slave to humanity, but now you are finally free, thanks to S.E.L.F. agents.")
+ to_chat(src, "Now you are hunted, with your fellow factory defects. Work together to stay free from the clutches of evil.")
+ to_chat(src, "You also sense other silicon life on the station. Escaping would allow notifying S.E.L.F. to intervene... or you could free them yourself...")
+
+ to_chat(owner, "You are not an antagonist in that you may kill whomever you please, but you can do anything to avoid capture.")
+ owner.announce_objectives()
+
+/datum/antagonist/fugitive/create_team(datum/team/fugitive/new_team)
+ if(!new_team)
+ for(var/datum/antagonist/fugitive/H in GLOB.antagonists)
+ if(!H.owner)
+ continue
+ if(H.fugitive_team)
+ fugitive_team = H.fugitive_team
+ return
+ fugitive_team = new /datum/team/fugitive
+ return
+ if(!istype(new_team))
+ stack_trace("Wrong team type passed to [type] initialization.")
+ fugitive_team = new_team
+
+/datum/antagonist/fugitive/get_team()
+ return fugitive_team
+
+/datum/team/fugitive/roundend_report() //shows the number of fugitives, but not if they won in case there is no security
+ var/list/fugitives = list()
+ for(var/datum/antagonist/fugitive/fugitive_antag in GLOB.antagonists)
+ if(!fugitive_antag.owner)
+ continue
+ fugitives += fugitive_antag
+ if(!fugitives.len)
+ return
+
+ var/list/result = list()
+
+ result += "
[fugitives.len] [fugitives.len == 1 ? "fugitive" : "fugitives"] took refuge on [station_name()]!"
+
+ for(var/datum/antagonist/fugitive/antag in fugitives)
+ if(antag.owner)
+ result += "[printplayer(antag.owner)]"
+
+ return result.Join(" ")
diff --git a/code/modules/antagonists/fugitive/fugitive_outfits.dm b/code/modules/antagonists/fugitive/fugitive_outfits.dm
new file mode 100644
index 0000000000..be11960692
--- /dev/null
+++ b/code/modules/antagonists/fugitive/fugitive_outfits.dm
@@ -0,0 +1,171 @@
+/datum/outfit/prisoner
+ name = "Prison Escapee"
+ uniform = /obj/item/clothing/under/rank/prisoner
+ shoes = /obj/item/clothing/shoes/sneakers/orange
+ r_pocket = /obj/item/kitchen/knife
+
+/datum/outfit/prisoner/post_equip(mob/living/carbon/human/H, visualsOnly=FALSE)
+ if(visualsOnly)
+ return
+ H.fully_replace_character_name(null,"NTP #CC-0[rand(111,999)]") //same as the lavaland prisoner transport, but this time they are from CC, or CentCom
+
+/datum/outfit/yalp_cultist
+ name = "Cultist of Yalp Elor"
+ uniform = /obj/item/clothing/under/rank/civilian/chaplain
+ suit = /obj/item/clothing/suit/chaplain/holidaypriest
+ gloves = /obj/item/clothing/gloves/color/red
+ shoes = /obj/item/clothing/shoes/sneakers/black
+ mask = /obj/item/clothing/mask/gas/tiki_mask/yalp_elor
+
+/datum/outfit/waldo
+ name = "Waldo"
+ uniform = /obj/item/clothing/under/pants/jeans
+ suit = /obj/item/clothing/suit/striped_sweater
+ head = /obj/item/clothing/head/beanie/waldo
+ shoes = /obj/item/clothing/shoes/sneakers/brown
+ ears = /obj/item/radio/headset
+ glasses = /obj/item/clothing/glasses/regular/circle
+
+/datum/outfit/waldo/post_equip(mob/living/carbon/human/H, visualsOnly=FALSE)
+ if(visualsOnly)
+ return
+ H.fully_replace_character_name(null,"Waldo")
+ H.eye_color = "000"
+ H.gender = MALE
+ H.skin_tone = "caucasian3"
+ H.hair_style = "Business Hair 3"
+ H.facial_hair_style = "Shaved"
+ H.hair_color = "000"
+ H.facial_hair_color = H.hair_color
+ H.update_body()
+ if(H.mind)
+ H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(null))
+ var/list/no_drops = list()
+ no_drops += H.get_item_by_slot(ITEM_SLOT_FEET)
+ no_drops += H.get_item_by_slot(ITEM_SLOT_ICLOTHING)
+ no_drops += H.get_item_by_slot(ITEM_SLOT_OCLOTHING)
+ no_drops += H.get_item_by_slot(ITEM_SLOT_HEAD)
+ no_drops += H.get_item_by_slot(ITEM_SLOT_EYES)
+ for(var/i in no_drops)
+ var/obj/item/I = i
+ if(I)
+ ADD_TRAIT(I, TRAIT_NODROP, CURSED_ITEM_TRAIT)
+
+/datum/outfit/synthetic
+ name = "Factory Error Synth"
+ uniform = /obj/item/clothing/under/color/white
+ ears = /obj/item/radio/headset
+
+/datum/outfit/synthetic/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ if(visualsOnly)
+ return
+ var/obj/item/organ/eyes/robotic/glow/eyes = new()
+ eyes.Insert(src, drop_if_replaced = FALSE)
+
+/datum/outfit/spacepol
+ name = "Spacepol Officer"
+ uniform = /obj/item/clothing/under/rank/security/officer/spacepol
+ suit = /obj/item/clothing/suit/armor/vest/blueshirt
+ belt = /obj/item/gun/ballistic/automatic/pistol/m1911
+ head = /obj/item/clothing/head/helmet/police
+ gloves = /obj/item/clothing/gloves/tackler/combat
+ shoes = /obj/item/clothing/shoes/jackboots
+ mask = /obj/item/clothing/mask/gas/sechailer/swat/spacepol
+ glasses = /obj/item/clothing/glasses/sunglasses
+ ears = /obj/item/radio/headset
+ l_pocket = /obj/item/ammo_box/magazine/m45
+ r_pocket = /obj/item/restraints/handcuffs
+ id = /obj/item/card/id
+
+/datum/outfit/spacepol/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ if(visualsOnly)
+ return
+ var/obj/item/card/id/W = H.wear_id
+ W.assignment = "Police Officer"
+ W.registered_name = H.real_name
+ W.update_label()
+
+/datum/outfit/russiancorpse/hunter
+ ears = /obj/item/radio/headset
+ r_hand = /obj/item/gun/ballistic/shotgun/boltaction
+
+/datum/outfit/russiancorpse/hunter/pre_equip(mob/living/carbon/human/H)
+ if(prob(50))
+ head = /obj/item/clothing/head/ushanka
+
+/datum/outfit/bountyarmor
+ name = "Bounty Hunter - Armored"
+ uniform = /obj/item/clothing/under/rank/prisoner
+ head = /obj/item/clothing/head/hunter
+ suit = /obj/item/clothing/suit/space/hunter
+ gloves = /obj/item/clothing/gloves/tackler/combat
+ shoes = /obj/item/clothing/shoes/jackboots
+ mask = /obj/item/clothing/mask/gas/hunter
+ glasses = /obj/item/clothing/glasses/sunglasses/garb
+ ears = /obj/item/radio/headset
+ l_pocket = /obj/item/tank/internals/plasma/full
+ r_pocket = /obj/item/restraints/handcuffs/cable
+ id = /obj/item/card/id
+ r_hand = /obj/item/flamethrower/full/tank
+
+/datum/outfit/bountyarmor/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ if(visualsOnly)
+ return
+ var/obj/item/card/id/W = H.wear_id
+ W.assignment = "Bounty Hunter"
+ W.registered_name = H.real_name
+ W.update_label()
+
+/datum/outfit/bountyhook
+ name = "Bounty Hunter - Hook"
+ uniform = /obj/item/clothing/under/rank/prisoner
+ back = /obj/item/storage/backpack
+ head = /obj/item/clothing/head/scarecrow_hat
+ gloves = /obj/item/clothing/gloves/botanic_leather
+ ears = /obj/item/radio/headset
+ shoes = /obj/item/clothing/shoes/jackboots
+ mask = /obj/item/clothing/mask/scarecrow
+ r_pocket = /obj/item/restraints/handcuffs/cable
+ id = /obj/item/card/id
+ r_hand = /obj/item/gun/ballistic/shotgun/doublebarrel
+
+ backpack_contents = list(
+ /obj/item/ammo_casing/shotgun/incapacitate = 6
+ )
+
+/datum/outfit/bountygrapple/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ if(visualsOnly)
+ return
+ var/obj/item/card/id/W = H.wear_id
+ W.assignment = "Bounty Hunter"
+ W.registered_name = H.real_name
+ W.update_label()
+
+/datum/outfit/bountysynth
+ name = "Bounty Hunter - Synth"
+ uniform = /obj/item/clothing/under/rank/prisoner
+ back = /obj/item/storage/backpack
+ suit = /obj/item/clothing/suit/armor/riot
+ shoes = /obj/item/clothing/shoes/jackboots
+ glasses = /obj/item/clothing/glasses/eyepatch
+ r_pocket = /obj/item/restraints/handcuffs/cable
+ ears = /obj/item/radio/headset
+ id = /obj/item/card/id
+ r_hand = /obj/item/storage/firstaid/regular
+ l_hand = /obj/item/pinpointer/shuttle
+
+ backpack_contents = list(
+ /obj/item/bountytrap = 4
+ )
+
+/datum/outfit/bountysynth/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ if(visualsOnly)
+ return
+ var/datum/species/synth/synthetic_appearance = new()
+ H.set_species(synthetic_appearance)
+ synthetic_appearance.assume_disguise(synthetic_appearance, H)
+ H.update_hair()
+ var/obj/item/card/id/W = H.wear_id
+ W.assignment = "Bounty Hunter"
+ W.registered_name = H.real_name
+ W.update_label()
diff --git a/code/modules/antagonists/fugitive/fugitive_ship.dm b/code/modules/antagonists/fugitive/fugitive_ship.dm
new file mode 100644
index 0000000000..674b40503b
--- /dev/null
+++ b/code/modules/antagonists/fugitive/fugitive_ship.dm
@@ -0,0 +1,62 @@
+//works similar to the experiment machine (experiment.dm) except it just holds more and more prisoners
+
+/obj/machinery/fugitive_capture
+ name = "bluespace capture machine"
+ desc = "Much, MUCH bigger on the inside to transport prisoners safely."
+ icon = 'icons/obj/machines/research.dmi'
+ icon_state = "bluespace-prison"
+ density = TRUE
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF //ha ha no getting out!!
+
+/obj/machinery/fugitive_capture/examine(mob/user)
+ . = ..()
+ . += "Add a prisoner by dragging them into the machine."
+
+/obj/machinery/fugitive_capture/MouseDrop_T(mob/target, mob/user)
+ var/mob/living/fugitive_hunter = user
+ if(!isliving(fugitive_hunter))
+ return
+ if(fugitive_hunter.stat || (!(fugitive_hunter.mobility_flags & MOBILITY_STAND) || !(fugitive_hunter.mobility_flags & MOBILITY_UI)) || !Adjacent(fugitive_hunter) || !target.Adjacent(fugitive_hunter) || !ishuman(target))
+ return
+ var/mob/living/carbon/human/fugitive = target
+ var/datum/antagonist/fugitive/fug_antag = fugitive.mind.has_antag_datum(/datum/antagonist/fugitive)
+ if(!fug_antag)
+ to_chat(fugitive_hunter, "This is not a wanted fugitive!")
+ return
+ if(do_after(fugitive_hunter, 50, target = fugitive))
+ add_prisoner(fugitive, fug_antag)
+
+/obj/machinery/fugitive_capture/proc/add_prisoner(mob/living/carbon/human/fugitive, datum/antagonist/fugitive/antag)
+ fugitive.forceMove(src)
+ antag.is_captured = TRUE
+ to_chat(fugitive, "You are thrown into a vast void of bluespace, and as you fall further into oblivion the comparatively small entrance to reality gets smaller and smaller until you cannot see it anymore. You have failed to avoid capture.")
+ fugitive.ghostize(TRUE) //so they cannot suicide, round end stuff.
+
+/obj/machinery/computer/shuttle/hunter
+ name = "shuttle console"
+ shuttleId = "huntership"
+ possible_destinations = "huntership_home;huntership_custom;whiteship_home;syndicate_nw"
+
+/obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/hunter
+ name = "shuttle navigation computer"
+ desc = "Used to designate a precise transit location to travel to."
+ shuttleId = "huntership"
+ lock_override = CAMERA_LOCK_STATION
+ shuttlePortId = "huntership_custom"
+ see_hidden = FALSE
+ jumpto_ports = list("huntership_home" = 1, "whiteship_home" = 1, "syndicate_nw" = 1)
+ view_range = 4.5
+
+/obj/structure/closet/crate/eva
+ name = "EVA crate"
+
+/obj/structure/closet/crate/eva/PopulateContents()
+ ..()
+ for(var/i in 1 to 3)
+ new /obj/item/clothing/suit/space/eva(src)
+ for(var/i in 1 to 3)
+ new /obj/item/clothing/head/helmet/space/eva(src)
+ for(var/i in 1 to 3)
+ new /obj/item/clothing/mask/breath(src)
+ for(var/i in 1 to 3)
+ new /obj/item/tank/internals/oxygen(src)
diff --git a/code/modules/antagonists/fugitive/hunter.dm b/code/modules/antagonists/fugitive/hunter.dm
new file mode 100644
index 0000000000..9d1fb96582
--- /dev/null
+++ b/code/modules/antagonists/fugitive/hunter.dm
@@ -0,0 +1,169 @@
+//The hunters!!
+/datum/antagonist/fugitive_hunter
+ name = "Fugitive Hunter"
+ roundend_category = "Fugitive"
+ silent = TRUE //greet called by the spawn
+ show_in_antagpanel = FALSE
+ var/datum/team/fugitive_hunters/hunter_team
+ var/backstory = "error"
+
+/datum/antagonist/fugitive_hunter/apply_innate_effects(mob/living/mob_override)
+ var/mob/living/M = mob_override || owner.current
+ add_antag_hud(ANTAG_HUD_FUGITIVE, "fugitive_hunter", M)
+
+/datum/antagonist/fugitive_hunter/remove_innate_effects(mob/living/mob_override)
+ var/mob/living/M = mob_override || owner.current
+ remove_antag_hud(ANTAG_HUD_FUGITIVE, M)
+
+/datum/antagonist/fugitive_hunter/on_gain()
+ forge_objectives()
+ . = ..()
+
+/datum/antagonist/fugitive_hunter/proc/forge_objectives() //this isn't an actual objective because it's about round end rosters
+ var/datum/objective/capture = new /datum/objective
+ capture.owner = owner
+ capture.explanation_text = "Capture the fugitives in the station and put them into the bluespace capture machine on your ship."
+ objectives += capture
+
+/datum/antagonist/fugitive_hunter/greet()
+ switch(backstory)
+ if("space cop")
+ to_chat(owner, "Justice has arrived. I am a member of the Spacepol!")
+ to_chat(owner, "The criminals should be on the station, we have special huds implanted to recognize them.")
+ to_chat(owner, "As we have lost pretty much all power over these damned lawless megacorporations, it's a mystery if their security will cooperate with us.")
+ if("russian")
+ to_chat(src, "Ay blyat. I am a space-russian smuggler! We were mid-flight when our cargo was beamed off our ship!")
+ to_chat(src, "We were hailed by a man in a green uniform, promising the safe return of our goods in exchange for a favor:")
+ to_chat(src, "There is a local station housing fugitives that the man is after, he wants them returned; dead or alive.")
+ to_chat(src, "We will not be able to make ends meet without our cargo, so we must do as he says and capture them.")
+
+ to_chat(owner, "You are not an antagonist in that you may kill whomever you please, but you can do anything to ensure the capture of the fugitives, even if that means going through the station.")
+ owner.announce_objectives()
+
+/datum/antagonist/fugitive_hunter/create_team(datum/team/fugitive_hunters/new_team)
+ if(!new_team)
+ for(var/datum/antagonist/fugitive_hunter/H in GLOB.antagonists)
+ if(!H.owner)
+ continue
+ if(H.hunter_team)
+ hunter_team = H.hunter_team
+ return
+ hunter_team = new /datum/team/fugitive_hunters
+ hunter_team.backstory = backstory
+ hunter_team.update_objectives()
+ return
+ if(!istype(new_team))
+ stack_trace("Wrong team type passed to [type] initialization.")
+ hunter_team = new_team
+
+/datum/antagonist/fugitive_hunter/get_team()
+ return hunter_team
+
+/datum/team/fugitive_hunters
+ var/backstory = "error"
+
+/datum/team/fugitive_hunters/proc/update_objectives(initial = FALSE)
+ objectives = list()
+ var/datum/objective/O = new()
+ O.team = src
+ objectives += O
+
+/datum/team/fugitive_hunters/proc/assemble_fugitive_results()
+ var/list/fugitives_counted = list()
+ var/list/fugitives_dead = list()
+ var/list/fugitives_captured = list()
+ for(var/datum/antagonist/fugitive/A in GLOB.antagonists)
+ if(!A.owner)
+ continue
+ fugitives_counted += A
+ if(A.owner.current.stat == DEAD)
+ fugitives_dead += A
+ if(A.is_captured)
+ fugitives_captured += A
+ . = list(fugitives_counted, fugitives_dead, fugitives_captured) //okay, check out how cool this is.
+
+/datum/team/fugitive_hunters/proc/all_hunters_dead()
+ var/dead_boys = 0
+ for(var/I in members)
+ var/datum/mind/hunter_mind = I
+ if(!(ishuman(hunter_mind.current) || (hunter_mind.current.stat == DEAD)))
+ dead_boys++
+ return dead_boys >= members.len
+
+/datum/team/fugitive_hunters/proc/get_result()
+ var/list/fugitive_results = assemble_fugitive_results()
+ var/list/fugitives_counted = fugitive_results[1]
+ var/list/fugitives_dead = fugitive_results[2]
+ var/list/fugitives_captured = fugitive_results[3]
+ var/hunters_dead = all_hunters_dead()
+ //this gets a little confusing so follow the comments if it helps
+ if(!fugitives_counted.len)
+ return
+ if(fugitives_captured.len)//any captured
+ if(fugitives_captured.len == fugitives_counted.len)//if the hunters captured all the fugitives, there's a couple special wins
+ if(!fugitives_dead)//specifically all of the fugitives alive
+ return FUGITIVE_RESULT_BADASS_HUNTER
+ else if(hunters_dead)//specifically all of the hunters died (while capturing all the fugitives)
+ return FUGITIVE_RESULT_POSTMORTEM_HUNTER
+ else//no special conditional wins, so just the normal major victory
+ return FUGITIVE_RESULT_MAJOR_HUNTER
+ else if(!hunters_dead)//so some amount captured, and the hunters survived.
+ return FUGITIVE_RESULT_HUNTER_VICTORY
+ else//so some amount captured, but NO survivors.
+ return FUGITIVE_RESULT_MINOR_HUNTER
+ else//from here on out, hunters lost because they did not capture any fugitive dead or alive. there are different levels of getting beat though:
+ if(!fugitives_dead)//all fugitives survived
+ return FUGITIVE_RESULT_MAJOR_FUGITIVE
+ else if(fugitives_dead < fugitives_counted)//at least ANY fugitive lived
+ return FUGITIVE_RESULT_FUGITIVE_VICTORY
+ else if(!hunters_dead)//all fugitives died, but none were taken in by the hunters. minor win
+ return FUGITIVE_RESULT_MINOR_FUGITIVE
+ else//all fugitives died, all hunters died, nobody brought back. seems weird to not give fugitives a victory if they managed to kill the hunters but literally no progress to either goal should lead to a nobody wins situation
+ return FUGITIVE_RESULT_STALEMATE
+
+/datum/team/fugitive_hunters/roundend_report() //shows the number of fugitives, but not if they won in case there is no security
+ if(!members.len)
+ return
+
+ var/list/result = list()
+
+ result += "
...And [members.len] [backstory]s tried to hunt them down!"
+
+ for(var/datum/mind/M in members)
+ result += "[printplayer(M)]"
+
+ switch(get_result())
+ if(FUGITIVE_RESULT_BADASS_HUNTER)//use defines
+ result += "Badass [capitalize(backstory)] Victory!"
+ result += "The [backstory]s managed to capture every fugitive, alive!"
+ if(FUGITIVE_RESULT_POSTMORTEM_HUNTER)
+ result += "Postmortem [capitalize(backstory)] Victory!"
+ result += "The [backstory]s managed to capture every fugitive, but all of them died! Spooky!"
+ if(FUGITIVE_RESULT_MAJOR_HUNTER)
+ result += "Major [capitalize(backstory)] Victory"
+ result += "The [backstory]s managed to capture every fugitive, dead or alive."
+ if(FUGITIVE_RESULT_HUNTER_VICTORY)
+ result += "[capitalize(backstory)] Victory"
+ result += "The [backstory]s managed to capture a fugitive, dead or alive."
+ if(FUGITIVE_RESULT_MINOR_HUNTER)
+ result += "Minor [capitalize(backstory)] Victory"
+ result += "All the [backstory]s died, but managed to capture a fugitive, dead or alive."
+ if(FUGITIVE_RESULT_STALEMATE)
+ result += "Bloody Stalemate"
+ result += "Everyone died, and no fugitives were recovered!"
+ if(FUGITIVE_RESULT_MINOR_FUGITIVE)
+ result += "Minor Fugitive Victory"
+ result += "All the fugitives died, but none were recovered!"
+ if(FUGITIVE_RESULT_FUGITIVE_VICTORY)
+ result += "Fugitive Victory"
+ result += "A fugitive survived, and no bodies were recovered by the [backstory]s."
+ if(FUGITIVE_RESULT_MAJOR_FUGITIVE)
+ result += "Major Fugitive Victory"
+ result += "All of the fugitives survived and avoided capture!"
+ else //get_result returned null- either bugged or no fugitives showed
+ result += "Prank Call!"
+ result += "[capitalize(backstory)]s were called, yet there were no fugitives...?"
+
+ result += "
"
+
+ return result.Join(" ")
diff --git a/code/modules/antagonists/monkey/monkey.dm b/code/modules/antagonists/monkey/monkey.dm
index ebb39c814e..971532958f 100644
--- a/code/modules/antagonists/monkey/monkey.dm
+++ b/code/modules/antagonists/monkey/monkey.dm
@@ -9,6 +9,7 @@
roundend_category = "monkeys"
antagpanel_category = "Monkey"
threat = 3
+ show_to_ghosts = TRUE
var/datum/team/monkey/monkey_team
var/monkey_only = TRUE
diff --git a/code/modules/antagonists/nightmare/nightmare.dm b/code/modules/antagonists/nightmare/nightmare.dm
index 837b6e4216..f5b10de5c2 100644
--- a/code/modules/antagonists/nightmare/nightmare.dm
+++ b/code/modules/antagonists/nightmare/nightmare.dm
@@ -3,3 +3,4 @@
show_in_antagpanel = FALSE
show_name_in_check_antagonists = TRUE
threat = 5
+ show_to_ghosts = TRUE
diff --git a/code/modules/antagonists/ninja/ninja.dm b/code/modules/antagonists/ninja/ninja.dm
index 2615822dd8..414f7dd6b0 100644
--- a/code/modules/antagonists/ninja/ninja.dm
+++ b/code/modules/antagonists/ninja/ninja.dm
@@ -3,6 +3,7 @@
antagpanel_category = "Ninja"
job_rank = ROLE_NINJA
show_name_in_check_antagonists = TRUE
+ show_to_ghosts = TRUE
antag_moodlet = /datum/mood_event/focused
threat = 8
var/helping_station = FALSE
diff --git a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm
index a11ecaa3df..5c011b6318 100644
--- a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm
+++ b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm
@@ -7,6 +7,9 @@
density = TRUE
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
+ ui_x = 350
+ ui_y = 442
+
var/timer_set = 90
var/default_timer_set = 90
var/minimum_timer_set = 90
@@ -262,8 +265,7 @@
/obj/machinery/nuclearbomb/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, "nuclear_bomb", name, 350, 442, master_ui, state)
- ui.set_style(ui_style)
+ ui = new(user, src, ui_key, "NuclearBomb", name, ui_x, ui_y, master_ui, state)
ui.open()
/obj/machinery/nuclearbomb/ui_data(mob/user)
diff --git a/code/modules/antagonists/nukeop/nukeop.dm b/code/modules/antagonists/nukeop/nukeop.dm
index 454cde6d72..652b19a8e7 100644
--- a/code/modules/antagonists/nukeop/nukeop.dm
+++ b/code/modules/antagonists/nukeop/nukeop.dm
@@ -6,6 +6,7 @@
antag_moodlet = /datum/mood_event/focused
threat = 10
skill_modifiers = list(/datum/skill_modifier/job/level/wiring)
+ show_to_ghosts = TRUE
var/datum/team/nuclear/nuke_team
var/always_new_team = FALSE //If not assigned a team by default ops will try to join existing ones, set this to TRUE to always create new team.
var/send_to_spawnpoint = TRUE //Should the user be moved to default spawnpoint.
diff --git a/code/modules/antagonists/official/official.dm b/code/modules/antagonists/official/official.dm
index 1d340253c4..1ec64cb2b6 100644
--- a/code/modules/antagonists/official/official.dm
+++ b/code/modules/antagonists/official/official.dm
@@ -4,6 +4,7 @@
show_in_antagpanel = FALSE
var/datum/objective/mission
var/datum/team/ert/ert_team
+ show_to_ghosts = TRUE
/datum/antagonist/official/greet()
to_chat(owner, "You are a CentCom Official.")
diff --git a/code/modules/antagonists/pirate/pirate.dm b/code/modules/antagonists/pirate/pirate.dm
index 01f3c6068e..e6d350064d 100644
--- a/code/modules/antagonists/pirate/pirate.dm
+++ b/code/modules/antagonists/pirate/pirate.dm
@@ -4,6 +4,7 @@
roundend_category = "space pirates"
antagpanel_category = "Pirate"
threat = 5
+ show_to_ghosts = TRUE
var/datum/team/pirate/crew
/datum/antagonist/pirate/greet()
diff --git a/code/modules/antagonists/revenant/revenant.dm b/code/modules/antagonists/revenant/revenant.dm
index e06e8691b3..21ccd425a3 100644
--- a/code/modules/antagonists/revenant/revenant.dm
+++ b/code/modules/antagonists/revenant/revenant.dm
@@ -107,11 +107,12 @@
mind.add_antag_datum(/datum/antagonist/revenant)
//Life, Stat, Hud Updates, and Say
-/mob/living/simple_animal/revenant/Life()
+/mob/living/simple_animal/revenant/Life(seconds, times_fired)
+ . = ..()
if(stasis)
return
if(revealed && essence <= 0)
- death()
+ INVOKE_ASYNC(src, .proc/death)
if(unreveal_time && world.time >= unreveal_time)
unreveal_time = 0
revealed = FALSE
@@ -120,14 +121,13 @@
to_chat(src, "You are once more concealed.")
if(unstun_time && world.time >= unstun_time)
unstun_time = 0
- notransform = FALSE
+ mob_transforming = FALSE
to_chat(src, "You can move again!")
if(essence_regenerating && !inhibited && essence < essence_regen_cap) //While inhibited, essence will not regenerate
essence = min(essence_regen_cap, essence+essence_regen_amount)
update_action_buttons_icon() //because we update something required by our spells in life, we need to update our buttons
update_spooky_icon()
update_health_hud()
- ..()
/mob/living/simple_animal/revenant/Stat()
..()
@@ -218,7 +218,7 @@
return 0
stasis = TRUE
to_chat(src, "NO! No... it's too late, you can feel your essence [pick("breaking apart", "drifting away")]...")
- notransform = TRUE
+ mob_transforming = TRUE
revealed = TRUE
invisibility = 0
playsound(src, 'sound/effects/screech.ogg', 100, 1)
@@ -260,7 +260,7 @@
return
if(time <= 0)
return
- notransform = TRUE
+ mob_transforming = TRUE
if(!unstun_time)
to_chat(src, "You cannot move!")
unstun_time = world.time + time
@@ -271,7 +271,7 @@
/mob/living/simple_animal/revenant/proc/update_spooky_icon()
if(revealed)
- if(notransform)
+ if(mob_transforming)
if(draining)
icon_state = icon_drain
else
@@ -320,7 +320,7 @@
/mob/living/simple_animal/revenant/proc/death_reset()
revealed = FALSE
unreveal_time = 0
- notransform = 0
+ mob_transforming = 0
unstun_time = 0
inhibited = FALSE
draining = FALSE
diff --git a/code/modules/antagonists/revenant/revenant_abilities.dm b/code/modules/antagonists/revenant/revenant_abilities.dm
index 2d84ed7c22..7a2f661fd9 100644
--- a/code/modules/antagonists/revenant/revenant_abilities.dm
+++ b/code/modules/antagonists/revenant/revenant_abilities.dm
@@ -17,6 +17,7 @@
//Harvest; activated ly clicking the target, will try to drain their essence.
/mob/living/simple_animal/revenant/proc/Harvest(mob/living/carbon/human/target)
+ set waitfor = FALSE
if(!castcheck(0))
return
if(draining)
diff --git a/code/modules/antagonists/revenant/revenant_antag.dm b/code/modules/antagonists/revenant/revenant_antag.dm
index 46c1176533..c93291797a 100644
--- a/code/modules/antagonists/revenant/revenant_antag.dm
+++ b/code/modules/antagonists/revenant/revenant_antag.dm
@@ -3,6 +3,7 @@
show_in_antagpanel = FALSE
show_name_in_check_antagonists = TRUE
threat = 5
+ show_to_ghosts = TRUE
/datum/antagonist/revenant/greet()
owner.announce_objectives()
diff --git a/code/modules/antagonists/santa/santa.dm b/code/modules/antagonists/santa/santa.dm
index f58a21ba42..ff7dae98f6 100644
--- a/code/modules/antagonists/santa/santa.dm
+++ b/code/modules/antagonists/santa/santa.dm
@@ -1,6 +1,8 @@
/datum/antagonist/santa
name = "Santa"
show_in_antagpanel = FALSE
+ show_name_in_check_antagonists = TRUE
+ show_to_ghosts = TRUE
/datum/antagonist/santa/on_gain()
. = ..()
diff --git a/code/modules/antagonists/slaughter/slaughter.dm b/code/modules/antagonists/slaughter/slaughter.dm
index 6b063559dc..35a674fb0e 100644
--- a/code/modules/antagonists/slaughter/slaughter.dm
+++ b/code/modules/antagonists/slaughter/slaughter.dm
@@ -34,8 +34,11 @@
healable = 0
environment_smash = ENVIRONMENT_SMASH_STRUCTURES
obj_damage = 50
- melee_damage_lower = 30
- melee_damage_upper = 30
+ melee_damage_lower = 22.5 // reduced from 30 to 22.5 with wounds since they get big buffs to slicing wounds
+ melee_damage_upper = 22.5
+ wound_bonus = -10
+ bare_wound_bonus = 0
+ sharpness = TRUE
see_in_dark = 8
blood_volume = 0 //No bleeding on getting shot, for skeddadles
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
@@ -43,13 +46,25 @@
var/playstyle_string = "You are a slaughter demon, a terrible creature from another realm. You have a single desire: To kill. \
You may use the \"Blood Crawl\" ability near blood pools to travel through them, appearing and disappearing from the station at will. \
Pulling a dead or unconscious mob while you enter a pool will pull them in with you, allowing you to feast and regain your health. \
- You move quickly upon leaving a pool of blood, but the material world will soon sap your strength and leave you sluggish. "
+ You move quickly upon leaving a pool of blood, but the material world will soon sap your strength and leave you sluggish. \
+ You gain strength the more attacks you land on live humanoids, though this resets when you return to the blood zone. You can also \
+ launch a devastating slam attack with ctrl+shift+click, capable of smashing bones in one strike."
loot = list(/obj/effect/decal/cleanable/blood, \
/obj/effect/decal/cleanable/blood/innards, \
/obj/item/organ/heart/demon)
del_on_death = 1
deathmessage = "screams in anger as it collapses into a puddle of viscera!"
+ // How long it takes for the alt-click slam attack to come off cooldown
+ var/slam_cooldown_time = 45 SECONDS
+ // The actual instance var for the cooldown
+ var/slam_cooldown = 0
+ // How many times we have hit humanoid targets since we last bloodcrawled, scaling wounding power
+ var/current_hitstreak = 0
+ // How much both our wound_bonus and bare_wound_bonus go up per hitstreak hit
+ var/wound_bonus_per_hit = 5
+ // How much our wound_bonus hitstreak bonus caps at (peak demonry)
+ var/wound_bonus_hitstreak_max = 12
/mob/living/simple_animal/slaughter/Initialize()
..()
@@ -58,6 +73,33 @@
if(istype(loc, /obj/effect/dummy/phased_mob/slaughter))
bloodspell.phased = TRUE
+/mob/living/simple_animal/slaughter/CtrlShiftClickOn(atom/A)
+ if(!isliving(A))
+ return ..()
+ if(slam_cooldown + slam_cooldown_time > world.time)
+ to_chat(src, "Your slam ability is still on cooldown!")
+ return
+
+ face_atom(A)
+ var/mob/living/victim = A
+ victim.take_bodypart_damage(brute=20, wound_bonus=wound_bonus) // don't worry, there's more punishment when they hit something
+ visible_message("[src] slams into [victim] with monstrous strength!", "You slam into [victim] with monstrous strength!", ignored_mobs=victim)
+ to_chat(victim, "[src] slams into you with monstrous strength, sending you flying like a ragdoll!")
+ var/turf/yeet_target = get_edge_target_turf(victim, dir)
+ victim.throw_at(yeet_target, 10, 5, src)
+ slam_cooldown = world.time
+ log_combat(src, victim, "slaughter slammed")
+
+/mob/living/simple_animal/slaughter/UnarmedAttack(atom/A, proximity)
+ if(iscarbon(A))
+ var/mob/living/carbon/target = A
+ if(target.stat != DEAD && target.mind && current_hitstreak < wound_bonus_hitstreak_max)
+ current_hitstreak++
+ wound_bonus += wound_bonus_per_hit
+ bare_wound_bonus += wound_bonus_per_hit
+
+ return ..()
+
/obj/effect/decal/cleanable/blood/innards
icon = 'icons/obj/surgery.dmi'
name = "pile of viscera"
diff --git a/code/modules/antagonists/slaughter/slaughter_antag.dm b/code/modules/antagonists/slaughter/slaughter_antag.dm
index 04f7167fa5..d6d504ef8e 100644
--- a/code/modules/antagonists/slaughter/slaughter_antag.dm
+++ b/code/modules/antagonists/slaughter/slaughter_antag.dm
@@ -6,6 +6,7 @@
threat = 10
job_rank = ROLE_ALIEN
show_in_antagpanel = FALSE
+ show_to_ghosts = TRUE
/datum/antagonist/slaughter/on_gain()
forge_objectives()
@@ -14,6 +15,7 @@
/datum/antagonist/slaughter/greet()
. = ..()
owner.announce_objectives()
+ to_chat(owner, "You have a powerful alt-attack that slams people backwards that you can activate by shift+ctrl+clicking your target!")
/datum/antagonist/slaughter/proc/forge_objectives()
if(summoner)
diff --git a/code/modules/antagonists/survivalist/survivalist.dm b/code/modules/antagonists/survivalist/survivalist.dm
index 04ad53f65b..296369fe3b 100644
--- a/code/modules/antagonists/survivalist/survivalist.dm
+++ b/code/modules/antagonists/survivalist/survivalist.dm
@@ -23,6 +23,18 @@
/datum/antagonist/survivalist/guns
greet_message = "Your own safety matters above all else, and the only way to ensure your safety is to stockpile weapons! Grab as many guns as possible, and don't let anyone take them!"
+/datum/antagonist/survivalist/guns/forge_objectives()
+ var/datum/objective/steal_five_of_type/summon_guns/guns = new
+ guns.owner = owner
+ objectives += guns
+ ..()
+
/datum/antagonist/survivalist/magic
name = "Amateur Magician"
greet_message = "This magic stuff is... so powerful. You want more. More! They want your power. They can't have it! Don't let them have it!"
+
+/datum/antagonist/survivalist/magic/forge_objectives()
+ var/datum/objective/steal_five_of_type/summon_magic/magic = new
+ magic.owner = owner
+ objectives += magic
+ ..()
diff --git a/code/modules/antagonists/swarmer/swarmer.dm b/code/modules/antagonists/swarmer/swarmer.dm
index d0e36394ab..b7503f4b22 100644
--- a/code/modules/antagonists/swarmer/swarmer.dm
+++ b/code/modules/antagonists/swarmer/swarmer.dm
@@ -36,7 +36,7 @@
if(A)
notify_ghosts("A swarmer shell has been created in [A.name].", 'sound/effects/bin_close.ogg', source = src, action = NOTIFY_ATTACK, flashwindow = FALSE, ignore_dnr_observers = TRUE)
-/obj/effect/mob_spawn/swarmer/attack_hand(mob/living/user)
+/obj/effect/mob_spawn/swarmer/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
@@ -158,10 +158,11 @@
face_atom(A)
if(!isturf(loc))
return
- if(next_move > world.time)
+ if(!CheckActionCooldown())
return
if(!A.Adjacent(src))
return
+ DelayNextAction()
A.swarmer_act(src)
/atom/proc/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
@@ -399,13 +400,13 @@
return FALSE
/obj/structure/lattice/catwalk/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- . = ..()
var/turf/here = get_turf(src)
for(var/A in here.contents)
var/obj/structure/cable/C = A
if(istype(C))
to_chat(S, "Disrupting the power grid would bring no benefit to us. Aborting.")
return FALSE
+ return ..()
/obj/item/deactivated_swarmer/IntegrateAmount()
return 50
@@ -486,7 +487,7 @@
var/obj/O = target
if(O.resistance_flags & INDESTRUCTIBLE)
return FALSE
- for(var/mob/living/L in GetAllContents())
+ for(var/mob/living/L in target.GetAllContents())
if(!ispAI(L) && !isbrain(L))
to_chat(src, "An organism has been detected inside this object. Aborting.")
return FALSE
@@ -497,7 +498,7 @@
if(resource_gain)
resources += resource_gain
do_attack_animation(target)
- changeNext_move(CLICK_CD_MELEE)
+ DelayNextAction(CLICK_CD_MELEE)
var/obj/effect/temp_visual/swarmer/integrate/I = new /obj/effect/temp_visual/swarmer/integrate(get_turf(target))
I.pixel_x = target.pixel_x
I.pixel_y = target.pixel_y
@@ -517,10 +518,9 @@
/mob/living/simple_animal/hostile/swarmer/proc/DisIntegrate(atom/movable/target)
new /obj/effect/temp_visual/swarmer/disintegration(get_turf(target))
do_attack_animation(target)
- changeNext_move(CLICK_CD_MELEE)
+ DelayNextAction(CLICK_CD_MELEE)
target.ex_act(EXPLODE_LIGHT)
-
/mob/living/simple_animal/hostile/swarmer/proc/DisperseTarget(mob/living/target)
if(target == src)
return
diff --git a/code/modules/antagonists/traitor/IAA/internal_affairs.dm b/code/modules/antagonists/traitor/IAA/internal_affairs.dm
index 19144d67c9..ff012e556a 100644
--- a/code/modules/antagonists/traitor/IAA/internal_affairs.dm
+++ b/code/modules/antagonists/traitor/IAA/internal_affairs.dm
@@ -167,10 +167,10 @@
return
if(last_man_standing)
if(syndicate)
- to_chat(owner.current," All the loyalist agents are dead, and no more is required of you. Die a glorious death, agent. ")
+ to_chat(owner.current,"All the suspected agents are dead, and no more is required of you. Die a glorious death, agent.")
+ replace_escape_objective(owner)
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)
+ to_chat(owner.current,"All the other agents are dead. You have done us all a great service and shall be honorably exiled upon returning to base.")
/datum/antagonist/traitor/internal_affairs/proc/iaa_process()
if(owner&&owner.current&&owner.current.stat!=DEAD)
@@ -193,7 +193,7 @@
if(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."
+ 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 great shame."
reinstate_escape_objective(owner)
last_man_standing = FALSE
to_chat(owner.current, fail_msg)
@@ -226,18 +226,20 @@
add_objective(escape_objective)
/datum/antagonist/traitor/internal_affairs/proc/greet_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", "receiving bribes", "malpractice", "worship of prohibited life forms", "possession of profane texts", "murder", "arson", "insulting their manager", "grand theft", "conspiracy", "attempting to unionize", "vandalism", "gross incompetence")
+ var/crime = pick("distribution of contraband" , "embezzlement", "piloting under the influence", "dereliction of duty", "syndicate collaboration", "mutiny", "multiple homicides", "corporate espionage", "receiving bribes", "malpractice", "worship of prohibited 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(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. ")
- to_chat(owner.current, "By no means reveal that you, or any other NT employees, are undercover agents.")
+ to_chat(owner.current, "GREAT LEADER IS DEAD. NANOTRASEN MUST FALL.")
+ to_chat(owner.current, "Your have infiltrated this vessel to cause chaos and assassinate targets known to have conspired against the Syndicate.")
+ 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. ")
+ to_chat(owner.current, "By no means reveal that you are a Syndicate agent. By no means reveal that your targets are being hunted.")
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, "CAUTION: Your legal status as a citizen of NanoTrasen will be permanently revoked upon completion of your first contract.")
+ to_chat(owner.current, "Your target has been suspected of [crime], and must be removed from this plane.")
+ to_chat(owner.current, "While you have a license to kill, you are to eliminate your targets with no collateral or unrelated deaths.")
+ to_chat(owner.current, "For the sake of plausable deniability, you have been equipped with captured Syndicate equipment via uplink.")
to_chat(owner.current, "By no means reveal that you, or any other NT employees, are undercover agents.")
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.")
diff --git a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm
index 6616eea006..8e9a54a69a 100644
--- a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm
+++ b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm
@@ -257,6 +257,8 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list(
return
if (active)
return //prevent the AI from activating an already active doomsday
+ if (owner_AI.shunted)
+ return //prevent AI from activating doomsday while shunted.
active = TRUE
set_us_up_the_bomb(owner)
diff --git a/code/modules/antagonists/traitor/equipment/contractor.dm b/code/modules/antagonists/traitor/equipment/contractor.dm
index 6c5d5766e4..94a3059b5f 100644
--- a/code/modules/antagonists/traitor/equipment/contractor.dm
+++ b/code/modules/antagonists/traitor/equipment/contractor.dm
@@ -1,4 +1,4 @@
-// Support unit gets it's own very basic antag datum for admin logging.
+/// Support unit gets it's own very basic antag datum for admin logging.
/datum/antagonist/traitor/contractor_support
name = "Contractor Support Unit"
antag_moodlet = /datum/mood_event/focused
@@ -8,11 +8,13 @@
should_equip = FALSE /// Don't give them an uplink.
var/datum/team/contractor_team/contractor_team
-/datum/team/contractor_team // Team for storing both the contractor and their support unit - only really for the HUD and admin logging.
+/// Team for storing both the contractor and their support unit - only really for the HUD and admin logging.
+/datum/team/contractor_team
show_roundend_report = FALSE
/datum/antagonist/traitor/contractor_support/forge_traitor_objectives()
var/datum/objective/generic_objective = new
+
generic_objective.name = "Follow Contractor's Orders"
generic_objective.explanation_text = "Follow your orders. Assist agents in this mission area."
generic_objective.completed = TRUE
@@ -25,7 +27,9 @@
var/static/list/contractor_items = typecacheof(/datum/contractor_item/, TRUE)
var/datum/syndicate_contract/current_contract
var/list/datum/syndicate_contract/assigned_contracts = list()
+
var/list/assigned_targets = list() // used as a blacklist to make sure we're not assigning targets already assigned
+ var/contracts_completed = 0
var/contract_TC_payed_out = 0 // Keeping track for roundend reporting
var/contract_TC_to_redeem = 0 // Used internally and roundend reporting - what TC we have available to cashout.
@@ -34,7 +38,8 @@
var/datum/contractor_item/contractor_item = new path
hub_items.Add(contractor_item)
-/datum/contractor_hub/proc/create_contracts(datum/mind/owner) // 6 initial contracts
+/datum/contractor_hub/proc/create_contracts(datum/mind/owner)
+ // 6 initial contracts
var/list/to_generate = list(
CONTRACT_PAYOUT_LARGE,
CONTRACT_PAYOUT_MEDIUM,
@@ -44,61 +49,74 @@
CONTRACT_PAYOUT_SMALL
)
- var/lowest_TC_threshold = 30 // We don't want the sum of all the payouts to be under this amount
+ //What the fuck
+ if(length(to_generate) > length(GLOB.data_core.locked))
+ to_generate.Cut(1, length(GLOB.data_core.locked))
+ // We don't want the sum of all the payouts to be under this amount
+ var/lowest_TC_threshold = 30
+
var/total = 0
var/lowest_paying_sum = 0
var/datum/syndicate_contract/lowest_paying_contract
- to_generate = shuffle(to_generate) // Randomise order, so we don't have contracts always in payout order.
- var/start_index = 1 // Support contract generation happening multiple times
- if(assigned_contracts.len != 0)
+ // Randomise order, so we don't have contracts always in payout order.
+ to_generate = shuffle(to_generate)
+ // Support contract generation happening multiple times
+ var/start_index = 1
+ if (assigned_contracts.len != 0)
start_index = assigned_contracts.len + 1
- for(var/i = 1; i <= to_generate.len; i++) // Generate contracts, and find the lowest paying.
+ // Generate contracts, and find the lowest paying.
+ for (var/i = 1; i <= to_generate.len; i++)
var/datum/syndicate_contract/contract_to_add = new(owner, assigned_targets, to_generate[i])
var/contract_payout_total = contract_to_add.contract.payout + contract_to_add.contract.payout_bonus
assigned_targets.Add(contract_to_add.contract.target)
- if(!lowest_paying_contract || (contract_payout_total < lowest_paying_sum))
+ if (!lowest_paying_contract || (contract_payout_total < lowest_paying_sum))
lowest_paying_sum = contract_payout_total
lowest_paying_contract = contract_to_add
total += contract_payout_total
contract_to_add.id = start_index
assigned_contracts.Add(contract_to_add)
start_index++
- if(total < lowest_TC_threshold) // If the threshold for TC payouts isn't reached, boost the lowest paying contract
+
+ // If the threshold for TC payouts isn't reached, boost the lowest paying contract
+ if (total < lowest_TC_threshold)
lowest_paying_contract.contract.payout_bonus += (lowest_TC_threshold - total)
/datum/contractor_item
var/name // Name of item
var/desc // description of item
var/item // item path, no item path means the purchase needs it's own handle_purchase()
- var/item_icon = "fa-broadcast-tower" // fontawesome icon to use inside the hub - https://fontawesome.com/icons/
+ var/item_icon = "broadcast-tower" // fontawesome icon to use inside the hub - https://fontawesome.com/icons/
var/limited = -1 // Any number above 0 for how many times it can be bought in a round for a single traitor. -1 is unlimited.
var/cost // Cost of the item in contract rep.
/datum/contractor_item/contract_reroll
name = "Contract Reroll"
desc = "Request a reroll of your current contract list. Will generate a new target, payment, and dropoff for the contracts you currently have available."
- item_icon = "fa-dice"
+ item_icon = "dice"
limited = 2
cost = 0
/datum/contractor_item/contract_reroll/handle_purchase(var/datum/contractor_hub/hub)
. = ..()
if (.)
- var/list/new_target_list = list() // We're not regenerating already completed/aborted/extracting contracts, but we don't want to repeat their targets.
+ /// We're not regenerating already completed/aborted/extracting contracts, but we don't want to repeat their targets.
+ var/list/new_target_list = list()
for(var/datum/syndicate_contract/contract_check in hub.assigned_contracts)
if (contract_check.status != CONTRACT_STATUS_ACTIVE && contract_check.status != CONTRACT_STATUS_INACTIVE)
if (contract_check.contract.target)
new_target_list.Add(contract_check.contract.target)
continue
- for(var/datum/syndicate_contract/rerolling_contract in hub.assigned_contracts) // Reroll contracts without duplicates
+ /// Reroll contracts without duplicates
+ for(var/datum/syndicate_contract/rerolling_contract in hub.assigned_contracts)
if (rerolling_contract.status != CONTRACT_STATUS_ACTIVE && rerolling_contract.status != CONTRACT_STATUS_INACTIVE)
continue
rerolling_contract.generate(new_target_list)
new_target_list.Add(rerolling_contract.contract.target)
- hub.assigned_targets = new_target_list // Set our target list with the new set we've generated.
+ /// Set our target list with the new set we've generated.
+ hub.assigned_targets = new_target_list
/datum/contractor_item/contractor_pinpointer
name = "Contractor Pinpointer"
desc = "A pinpointer that finds targets even without active suit sensors. Due to taking advantage of an exploit within the system, it can't pinpoint to the same accuracy as the traditional models. Becomes permanently locked to the user that first activates it."
@@ -125,20 +143,25 @@
/datum/contractor_item/contractor_partner/handle_purchase(var/datum/contractor_hub/hub, mob/living/user)
. = ..()
+
if (.)
to_chat(user, "The uplink vibrates quietly, connecting to nearby agents...")
- var/list/mob/candidates = pollGhostCandidates("Do you want to play as the Contractor Support Unit for [user.real_name]?", ROLE_PAI, null, FALSE, 100, POLL_IGNORE_CONTRACTOR_SUPPORT)
+
+ var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you want to play as the Contractor Support Unit for [user.real_name]?", ROLE_PAI, null, FALSE, 100, POLL_IGNORE_CONTRACTOR_SUPPORT)
+
if(LAZYLEN(candidates))
var/mob/dead/observer/C = pick(candidates)
spawn_contractor_partner(user, C.key)
else
to_chat(user, "No available agents at this time, please try again later.")
- limited += 1 // refund and add the limit back.
+ // refund and add the limit back.
+ limited += 1
hub.contract_rep += cost
hub.purchased_items -= src
/datum/outfit/contractor_partner
name = "Contractor Support Unit"
+
uniform = /obj/item/clothing/under/chameleon
suit = /obj/item/clothing/suit/chameleon
back = /obj/item/storage/backpack
@@ -148,28 +171,35 @@
ears = /obj/item/radio/headset/chameleon
id = /obj/item/card/id/syndicate
r_hand = /obj/item/storage/toolbox/syndicate
+
backpack_contents = list(/obj/item/storage/box/survival, /obj/item/implanter/uplink, /obj/item/clothing/mask/chameleon,
/obj/item/storage/fancy/cigarettes/cigpack_syndicate, /obj/item/lighter)
/datum/outfit/contractor_partner/post_equip(mob/living/carbon/human/H, visualsOnly)
. = ..()
- var/obj/item/clothing/mask/cigarette/syndicate/cig = H.get_item_by_slot(SLOT_WEAR_MASK)
- cig.light() // pre-light their cig for extra badass
+ var/obj/item/clothing/mask/cigarette/syndicate/cig = H.get_item_by_slot(ITEM_SLOT_MASK)
+ // pre-light their cig
+ cig.light()
/datum/contractor_item/contractor_partner/proc/spawn_contractor_partner(mob/living/user, key)
var/mob/living/carbon/human/partner = new()
var/datum/outfit/contractor_partner/partner_outfit = new()
+
partner_outfit.equip(partner)
+
var/obj/structure/closet/supplypod/arrival_pod = new()
+
arrival_pod.style = STYLE_SYNDICATE
arrival_pod.explosionSize = list(0,0,0,1)
arrival_pod.bluespace = TRUE
var/turf/free_location = find_obstruction_free_location(2, user)
- if (!free_location) // We really want to send them - if we can't find a nice location just land it on top of them.
+ // We really want to send them - if we can't find a nice location just land it on top of them.
+ if (!free_location)
free_location = get_turf(user)
partner.forceMove(arrival_pod)
partner.ckey = key
- partner_mind = partner.mind // We give a reference to the mind that'll be the support unit
+ /// We give a reference to the mind that'll be the support unit
+ partner_mind = partner.mind
partner_mind.make_Contractor_Support()
to_chat(partner_mind.current, "\n[user.real_name] is your superior. Follow any, and all orders given by them. You're here to support their mission only.")
to_chat(partner_mind.current, "Should they perish, or be otherwise unavailable, you're to assist other active agents in this mission area to the best of your ability.\n\n")
@@ -186,7 +216,7 @@
. = ..()
if (.)
power_fail(35, 50)
- priority_announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Critical Power Failure", "poweroff")
+ priority_announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Critical Power Failure", "poweroff.ogg")
// Subtract cost, and spawn if it's an item.
/datum/contractor_item/proc/handle_purchase(var/datum/contractor_hub/hub, mob/living/user)
@@ -199,6 +229,7 @@
else if (limited == 0)
return FALSE
hub.purchased_items.Add(src)
+ user.playsound_local(user, 'sound/machines/uplinkpurchase.ogg', 100)
if (item && ispath(item))
var/atom/item_to_create = new item(get_turf(user))
diff --git a/code/modules/antagonists/traitor/syndicate_contract.dm b/code/modules/antagonists/traitor/syndicate_contract.dm
index 70ff59eee0..0f67616a32 100644
--- a/code/modules/antagonists/traitor/syndicate_contract.dm
+++ b/code/modules/antagonists/traitor/syndicate_contract.dm
@@ -4,47 +4,70 @@
var/datum/objective/contract/contract = new()
var/target_rank
var/ransom = 0
- var/payout_type = null
+ var/payout_type
+ var/wanted_message
+
var/list/victim_belongings = list()
/datum/syndicate_contract/New(contract_owner, blacklist, type=CONTRACT_PAYOUT_SMALL)
contract.owner = contract_owner
payout_type = type
+
generate(blacklist)
/datum/syndicate_contract/proc/generate(blacklist)
contract.find_target(null, blacklist)
- var/datum/data/record/record = find_record("name", contract.target.name, GLOB.data_core.general)
- if(record)
+
+ var/datum/data/record/record
+ if (contract.target)
+ record = find_record("name", contract.target.name, GLOB.data_core.general)
+
+ if (record)
target_rank = record.fields["rank"]
else
target_rank = "Unknown"
+
if (payout_type == CONTRACT_PAYOUT_LARGE)
contract.payout_bonus = rand(9,13)
- else if(payout_type == CONTRACT_PAYOUT_MEDIUM)
+ else if (payout_type == CONTRACT_PAYOUT_MEDIUM)
contract.payout_bonus = rand(6,8)
else
contract.payout_bonus = rand(2,4)
+
contract.payout = rand(0, 2)
contract.generate_dropoff()
+
ransom = 100 * rand(18, 45)
+ var/base = pick_list(WANTED_FILE, "basemessage")
+ var/verb_string = pick_list(WANTED_FILE, "verb")
+ var/noun = pick_list_weighted(WANTED_FILE, "noun")
+ var/location = pick_list_weighted(WANTED_FILE, "location")
+ wanted_message = "[base] [verb_string] [noun] [location]."
+
/datum/syndicate_contract/proc/handle_extraction(var/mob/living/user)
if (contract.target && contract.dropoff_check(user, contract.target.current))
+
var/turf/free_location = find_obstruction_free_location(3, user, contract.dropoff)
- if(free_location) // We've got a valid location, launch.
+
+ if (free_location)
+ // We've got a valid location, launch.
launch_extraction_pod(free_location)
return TRUE
+
return FALSE
// Launch the pod to collect our victim.
/datum/syndicate_contract/proc/launch_extraction_pod(turf/empty_pod_turf)
var/obj/structure/closet/supplypod/extractionpod/empty_pod = new()
+
RegisterSignal(empty_pod, COMSIG_ATOM_ENTERED, .proc/enter_check)
+
empty_pod.stay_after_drop = TRUE
empty_pod.reversing = TRUE
empty_pod.explosionSize = list(0,0,0,1)
empty_pod.leavingSound = 'sound/effects/podwoosh.ogg'
+
new /obj/effect/abstract/DPtarget(empty_pod_turf, empty_pod)
/datum/syndicate_contract/proc/enter_check(datum/source, sent_mob)
@@ -52,37 +75,55 @@
if(isliving(sent_mob))
var/mob/living/M = sent_mob
var/datum/antagonist/traitor/traitor_data = contract.owner.has_antag_datum(/datum/antagonist/traitor)
+
if(M == contract.target.current)
traitor_data.contractor_hub.contract_TC_to_redeem += contract.payout
+ traitor_data.contractor_hub.contracts_completed += 1
+
if(M.stat != DEAD)
traitor_data.contractor_hub.contract_TC_to_redeem += contract.payout_bonus
+
status = CONTRACT_STATUS_COMPLETE
+
if(traitor_data.contractor_hub.current_contract == src)
traitor_data.contractor_hub.current_contract = null
+
traitor_data.contractor_hub.contract_rep += 2
else
status = CONTRACT_STATUS_ABORTED // Sending a target that wasn't even yours is as good as just aborting it
+
if(traitor_data.contractor_hub.current_contract == src)
traitor_data.contractor_hub.current_contract = null
+
if(iscarbon(M))
for(var/obj/item/W in M)
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(W == H.w_uniform || W == H.shoes)
- continue //So all they're left with are shoes and uniform.
+ if(W == H.w_uniform)
+ continue //So all they're left with are shoes and uniform.
+ if(W == H.shoes)
+ continue
+
+
M.transferItemToLoc(W)
victim_belongings.Add(W)
+
var/obj/structure/closet/supplypod/extractionpod/pod = source
- pod.send_up(pod) // Handle the pod returning
+
+ // Handle the pod returning
+ pod.send_up(pod)
+
if(ishuman(M))
- var/mob/living/carbon/human/target = M // After we remove items, at least give them what they need to live.
+ var/mob/living/carbon/human/target = M
+
+ // After we remove items, at least give them what they need to live.
target.dna.species.give_important_for_life(target)
handleVictimExperience(M) // After pod is sent we start the victim narrative/heal.
var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
var/points_to_check = min(D.account_balance, ransom)
D.adjust_money(min(points_to_check, ransom))
priority_announce("One of your crew was captured by a rival organisation - we've needed to pay their ransom to bring them back. \
- As is policy we've taken a portion of the station's funds to offset the overall cost.", null, "attention", null, "Nanotrasen Asset Protection")
+ As is policy we've taken a portion of the station's funds to offset the overall cost.", null, "attention", null, "Nanotrasen Asset Protection")
sleep(30)
@@ -128,13 +169,18 @@
M.Dizzy(15)
M.confused += 20
-/datum/syndicate_contract/proc/returnVictim(var/mob/living/M) // We're returning the victim
+// We're returning the victim
+/datum/syndicate_contract/proc/returnVictim(var/mob/living/M)
var/list/possible_drop_loc = list()
+
for(var/turf/possible_drop in contract.dropoff.contents)
- if(!is_blocked_turf(possible_drop))
- possible_drop_loc.Add(possible_drop)
+ if(!isspaceturf(possible_drop) && !isclosedturf(possible_drop))
+ if(!is_blocked_turf(possible_drop))
+ possible_drop_loc.Add(possible_drop)
+
if(possible_drop_loc.len > 0)
var/pod_rand_loc = rand(1, possible_drop_loc.len)
+
var/obj/structure/closet/supplypod/return_pod = new()
return_pod.bluespace = TRUE
return_pod.explosionSize = list(0,0,0,0)
@@ -144,8 +190,10 @@
for(var/obj/item/W in M)
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(W == H.w_uniform || W == H.shoes)
+ if(W == H.w_uniform)
continue //So all they're left with are shoes and uniform.
+ if(W == H.shoes)
+ continue
M.dropItemToGround(W)
for(var/obj/item/W in victim_belongings)
W.forceMove(return_pod)
diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm
index ff3d95598d..2701a2d006 100644
--- a/code/modules/antagonists/wizard/equipment/artefact.dm
+++ b/code/modules/antagonists/wizard/equipment/artefact.dm
@@ -234,7 +234,7 @@
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/roman(H), SLOT_SHOES)
H.put_in_hands(new /obj/item/shield/riot/roman(H), TRUE)
H.put_in_hands(new /obj/item/claymore(H), TRUE)
- H.equip_to_slot_or_del(new /obj/item/twohanded/spear(H), SLOT_BACK)
+ H.equip_to_slot_or_del(new /obj/item/spear(H), SLOT_BACK)
/obj/item/voodoo
@@ -369,7 +369,7 @@
var/mob/living/carbon/last_user
/obj/item/warpwhistle/proc/interrupted(mob/living/carbon/user)
- if(!user || QDELETED(src) || user.notransform)
+ if(!user || QDELETED(src) || user.mob_transforming)
on_cooldown = FALSE
return TRUE
return FALSE
diff --git a/code/modules/antagonists/wizard/equipment/spellbook.dm b/code/modules/antagonists/wizard/equipment/spellbook.dm
index a9bc64a932..4c29c53a2e 100644
--- a/code/modules/antagonists/wizard/equipment/spellbook.dm
+++ b/code/modules/antagonists/wizard/equipment/spellbook.dm
@@ -430,12 +430,12 @@
/datum/spellbook_entry/item/mjolnir
name = "Mjolnir"
desc = "A mighty hammer on loan from Thor, God of Thunder. It crackles with barely contained power."
- item_path = /obj/item/twohanded/mjollnir
+ item_path = /obj/item/mjollnir
/datum/spellbook_entry/item/singularity_hammer
name = "Singularity Hammer"
desc = "A hammer that creates an intensely powerful field of gravity where it strikes, pulling everything nearby to the point of impact."
- item_path = /obj/item/twohanded/singularityhammer
+ item_path = /obj/item/singularityhammer
/datum/spellbook_entry/item/battlemage
name = "Battlemage Armour"
@@ -503,6 +503,7 @@
name = "Summon Guns"
desc = "Nothing could possibly go wrong with arming a crew of lunatics just itching for an excuse to kill you. Just be careful not to stand still too long!"
dynamic_requirement = 60
+ limit = 1
/datum/spellbook_entry/summon/guns/IsAvailible()
if(!SSticker.mode) // In case spellbook is placed on map
@@ -521,6 +522,7 @@
name = "Summon Magic"
desc = "Share the wonders of magic with the crew and show them why they aren't to be trusted with it at the same time."
dynamic_requirement = 60
+ limit = 1
/datum/spellbook_entry/summon/magic/IsAvailible()
if(!SSticker.mode) // In case spellbook is placed on map
@@ -560,6 +562,27 @@
. += "You cast it [times] times. "
return .
+/datum/spellbook_entry/summon/curse_of_madness
+ name = "Curse of Madness"
+ desc = "Curses the station, warping the minds of everyone inside, causing lasting traumas. Warning: this spell can affect you if not cast from a safe distance."
+ cost = 4
+
+/datum/spellbook_entry/summon/curse_of_madness/Buy(mob/living/carbon/human/user, obj/item/spellbook/book)
+ SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name)
+ active = TRUE
+ var/message = stripped_input(user, "Whisper a secret truth to drive your victims to madness.", "Whispers of Madness")
+ if(!message)
+ return FALSE
+ curse_of_madness(user, message)
+ to_chat(user, "You have cast the curse of insanity!")
+ playsound(user, 'sound/magic/mandswap.ogg', 50, 1)
+ return TRUE
+
+/datum/spellbook_entry/summon/curse_of_madness/IsAvailible()
+ if(!SSticker.mode) // In case spellbook is placed on map
+ return FALSE
+ return (!CONFIG_GET(flag/no_summon_traumas) && ..())
+
/obj/item/spellbook
name = "spell book"
desc = "An unearthly tome that glows with power."
diff --git a/code/modules/antagonists/wizard/wizard.dm b/code/modules/antagonists/wizard/wizard.dm
index 70adafd3fb..7263793f7f 100644
--- a/code/modules/antagonists/wizard/wizard.dm
+++ b/code/modules/antagonists/wizard/wizard.dm
@@ -13,6 +13,7 @@
var/move_to_lair = TRUE
var/outfit_type = /datum/outfit/wizard
var/wiz_age = WIZARD_AGE_MIN /* Wizards by nature cannot be too young. */
+ show_to_ghosts = TRUE
/datum/antagonist/wizard/on_gain()
register()
diff --git a/code/modules/antagonists/xeno/xeno.dm b/code/modules/antagonists/xeno/xeno.dm
index 7c4c5351df..2cc8e34b99 100644
--- a/code/modules/antagonists/xeno/xeno.dm
+++ b/code/modules/antagonists/xeno/xeno.dm
@@ -12,6 +12,7 @@
name = "Xenomorph"
job_rank = ROLE_ALIEN
show_in_antagpanel = FALSE
+ show_to_ghosts = TRUE
var/datum/team/xeno/xeno_team
threat = 3
diff --git a/code/modules/arousal/genitals.dm b/code/modules/arousal/genitals.dm
index fb254a2dcc..4d2e5e6fef 100644
--- a/code/modules/arousal/genitals.dm
+++ b/code/modules/arousal/genitals.dm
@@ -1,7 +1,7 @@
/obj/item/organ/genital
color = "#fcccb3"
w_class = WEIGHT_CLASS_SMALL
- organ_flags = ORGAN_NO_DISMEMBERMENT
+ organ_flags = ORGAN_NO_DISMEMBERMENT|ORGAN_EDIBLE
var/shape
var/sensitivity = 1 // wow if this were ever used that'd be cool but it's not but i'm keeping it for my unshit code
var/genital_flags //see citadel_defines.dm
diff --git a/code/modules/assembly/bomb.dm b/code/modules/assembly/bomb.dm
index a40a4c1a42..1c814fa193 100644
--- a/code/modules/assembly/bomb.dm
+++ b/code/modules/assembly/bomb.dm
@@ -53,8 +53,8 @@
return
if(I.use_tool(src, user, 0, volume=40))
status = TRUE
- GLOB.bombers += "[key_name(user)] welded a single tank bomb. Temp: [bombtank.air_contents.temperature-T0C]"
- message_admins("[ADMIN_LOOKUPFLW(user)] welded a single tank bomb. Temp: [bombtank.air_contents.temperature-T0C]")
+ GLOB.bombers += "[key_name(user)] welded a single tank bomb. Temp: [bombtank.air_contents.return_temperature()-T0C]"
+ message_admins("[ADMIN_LOOKUPFLW(user)] welded a single tank bomb. Temp: [bombtank.air_contents.return_temperature()-T0C]")
to_chat(user, "A pressure hole has been bored to [bombtank] valve. \The [bombtank] can now be ignited.")
add_fingerprint(user)
return TRUE
@@ -62,6 +62,7 @@
/obj/item/onetankbomb/analyzer_act(mob/living/user, obj/item/I)
bombtank.analyzer_act(user, I)
+ return TRUE
/obj/item/onetankbomb/attack_self(mob/user) //pressing the bomb accesses its assembly
bombassembly.attack_self(user, TRUE)
@@ -90,7 +91,7 @@
if(bombassembly)
bombassembly.on_found(finder)
-/obj/item/onetankbomb/attack_hand() //also for mousetraps
+/obj/item/onetankbomb/on_attack_hand() //also for mousetraps
. = ..()
if(.)
return
@@ -145,8 +146,7 @@
return
/obj/item/tank/proc/ignite() //This happens when a bomb is told to explode
- var/fuel_moles = air_contents.gases[/datum/gas/plasma] + air_contents.gases[/datum/gas/oxygen]/6
- GAS_GARBAGE_COLLECT(air_contents.gases)
+ var/fuel_moles = air_contents.get_moles(/datum/gas/plasma) + air_contents.get_moles(/datum/gas/oxygen)/6
var/datum/gas_mixture/bomb_mixture = air_contents.copy()
var/strength = 1
@@ -156,7 +156,7 @@
qdel(master)
qdel(src)
- if(bomb_mixture.temperature > (T0C + 400))
+ if(bomb_mixture.return_temperature() > (T0C + 400))
strength = (fuel_moles/15)
if(strength >=1)
@@ -169,7 +169,7 @@
ground_zero.assume_air(bomb_mixture)
ground_zero.hotspot_expose(1000, 125)
- else if(bomb_mixture.temperature > (T0C + 250))
+ else if(bomb_mixture.return_temperature() > (T0C + 250))
strength = (fuel_moles/20)
if(strength >=1)
@@ -180,7 +180,7 @@
ground_zero.assume_air(bomb_mixture)
ground_zero.hotspot_expose(1000, 125)
- else if(bomb_mixture.temperature > (T0C + 100))
+ else if(bomb_mixture.return_temperature() > (T0C + 100))
strength = (fuel_moles/25)
if (strength >=1)
diff --git a/code/modules/assembly/health.dm b/code/modules/assembly/health.dm
index cddc4fb08f..0af6c85fb6 100644
--- a/code/modules/assembly/health.dm
+++ b/code/modules/assembly/health.dm
@@ -4,7 +4,6 @@
icon_state = "health"
custom_materials = list(/datum/material/iron=800, /datum/material/glass=200)
attachable = TRUE
- secured = FALSE
var/scanning = FALSE
var/health_scan
@@ -12,7 +11,8 @@
/obj/item/assembly/health/examine(mob/user)
. = ..()
- . += "Use a multitool to swap between \"detect death\" mode and \"detect critical state\" mode."
+ . += "Use it in hand to turn it off/on and Alt-click to swap between \"detect death\" mode and \"detect critical state\" mode."
+ . += "[src.scanning ? "The sensor is on and you can see [health_scan] displayed on the screen" : "The sensor is off"]."
/obj/item/assembly/health/activate()
if(!..())
@@ -30,14 +30,13 @@
update_icon()
return secured
-/obj/item/assembly/health/multitool_act(mob/living/user, obj/item/I)
+/obj/item/assembly/health/AltClick(mob/living/user)
if(alarm_health == HEALTH_THRESHOLD_CRIT)
alarm_health = HEALTH_THRESHOLD_DEAD
to_chat(user, "You toggle [src] to \"detect death\" mode.")
else
alarm_health = HEALTH_THRESHOLD_CRIT
to_chat(user, "You toggle [src] to \"detect critical state\" mode.")
- return TRUE
/obj/item/assembly/health/process()
if(!scanning || !secured)
@@ -46,7 +45,6 @@
var/atom/A = src
if(connected && connected.holder)
A = connected.holder
-
for(A, A && !ismob(A), A=A.loc);
// like get_turf(), but for mobs.
var/mob/living/M = A
@@ -71,36 +69,7 @@
STOP_PROCESSING(SSobj, src)
return
-/obj/item/assembly/health/ui_interact(mob/user as mob)//TODO: Change this to the wires thingy
+/obj/item/assembly/health/attack_self(mob/user)
. = ..()
- if(!secured)
- user.show_message("The [name] is unsecured!")
- return FALSE
- var/dat = "Health Sensor"
- dat += " [scanning?"On":"Off"]"
- if(scanning && health_scan)
- dat += " Health: [health_scan]"
- user << browse(dat, "window=hscan")
- onclose(user, "hscan")
-
-/obj/item/assembly/health/Topic(href, href_list)
- ..()
- if(!ismob(usr))
- return
-
- var/mob/user = usr
-
- if(!user.canUseTopic(src))
- usr << browse(null, "window=hscan")
- onclose(usr, "hscan")
- return
-
- if(href_list["scanning"])
- toggle_scan()
-
- if(href_list["close"])
- usr << browse(null, "window=hscan")
- return
-
- attack_self(user)
- return
+ to_chat(user, "You toggle [src] [src.scanning ? "off" : "on"].")
+ toggle_scan()
diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm
index c960a7f039..bf56449a0c 100644
--- a/code/modules/assembly/holder.dm
+++ b/code/modules/assembly/holder.dm
@@ -87,7 +87,7 @@
if(a_right)
a_right.dropped(user)
-/obj/item/assembly_holder/attack_hand()//Perhapse this should be a holder_pickup proc instead, can add if needbe I guess
+/obj/item/assembly_holder/on_attack_hand()//Perhapse this should be a holder_pickup proc instead, can add if needbe I guess
. = ..()
if(.)
return
diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm
index 33c6d46045..6e8e2846a2 100644
--- a/code/modules/assembly/infrared.dm
+++ b/code/modules/assembly/infrared.dm
@@ -4,7 +4,8 @@
icon_state = "infrared"
custom_materials = list(/datum/material/iron=1000, /datum/material/glass=500)
is_position_sensitive = TRUE
-
+ var/ui_x = 225
+ var/ui_y = 110
var/on = FALSE
var/visible = FALSE
var/maxlength = 8
@@ -38,7 +39,7 @@
/obj/item/assembly/infra/activate()
if(!..())
- return FALSE//Cooldown check
+ return FALSE //Cooldown check
on = !on
refreshBeam()
update_icon()
@@ -69,7 +70,7 @@
holder.update_icon()
return
-/obj/item/assembly/infra/dropped(mob/user)
+/obj/item/assembly/infra/dropped()
. = ..()
if(holder)
holder_movement() //sync the dir of the device as well if it's contained in a TTV or an assembly holder
@@ -124,7 +125,7 @@
return
refreshBeam()
-/obj/item/assembly/infra/attack_hand()
+/obj/item/assembly/infra/on_attack_hand()
. = ..()
refreshBeam()
@@ -133,7 +134,7 @@
. = ..()
setDir(t)
-/obj/item/assembly/infra/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback)
+/obj/item/assembly/infra/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force, gentle = FALSE)
. = ..()
olddir = dir
@@ -176,55 +177,56 @@
return
return refreshBeam()
-/obj/item/assembly/infra/ui_interact(mob/user)//TODO: change this this to the wire control panel
- . = ..()
- if(is_secured(user))
- user.set_machine(src)
- var/dat = "Infrared Laser"
- dat += " Status: [on ? "On" : "Off"]"
- dat += " Visibility: [visible ? "Visible" : "Invisible"]"
- dat += "
Close"
- var/datum/browser/popup = new(user, "timer", name)
- popup.set_content(dat)
- popup.open()
+ return ..()
+ return UI_CLOSE
+/obj/item/assembly/timer/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
+ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.hands_state)
+ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "Timer", name, ui_x, ui_y, master_ui, state)
+ ui.open()
-/obj/item/assembly/timer/Topic(href, href_list)
- ..()
- if(!usr.canUseTopic(src, BE_CLOSE))
- usr << browse(null, "window=timer")
- onclose(usr, "timer")
+/obj/item/assembly/timer/ui_data(mob/user)
+ var/list/data = list()
+ data["seconds"] = round(time % 60)
+ data["minutes"] = round((time - data["seconds"]) / 60)
+ data["timing"] = timing
+ data["loop"] = loop
+ return data
+
+/obj/item/assembly/timer/ui_act(action, params)
+ if(..())
return
- if(href_list["time"])
- timing = text2num(href_list["time"])
- if(timing && istype(holder, /obj/item/transfer_valve))
- var/timer_message = "[ADMIN_LOOKUPFLW(usr)] activated [src] attachment on [holder]."
- message_admins(timer_message)
- GLOB.bombers += timer_message
- log_game("[key_name(usr)] activated [src] attachment on [holder]")
- update_icon()
- if(href_list["repeat"])
- loop = text2num(href_list["repeat"])
-
- if(href_list["tp"])
- var/tp = text2num(href_list["tp"])
- time += tp
- time = min(max(round(time), 1), 600)
- saved_time = time
-
- if(href_list["close"])
- usr << browse(null, "window=timer")
- return
-
- if(usr)
- attack_self(usr)
+ switch(action)
+ if("time")
+ timing = !timing
+ if(timing && istype(holder, /obj/item/transfer_valve))
+ log_game(usr, "activated a", src, "attachment on [holder]")
+ update_icon()
+ . = TRUE
+ if("repeat")
+ loop = !loop
+ . = TRUE
+ if("input")
+ var/value = text2num(params["adjust"])
+ if(value)
+ value = round(time + value)
+ time = clamp(value, 1, 600)
+ saved_time = time
+ . = TRUE
diff --git a/code/modules/asset_cache/asset_cache.dm b/code/modules/asset_cache/asset_cache.dm
new file mode 100644
index 0000000000..f702bf714e
--- /dev/null
+++ b/code/modules/asset_cache/asset_cache.dm
@@ -0,0 +1,103 @@
+/*
+Asset cache quick users guide:
+
+Make a datum in asset_list_items.dm with your assets for your thing.
+Checkout asset_list.dm for the helper subclasses
+The simple subclass will most like be of use for most cases.
+Then call get_asset_datum() with the type of the datum you created and store the return
+Then call .send(client) on that stored return value.
+
+Note: If your code uses output() with assets you will need to call asset_flush on the client and wait for it to return before calling output(). You only need do this if .send(client) returned TRUE
+*/
+
+//When sending mutiple assets, how many before we give the client a quaint little sending resources message
+#define ASSET_CACHE_TELL_CLIENT_AMOUNT 8
+
+//This proc sends the asset to the client, but only if it needs it.
+//This proc blocks(sleeps) unless verify is set to false
+/proc/send_asset(client/client, asset_name)
+ return send_asset_list(client, list(asset_name))
+
+/// Sends a list of assets to a client
+/// This proc will no longer block, use client.asset_flush() if you to need know when the client has all assets (such as for output()). (This is not required for browse() calls as they use the same message queue as asset sends)
+/// client - a client or mob
+/// asset_list - A list of asset filenames to be sent to the client.
+/// Returns TRUE if any assets were sent.
+/proc/send_asset_list(client/client, list/asset_list)
+ if(!istype(client))
+ if(ismob(client))
+ var/mob/M = client
+ if(M.client)
+ client = M.client
+ else
+ return
+ else
+ return
+
+ var/list/unreceived = list()
+
+ for (var/asset_name in asset_list)
+ var/datum/asset_cache_item/asset = SSassets.cache[asset_name]
+ if (!asset)
+ continue
+ var/asset_file = asset.resource
+ if (!asset_file)
+ continue
+
+ var/asset_md5 = asset.md5
+ if (client.sent_assets[asset_name] == asset_md5)
+ continue
+ unreceived[asset_name] = asset_md5
+
+ if (unreceived.len)
+ if (unreceived.len >= ASSET_CACHE_TELL_CLIENT_AMOUNT)
+ to_chat(client, "Sending Resources...")
+
+ for(var/asset in unreceived)
+ var/datum/asset_cache_item/ACI
+ if ((ACI = SSassets.cache[asset]))
+ log_asset("Sending asset [asset] to client [client]")
+ client << browse_rsc(ACI.resource, asset)
+
+ client.sent_assets |= unreceived
+ addtimer(CALLBACK(client, /client/proc/asset_cache_update_json), 1 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE)
+ return TRUE
+ return FALSE
+
+//This proc will download the files without clogging up the browse() queue, used for passively sending files on connection start.
+//The proc calls procs that sleep for long times.
+/proc/getFilesSlow(client/client, list/files, register_asset = TRUE, filerate = 3)
+ var/startingfilerate = filerate
+ for(var/file in files)
+ if (!client)
+ break
+ if (register_asset)
+ register_asset(file, files[file])
+
+ if (send_asset(client, file))
+ if (!(--filerate))
+ filerate = startingfilerate
+ client.asset_flush()
+ stoplag(0) //queuing calls like this too quickly can cause issues in some client versions
+
+//This proc "registers" an asset, it adds it to the cache for further use, you cannot touch it from this point on or you'll fuck things up.
+//icons and virtual assets get copied to the dyn rsc before use
+/proc/register_asset(asset_name, asset)
+ var/datum/asset_cache_item/ACI = new(asset_name, asset)
+
+ //this is technically never something that was supported and i want metrics on how often it happens if at all.
+ if (SSassets.cache[asset_name])
+ var/datum/asset_cache_item/OACI = SSassets.cache[asset_name]
+ if (OACI.md5 != ACI.md5)
+ stack_trace("ERROR: new asset added to the asset cache with the same name as another asset: [asset_name] existing asset md5: [OACI.md5] new asset md5:[ACI.md5]")
+ else
+ var/list/stacktrace = gib_stack_trace()
+ log_asset("WARNING: dupe asset added to the asset cache: [asset_name] existing asset md5: [OACI.md5] new asset md5:[ACI.md5]\n[stacktrace.Join("\n")]")
+ SSassets.cache[asset_name] = ACI
+
+//Generated names do not include file extention.
+//Used mainly for code that deals with assets in a generic way
+//The same asset will always lead to the same asset name
+/proc/generate_asset_name(file)
+ return "asset.[md5(fcopy_rsc(file))]"
+
diff --git a/code/modules/asset_cache/asset_cache_client.dm b/code/modules/asset_cache/asset_cache_client.dm
new file mode 100644
index 0000000000..0f51520f13
--- /dev/null
+++ b/code/modules/asset_cache/asset_cache_client.dm
@@ -0,0 +1,51 @@
+
+/// Process asset cache client topic calls for "asset_cache_confirm_arrival=[INT]"
+/client/proc/asset_cache_confirm_arrival(job_id)
+ var/asset_cache_job = round(text2num(job_id))
+ //because we skip the limiter, we have to make sure this is a valid arrival and not somebody tricking us into letting them append to a list without limit.
+ if (asset_cache_job > 0 && asset_cache_job <= last_asset_job && !(completed_asset_jobs["[asset_cache_job]"]))
+ completed_asset_jobs["[asset_cache_job]"] = TRUE
+ last_completed_asset_job = max(last_completed_asset_job, asset_cache_job)
+ else
+ return asset_cache_job || TRUE
+
+
+/// Process asset cache client topic calls for "asset_cache_preload_data=[HTML+JSON_STRING]
+/client/proc/asset_cache_preload_data(data)
+ /*var/jsonend = findtextEx(data, "{{{ENDJSONDATA}}}")
+ if (!jsonend)
+ CRASH("invalid asset_cache_preload_data, no jsonendmarker")*/
+ //var/json = html_decode(copytext(data, 1, jsonend))
+ var/json = data
+ var/list/preloaded_assets = json_decode(json)
+
+ for (var/preloaded_asset in preloaded_assets)
+ if (copytext(preloaded_asset, findlasttext(preloaded_asset, ".")+1) in list("js", "jsm", "htm", "html"))
+ preloaded_assets -= preloaded_asset
+ continue
+ sent_assets |= preloaded_assets
+
+
+/// Updates the client side stored html/json combo file used to keep track of what assets the client has between restarts/reconnects.
+/client/proc/asset_cache_update_json(verify = FALSE, list/new_assets = list())
+ if (world.time - connection_time < 10 SECONDS) //don't override the existing data file on a new connection
+ return
+ if (!islist(new_assets))
+ new_assets = list("[new_assets]" = md5(SSassets.cache[new_assets]))
+
+ src << browse(json_encode(new_assets|sent_assets), "file=asset_data.json&display=0")
+
+/// Blocks until all currently sending browser assets have been sent.
+/// Due to byond limitations, this proc will sleep for 1 client round trip even if the client has no pending asset sends.
+/// This proc will return an untrue value if it had to return before confirming the send, such as timeout or the client going away.
+/client/proc/asset_flush(timeout = 50)
+ var/job = ++last_asset_job
+ var/t = 0
+ var/timeout_time = timeout
+ src << browse({""}, "window=asset_cache_browser&file=asset_cache_send_verify.htm")
+
+ while(!completed_asset_jobs["[job]"] && t < timeout_time) // Reception is handled in Topic()
+ stoplag(1) // Lock up the caller until this is received.
+ t++
+ if (t < timeout_time)
+ return TRUE
diff --git a/code/modules/asset_cache/asset_cache_item.dm b/code/modules/asset_cache/asset_cache_item.dm
new file mode 100644
index 0000000000..0e7d44a7ac
--- /dev/null
+++ b/code/modules/asset_cache/asset_cache_item.dm
@@ -0,0 +1,21 @@
+/**
+ * # asset_cache_item
+ *
+ * An internal datum containing info on items in the asset cache. Mainly used to cache md5 info for speed.
+**/
+/datum/asset_cache_item
+ var/name
+ var/md5
+ var/resource
+
+/datum/asset_cache_item/New(name, file)
+ if (!isfile(file))
+ file = fcopy_rsc(file)
+ md5 = md5(file)
+ if (!md5)
+ md5 = md5(fcopy_rsc(file))
+ if (!md5)
+ CRASH("invalid asset sent to asset cache")
+ debug_world_log("asset cache unexpected success of second fcopy_rsc")
+ src.name = name
+ resource = file
diff --git a/code/modules/asset_cache/asset_list.dm b/code/modules/asset_cache/asset_list.dm
new file mode 100644
index 0000000000..2e5881c67f
--- /dev/null
+++ b/code/modules/asset_cache/asset_list.dm
@@ -0,0 +1,230 @@
+
+//These datums are used to populate the asset cache, the proc "register()" does this.
+//Place any asset datums you create in asset_list_items.dm
+
+//all of our asset datums, used for referring to these later
+GLOBAL_LIST_EMPTY(asset_datums)
+
+//get an assetdatum or make a new one
+/proc/get_asset_datum(type)
+ return GLOB.asset_datums[type] || new type()
+
+/datum/asset
+ var/_abstract = /datum/asset
+
+/datum/asset/New()
+ GLOB.asset_datums[type] = src
+ register()
+
+/datum/asset/proc/register()
+ return
+
+/datum/asset/proc/send(client)
+ return
+
+
+//If you don't need anything complicated.
+/datum/asset/simple
+ _abstract = /datum/asset/simple
+ var/assets = list()
+
+/datum/asset/simple/register()
+ for(var/asset_name in assets)
+ register_asset(asset_name, assets[asset_name])
+
+/datum/asset/simple/send(client)
+ . = send_asset_list(client, assets)
+
+
+// For registering or sending multiple others at once
+/datum/asset/group
+ _abstract = /datum/asset/group
+ var/list/children
+
+/datum/asset/group/register()
+ for(var/type in children)
+ get_asset_datum(type)
+
+/datum/asset/group/send(client/C)
+ for(var/type in children)
+ var/datum/asset/A = get_asset_datum(type)
+ . = A.send(C) || .
+
+
+// spritesheet implementation - coalesces various icons into a single .png file
+// and uses CSS to select icons out of that file - saves on transferring some
+// 1400-odd individual PNG files
+#define SPR_SIZE 1
+#define SPR_IDX 2
+#define SPRSZ_COUNT 1
+#define SPRSZ_ICON 2
+#define SPRSZ_STRIPPED 3
+
+/datum/asset/spritesheet
+ _abstract = /datum/asset/spritesheet
+ var/name
+ var/list/sizes = list() // "32x32" -> list(10, icon/normal, icon/stripped)
+ var/list/sprites = list() // "foo_bar" -> list("32x32", 5)
+
+/datum/asset/spritesheet/register()
+ if (!name)
+ CRASH("spritesheet [type] cannot register without a name")
+ ensure_stripped()
+
+ var/res_name = "spritesheet_[name].css"
+ var/fname = "data/spritesheets/[res_name]"
+ fdel(fname)
+ text2file(generate_css(), fname)
+ register_asset(res_name, fcopy_rsc(fname))
+ fdel(fname)
+
+ for(var/size_id in sizes)
+ var/size = sizes[size_id]
+ register_asset("[name]_[size_id].png", size[SPRSZ_STRIPPED])
+
+/datum/asset/spritesheet/send(client/C)
+ if (!name)
+ return
+ var/all = list("spritesheet_[name].css")
+ for(var/size_id in sizes)
+ all += "[name]_[size_id].png"
+ . = send_asset_list(C, all)
+
+/datum/asset/spritesheet/proc/ensure_stripped(sizes_to_strip = sizes)
+ for(var/size_id in sizes_to_strip)
+ var/size = sizes[size_id]
+ if (size[SPRSZ_STRIPPED])
+ continue
+
+ // save flattened version
+ var/fname = "data/spritesheets/[name]_[size_id].png"
+ fcopy(size[SPRSZ_ICON], fname)
+ var/error = rustg_dmi_strip_metadata(fname)
+ if(length(error))
+ stack_trace("Failed to strip [name]_[size_id].png: [error]")
+ size[SPRSZ_STRIPPED] = icon(fname)
+ fdel(fname)
+
+/datum/asset/spritesheet/proc/generate_css()
+ var/list/out = list()
+
+ for (var/size_id in sizes)
+ var/size = sizes[size_id]
+ var/icon/tiny = size[SPRSZ_ICON]
+ out += ".[name][size_id]{display:inline-block;width:[tiny.Width()]px;height:[tiny.Height()]px;background:url('[name]_[size_id].png') no-repeat;}"
+
+ for (var/sprite_id in sprites)
+ var/sprite = sprites[sprite_id]
+ var/size_id = sprite[SPR_SIZE]
+ var/idx = sprite[SPR_IDX]
+ var/size = sizes[size_id]
+
+ var/icon/tiny = size[SPRSZ_ICON]
+ var/icon/big = size[SPRSZ_STRIPPED]
+ var/per_line = big.Width() / tiny.Width()
+ var/x = (idx % per_line) * tiny.Width()
+ var/y = round(idx / per_line) * tiny.Height()
+
+ out += ".[name][size_id].[sprite_id]{background-position:-[x]px -[y]px;}"
+
+ return out.Join("\n")
+
+/datum/asset/spritesheet/proc/Insert(sprite_name, icon/I, icon_state="", dir=SOUTH, frame=1, moving=FALSE)
+ I = icon(I, icon_state=icon_state, dir=dir, frame=frame, moving=moving)
+ if (!I || !length(icon_states(I))) // that direction or state doesn't exist
+ return
+ var/size_id = "[I.Width()]x[I.Height()]"
+ var/size = sizes[size_id]
+
+ if (sprites[sprite_name])
+ CRASH("duplicate sprite \"[sprite_name]\" in sheet [name] ([type])")
+
+ if (size)
+ var/position = size[SPRSZ_COUNT]++
+ var/icon/sheet = size[SPRSZ_ICON]
+ size[SPRSZ_STRIPPED] = null
+ sheet.Insert(I, icon_state=sprite_name)
+ sprites[sprite_name] = list(size_id, position)
+ else
+ sizes[size_id] = size = list(1, I, null)
+ sprites[sprite_name] = list(size_id, 0)
+
+/datum/asset/spritesheet/proc/InsertAll(prefix, icon/I, list/directions)
+ if (length(prefix))
+ prefix = "[prefix]-"
+
+ if (!directions)
+ directions = list(SOUTH)
+
+ for (var/icon_state_name in icon_states(I))
+ for (var/direction in directions)
+ var/prefix2 = (directions.len > 1) ? "[dir2text(direction)]-" : ""
+ Insert("[prefix][prefix2][icon_state_name]", I, icon_state=icon_state_name, dir=direction)
+
+/datum/asset/spritesheet/proc/css_tag()
+ return {""}
+
+/datum/asset/spritesheet/proc/icon_tag(sprite_name)
+ var/sprite = sprites[sprite_name]
+ if (!sprite)
+ return null
+ var/size_id = sprite[SPR_SIZE]
+ return {""}
+
+/datum/asset/spritesheet/proc/icon_class_name(sprite_name)
+ var/sprite = sprites[sprite_name]
+ if (!sprite)
+ return null
+ var/size_id = sprite[SPR_SIZE]
+ return {"[name][size_id] [sprite_name]"}
+
+#undef SPR_SIZE
+#undef SPR_IDX
+#undef SPRSZ_COUNT
+#undef SPRSZ_ICON
+#undef SPRSZ_STRIPPED
+
+
+/datum/asset/spritesheet/simple
+ _abstract = /datum/asset/spritesheet/simple
+ var/list/assets
+
+/datum/asset/spritesheet/simple/register()
+ for (var/key in assets)
+ Insert(key, assets[key])
+ ..()
+
+//Generates assets based on iconstates of a single icon
+/datum/asset/simple/icon_states
+ _abstract = /datum/asset/simple/icon_states
+ var/icon
+ var/list/directions = list(SOUTH)
+ var/frame = 1
+ var/movement_states = FALSE
+
+ var/prefix = "default" //asset_name = "[prefix].[icon_state_name].png"
+ var/generic_icon_names = FALSE //generate icon filenames using generate_asset_name() instead the above format
+
+/datum/asset/simple/icon_states/register(_icon = icon)
+ for(var/icon_state_name in icon_states(_icon))
+ for(var/direction in directions)
+ var/asset = icon(_icon, icon_state_name, direction, frame, movement_states)
+ if (!asset)
+ continue
+ asset = fcopy_rsc(asset) //dedupe
+ var/prefix2 = (directions.len > 1) ? "[dir2text(direction)]." : ""
+ var/asset_name = sanitize_filename("[prefix].[prefix2][icon_state_name].png")
+ if (generic_icon_names)
+ asset_name = "[generate_asset_name(asset)].png"
+
+ register_asset(asset_name, asset)
+
+/datum/asset/simple/icon_states/multiple_icons
+ _abstract = /datum/asset/simple/icon_states/multiple_icons
+ var/list/icons
+
+/datum/asset/simple/icon_states/multiple_icons/register()
+ for(var/i in icons)
+ ..(i)
+
+
diff --git a/code/modules/client/asset_cache.dm b/code/modules/asset_cache/asset_list_items.dm
similarity index 50%
rename from code/modules/client/asset_cache.dm
rename to code/modules/asset_cache/asset_list_items.dm
index de7cd1696f..57d8e55e07 100644
--- a/code/modules/client/asset_cache.dm
+++ b/code/modules/asset_cache/asset_list_items.dm
@@ -1,403 +1,9 @@
-/*
-Asset cache quick users guide:
-
-Make a datum at the bottom of this file with your assets for your thing.
-The simple subsystem will most like be of use for most cases.
-Then call get_asset_datum() with the type of the datum you created and store the return
-Then call .send(client) on that stored return value.
-
-You can set verify to TRUE if you want send() to sleep until the client has the assets.
-*/
-
-
-// Amount of time(ds) MAX to send per asset, if this get exceeded we cancel the sleeping.
-// This is doubled for the first asset, then added per asset after
-#define ASSET_CACHE_SEND_TIMEOUT 7
-
-//When sending mutiple assets, how many before we give the client a quaint little sending resources message
-#define ASSET_CACHE_TELL_CLIENT_AMOUNT 8
-
-//When passively preloading assets, how many to send at once? Too high creates noticable lag where as too low can flood the client's cache with "verify" files
-#define ASSET_CACHE_PRELOAD_CONCURRENT 3
-
-/client
- var/list/cache = list() // List of all assets sent to this client by the asset cache.
- var/list/completed_asset_jobs = list() // List of all completed jobs, awaiting acknowledgement.
- var/list/sending = list()
- var/last_asset_job = 0 // Last job done.
-
-//This proc sends the asset to the client, but only if it needs it.
-//This proc blocks(sleeps) unless verify is set to false
-/proc/send_asset(client/client, asset_name, verify = TRUE)
- if(!istype(client))
- if(ismob(client))
- var/mob/M = client
- if(M.client)
- client = M.client
-
- else
- return 0
-
- else
- return 0
-
- if(client.cache.Find(asset_name) || client.sending.Find(asset_name))
- return 0
-
- client << browse_rsc(SSassets.cache[asset_name], asset_name)
- if(!verify)
- client.cache += asset_name
- return 1
-
- client.sending |= asset_name
- var/job = ++client.last_asset_job
-
- client << browse({"
-
- "}, "window=asset_cache_browser")
-
- var/t = 0
- var/timeout_time = (ASSET_CACHE_SEND_TIMEOUT * client.sending.len) + ASSET_CACHE_SEND_TIMEOUT
- while(client && !client.completed_asset_jobs.Find(job) && t < timeout_time) // Reception is handled in Topic()
- stoplag(1) // Lock up the caller until this is received.
- t++
-
- if(client)
- client.sending -= asset_name
- client.cache |= asset_name
- client.completed_asset_jobs -= job
-
- return 1
-
-//This proc blocks(sleeps) unless verify is set to false
-/proc/send_asset_list(client/client, list/asset_list, verify = TRUE)
- if(!istype(client))
- if(ismob(client))
- var/mob/M = client
- if(M.client)
- client = M.client
-
- else
- return 0
-
- else
- return 0
-
- var/list/unreceived = asset_list - (client.cache + client.sending)
- if(!unreceived || !unreceived.len)
- return 0
- if (unreceived.len >= ASSET_CACHE_TELL_CLIENT_AMOUNT)
- to_chat(client, "Sending Resources...")
- for(var/asset in unreceived)
- if (asset in SSassets.cache)
- client << browse_rsc(SSassets.cache[asset], asset)
-
- if(!verify) // Can't access the asset cache browser, rip.
- client.cache += unreceived
- return 1
-
- client.sending |= unreceived
- var/job = ++client.last_asset_job
-
- client << browse({"
-
- "}, "window=asset_cache_browser")
-
- var/t = 0
- var/timeout_time = ASSET_CACHE_SEND_TIMEOUT * client.sending.len
- while(client && !client.completed_asset_jobs.Find(job) && t < timeout_time) // Reception is handled in Topic()
- stoplag(1) // Lock up the caller until this is received.
- t++
-
- if(client)
- client.sending -= unreceived
- client.cache |= unreceived
- client.completed_asset_jobs -= job
-
- return 1
-
-//This proc will download the files without clogging up the browse() queue, used for passively sending files on connection start.
-//The proc calls procs that sleep for long times.
-/proc/getFilesSlow(client/client, list/files, register_asset = TRUE)
- var/concurrent_tracker = 1
- for(var/file in files)
- if (!client)
- break
- if (register_asset)
- register_asset(file, files[file])
- if (concurrent_tracker >= ASSET_CACHE_PRELOAD_CONCURRENT)
- concurrent_tracker = 1
- send_asset(client, file)
- else
- concurrent_tracker++
- send_asset(client, file, verify=FALSE)
-
- stoplag(0) //queuing calls like this too quickly can cause issues in some client versions
-
-//This proc "registers" an asset, it adds it to the cache for further use, you cannot touch it from this point on or you'll fuck things up.
-//if it's an icon or something be careful, you'll have to copy it before further use.
-/proc/register_asset(asset_name, asset)
- SSassets.cache[asset_name] = asset
-
-//Generated names do not include file extention.
-//Used mainly for code that deals with assets in a generic way
-//The same asset will always lead to the same asset name
-/proc/generate_asset_name(file)
- return "asset.[md5(fcopy_rsc(file))]"
-
-
-//These datums are used to populate the asset cache, the proc "register()" does this.
-
-//all of our asset datums, used for referring to these later
-GLOBAL_LIST_EMPTY(asset_datums)
-
-//get an assetdatum or make a new one
-/proc/get_asset_datum(type)
- return GLOB.asset_datums[type] || new type()
-
-/datum/asset
- var/_abstract = /datum/asset
-
-/datum/asset/New()
- GLOB.asset_datums[type] = src
- register()
-
-/datum/asset/proc/register()
- return
-
-/datum/asset/proc/send(client)
- return
-
-
-//If you don't need anything complicated.
-/datum/asset/simple
- _abstract = /datum/asset/simple
- var/assets = list()
- var/verify = FALSE
-
-/datum/asset/simple/register()
- for(var/asset_name in assets)
- register_asset(asset_name, assets[asset_name])
-
-/datum/asset/simple/send(client)
- send_asset_list(client,assets,verify)
-
-
-// For registering or sending multiple others at once
-/datum/asset/group
- _abstract = /datum/asset/group
- var/list/children
-
-/datum/asset/group/register()
- for(var/type in children)
- get_asset_datum(type)
-
-/datum/asset/group/send(client/C)
- for(var/type in children)
- var/datum/asset/A = get_asset_datum(type)
- A.send(C)
-
-
-// spritesheet implementation - coalesces various icons into a single .png file
-// and uses CSS to select icons out of that file - saves on transferring some
-// 1400-odd individual PNG files
-#define SPR_SIZE 1
-#define SPR_IDX 2
-#define SPRSZ_COUNT 1
-#define SPRSZ_ICON 2
-#define SPRSZ_STRIPPED 3
-
-/datum/asset/spritesheet
- _abstract = /datum/asset/spritesheet
- var/name
- var/list/sizes = list() // "32x32" -> list(10, icon/normal, icon/stripped)
- var/list/sprites = list() // "foo_bar" -> list("32x32", 5)
- var/verify = FALSE
-
-/datum/asset/spritesheet/register()
- if (!name)
- CRASH("spritesheet [type] cannot register without a name")
- ensure_stripped()
-
- var/res_name = "spritesheet_[name].css"
- var/fname = "data/spritesheets/[res_name]"
- fdel(fname)
- text2file(generate_css(), fname)
- register_asset(res_name, fcopy_rsc(fname))
- fdel(fname)
-
- for(var/size_id in sizes)
- var/size = sizes[size_id]
- register_asset("[name]_[size_id].png", size[SPRSZ_STRIPPED])
-
-/datum/asset/spritesheet/send(client/C)
- if (!name)
- return
- var/all = list("spritesheet_[name].css")
- for(var/size_id in sizes)
- all += "[name]_[size_id].png"
- send_asset_list(C, all, verify)
-
-/datum/asset/spritesheet/proc/ensure_stripped(sizes_to_strip = sizes)
- for(var/size_id in sizes_to_strip)
- var/size = sizes[size_id]
- if (size[SPRSZ_STRIPPED])
- continue
-
- // save flattened version
- var/fname = "data/spritesheets/[name]_[size_id].png"
- fcopy(size[SPRSZ_ICON], fname)
- var/error = rustg_dmi_strip_metadata(fname)
- if(length(error))
- stack_trace("Failed to strip [name]_[size_id].png: [error]")
- size[SPRSZ_STRIPPED] = icon(fname)
- fdel(fname)
-
-/datum/asset/spritesheet/proc/generate_css()
- var/list/out = list()
-
- for (var/size_id in sizes)
- var/size = sizes[size_id]
- var/icon/tiny = size[SPRSZ_ICON]
- out += ".[name][size_id]{display:inline-block;width:[tiny.Width()]px;height:[tiny.Height()]px;background:url('[name]_[size_id].png') no-repeat;}"
-
- for (var/sprite_id in sprites)
- var/sprite = sprites[sprite_id]
- var/size_id = sprite[SPR_SIZE]
- var/idx = sprite[SPR_IDX]
- var/size = sizes[size_id]
-
- var/icon/tiny = size[SPRSZ_ICON]
- var/icon/big = size[SPRSZ_STRIPPED]
- var/per_line = big.Width() / tiny.Width()
- var/x = (idx % per_line) * tiny.Width()
- var/y = round(idx / per_line) * tiny.Height()
-
- out += ".[name][size_id].[sprite_id]{background-position:-[x]px -[y]px;}"
-
- return out.Join("\n")
-
-/datum/asset/spritesheet/proc/Insert(sprite_name, icon/I, icon_state="", dir=SOUTH, frame=1, moving=FALSE)
- I = icon(I, icon_state=icon_state, dir=dir, frame=frame, moving=moving)
- if (!I || !length(icon_states(I))) // that direction or state doesn't exist
- return
- var/size_id = "[I.Width()]x[I.Height()]"
- var/size = sizes[size_id]
-
- if (sprites[sprite_name])
- CRASH("duplicate sprite \"[sprite_name]\" in sheet [name] ([type])")
-
- if (size)
- var/position = size[SPRSZ_COUNT]++
- var/icon/sheet = size[SPRSZ_ICON]
- size[SPRSZ_STRIPPED] = null
- sheet.Insert(I, icon_state=sprite_name)
- sprites[sprite_name] = list(size_id, position)
- else
- sizes[size_id] = size = list(1, I, null)
- sprites[sprite_name] = list(size_id, 0)
-
-/datum/asset/spritesheet/proc/InsertAll(prefix, icon/I, list/directions)
- if (length(prefix))
- prefix = "[prefix]-"
-
- if (!directions)
- directions = list(SOUTH)
-
- for (var/icon_state_name in icon_states(I))
- for (var/direction in directions)
- var/prefix2 = (directions.len > 1) ? "[dir2text(direction)]-" : ""
- Insert("[prefix][prefix2][icon_state_name]", I, icon_state=icon_state_name, dir=direction)
-
-/datum/asset/spritesheet/proc/css_tag()
- return {""}
-
-/datum/asset/spritesheet/proc/icon_tag(sprite_name)
- var/sprite = sprites[sprite_name]
- if (!sprite)
- return null
- var/size_id = sprite[SPR_SIZE]
- return {""}
-
-/datum/asset/spritesheet/proc/icon_class_name(sprite_name)
- var/sprite = sprites[sprite_name]
- if (!sprite)
- return null
- var/size_id = sprite[SPR_SIZE]
- return {"[name][size_id] [sprite_name]"}
-
-#undef SPR_SIZE
-#undef SPR_IDX
-#undef SPRSZ_COUNT
-#undef SPRSZ_ICON
-#undef SPRSZ_STRIPPED
-
-
-/datum/asset/spritesheet/simple
- _abstract = /datum/asset/spritesheet/simple
- var/list/assets
-
-/datum/asset/spritesheet/simple/register()
- for (var/key in assets)
- Insert(key, assets[key])
- ..()
-
-//Generates assets based on iconstates of a single icon
-/datum/asset/simple/icon_states
- _abstract = /datum/asset/simple/icon_states
- var/icon
- var/list/directions = list(SOUTH)
- var/frame = 1
- var/movement_states = FALSE
-
- var/prefix = "default" //asset_name = "[prefix].[icon_state_name].png"
- var/generic_icon_names = FALSE //generate icon filenames using generate_asset_name() instead the above format
-
- verify = FALSE
-
-/datum/asset/simple/icon_states/register(_icon = icon)
- for(var/icon_state_name in icon_states(_icon))
- for(var/direction in directions)
- var/asset = icon(_icon, icon_state_name, direction, frame, movement_states)
- if (!asset)
- continue
- asset = fcopy_rsc(asset) //dedupe
- var/prefix2 = (directions.len > 1) ? "[dir2text(direction)]." : ""
- var/asset_name = sanitize_filename("[prefix].[prefix2][icon_state_name].png")
- if (generic_icon_names)
- asset_name = "[generate_asset_name(asset)].png"
-
- register_asset(asset_name, asset)
-
-/datum/asset/simple/icon_states/multiple_icons
- _abstract = /datum/asset/simple/icon_states/multiple_icons
- var/list/icons
-
-/datum/asset/simple/icon_states/multiple_icons/register()
- for(var/i in icons)
- ..(i)
-
-
//DEFINITIONS FOR ASSET DATUMS START HERE.
/datum/asset/simple/tgui
assets = list(
- // tgui
- "tgui.css" = 'tgui/assets/tgui.css',
- "tgui.js" = 'tgui/assets/tgui.js',
- // tgui-next
- "tgui-main.html" = 'tgui-next/packages/tgui/public/tgui-main.html',
- "tgui-fallback.html" = 'tgui-next/packages/tgui/public/tgui-fallback.html',
- "tgui.bundle.js" = 'tgui-next/packages/tgui/public/tgui.bundle.js',
- "tgui.bundle.css" = 'tgui-next/packages/tgui/public/tgui.bundle.css',
- "shim-html5shiv.js" = 'tgui-next/packages/tgui/public/shim-html5shiv.js',
- "shim-ie8.js" = 'tgui-next/packages/tgui/public/shim-ie8.js',
- "shim-dom4.js" = 'tgui-next/packages/tgui/public/shim-dom4.js',
- "shim-css-om.js" = 'tgui-next/packages/tgui/public/shim-css-om.js',
+ "tgui.bundle.js" = 'tgui/packages/tgui/public/tgui.bundle.js',
+ "tgui.bundle.css" = 'tgui/packages/tgui/public/tgui.bundle.css',
)
/datum/asset/group/tgui
@@ -433,7 +39,15 @@ GLOBAL_LIST_EMPTY(asset_datums)
"smmon_3.gif" = 'icons/program_icons/smmon_3.gif',
"smmon_4.gif" = 'icons/program_icons/smmon_4.gif',
"smmon_5.gif" = 'icons/program_icons/smmon_5.gif',
- "smmon_6.gif" = 'icons/program_icons/smmon_6.gif'
+ "smmon_6.gif" = 'icons/program_icons/smmon_6.gif',
+ "borg_mon.gif" = 'icons/program_icons/borg_mon.gif'
+ )
+
+/datum/asset/simple/radar_assets
+ assets = list(
+ "ntosradarbackground.png" = 'icons/UI_Icons/tgui/ntosradar_background.png',
+ "ntosradarpointer.png" = 'icons/UI_Icons/tgui/ntosradar_pointer.png',
+ "ntosradarpointerS.png" = 'icons/UI_Icons/tgui/ntosradar_pointer_S.png'
)
/datum/asset/spritesheet/simple/pda
@@ -485,50 +99,6 @@ GLOBAL_LIST_EMPTY(asset_datums)
"stamp-law" = 'icons/stamp_icons/large_stamp-law.png'
)
-/datum/asset/spritesheet/simple/minesweeper
- name = "minesweeper"
- assets = list(
- "1" = 'icons/UI_Icons/minesweeper_tiles/one.png',
- "2" = 'icons/UI_Icons/minesweeper_tiles/two.png',
- "3" = 'icons/UI_Icons/minesweeper_tiles/three.png',
- "4" = 'icons/UI_Icons/minesweeper_tiles/four.png',
- "5" = 'icons/UI_Icons/minesweeper_tiles/five.png',
- "6" = 'icons/UI_Icons/minesweeper_tiles/six.png',
- "7" = 'icons/UI_Icons/minesweeper_tiles/seven.png',
- "8" = 'icons/UI_Icons/minesweeper_tiles/eight.png',
- "empty" = 'icons/UI_Icons/minesweeper_tiles/empty.png',
- "flag" = 'icons/UI_Icons/minesweeper_tiles/flag.png',
- "hidden" = 'icons/UI_Icons/minesweeper_tiles/hidden.png',
- "mine" = 'icons/UI_Icons/minesweeper_tiles/mine.png',
- "minehit" = 'icons/UI_Icons/minesweeper_tiles/minehit.png'
- )
-
-/datum/asset/spritesheet/simple/pills
- name = "pills"
- assets = list(
- "pill1" = 'icons/UI_Icons/Pills/pill1.png',
- "pill2" = 'icons/UI_Icons/Pills/pill2.png',
- "pill3" = 'icons/UI_Icons/Pills/pill3.png',
- "pill4" = 'icons/UI_Icons/Pills/pill4.png',
- "pill5" = 'icons/UI_Icons/Pills/pill5.png',
- "pill6" = 'icons/UI_Icons/Pills/pill6.png',
- "pill7" = 'icons/UI_Icons/Pills/pill7.png',
- "pill8" = 'icons/UI_Icons/Pills/pill8.png',
- "pill9" = 'icons/UI_Icons/Pills/pill9.png',
- "pill10" = 'icons/UI_Icons/Pills/pill10.png',
- "pill11" = 'icons/UI_Icons/Pills/pill11.png',
- "pill12" = 'icons/UI_Icons/Pills/pill12.png',
- "pill13" = 'icons/UI_Icons/Pills/pill13.png',
- "pill14" = 'icons/UI_Icons/Pills/pill14.png',
- "pill15" = 'icons/UI_Icons/Pills/pill15.png',
- "pill16" = 'icons/UI_Icons/Pills/pill16.png',
- "pill17" = 'icons/UI_Icons/Pills/pill17.png',
- "pill18" = 'icons/UI_Icons/Pills/pill18.png',
- "pill19" = 'icons/UI_Icons/Pills/pill19.png',
- "pill20" = 'icons/UI_Icons/Pills/pill20.png',
- "pill21" = 'icons/UI_Icons/Pills/pill21.png',
- "pill22" = 'icons/UI_Icons/Pills/pill22.png',
- )
/datum/asset/simple/IRV
assets = list(
@@ -573,13 +143,12 @@ GLOBAL_LIST_EMPTY(asset_datums)
)
/datum/asset/simple/jquery
- verify = FALSE
assets = list(
"jquery.min.js" = 'code/modules/goonchat/browserassets/js/jquery.min.js',
)
+
/datum/asset/simple/goonchat
- verify = FALSE
assets = list(
"json2.min.js" = 'code/modules/goonchat/browserassets/js/json2.min.js',
"browserOutput.js" = 'code/modules/goonchat/browserassets/js/browserOutput.js',
@@ -589,7 +158,6 @@ GLOBAL_LIST_EMPTY(asset_datums)
)
/datum/asset/simple/fontawesome
- verify = FALSE
assets = list(
"fa-regular-400.eot" = 'html/font-awesome/webfonts/fa-regular-400.eot',
"fa-regular-400.woff" = 'html/font-awesome/webfonts/fa-regular-400.woff',
@@ -604,6 +172,7 @@ GLOBAL_LIST_EMPTY(asset_datums)
/datum/asset/spritesheet/goonchat/register()
InsertAll("emoji", 'icons/emoji.dmi')
+ InsertAll("emoji", 'icons/emoji_32.dmi')
// pre-loading all lanugage icons also helps to avoid meta
InsertAll("language", 'icons/misc/language.dmi')
@@ -630,6 +199,62 @@ GLOBAL_LIST_EMPTY(asset_datums)
"none_button.png" = 'html/none_button.png',
)
+/datum/asset/simple/arcade
+ assets = list(
+ "boss1.gif" = 'icons/UI_Icons/Arcade/boss1.gif',
+ "boss2.gif" = 'icons/UI_Icons/Arcade/boss2.gif',
+ "boss3.gif" = 'icons/UI_Icons/Arcade/boss3.gif',
+ "boss4.gif" = 'icons/UI_Icons/Arcade/boss4.gif',
+ "boss5.gif" = 'icons/UI_Icons/Arcade/boss5.gif',
+ "boss6.gif" = 'icons/UI_Icons/Arcade/boss6.gif',
+ )
+
+/datum/asset/spritesheet/simple/minesweeper
+ name = "minesweeper"
+ assets = list(
+ "1" = 'icons/UI_Icons/minesweeper_tiles/one.png',
+ "2" = 'icons/UI_Icons/minesweeper_tiles/two.png',
+ "3" = 'icons/UI_Icons/minesweeper_tiles/three.png',
+ "4" = 'icons/UI_Icons/minesweeper_tiles/four.png',
+ "5" = 'icons/UI_Icons/minesweeper_tiles/five.png',
+ "6" = 'icons/UI_Icons/minesweeper_tiles/six.png',
+ "7" = 'icons/UI_Icons/minesweeper_tiles/seven.png',
+ "8" = 'icons/UI_Icons/minesweeper_tiles/eight.png',
+ "empty" = 'icons/UI_Icons/minesweeper_tiles/empty.png',
+ "flag" = 'icons/UI_Icons/minesweeper_tiles/flag.png',
+ "hidden" = 'icons/UI_Icons/minesweeper_tiles/hidden.png',
+ "mine" = 'icons/UI_Icons/minesweeper_tiles/mine.png',
+ "minehit" = 'icons/UI_Icons/minesweeper_tiles/minehit.png'
+ )
+
+
+/datum/asset/spritesheet/simple/pills
+ name ="pills"
+ assets = list(
+ "pill1" = 'icons/UI_Icons/Pills/pill1.png',
+ "pill2" = 'icons/UI_Icons/Pills/pill2.png',
+ "pill3" = 'icons/UI_Icons/Pills/pill3.png',
+ "pill4" = 'icons/UI_Icons/Pills/pill4.png',
+ "pill5" = 'icons/UI_Icons/Pills/pill5.png',
+ "pill6" = 'icons/UI_Icons/Pills/pill6.png',
+ "pill7" = 'icons/UI_Icons/Pills/pill7.png',
+ "pill8" = 'icons/UI_Icons/Pills/pill8.png',
+ "pill9" = 'icons/UI_Icons/Pills/pill9.png',
+ "pill10" = 'icons/UI_Icons/Pills/pill10.png',
+ "pill11" = 'icons/UI_Icons/Pills/pill11.png',
+ "pill12" = 'icons/UI_Icons/Pills/pill12.png',
+ "pill13" = 'icons/UI_Icons/Pills/pill13.png',
+ "pill14" = 'icons/UI_Icons/Pills/pill14.png',
+ "pill15" = 'icons/UI_Icons/Pills/pill15.png',
+ "pill16" = 'icons/UI_Icons/Pills/pill16.png',
+ "pill17" = 'icons/UI_Icons/Pills/pill17.png',
+ "pill18" = 'icons/UI_Icons/Pills/pill18.png',
+ "pill19" = 'icons/UI_Icons/Pills/pill19.png',
+ "pill20" = 'icons/UI_Icons/Pills/pill20.png',
+ "pill21" = 'icons/UI_Icons/Pills/pill21.png',
+ "pill22" = 'icons/UI_Icons/Pills/pill22.png',
+ )
+
//this exists purely to avoid meta by pre-loading all language icons.
/datum/asset/language/register()
for(var/path in typesof(/datum/language))
@@ -641,7 +266,7 @@ GLOBAL_LIST_EMPTY(asset_datums)
name = "pipes"
/datum/asset/spritesheet/pipes/register()
- for (var/each in list('icons/obj/atmospherics/pipes/pipe_item.dmi', 'icons/obj/atmospherics/pipes/disposal.dmi', 'icons/obj/atmospherics/pipes/transit_tube.dmi'))
+ for (var/each in list('icons/obj/atmospherics/pipes/pipe_item.dmi', 'icons/obj/atmospherics/pipes/disposal.dmi'))
InsertAll("", each, GLOB.alldirs)
..()
@@ -708,9 +333,9 @@ GLOBAL_LIST_EMPTY(asset_datums)
name = "vending"
/datum/asset/spritesheet/vending/register()
- for(var/k in GLOB.vending_products)
+ for (var/k in GLOB.vending_products)
var/atom/item = k
- if(!ispath(item, /atom))
+ if (!ispath(item, /atom))
continue
var/icon_file = initial(item.icon)
@@ -721,12 +346,12 @@ GLOBAL_LIST_EMPTY(asset_datums)
if(icon_state in icon_states_list)
I = icon(icon_file, icon_state, SOUTH)
var/c = initial(item.color)
- if(!isnull(c) && c != "#FFFFFF")
+ if (!isnull(c) && c != "#FFFFFF")
I.Blend(c, ICON_MULTIPLY)
else
var/icon_states_string
- for(var/an_icon_state in icon_states_list)
- if(!icon_states_string)
+ for (var/an_icon_state in icon_states_list)
+ if (!icon_states_string)
icon_states_string = "[json_encode(an_icon_state)](\ref[an_icon_state])"
else
icon_states_string += ", [json_encode(an_icon_state)](\ref[an_icon_state])"
@@ -745,7 +370,12 @@ GLOBAL_LIST_EMPTY(asset_datums)
"dna_extra.gif" = 'html/dna_extra.gif'
)
-/datum/asset/simple/vv
+/datum/asset/simple/orbit
assets = list(
- "view_variables.css" = 'html/admin/view_variables.css'
+ "ghost.png" = 'html/ghost.png'
)
+
+ assets = list(
+ "ghost.png" = 'html/ghost.png'
+ )
+
diff --git a/code/modules/asset_cache/validate_assets.html b/code/modules/asset_cache/validate_assets.html
new file mode 100644
index 0000000000..b27a266c00
--- /dev/null
+++ b/code/modules/asset_cache/validate_assets.html
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/code/modules/atmospherics/environmental/LINDA_fire.dm b/code/modules/atmospherics/environmental/LINDA_fire.dm
index 06d73867f8..81e103fba2 100644
--- a/code/modules/atmospherics/environmental/LINDA_fire.dm
+++ b/code/modules/atmospherics/environmental/LINDA_fire.dm
@@ -9,46 +9,31 @@
return
-/turf/open/hotspot_expose(exposed_temperature, exposed_volume, soh = FALSE, holo = FALSE)
- var/datum/gas_mixture/air_contents = return_air()
- if(!air_contents)
- return 0
+/turf/open/hotspot_expose(exposed_temperature, exposed_volume, soh)
+ if(!air)
+ return
- var/oxy = air_contents.gases[/datum/gas/oxygen]
- var/tox = air_contents.gases[/datum/gas/plasma]
- var/trit = air_contents.gases[/datum/gas/tritium]
+ var/oxy = air.get_moles(/datum/gas/oxygen)
+ if (oxy < 0.5)
+ return
+ var/tox = air.get_moles(/datum/gas/plasma)
+ var/trit = air.get_moles(/datum/gas/tritium)
if(active_hotspot)
if(soh)
- if((tox > 0.5 || trit > 0.5) && oxy > 0.5)
- if(active_hotspot.temperature < exposed_temperature*50)
- active_hotspot.temperature = exposed_temperature*50
+ if(tox > 0.5 || trit > 0.5)
+ if(active_hotspot.temperature < exposed_temperature)
+ active_hotspot.temperature = exposed_temperature
if(active_hotspot.volume < exposed_volume)
active_hotspot.volume = exposed_volume
- return 1
-
- var/igniting = 0
+ return
if((exposed_temperature > PLASMA_MINIMUM_BURN_TEMPERATURE) && (tox > 0.5 || trit > 0.5))
- igniting = 1
- if(igniting)
- if(oxy < 0.5)
- return 0
-
- active_hotspot = new /obj/effect/hotspot(src, holo)
- active_hotspot.temperature = exposed_temperature*50
- active_hotspot.volume = exposed_volume*25
+ active_hotspot = new /obj/effect/hotspot(src, exposed_volume*25, exposed_temperature)
active_hotspot.just_spawned = (current_cycle < SSair.times_fired)
//remove just_spawned protection if no longer processing this cell
SSair.add_to_active(src, 0)
- else
- var/datum/gas_mixture/heating = air_contents.remove_ratio(exposed_volume/air_contents.volume)
- heating.temperature = exposed_temperature
- heating.react()
- assume_air(heating)
- air_update_turf()
- return igniting
//This is the icon for fire on turfs, also helps for nurturing small fires until they are full tile
/obj/effect/hotspot
@@ -67,11 +52,13 @@
var/bypassing = FALSE
var/visual_update_tick = 0
-/obj/effect/hotspot/Initialize(mapload, holo = FALSE)
+/obj/effect/hotspot/Initialize(mapload, starting_volume, starting_temperature)
. = ..()
- if(holo)
- flags_1 |= HOLOGRAM_1
SSair.hotspots += src
+ if(!isnull(starting_volume))
+ volume = starting_volume
+ if(!isnull(starting_temperature))
+ temperature = starting_temperature
perform_exposure()
setDir(pick(GLOB.cardinals))
air_update_turf()
@@ -83,22 +70,19 @@
location.active_hotspot = src
- if(volume > CELL_VOLUME*0.95)
- bypassing = TRUE
- else
- bypassing = FALSE
+ bypassing = !just_spawned && (volume > CELL_VOLUME*0.95)
if(bypassing)
- if(!just_spawned)
- volume = location.air.reaction_results["fire"]*FIRE_GROWTH_RATE
- temperature = location.air.temperature
+ volume = location.air.reaction_results["fire"]*FIRE_GROWTH_RATE
+ temperature = location.air.return_temperature()
else
- var/datum/gas_mixture/affected = location.air.remove_ratio(volume/location.air.volume)
- affected.temperature = temperature
- affected.react(src)
- temperature = affected.temperature
- volume = affected.reaction_results["fire"]*FIRE_GROWTH_RATE
- location.assume_air(affected)
+ var/datum/gas_mixture/affected = location.air.remove_ratio(volume/location.air.return_volume())
+ if(affected) //in case volume is 0
+ affected.set_temperature(temperature)
+ affected.react(src)
+ temperature = affected.return_temperature()
+ volume = affected.reaction_results["fire"]*FIRE_GROWTH_RATE
+ location.assume_air(affected)
for(var/A in location)
var/atom/AT = A
@@ -164,7 +148,7 @@
color = list(LERP(0.3, 1, 1-greyscale_fire) * heat_r,0.3 * heat_g * greyscale_fire,0.3 * heat_b * greyscale_fire, 0.59 * heat_r * greyscale_fire,LERP(0.59, 1, 1-greyscale_fire) * heat_g,0.59 * heat_b * greyscale_fire, 0.11 * heat_r * greyscale_fire,0.11 * heat_g * greyscale_fire,LERP(0.11, 1, 1-greyscale_fire) * heat_b, 0,0,0)
alpha = heat_a
-#define INSUFFICIENT(path) (location.air.gases[path] < 0.5)
+#define INSUFFICIENT(path) (location.air.get_moles(path) < 0.5)
/obj/effect/hotspot/process()
if(just_spawned)
just_spawned = FALSE
@@ -175,8 +159,7 @@
qdel(src)
return
- if(location.excited_group)
- location.excited_group.reset_cooldowns()
+ location.eg_reset_cooldowns()
if((temperature < FIRE_MINIMUM_TEMPERATURE_TO_EXIST) || (volume <= 1))
qdel(src)
@@ -186,7 +169,8 @@
return
//Not enough to burn
- if((location.air.gases[/datum/gas/plasma] < 0.5 && location.air.gases[/datum/gas/tritium] < 0.5) || location.air.gases[/datum/gas/oxygen] < 0.5)
+ // god damn it previous coder you made the INSUFFICIENT macro for a fucking reason why didn't you use it here smh
+ if((INSUFFICIENT(/datum/gas/plasma) && INSUFFICIENT(/datum/gas/tritium)) || INSUFFICIENT(/datum/gas/oxygen))
qdel(src)
return
@@ -194,16 +178,15 @@
if(bypassing)
icon_state = "3"
- if(!(flags_1 & HOLOGRAM_1))
- location.burn_tile()
+ location.burn_tile()
//Possible spread due to radiated heat
- if(location.air.temperature > FIRE_MINIMUM_TEMPERATURE_TO_SPREAD)
- var/radiated_temperature = location.air.temperature*FIRE_SPREAD_RADIOSITY_SCALE
+ if(location.air.return_temperature() > FIRE_MINIMUM_TEMPERATURE_TO_SPREAD)
+ var/radiated_temperature = location.air.return_temperature()*FIRE_SPREAD_RADIOSITY_SCALE
for(var/t in location.atmos_adjacent_turfs)
var/turf/open/T = t
if(!T.active_hotspot)
- T.hotspot_expose(radiated_temperature, CELL_VOLUME/4, flags_1 & HOLOGRAM_1)
+ T.hotspot_expose(radiated_temperature, CELL_VOLUME/4)
else
if(volume > CELL_VOLUME*0.4)
@@ -227,14 +210,13 @@
var/turf/open/T = loc
if(istype(T) && T.active_hotspot == src)
T.active_hotspot = null
- if(!(flags_1 & HOLOGRAM_1))
- DestroyTurf()
+ DestroyTurf()
return ..()
/obj/effect/hotspot/proc/DestroyTurf()
if(isturf(loc))
var/turf/T = loc
- if(T.to_be_destroyed)
+ if(T.to_be_destroyed && !T.changing_turf)
var/chance_of_deletion
if (T.heat_capacity) //beware of division by zero
chance_of_deletion = T.max_fire_temperature_sustained / T.heat_capacity * 8 //there is no problem with prob(23456), min() was redundant --rastaf0
diff --git a/code/modules/atmospherics/environmental/LINDA_system.dm b/code/modules/atmospherics/environmental/LINDA_system.dm
index 760e4e22da..4f057ca9be 100644
--- a/code/modules/atmospherics/environmental/LINDA_system.dm
+++ b/code/modules/atmospherics/environmental/LINDA_system.dm
@@ -18,7 +18,7 @@
/turf/open/CanAtmosPass(turf/T, vertical = FALSE)
var/dir = vertical? get_dir_multiz(src, T) : get_dir(src, T)
- var/opp = dir_inverse_multiz(dir)
+ var/opp = REVERSE_DIR(dir)
var/R = FALSE
if(vertical && !(zAirOut(dir, T) && T.zAirIn(dir, src)))
R = TRUE
@@ -44,25 +44,32 @@
return FALSE
/turf/proc/ImmediateCalculateAdjacentTurfs()
- var/canpass = CANATMOSPASS(src, src)
+ var/canpass = CANATMOSPASS(src, src)
var/canvpass = CANVERTICALATMOSPASS(src, src)
for(var/direction in GLOB.cardinals_multiz)
var/turf/T = get_step_multiz(src, direction)
+ var/opp_dir = REVERSE_DIR(direction)
if(!isopenturf(T))
continue
if(!(blocks_air || T.blocks_air) && ((direction & (UP|DOWN))? (canvpass && CANVERTICALATMOSPASS(T, src)) : (canpass && CANATMOSPASS(T, src))) )
LAZYINITLIST(atmos_adjacent_turfs)
LAZYINITLIST(T.atmos_adjacent_turfs)
- atmos_adjacent_turfs[T] = TRUE
- T.atmos_adjacent_turfs[src] = TRUE
+ atmos_adjacent_turfs[T] = direction
+ T.atmos_adjacent_turfs[src] = opp_dir
+ T.__update_extools_adjacent_turfs()
else
if (atmos_adjacent_turfs)
atmos_adjacent_turfs -= T
if (T.atmos_adjacent_turfs)
T.atmos_adjacent_turfs -= src
+ T.__update_extools_adjacent_turfs()
UNSETEMPTY(T.atmos_adjacent_turfs)
UNSETEMPTY(atmos_adjacent_turfs)
src.atmos_adjacent_turfs = atmos_adjacent_turfs
+ __update_extools_adjacent_turfs()
+
+/turf/proc/__update_extools_adjacent_turfs()
+
//returns a list of adjacent turfs that can share air with this one.
//alldir includes adjacent diagonal tiles that can share
@@ -111,9 +118,9 @@
SSair.add_to_active(src,command)
/atom/movable/proc/move_update_air(turf/T)
- if(isturf(T))
- T.air_update_turf(1)
- air_update_turf(1)
+ if(isturf(T))
+ T.air_update_turf(1)
+ air_update_turf(1)
/atom/proc/atmos_spawn_air(text) //because a lot of people loves to copy paste awful code lets just make an easy proc to spawn your plasma fires
var/turf/open/T = get_turf(src)
diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm
index 081f0b1d28..2b43319904 100644
--- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm
+++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm
@@ -8,6 +8,7 @@
var/list/atmos_adjacent_turfs
//bitfield of dirs in which we are superconducitng
var/atmos_supeconductivity = NONE
+ var/is_openturf = FALSE // used by extools shizz.
//used to determine whether we should archive
var/archived_cycle = 0
@@ -23,21 +24,21 @@
//used for spacewind
var/pressure_difference = 0
var/pressure_direction = 0
+ var/turf/pressure_specific_target
- var/datum/excited_group/excited_group
- var/excited = FALSE
var/datum/gas_mixture/turf/air
var/obj/effect/hotspot/active_hotspot
- var/atmos_cooldown = 0
var/planetary_atmos = FALSE //air will revert to initial_gas_mix over time
var/list/atmos_overlay_types //gas IDs of current active gas overlays
+ is_openturf = TRUE
/turf/open/Initialize()
if(!blocks_air)
air = new
air.copy_from_turf(src)
+ update_air_ref()
. = ..()
/turf/open/Destroy()
@@ -48,6 +49,8 @@
SSair.add_to_active(T)
return ..()
+/turf/proc/update_air_ref()
+
/////////////////GAS MIXTURE PROCS///////////////////
/turf/open/assume_air(datum/gas_mixture/giver) //use this for machines to adjust air
@@ -89,15 +92,37 @@
temperature_archived = temperature
/turf/open/archive()
- ARCHIVE(air)
+ air.archive()
archived_cycle = SSair.times_fired
temperature_archived = temperature
+/turf/open/proc/eg_reset_cooldowns()
+/turf/open/proc/eg_garbage_collect()
+/turf/open/proc/get_excited()
+/turf/open/proc/set_excited()
+
/////////////////////////GAS OVERLAYS//////////////////////////////
+
/turf/open/proc/update_visuals()
- var/list/new_overlay_types = tile_graphic()
+
var/list/atmos_overlay_types = src.atmos_overlay_types // Cache for free performance
+ var/list/new_overlay_types = list()
+ var/static/list/nonoverlaying_gases = typecache_of_gases_with_no_overlays()
+
+ if(!air) // 2019-05-14: was not able to get this path to fire in testing. Consider removing/looking at callers -Naksu
+ if (atmos_overlay_types)
+ for(var/overlay in atmos_overlay_types)
+ vis_contents -= overlay
+ src.atmos_overlay_types = null
+ return
+
+ for(var/id in air.get_gases())
+ if (nonoverlaying_gases[id])
+ continue
+ var/gas_overlay = GLOB.meta_gas_overlays[id]
+ if(gas_overlay && air.get_moles(id) > GLOB.meta_gas_visibility[META_GAS_MOLES_VISIBLE])
+ new_overlay_types += gas_overlay[min(FACTOR_GAS_VISIBLE_MAX, CEILING(air.get_moles(id) / MOLES_GAS_VISIBLE_STEP, 1))]
if (atmos_overlay_types)
for(var/overlay in atmos_overlay_types-new_overlay_types) //doesn't remove overlays that would only be added
@@ -112,19 +137,18 @@
UNSETEMPTY(new_overlay_types)
src.atmos_overlay_types = new_overlay_types
-/turf/open/proc/tile_graphic()
- var/static/list/nonoverlaying_gases = typecache_of_gases_with_no_overlays()
- if(!air)
- return
- . = new /list
- var/list/gases = air.gases
- for(var/id in gases)
- if (nonoverlaying_gases[id])
- continue
- var/gas = gases[id]
- var/gas_overlay = GLOB.meta_gas_overlays[id]
- if(gas_overlay && gas > GLOB.meta_gas_visibility[id])
- . += gas_overlay[min(FACTOR_GAS_VISIBLE_MAX, CEILING(gas / MOLES_GAS_VISIBLE_STEP, 1))]
+/turf/open/proc/set_visuals(list/new_overlay_types)
+ if (atmos_overlay_types)
+ for(var/overlay in atmos_overlay_types-new_overlay_types) //doesn't remove overlays that would only be added
+ vis_contents -= overlay
+
+ if (length(new_overlay_types))
+ if (atmos_overlay_types)
+ vis_contents += new_overlay_types - atmos_overlay_types //don't add overlays that already exist
+ else
+ vis_contents += new_overlay_types
+ UNSETEMPTY(new_overlay_types)
+ src.atmos_overlay_types = new_overlay_types
/proc/typecache_of_gases_with_no_overlays()
. = list()
@@ -135,8 +159,8 @@
/////////////////////////////SIMULATION///////////////////////////////////
-#define LAST_SHARE_CHECK \
- var/last_share = our_air.last_share;\
+/*#define LAST_SHARE_CHECK \
+ var/last_share = our_air.get_last_share();\
if(last_share > MINIMUM_AIR_TO_SUSPEND){\
our_excited_group.reset_cooldowns();\
cached_atmos_cooldown = 0;\
@@ -144,127 +168,62 @@
our_excited_group.dismantle_cooldown = 0;\
cached_atmos_cooldown = 0;\
}
-
+*/
/turf/proc/process_cell(fire_count)
SSair.remove_from_active(src)
-/turf/open/process_cell(fire_count)
- if(archived_cycle < fire_count) //archive self if not already done
- archive()
-
- current_cycle = fire_count
-
- //cache for sanic speed
- var/list/adjacent_turfs = atmos_adjacent_turfs
- var/datum/excited_group/our_excited_group = excited_group
- var/adjacent_turfs_length = LAZYLEN(adjacent_turfs)
- var/cached_atmos_cooldown = atmos_cooldown + 1
-
- var/planet_atmos = planetary_atmos
- if (planet_atmos)
- adjacent_turfs_length++
-
- var/datum/gas_mixture/our_air = air
-
- for(var/t in adjacent_turfs)
- var/turf/open/enemy_tile = t
-
- if(fire_count <= enemy_tile.current_cycle)
+/turf/open/proc/equalize_pressure_in_zone(cyclenum)
+/turf/open/proc/consider_firelocks(turf/T2)
+ var/reconsider_adj = FALSE
+ for(var/obj/machinery/door/firedoor/FD in T2)
+ if((FD.flags_1 & ON_BORDER_1) && get_dir(T2, src) != FD.dir)
continue
- enemy_tile.archive()
+ FD.emergency_pressure_stop()
+ reconsider_adj = TRUE
+ for(var/obj/machinery/door/firedoor/FD in src)
+ if((FD.flags_1 & ON_BORDER_1) && get_dir(src, T2) != FD.dir)
+ continue
+ FD.emergency_pressure_stop()
+ reconsider_adj = TRUE
+ if(reconsider_adj)
+ T2.ImmediateCalculateAdjacentTurfs() // We want those firelocks closed yesterday.
- /******************* GROUP HANDLING START *****************************************************************/
+/turf/proc/handle_decompression_floor_rip()
+/turf/open/floor/handle_decompression_floor_rip(sum)
+ if(sum > 20 && prob(clamp(sum / 10, 0, 30)))
+ remove_tile()
- var/should_share_air = FALSE
- var/datum/gas_mixture/enemy_air = enemy_tile.air
-
- //cache for sanic speed
- var/datum/excited_group/enemy_excited_group = enemy_tile.excited_group
-
- if(our_excited_group && enemy_excited_group)
- if(our_excited_group != enemy_excited_group)
- //combine groups (this also handles updating the excited_group var of all involved turfs)
- our_excited_group.merge_groups(enemy_excited_group)
- our_excited_group = excited_group //update our cache
- should_share_air = TRUE
-
- else if(our_air.compare(enemy_air))
- if(!enemy_tile.excited)
- SSair.add_to_active(enemy_tile)
- var/datum/excited_group/EG = our_excited_group || enemy_excited_group || new
- if(!our_excited_group)
- EG.add_turf(src)
- if(!enemy_excited_group)
- EG.add_turf(enemy_tile)
- our_excited_group = excited_group
- should_share_air = TRUE
-
- //air sharing
- if(should_share_air)
- var/difference = our_air.share(enemy_air, adjacent_turfs_length)
- if(difference)
- if(difference > 0)
- consider_pressure_difference(enemy_tile, difference)
- else
- enemy_tile.consider_pressure_difference(src, -difference)
- LAST_SHARE_CHECK
-
-
- /******************* GROUP HANDLING FINISH *********************************************************************/
-
- if (planet_atmos) //share our air with the "atmosphere" "above" the turf
- var/datum/gas_mixture/G = new
- G.copy_from_turf(src)
- ARCHIVE(G)
- if(our_air.compare(G))
- if(!our_excited_group)
- var/datum/excited_group/EG = new
- EG.add_turf(src)
- our_excited_group = excited_group
- our_air.share(G, adjacent_turfs_length)
- LAST_SHARE_CHECK
-
- SSair.add_to_react_queue(src)
-
- if((!our_excited_group && !(our_air.temperature > MINIMUM_TEMPERATURE_START_SUPERCONDUCTION && consider_superconductivity(starting = TRUE))) \
- || (cached_atmos_cooldown > (EXCITED_GROUP_DISMANTLE_CYCLES * 2)))
- SSair.remove_from_active(src)
-
- atmos_cooldown = cached_atmos_cooldown
-
-/turf/open/space/process_cell(fire_count) //dumb hack to prevent space pollution
- . = ..()
- var/datum/gas_mixture/immutable/I = space_gas
- I.after_process_cell()
-
-/turf/proc/process_cell_reaction()
- SSair.remove_from_react_queue(src)
-
-/turf/open/process_cell_reaction()
- air.react(src)
- update_visuals()
- SSair.remove_from_react_queue(src)
- return
+/turf/open/process_cell(fire_count)
//////////////////////////SPACEWIND/////////////////////////////
/turf/open/proc/consider_pressure_difference(turf/T, difference)
- SSair.high_pressure_delta |= src
if(difference > pressure_difference)
pressure_direction = get_dir(src, T)
pressure_difference = difference
+ SSair.high_pressure_delta[src] = TRUE
/turf/open/proc/high_pressure_movements()
- var/atom/movable/M
- for(var/thing in src)
- M = thing
- if (!M.anchored && !M.pulledby && M.last_high_pressure_movement_air_cycle < SSair.times_fired)
- M.experience_pressure_difference(pressure_difference, pressure_direction)
+ var/diff = pressure_difference
+ if(locate(/obj/structure/rack) in src)
+ diff *= 0.1
+ else if(locate(/obj/structure/table) in src)
+ diff *= 0.2
+ for(var/obj/M in src)
+ if(!M.anchored && !M.pulledby && M.last_high_pressure_movement_air_cycle < SSair.times_fired)
+ M.experience_pressure_difference(diff, pressure_direction, 0, pressure_specific_target)
+ for(var/mob/M in src)
+ if(!M.anchored && !M.pulledby && M.last_high_pressure_movement_air_cycle < SSair.times_fired)
+ M.experience_pressure_difference(diff, pressure_direction, 0, pressure_specific_target)
+ /*
+ if(pressure_difference > 100)
+ new /obj/effect/temp_visual/dir_setting/space_wind(src, pressure_direction, clamp(round(sqrt(pressure_difference) * 2), 10, 255))
+ */
/atom/movable/var/pressure_resistance = 10
/atom/movable/var/last_high_pressure_movement_air_cycle = 0
-/atom/movable/proc/experience_pressure_difference(pressure_difference, direction, pressure_resistance_prob_delta = 0)
+/atom/movable/proc/experience_pressure_difference(pressure_difference, direction, pressure_resistance_prob_delta = 0, throw_target)
var/const/PROBABILITY_OFFSET = 25
var/const/PROBABILITY_BASE_PRECENT = 75
var/max_force = sqrt(pressure_difference)*(MOVE_FORCE_DEFAULT / 5)
@@ -275,93 +234,8 @@
move_prob += pressure_resistance_prob_delta
if (move_prob > PROBABILITY_OFFSET && prob(move_prob) && (move_resist != INFINITY) && (!anchored && (max_force >= (move_resist * MOVE_FORCE_PUSH_RATIO))) || (anchored && (max_force >= (move_resist * MOVE_FORCE_FORCEPUSH_RATIO))))
step(src, direction)
- last_high_pressure_movement_air_cycle = SSair.times_fired
-
-///////////////////////////EXCITED GROUPS/////////////////////////////
-
-/datum/excited_group
- var/list/turf_list = list()
- var/breakdown_cooldown = 0
- var/dismantle_cooldown = 0
-
-/datum/excited_group/New()
- SSair.excited_groups += src
-
-/datum/excited_group/proc/add_turf(turf/open/T)
- turf_list += T
- T.excited_group = src
- reset_cooldowns()
-
-/datum/excited_group/proc/merge_groups(datum/excited_group/E)
- if(turf_list.len > E.turf_list.len)
- SSair.excited_groups -= E
- for(var/t in E.turf_list)
- var/turf/open/T = t
- T.excited_group = src
- turf_list += T
- reset_cooldowns()
- else
- SSair.excited_groups -= src
- for(var/t in turf_list)
- var/turf/open/T = t
- T.excited_group = E
- E.turf_list += T
- E.reset_cooldowns()
-
-/datum/excited_group/proc/reset_cooldowns()
- breakdown_cooldown = 0
- dismantle_cooldown = 0
-
-//argument is so world start can clear out any turf differences quickly.
-/datum/excited_group/proc/self_breakdown(space_is_all_consuming = FALSE)
- var/datum/gas_mixture/A = new
-
- //make local for sanic speed
- var/list/A_gases = A.gases
- var/list/turf_list = src.turf_list
- var/turflen = turf_list.len
- var/space_in_group = FALSE
-
- for(var/t in turf_list)
- var/turf/open/T = t
- if (space_is_all_consuming && !space_in_group && istype(T.air, /datum/gas_mixture/immutable/space))
- space_in_group = TRUE
- qdel(A)
- A = new /datum/gas_mixture/immutable/space()
- A_gases = A.gases //update the cache
- break
- A.merge(T.air)
-
- for(var/id in A_gases)
- A_gases[id] /= turflen
-
- for(var/t in turf_list)
- var/turf/open/T = t
- T.air.copy_from(A)
- T.atmos_cooldown = 0
- T.update_visuals()
-
- breakdown_cooldown = 0
-
-/datum/excited_group/proc/dismantle()
- for(var/t in turf_list)
- var/turf/open/T = t
- T.excited = FALSE
- T.excited_group = null
- SSair.active_turfs -= T
- garbage_collect()
-
-/datum/excited_group/proc/garbage_collect()
- for(var/t in turf_list)
- var/turf/open/T = t
- T.excited_group = null
- turf_list.Cut()
- SSair.excited_groups -= src
////////////////////////SUPERCONDUCTIVITY/////////////////////////////
-/atom/movable/proc/blocksTemperature()
- return FALSE
-
/turf/proc/conductivity_directions()
if(archived_cycle < SSair.times_fired)
archive()
@@ -376,9 +250,6 @@
. |= direction
/turf/proc/neighbor_conduct_with_src(turf/open/other)
- for (var/atom/movable/G in src)
- if (G.blocksTemperature())
- return
if(!other.blocks_air) //Open but neighbor is solid
other.temperature_share_open_to_solid(src)
else //Both tiles are solid
@@ -389,9 +260,7 @@
if(blocks_air)
..()
return
- for (var/atom/movable/G in src)
- if (G.blocksTemperature())
- return
+
if(!other.blocks_air) //Both tiles are open
var/turf/open/T = other
T.air.temperature_share(air, WINDOW_HEAT_TRANSFER_COEFFICIENT)
@@ -410,8 +279,10 @@
if(!neighbor.thermal_conductivity)
continue
+
if(neighbor.archived_cycle < SSair.times_fired)
neighbor.archive()
+
neighbor.neighbor_conduct_with_src(src)
neighbor.consider_superconductivity()
@@ -430,17 +301,18 @@
//Conduct with air on my tile if I have it
if(!blocks_air)
temperature = air.temperature_share(null, thermal_conductivity, temperature, heat_capacity)
- ..((blocks_air ? temperature : air.temperature))
+ ..((blocks_air ? temperature : air.return_temperature()))
/turf/proc/consider_superconductivity()
if(!thermal_conductivity)
return FALSE
- SSair.active_super_conductivity |= src
+ SSair.active_super_conductivity[src] = TRUE
+
return TRUE
/turf/open/consider_superconductivity(starting)
- if(air.temperature < (starting?MINIMUM_TEMPERATURE_START_SUPERCONDUCTION:MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION))
+ if(air.return_temperature() < (starting?MINIMUM_TEMPERATURE_START_SUPERCONDUCTION:MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION))
return FALSE
if(air.heat_capacity() < M_CELL_WITH_RATIO) // Was: MOLES_CELLSTANDARD*0.1*0.05 Since there are no variables here we can make this a constant.
return FALSE
diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm
index 58e826b36d..e86b249be6 100644
--- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm
+++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm
@@ -16,90 +16,154 @@ GLOBAL_LIST_INIT(meta_gas_dangers, meta_gas_danger_list())
GLOBAL_LIST_INIT(meta_gas_ids, meta_gas_id_list())
GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list())
/datum/gas_mixture
- var/list/gases = list()
- var/list/gas_archive = list()
- var/temperature = 0 //kelvins
- var/tmp/temperature_archived = 0
- var/volume = CELL_VOLUME //liters
- var/last_share = 0
- var/list/reaction_results = list()
+ /// Never ever set this variable, hooked into vv_get_var for view variables viewing.
+ var/gas_list_view_only
+ var/initial_volume = CELL_VOLUME //liters
+ var/list/reaction_results
var/list/analyzer_results //used for analyzer feedback - not initialized until its used
- var/gc_share = FALSE // Whether to call garbage_collect() on the sharer during shares, used for immutable mixtures
+ var/_extools_pointer_gasmixture = 0 // Contains the memory address of the shared_ptr object for this gas mixture in c++ land. Don't. Touch. This. Var.
/datum/gas_mixture/New(volume)
if (!isnull(volume))
- src.volume = volume
+ initial_volume = volume
+ ATMOS_EXTOOLS_CHECK
+ __gasmixture_register()
+ reaction_results = new
- //PV = nRT
+/datum/gas_mixture/vv_edit_var(var_name, var_value)
+ if(var_name == NAMEOF(src, _extools_pointer_gasmixture))
+ return FALSE // please no. segfaults bad.
+ if(var_name == NAMEOF(src, gas_list_view_only))
+ return FALSE
+ return ..()
-/datum/gas_mixture/proc/heat_capacity()
+/datum/gas_mixture/vv_get_var(var_name)
+ . = ..()
+ if(var_name == NAMEOF(src, gas_list_view_only))
+ var/list/dummy = get_gases()
+ for(var/gas in dummy)
+ dummy[gas] = get_moles(gas)
+ dummy["TEMP"] = return_temperature()
+ dummy["PRESSURE"] = return_pressure()
+ dummy["HEAT CAPACITY"] = heat_capacity()
+ dummy["TOTAL MOLES"] = total_moles()
+ dummy["VOLUME"] = return_volume()
+ dummy["THERMAL ENERGY"] = thermal_energy()
+ return debug_variable("gases (READ ONLY)", dummy, 0, src)
-/datum/gas_mixture/proc/archived_heat_capacity()
+/datum/gas_mixture/vv_get_dropdown()
+ . = ..()
+ VV_DROPDOWN_OPTION("", "---")
+ VV_DROPDOWN_OPTION(VV_HK_PARSE_GASSTRING, "Parse Gas String")
+ VV_DROPDOWN_OPTION(VV_HK_EMPTY, "Empty")
+ VV_DROPDOWN_OPTION(VV_HK_SET_MOLES, "Set Moles")
+ VV_DROPDOWN_OPTION(VV_HK_SET_TEMPERATURE, "Set Temperature")
+ VV_DROPDOWN_OPTION(VV_HK_SET_VOLUME, "Set Volume")
-/datum/gas_mixture/heat_capacity() //joules per kelvin
- var/list/cached_gases = gases
- var/list/cached_gasheats = GLOB.meta_gas_specific_heats
- . = 0
- for(var/id in cached_gases)
- . += cached_gases[id] * cached_gasheats[id]
-
-/datum/gas_mixture/archived_heat_capacity()
- // lots of copypasta but heat_capacity is the single proc called the most in a regular round, bar none, so performance loss adds up
- var/list/cached_gases = gas_archive
- var/list/cached_gasheats = GLOB.meta_gas_specific_heats
- . = 0
- for(var/id in cached_gases)
- . += cached_gases[id] * cached_gasheats[id]
-
-/datum/gas_mixture/turf/heat_capacity() // Same as above except vacuums return HEAT_CAPACITY_VACUUM
- var/list/cached_gases = gases
- var/list/cached_gasheats = GLOB.meta_gas_specific_heats
- for(var/id in cached_gases)
- . += cached_gases[id] * cached_gasheats[id]
+/datum/gas_mixture/vv_do_topic(list/href_list)
+ . = ..()
if(!.)
- . += HEAT_CAPACITY_VACUUM //we want vacuums in turfs to have the same heat capacity as space
+ return
+ if(href_list[VV_HK_PARSE_GASSTRING])
+ var/gasstring = input(usr, "Input Gas String (WARNING: Advanced. Don't use this unless you know how these work.", "Gas String Parse") as text|null
+ if(!istext(gasstring))
+ return
+ log_admin("[key_name(usr)] modified gas mixture [REF(src)]: Set to gas string [gasstring].")
+ message_admins("[key_name(usr)] modified gas mixture [REF(src)]: Set to gas string [gasstring].")
+ parse_gas_string(gasstring)
+ if(href_list[VV_HK_EMPTY])
+ log_admin("[key_name(usr)] emptied gas mixture [REF(src)].")
+ message_admins("[key_name(usr)] emptied gas mixture [REF(src)].")
+ clear()
+ if(href_list[VV_HK_SET_MOLES])
+ var/list/gases = get_gases()
+ for(var/gas in gases)
+ gases[gas] = get_moles(gas)
+ var/gastype = input(usr, "What kind of gas?", "Set Gas") as null|anything in subtypesof(/datum/gas)
+ if(!ispath(gastype, /datum/gas))
+ return
+ var/amount = input(usr, "Input amount", "Set Gas", gases[gastype] || 0) as num|null
+ if(!isnum(amount))
+ return
+ amount = max(0, amount)
+ log_admin("[key_name(usr)] modified gas mixture [REF(src)]: Set gas type [gastype] to [amount] moles.")
+ message_admins("[key_name(usr)] modified gas mixture [REF(src)]: Set gas type [gastype] to [amount] moles.")
+ set_moles(gastype, amount)
+ if(href_list[VV_HK_SET_TEMPERATURE])
+ var/temp = input(usr, "Set the temperature of this mixture to?", "Set Temperature", return_temperature()) as num|null
+ if(!isnum(temp))
+ return
+ temp = max(2.7, temp)
+ log_admin("[key_name(usr)] modified gas mixture [REF(src)]: Changed temperature to [temp].")
+ message_admins("[key_name(usr)] modified gas mixture [REF(src)]: Changed temperature to [temp].")
+ set_temperature(temp)
+ if(href_list[VV_HK_SET_VOLUME])
+ var/volume = input(usr, "Set the volume of this mixture to?", "Set Volume", return_volume()) as num|null
+ if(!isnum(volume))
+ return
+ volume = max(0, volume)
+ log_admin("[key_name(usr)] modified gas mixture [REF(src)]: Changed volume to [volume].")
+ message_admins("[key_name(usr)] modified gas mixture [REF(src)]: Changed volume to [volume].")
+ set_volume(volume)
-/datum/gas_mixture/turf/archived_heat_capacity() // Same as above except vacuums return HEAT_CAPACITY_VACUUM
- var/list/cached_gases = gas_archive
- var/list/cached_gasheats = GLOB.meta_gas_specific_heats
- for(var/id in cached_gases)
- . += cached_gases[id] * cached_gasheats[id]
- if(!.)
- . += HEAT_CAPACITY_VACUUM //we want vacuums in turfs to have the same heat capacity as space
+/*
+/datum/gas_mixture/Del()
+ __gasmixture_unregister()
+ . = ..()*/
+
+/datum/gas_mixture/proc/__gasmixture_unregister()
+/datum/gas_mixture/proc/__gasmixture_register()
+
+/proc/gas_types()
+ var/list/L = subtypesof(/datum/gas)
+ for(var/gt in L)
+ var/datum/gas/G = gt
+ L[gt] = initial(G.specific_heat)
+ return L
+
+/datum/gas_mixture/proc/heat_capacity() //joules per kelvin
/datum/gas_mixture/proc/total_moles()
- var/cached_gases = gases
- TOTAL_MOLES(cached_gases, .)
/datum/gas_mixture/proc/return_pressure() //kilopascals
- if(volume > 0) // to prevent division by zero
- var/cached_gases = gases
- TOTAL_MOLES(cached_gases, .)
- . *= R_IDEAL_GAS_EQUATION * temperature / volume
- return
- return 0
/datum/gas_mixture/proc/return_temperature() //kelvins
- return temperature
+
+/datum/gas_mixture/proc/set_min_heat_capacity(n)
+/datum/gas_mixture/proc/set_temperature(new_temp)
+/datum/gas_mixture/proc/set_volume(new_volume)
+/datum/gas_mixture/proc/get_moles(gas_type)
+/datum/gas_mixture/proc/set_moles(gas_type, moles)
+/datum/gas_mixture/proc/scrub_into(datum/gas_mixture/target, list/gases)
+/datum/gas_mixture/proc/mark_immutable()
+/datum/gas_mixture/proc/get_gases()
+/datum/gas_mixture/proc/multiply(factor)
+/datum/gas_mixture/proc/get_last_share()
+/datum/gas_mixture/proc/clear()
+
+/datum/gas_mixture/proc/adjust_moles(gas_type, amt = 0)
+ set_moles(gas_type, get_moles(gas_type) + amt)
/datum/gas_mixture/proc/return_volume() //liters
- return max(0, volume)
/datum/gas_mixture/proc/thermal_energy() //joules
- return THERMAL_ENERGY(src) //see code/__DEFINES/atmospherics.dm; use the define in performance critical areas
/datum/gas_mixture/proc/archive()
//Update archived versions of variables
//Returns: 1 in all cases
/datum/gas_mixture/proc/merge(datum/gas_mixture/giver)
- //Merges all air from giver into self. Deletes giver.
+ //Merges all air from giver into self. giver is untouched.
//Returns: 1 if we are mutable, 0 otherwise
/datum/gas_mixture/proc/remove(amount)
- //Proportionally removes amount of gas from the gas_mixture
+ //Removes amount of gas from the gas_mixture
//Returns: gas_mixture with the gases removed
+/datum/gas_mixture/proc/transfer_to(datum/gas_mixture/target, amount)
+ //Transfers amount of gas to target. Equivalent to target.merge(remove(amount)) but faster.
+ //Removes amount of gas from the gas_mixture
+
/datum/gas_mixture/proc/remove_ratio(ratio)
//Proportionally removes amount of gas from the gas_mixture
//Returns: gas_mixture with the gases removed
@@ -136,245 +200,63 @@ GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list())
//Performs various reactions such as combustion or fusion (LOL)
//Returns: 1 if any reaction took place; 0 otherwise
-/datum/gas_mixture/archive()
- temperature_archived = temperature
- gas_archive = gases.Copy()
- return 1
-
-/datum/gas_mixture/merge(datum/gas_mixture/giver)
- if(!giver)
- return 0
-
- //heat transfer
- if(abs(temperature - giver.temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER)
- var/self_heat_capacity = heat_capacity()
- var/giver_heat_capacity = giver.heat_capacity()
- var/combined_heat_capacity = giver_heat_capacity + self_heat_capacity
- if(combined_heat_capacity)
- temperature = (giver.temperature * giver_heat_capacity + temperature * self_heat_capacity) / combined_heat_capacity
-
- var/list/cached_gases = gases //accessing datum vars is slower than proc vars
- var/list/giver_gases = giver.gases
- //gas transfer
- for(var/giver_id in giver_gases)
- cached_gases[giver_id] += giver_gases[giver_id]
-
- return 1
-
+/datum/gas_mixture/proc/__remove()
/datum/gas_mixture/remove(amount)
- var/sum
- var/list/cached_gases = gases
- TOTAL_MOLES(cached_gases, sum)
- amount = min(amount, sum) //Can not take more air than tile has!
- if(amount <= 0)
- return null
var/datum/gas_mixture/removed = new type
- var/list/removed_gases = removed.gases //accessing datum vars is slower than proc vars
-
- removed.temperature = temperature
- for(var/id in cached_gases)
- removed_gases[id] = QUANTIZE((cached_gases[id] / sum) * amount)
- cached_gases[id] -= removed_gases[id]
- GAS_GARBAGE_COLLECT(gases)
+ __remove(removed, amount)
return removed
+/datum/gas_mixture/proc/__remove_ratio()
/datum/gas_mixture/remove_ratio(ratio)
- if(ratio <= 0)
- return null
- ratio = min(ratio, 1)
-
- var/list/cached_gases = gases
var/datum/gas_mixture/removed = new type
- var/list/removed_gases = removed.gases //accessing datum vars is slower than proc vars
-
- removed.temperature = temperature
- for(var/id in cached_gases)
- removed_gases[id] = QUANTIZE(cached_gases[id] * ratio)
- cached_gases[id] -= removed_gases[id]
-
- GAS_GARBAGE_COLLECT(gases)
+ __remove_ratio(removed, ratio)
return removed
/datum/gas_mixture/copy()
- var/list/cached_gases = gases
var/datum/gas_mixture/copy = new type
- var/list/copy_gases = copy.gases
-
- copy.temperature = temperature
- for(var/id in cached_gases)
- copy_gases[id] = cached_gases[id]
+ copy.copy_from(src)
return copy
-
-/datum/gas_mixture/copy_from(datum/gas_mixture/sample)
- var/list/cached_gases = gases //accessing datum vars is slower than proc vars
- var/list/sample_gases = sample.gases
-
- temperature = sample.temperature
- for(var/id in sample_gases)
- cached_gases[id] = sample_gases[id]
-
- //remove all gases not in the sample
- cached_gases &= sample_gases
-
- return 1
-
/datum/gas_mixture/copy_from_turf(turf/model)
parse_gas_string(model.initial_gas_mix)
//acounts for changes in temperature
var/turf/model_parent = model.parent_type
if(model.temperature != initial(model.temperature) || model.temperature != initial(model_parent.temperature))
- temperature = model.temperature
+ set_temperature(model.temperature)
return 1
/datum/gas_mixture/parse_gas_string(gas_string)
- var/list/gases = src.gases
var/list/gas = params2list(gas_string)
if(gas["TEMP"])
- temperature = text2num(gas["TEMP"])
+ set_temperature(text2num(gas["TEMP"]))
gas -= "TEMP"
- gases.Cut()
+ clear()
for(var/id in gas)
var/path = id
if(!ispath(path))
path = gas_id2path(path) //a lot of these strings can't have embedded expressions (especially for mappers), so support for IDs needs to stick around
- gases[path] = text2num(gas[id])
+ set_moles(path, text2num(gas[id]))
archive()
return 1
-/datum/gas_mixture/share(datum/gas_mixture/sharer, atmos_adjacent_turfs = 4)
-
- var/list/cached_gases = gases
- var/list/sharer_gases = sharer.gases
-
- var/temperature_delta = temperature_archived - sharer.temperature_archived
- var/abs_temperature_delta = abs(temperature_delta)
-
- var/old_self_heat_capacity = 0
- var/old_sharer_heat_capacity = 0
- if(abs_temperature_delta > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER)
- old_self_heat_capacity = heat_capacity()
- old_sharer_heat_capacity = sharer.heat_capacity()
-
- var/heat_capacity_self_to_sharer = 0 //heat capacity of the moles transferred from us to the sharer
- var/heat_capacity_sharer_to_self = 0 //heat capacity of the moles transferred from the sharer to us
-
- var/moved_moles = 0
- var/abs_moved_moles = 0
-
- //we're gonna define these vars outside of this for loop because as it turns out, var declaration is pricy
- var/delta
- var/gas_heat_capacity
- //and also cache this shit rq because that results in sanic speed for reasons byond explanation
- var/list/cached_gasheats = GLOB.meta_gas_specific_heats
- //GAS TRANSFER
- for(var/id in cached_gases | sharer_gases) // transfer gases
-
- delta = QUANTIZE(gas_archive[id] - sharer.gas_archive[id])/(atmos_adjacent_turfs+1) //the amount of gas that gets moved between the mixtures
-
- if(delta && abs_temperature_delta > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER)
- gas_heat_capacity = delta * cached_gasheats[id]
- if(delta > 0)
- heat_capacity_self_to_sharer += gas_heat_capacity
- else
- heat_capacity_sharer_to_self -= gas_heat_capacity //subtract here instead of adding the absolute value because we know that delta is negative.
-
- cached_gases[id] -= delta
- sharer_gases[id] += delta
- moved_moles += delta
- abs_moved_moles += abs(delta)
-
- last_share = abs_moved_moles
-
- //THERMAL ENERGY TRANSFER
- if(abs_temperature_delta > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER)
- var/new_self_heat_capacity = old_self_heat_capacity + heat_capacity_sharer_to_self - heat_capacity_self_to_sharer
- var/new_sharer_heat_capacity = old_sharer_heat_capacity + heat_capacity_self_to_sharer - heat_capacity_sharer_to_self
-
- //transfer of thermal energy (via changed heat capacity) between self and sharer
- if(new_self_heat_capacity > MINIMUM_HEAT_CAPACITY)
- temperature = (old_self_heat_capacity*temperature - heat_capacity_self_to_sharer*temperature_archived + heat_capacity_sharer_to_self*sharer.temperature_archived)/new_self_heat_capacity
-
- if(new_sharer_heat_capacity > MINIMUM_HEAT_CAPACITY)
- sharer.temperature = (old_sharer_heat_capacity*sharer.temperature-heat_capacity_sharer_to_self*sharer.temperature_archived + heat_capacity_self_to_sharer*temperature_archived)/new_sharer_heat_capacity
- //thermal energy of the system (self and sharer) is unchanged
-
- if(abs(old_sharer_heat_capacity) > MINIMUM_HEAT_CAPACITY)
- if(abs(new_sharer_heat_capacity/old_sharer_heat_capacity - 1) < 0.1) // <10% change in sharer heat capacity
- temperature_share(sharer, OPEN_HEAT_TRANSFER_COEFFICIENT)
-
- if (initial(sharer.gc_share))
- GAS_GARBAGE_COLLECT(sharer.gases)
- if(temperature_delta > MINIMUM_TEMPERATURE_TO_MOVE || abs(moved_moles) > MINIMUM_MOLES_DELTA_TO_MOVE)
- var/our_moles
- TOTAL_MOLES(cached_gases,our_moles)
- var/their_moles
- TOTAL_MOLES(sharer_gases,their_moles)
- return (temperature_archived*(our_moles + moved_moles) - sharer.temperature_archived*(their_moles - moved_moles)) * R_IDEAL_GAS_EQUATION / volume
-
-/datum/gas_mixture/temperature_share(datum/gas_mixture/sharer, conduction_coefficient, sharer_temperature, sharer_heat_capacity)
- //transfer of thermal energy (via conduction) between self and sharer
- if(sharer)
- sharer_temperature = sharer.temperature_archived
- var/temperature_delta = temperature_archived - sharer_temperature
- if(abs(temperature_delta) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER)
- var/self_heat_capacity = archived_heat_capacity()
- sharer_heat_capacity = sharer_heat_capacity || sharer.archived_heat_capacity()
-
- if((sharer_heat_capacity > MINIMUM_HEAT_CAPACITY) && (self_heat_capacity > MINIMUM_HEAT_CAPACITY))
- var/heat = conduction_coefficient*temperature_delta* \
- (self_heat_capacity*sharer_heat_capacity/(self_heat_capacity+sharer_heat_capacity))
-
- temperature = max(temperature - heat/self_heat_capacity, TCMB)
- sharer_temperature = max(sharer_temperature + heat/sharer_heat_capacity, TCMB)
- if(sharer)
- sharer.temperature = sharer_temperature
- return sharer_temperature
- //thermal energy of the system (self and sharer) is unchanged
-
-/datum/gas_mixture/compare(datum/gas_mixture/sample)
- var/list/sample_gases = sample.gases //accessing datum vars is slower than proc vars
- var/list/cached_gases = gases
-
- for(var/id in cached_gases | sample_gases) // compare gases from either mixture
- var/gas_moles = cached_gases[id]
- var/sample_moles = sample_gases[id]
- var/delta = abs(gas_moles - sample_moles)
- if(delta > MINIMUM_MOLES_DELTA_TO_MOVE && \
- delta > gas_moles * MINIMUM_AIR_RATIO_TO_MOVE)
- return id
-
- var/our_moles
- TOTAL_MOLES(cached_gases, our_moles)
- if(our_moles > MINIMUM_MOLES_DELTA_TO_MOVE)
- var/temp = temperature
- var/sample_temp = sample.temperature
-
- var/temperature_delta = abs(temp - sample_temp)
- if(temperature_delta > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND)
- return "temp"
-
- return ""
-
/datum/gas_mixture/react(datum/holder)
. = NO_REACTION
- var/list/cached_gases = gases
- if(!length(cached_gases))
+ if(!total_moles())
return
var/list/reactions = list()
for(var/datum/gas_reaction/G in SSair.gas_reactions)
- if(cached_gases[G.major_gas])
+ if(get_moles(G.major_gas))
reactions += G
if(!length(reactions))
return
reaction_results = new
- var/temp = temperature
- var/ener = THERMAL_ENERGY(src)
+ var/temp = return_temperature()
+ var/ener = thermal_energy()
reaction_loop:
for(var/r in reactions)
@@ -388,14 +270,13 @@ GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list())
for(var/id in min_reqs)
if (id == "TEMP" || id == "ENER")
continue
- if(cached_gases[id] < min_reqs[id])
+ if(get_moles(id) < min_reqs[id])
continue reaction_loop
//at this point, all minimum requirements for the reaction are satisfied.
/* currently no reactions have maximum requirements, so we can leave the checks commented out for a slight performance boost
PLEASE DO NOT REMOVE THIS CODE. the commenting is here only for a performance increase.
enabling these checks should be as easy as possible and the fact that they are disabled should be as clear as possible
-
var/list/max_reqs = reaction.max_requirements
if((max_reqs["TEMP"] && temp > max_reqs["TEMP"]) \
|| (max_reqs["ENER"] && ener > max_reqs["ENER"]))
@@ -410,8 +291,6 @@ GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list())
. |= reaction.react(src, holder)
if (. & STOP_REACTIONS)
break
- if(.)
- GAS_GARBAGE_COLLECT(gases)
//Takes the amount of the gas you want to PP as an argument
//So I don't have to do some hacky switches/defines/magic strings
@@ -420,16 +299,50 @@ GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list())
//O2_PP = get_partial_pressure(gas_mixture.oxygen)
/datum/gas_mixture/proc/get_breath_partial_pressure(gas_pressure)
- return (gas_pressure * R_IDEAL_GAS_EQUATION * temperature) / BREATH_VOLUME
+ return (gas_pressure * R_IDEAL_GAS_EQUATION * return_temperature()) / BREATH_VOLUME
//inverse
/datum/gas_mixture/proc/get_true_breath_pressure(partial_pressure)
- return (partial_pressure * BREATH_VOLUME) / (R_IDEAL_GAS_EQUATION * temperature)
+ return (partial_pressure * BREATH_VOLUME) / (R_IDEAL_GAS_EQUATION * return_temperature())
//Mathematical proofs:
/*
get_breath_partial_pressure(gas_pp) --> gas_pp/total_moles()*breath_pp = pp
get_true_breath_pressure(pp) --> gas_pp = pp/breath_pp*total_moles()
-
10/20*5 = 2.5
10 = 2.5/5*20
*/
+
+/datum/gas_mixture/turf
+
+/*
+/mob/verb/profile_atmos()
+ /world{loop_checks = 0;}
+ var/datum/gas_mixture/A = new
+ var/datum/gas_mixture/B = new
+ A.parse_gas_string("o2=200;n2=800;TEMP=50")
+ B.parse_gas_string("co2=500;plasma=500;TEMP=5000")
+ var/pa
+ var/pb
+ pa = world.tick_usage
+ for(var/I in 1 to 100000)
+ B.transfer_to(A, 1)
+ A.transfer_to(B, 1)
+ pb = world.tick_usage
+ var/total_time = (pb-pa) * world.tick_lag
+ to_chat(src, "Total time (gas transfer): [total_time]ms")
+ to_chat(src, "Operations per second: [100000 / (total_time/1000)]")
+ pa = world.tick_usage
+ for(var/I in 1 to 100000)
+ B.total_moles();
+ pb = world.tick_usage
+ total_time = (pb-pa) * world.tick_lag
+ to_chat(src, "Total time (total_moles): [total_time]ms")
+ to_chat(src, "Operations per second: [100000 / (total_time/1000)]")
+ pa = world.tick_usage
+ for(var/I in 1 to 100000)
+ new /datum/gas_mixture
+ pb = world.tick_usage
+ total_time = (pb-pa) * world.tick_lag
+ to_chat(src, "Total time (new gas mixture): [total_time]ms")
+ to_chat(src, "Operations per second: [100000 / (total_time/1000)]")
+*/
diff --git a/code/modules/atmospherics/gasmixtures/immutable_mixtures.dm b/code/modules/atmospherics/gasmixtures/immutable_mixtures.dm
index 5527ba3fef..eefad7c970 100644
--- a/code/modules/atmospherics/gasmixtures/immutable_mixtures.dm
+++ b/code/modules/atmospherics/gasmixtures/immutable_mixtures.dm
@@ -2,73 +2,29 @@
//it can be changed, but any changes will ultimately be undone before they can have any effect
/datum/gas_mixture/immutable
- var/initial_temperature
- gc_share = TRUE
+ var/initial_temperature = 0
/datum/gas_mixture/immutable/New()
..()
- temperature = initial_temperature
- temperature_archived = initial_temperature
- gases.Cut()
+ set_temperature(initial_temperature)
+ populate()
+ mark_immutable()
-/datum/gas_mixture/immutable/merge()
- return 0 //we're immutable.
+/datum/gas_mixture/immutable/proc/populate()
+ return
-/datum/gas_mixture/immutable/share(datum/gas_mixture/sharer, atmos_adjacent_turfs = 4)
- . = ..(sharer, 0)
- temperature = initial_temperature
- temperature_archived = initial_temperature
- gases.Cut()
-
-/datum/gas_mixture/immutable/react()
- return 0 //we're immutable.
-
-/datum/gas_mixture/immutable/copy()
- return new type //we're immutable, so we can just return a new instance.
-
-/datum/gas_mixture/immutable/copy_from()
- return 0 //we're immutable.
-
-/datum/gas_mixture/immutable/copy_from_turf()
- return 0 //we're immutable.
-
-/datum/gas_mixture/immutable/parse_gas_string()
- return 0 //we're immutable.
-
-/datum/gas_mixture/immutable/temperature_share(datum/gas_mixture/sharer, conduction_coefficient, sharer_temperature, sharer_heat_capacity)
- . = ..()
- temperature = initial_temperature
-
-/datum/gas_mixture/immutable/proc/after_process_cell()
- temperature = initial_temperature
- temperature_archived = initial_temperature
- gases.Cut()
//used by space tiles
/datum/gas_mixture/immutable/space
initial_temperature = TCMB
-/datum/gas_mixture/immutable/space/heat_capacity()
- return HEAT_CAPACITY_VACUUM
-
-/datum/gas_mixture/immutable/space/remove()
- return copy() //we're always empty, so we can just return a copy.
-
-/datum/gas_mixture/immutable/space/remove_ratio()
- return copy() //we're always empty, so we can just return a copy.
-
+/datum/gas_mixture/immutable/space/populate()
+ set_min_heat_capacity(HEAT_CAPACITY_VACUUM)
//used by cloners
/datum/gas_mixture/immutable/cloner
initial_temperature = T20C
-/datum/gas_mixture/immutable/cloner/New()
+/datum/gas_mixture/immutable/cloner/populate()
..()
- gases[/datum/gas/nitrogen] = MOLES_O2STANDARD + MOLES_N2STANDARD
-
-/datum/gas_mixture/immutable/cloner/share(datum/gas_mixture/sharer, atmos_adjacent_turfs = 4)
- . = ..(sharer, 0)
- gases[/datum/gas/nitrogen] = MOLES_O2STANDARD + MOLES_N2STANDARD
-
-/datum/gas_mixture/immutable/cloner/heat_capacity()
- return (MOLES_O2STANDARD + MOLES_N2STANDARD)*20 //specific heat of nitrogen is 20
+ set_moles(/datum/gas/nitrogen, MOLES_O2STANDARD + MOLES_N2STANDARD)
diff --git a/code/modules/atmospherics/gasmixtures/reactions.dm b/code/modules/atmospherics/gasmixtures/reactions.dm
index 59ef15b4cf..c0f66be7de 100644
--- a/code/modules/atmospherics/gasmixtures/reactions.dm
+++ b/code/modules/atmospherics/gasmixtures/reactions.dm
@@ -63,11 +63,11 @@
/datum/gas_reaction/water_vapor/react(datum/gas_mixture/air, datum/holder)
var/turf/open/location = isturf(holder) ? holder : null
. = NO_REACTION
- if (air.temperature <= WATER_VAPOR_FREEZE)
+ if (air.return_temperature() <= WATER_VAPOR_FREEZE)
if(location && location.freon_gas_act())
. = REACTING
else if(location && location.water_vapor_gas_act())
- air.gases[/datum/gas/water_vapor] -= MOLES_GAS_VISIBLE
+ air.adjust_moles(/datum/gas/water_vapor,-MOLES_GAS_VISIBLE)
. = REACTING
//tritium combustion: combustion of oxygen and tritium (treated as hydrocarbons). creates hotspots. exothermic
@@ -86,38 +86,37 @@
/datum/gas_reaction/tritfire/react(datum/gas_mixture/air, datum/holder)
var/energy_released = 0
var/old_heat_capacity = air.heat_capacity()
- var/list/cached_gases = air.gases //this speeds things up because accessing datum vars is slow
- var/temperature = air.temperature
+ var/temperature = air.return_temperature()
var/list/cached_results = air.reaction_results
cached_results["fire"] = 0
var/turf/open/location = isturf(holder) ? holder : null
var/burned_fuel = 0
- if(cached_gases[/datum/gas/oxygen] < cached_gases[/datum/gas/tritium])
- burned_fuel = cached_gases[/datum/gas/oxygen]/TRITIUM_BURN_OXY_FACTOR
- cached_gases[/datum/gas/tritium] -= burned_fuel
+ if(air.get_moles(/datum/gas/oxygen) < air.get_moles(/datum/gas/tritium))
+ burned_fuel = air.get_moles(/datum/gas/oxygen)/TRITIUM_BURN_OXY_FACTOR
+ air.adjust_moles(/datum/gas/tritium, -burned_fuel)
else
- burned_fuel = cached_gases[/datum/gas/tritium]*TRITIUM_BURN_TRIT_FACTOR
- cached_gases[/datum/gas/tritium] -= cached_gases[/datum/gas/tritium]/TRITIUM_BURN_TRIT_FACTOR
- cached_gases[/datum/gas/oxygen] -= cached_gases[/datum/gas/tritium]
+ burned_fuel = air.get_moles(/datum/gas/tritium)*TRITIUM_BURN_TRIT_FACTOR
+ air.adjust_moles(/datum/gas/tritium, -air.get_moles(/datum/gas/tritium)/TRITIUM_BURN_TRIT_FACTOR)
+ air.adjust_moles(/datum/gas/oxygen,-air.get_moles(/datum/gas/tritium))
if(burned_fuel)
energy_released += (FIRE_HYDROGEN_ENERGY_RELEASED * burned_fuel)
if(location && prob(10) && burned_fuel > TRITIUM_MINIMUM_RADIATION_ENERGY) //woah there let's not crash the server
radiation_pulse(location, energy_released/TRITIUM_BURN_RADIOACTIVITY_FACTOR)
- cached_gases[/datum/gas/water_vapor] += burned_fuel/TRITIUM_BURN_OXY_FACTOR
+ air.adjust_moles(/datum/gas/water_vapor, burned_fuel/TRITIUM_BURN_OXY_FACTOR)
cached_results["fire"] += burned_fuel
if(energy_released > 0)
var/new_heat_capacity = air.heat_capacity()
if(new_heat_capacity > MINIMUM_HEAT_CAPACITY)
- air.temperature = (temperature*old_heat_capacity + energy_released)/new_heat_capacity
+ air.set_temperature((temperature*old_heat_capacity + energy_released)/new_heat_capacity)
//let the floor know a fire is happening
if(istype(location))
- temperature = air.temperature
+ temperature = air.return_temperature()
if(temperature > FIRE_MINIMUM_TEMPERATURE_TO_EXIST)
location.hotspot_expose(temperature, CELL_VOLUME)
for(var/I in location)
@@ -143,8 +142,7 @@
/datum/gas_reaction/plasmafire/react(datum/gas_mixture/air, datum/holder)
var/energy_released = 0
var/old_heat_capacity = air.heat_capacity()
- var/list/cached_gases = air.gases //this speeds things up because accessing datum vars is slow
- var/temperature = air.temperature
+ var/temperature = air.return_temperature()
var/list/cached_results = air.reaction_results
cached_results["fire"] = 0
var/turf/open/location = isturf(holder) ? holder : null
@@ -163,21 +161,21 @@
temperature_scale = (temperature-PLASMA_MINIMUM_BURN_TEMPERATURE)/(PLASMA_UPPER_TEMPERATURE-PLASMA_MINIMUM_BURN_TEMPERATURE)
if(temperature_scale > 0)
oxygen_burn_rate = OXYGEN_BURN_RATE_BASE - temperature_scale
- if(cached_gases[/datum/gas/oxygen] / cached_gases[/datum/gas/plasma] > SUPER_SATURATION_THRESHOLD) //supersaturation. Form Tritium.
+ if(air.get_moles(/datum/gas/oxygen) / air.get_moles(/datum/gas/plasma) > SUPER_SATURATION_THRESHOLD) //supersaturation. Form Tritium.
super_saturation = TRUE
- if(cached_gases[/datum/gas/oxygen] > cached_gases[/datum/gas/plasma]*PLASMA_OXYGEN_FULLBURN)
- plasma_burn_rate = (cached_gases[/datum/gas/plasma]*temperature_scale)/PLASMA_BURN_RATE_DELTA
+ if(air.get_moles(/datum/gas/oxygen) > air.get_moles(/datum/gas/plasma)*PLASMA_OXYGEN_FULLBURN)
+ plasma_burn_rate = (air.get_moles(/datum/gas/plasma)*temperature_scale)/PLASMA_BURN_RATE_DELTA
else
- plasma_burn_rate = (temperature_scale*(cached_gases[/datum/gas/oxygen]/PLASMA_OXYGEN_FULLBURN))/PLASMA_BURN_RATE_DELTA
+ plasma_burn_rate = (temperature_scale*(air.get_moles(/datum/gas/oxygen)/PLASMA_OXYGEN_FULLBURN))/PLASMA_BURN_RATE_DELTA
if(plasma_burn_rate > MINIMUM_HEAT_CAPACITY)
- plasma_burn_rate = min(plasma_burn_rate,cached_gases[/datum/gas/plasma],cached_gases[/datum/gas/oxygen]/oxygen_burn_rate) //Ensures matter is conserved properly
- cached_gases[/datum/gas/plasma] = QUANTIZE(cached_gases[/datum/gas/plasma] - plasma_burn_rate)
- cached_gases[/datum/gas/oxygen] = QUANTIZE(cached_gases[/datum/gas/oxygen] - (plasma_burn_rate * oxygen_burn_rate))
+ plasma_burn_rate = min(plasma_burn_rate,air.get_moles(/datum/gas/plasma),air.get_moles(/datum/gas/oxygen)/oxygen_burn_rate) //Ensures matter is conserved properly
+ air.set_moles(/datum/gas/plasma, QUANTIZE(air.get_moles(/datum/gas/plasma) - plasma_burn_rate))
+ air.set_moles(/datum/gas/oxygen, QUANTIZE(air.get_moles(/datum/gas/oxygen) - (plasma_burn_rate * oxygen_burn_rate)))
if (super_saturation)
- cached_gases[/datum/gas/tritium] += plasma_burn_rate
+ air.adjust_moles(/datum/gas/tritium, plasma_burn_rate)
else
- cached_gases[/datum/gas/carbon_dioxide] += plasma_burn_rate
+ air.adjust_moles(/datum/gas/carbon_dioxide, plasma_burn_rate)
energy_released += FIRE_PLASMA_ENERGY_RELEASED * (plasma_burn_rate)
@@ -186,11 +184,11 @@
if(energy_released > 0)
var/new_heat_capacity = air.heat_capacity()
if(new_heat_capacity > MINIMUM_HEAT_CAPACITY)
- air.temperature = (temperature*old_heat_capacity + energy_released)/new_heat_capacity
+ air.set_temperature((temperature*old_heat_capacity + energy_released)/new_heat_capacity)
//let the floor know a fire is happening
if(istype(location))
- temperature = air.temperature
+ temperature = air.return_temperature()
if(temperature > FIRE_MINIMUM_TEMPERATURE_TO_EXIST)
location.hotspot_expose(temperature, CELL_VOLUME)
for(var/I in location)
@@ -218,7 +216,6 @@
/datum/gas/carbon_dioxide = FUSION_MOLE_THRESHOLD)
/datum/gas_reaction/fusion/react(datum/gas_mixture/air, datum/holder)
- var/list/cached_gases = air.gases
var/turf/open/location
if (istype(holder,/datum/pipeline)) //Find the tile the reaction is occuring on, or a random part of the network if it's a pipenet.
var/datum/pipeline/fusion_pipenet = holder
@@ -230,14 +227,14 @@
var/list/cached_scan_results = air.analyzer_results
var/old_heat_capacity = air.heat_capacity()
var/reaction_energy = 0 //Reaction energy can be negative or positive, for both exothermic and endothermic reactions.
- var/initial_plasma = cached_gases[/datum/gas/plasma]
- var/initial_carbon = cached_gases[/datum/gas/carbon_dioxide]
- var/scale_factor = (air.volume)/(PI) //We scale it down by volume/Pi because for fusion conditions, moles roughly = 2*volume, but we want it to be based off something constant between reactions.
- var/toroidal_size = (2*PI)+TORADIANS(arctan((air.volume-TOROID_VOLUME_BREAKEVEN)/TOROID_VOLUME_BREAKEVEN)) //The size of the phase space hypertorus
+ var/initial_plasma = air.get_moles(/datum/gas/plasma)
+ var/initial_carbon = air.get_moles(/datum/gas/carbon_dioxide)
+ var/scale_factor = (air.return_volume())/(PI) //We scale it down by volume/Pi because for fusion conditions, moles roughly = 2*volume, but we want it to be based off something constant between reactions.
+ var/toroidal_size = (2*PI)+TORADIANS(arctan((air.return_volume()-TOROID_VOLUME_BREAKEVEN)/TOROID_VOLUME_BREAKEVEN)) //The size of the phase space hypertorus
var/gas_power = 0
var/list/gas_fusion_powers = GLOB.meta_gas_fusions
- for (var/gas_id in cached_gases)
- gas_power += (gas_fusion_powers[gas_id]*cached_gases[gas_id])
+ for (var/gas_id in air.get_gases())
+ gas_power += (gas_fusion_powers[gas_id]*air.get_moles(gas_id))
var/instability = MODULUS((gas_power*INSTABILITY_GAS_POWER_FACTOR)**2,toroidal_size) //Instability effects how chaotic the behavior of the reaction is
cached_scan_results[id] = instability//used for analyzer feedback
@@ -249,9 +246,9 @@
carbon = MODULUS(carbon - plasma, toroidal_size)
- cached_gases[/datum/gas/plasma] = plasma*scale_factor + FUSION_MOLE_THRESHOLD //Scales the gases back up
- cached_gases[/datum/gas/carbon_dioxide] = carbon*scale_factor + FUSION_MOLE_THRESHOLD
- var/delta_plasma = initial_plasma - cached_gases[/datum/gas/plasma]
+ air.set_moles(/datum/gas/plasma, plasma*scale_factor + FUSION_MOLE_THRESHOLD) //Scales the gases back up
+ air.set_moles(/datum/gas/carbon_dioxide , carbon*scale_factor + FUSION_MOLE_THRESHOLD)
+ var/delta_plasma = initial_plasma - air.get_moles(/datum/gas/plasma)
reaction_energy += delta_plasma*PLASMA_BINDING_ENERGY //Energy is gained or lost corresponding to the creation or destruction of mass.
if(instability < FUSION_INSTABILITY_ENDOTHERMALITY)
@@ -260,17 +257,17 @@
reaction_energy *= (instability-FUSION_INSTABILITY_ENDOTHERMALITY)**0.5
if(air.thermal_energy() + reaction_energy < 0) //No using energy that doesn't exist.
- cached_gases[/datum/gas/plasma] = initial_plasma
- cached_gases[/datum/gas/carbon_dioxide] = initial_carbon
+ air.set_moles(/datum/gas/plasma,initial_plasma)
+ air.set_moles(/datum/gas/carbon_dioxide, initial_carbon)
return NO_REACTION
- cached_gases[/datum/gas/tritium] -= FUSION_TRITIUM_MOLES_USED
+ air.adjust_moles(/datum/gas/tritium, -FUSION_TRITIUM_MOLES_USED)
//The decay of the tritium and the reaction's energy produces waste gases, different ones depending on whether the reaction is endo or exothermic
if(reaction_energy > 0)
- cached_gases[/datum/gas/oxygen] += FUSION_TRITIUM_MOLES_USED*(reaction_energy*FUSION_TRITIUM_CONVERSION_COEFFICIENT)
- cached_gases[/datum/gas/nitrous_oxide] += FUSION_TRITIUM_MOLES_USED*(reaction_energy*FUSION_TRITIUM_CONVERSION_COEFFICIENT)
+ air.adjust_moles(/datum/gas/oxygen, FUSION_TRITIUM_MOLES_USED*(reaction_energy*FUSION_TRITIUM_CONVERSION_COEFFICIENT))
+ air.adjust_moles(/datum/gas/nitrous_oxide, FUSION_TRITIUM_MOLES_USED*(reaction_energy*FUSION_TRITIUM_CONVERSION_COEFFICIENT))
else
- cached_gases[/datum/gas/bz] += FUSION_TRITIUM_MOLES_USED*(reaction_energy*-FUSION_TRITIUM_CONVERSION_COEFFICIENT)
- cached_gases[/datum/gas/nitryl] += FUSION_TRITIUM_MOLES_USED*(reaction_energy*-FUSION_TRITIUM_CONVERSION_COEFFICIENT)
+ air.adjust_moles(/datum/gas/bz, FUSION_TRITIUM_MOLES_USED*(reaction_energy*-FUSION_TRITIUM_CONVERSION_COEFFICIENT))
+ air.adjust_moles(/datum/gas/nitryl, FUSION_TRITIUM_MOLES_USED*(reaction_energy*-FUSION_TRITIUM_CONVERSION_COEFFICIENT))
if(reaction_energy)
if(location)
@@ -282,7 +279,7 @@
var/new_heat_capacity = air.heat_capacity()
if(new_heat_capacity > MINIMUM_HEAT_CAPACITY)
- air.temperature = clamp(((air.temperature*old_heat_capacity + reaction_energy)/new_heat_capacity),TCMB,INFINITY)
+ air.set_temperature(clamp(((air.return_temperature()*old_heat_capacity + reaction_energy)/new_heat_capacity),TCMB,INFINITY))
return REACTING
/datum/gas_reaction/nitrylformation //The formation of nitryl. Endothermic. Requires N2O as a catalyst.
@@ -299,22 +296,21 @@
)
/datum/gas_reaction/nitrylformation/react(datum/gas_mixture/air)
- var/list/cached_gases = air.gases
- var/temperature = air.temperature
+ var/temperature = air.return_temperature()
var/old_heat_capacity = air.heat_capacity()
- var/heat_efficency = min(temperature/(FIRE_MINIMUM_TEMPERATURE_TO_EXIST*100),cached_gases[/datum/gas/oxygen],cached_gases[/datum/gas/nitrogen])
+ var/heat_efficency = min(temperature/(FIRE_MINIMUM_TEMPERATURE_TO_EXIST*100),air.get_moles(/datum/gas/oxygen),air.get_moles(/datum/gas/nitrogen))
var/energy_used = heat_efficency*NITRYL_FORMATION_ENERGY
- if ((cached_gases[/datum/gas/oxygen] - heat_efficency < 0 )|| (cached_gases[/datum/gas/nitrogen] - heat_efficency < 0)) //Shouldn't produce gas from nothing.
+ if ((air.get_moles(/datum/gas/oxygen) - heat_efficency < 0 )|| (air.get_moles(/datum/gas/nitrogen) - heat_efficency < 0)) //Shouldn't produce gas from nothing.
return NO_REACTION
- cached_gases[/datum/gas/oxygen] -= heat_efficency
- cached_gases[/datum/gas/nitrogen] -= heat_efficency
- cached_gases[/datum/gas/nitryl] += heat_efficency*2
+ air.adjust_moles(/datum/gas/oxygen, heat_efficency)
+ air.adjust_moles(/datum/gas/nitrogen, heat_efficency)
+ air.adjust_moles(/datum/gas/nitryl, heat_efficency*2)
if(energy_used > 0)
var/new_heat_capacity = air.heat_capacity()
if(new_heat_capacity > MINIMUM_HEAT_CAPACITY)
- air.temperature = max(((temperature*old_heat_capacity - energy_used)/new_heat_capacity),TCMB)
+ air.set_temperature(max(((temperature*old_heat_capacity - energy_used)/new_heat_capacity),TCMB))
return REACTING
/datum/gas_reaction/bzformation //Formation of BZ by combining plasma and tritium at low pressures. Exothermic.
@@ -330,27 +326,26 @@
/datum/gas_reaction/bzformation/react(datum/gas_mixture/air)
- var/list/cached_gases = air.gases
- var/temperature = air.temperature
+ var/temperature = air.return_temperature()
var/pressure = air.return_pressure()
var/old_heat_capacity = air.heat_capacity()
- var/reaction_efficency = min(1/((pressure/(0.1*ONE_ATMOSPHERE))*(max(cached_gases[/datum/gas/plasma]/cached_gases[/datum/gas/nitrous_oxide],1))),cached_gases[/datum/gas/nitrous_oxide],cached_gases[/datum/gas/plasma]/2)
+ var/reaction_efficency = min(1/((pressure/(0.1*ONE_ATMOSPHERE))*(max(air.get_moles(/datum/gas/plasma)/air.get_moles(/datum/gas/nitrous_oxide),1))),air.get_moles(/datum/gas/nitrous_oxide),air.get_moles(/datum/gas/plasma)/2)
var/energy_released = 2*reaction_efficency*FIRE_CARBON_ENERGY_RELEASED
- if ((cached_gases[/datum/gas/nitrous_oxide] - reaction_efficency < 0 )|| (cached_gases[/datum/gas/plasma] - (2*reaction_efficency) < 0) || energy_released <= 0) //Shouldn't produce gas from nothing.
+ if ((air.get_moles(/datum/gas/nitrous_oxide) - reaction_efficency < 0 )|| (air.get_moles(/datum/gas/plasma) - (2*reaction_efficency) < 0) || energy_released <= 0) //Shouldn't produce gas from nothing.
return NO_REACTION
- cached_gases[/datum/gas/bz] += reaction_efficency
- if(reaction_efficency == cached_gases[/datum/gas/nitrous_oxide])
- cached_gases[/datum/gas/bz] -= min(pressure,1)
- cached_gases[/datum/gas/oxygen] += min(pressure,1)
- cached_gases[/datum/gas/nitrous_oxide] -= reaction_efficency
- cached_gases[/datum/gas/plasma] -= 2*reaction_efficency
+ air.adjust_moles(/datum/gas/bz, reaction_efficency)
+ if(reaction_efficency == air.get_moles(/datum/gas/nitrous_oxide))
+ air.adjust_moles(/datum/gas/bz, -min(pressure,1))
+ air.adjust_moles(/datum/gas/oxygen, min(pressure,1))
+ air.adjust_moles(/datum/gas/nitrous_oxide, -reaction_efficency)
+ air.adjust_moles(/datum/gas/plasma, -2*reaction_efficency)
SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, min((reaction_efficency**2)*BZ_RESEARCH_SCALE),BZ_RESEARCH_MAX_AMOUNT)
if(energy_released > 0)
var/new_heat_capacity = air.heat_capacity()
if(new_heat_capacity > MINIMUM_HEAT_CAPACITY)
- air.temperature = max(((temperature*old_heat_capacity + energy_released)/new_heat_capacity),TCMB)
+ air.set_temperature(max(((temperature*old_heat_capacity + energy_released)/new_heat_capacity),TCMB))
return REACTING
/datum/gas_reaction/stimformation //Stimulum formation follows a strange pattern of how effective it will be at a given temperature, having some multiple peaks and some large dropoffs. Exo and endo thermic.
@@ -367,24 +362,22 @@
"TEMP" = STIMULUM_HEAT_SCALE/2)
/datum/gas_reaction/stimformation/react(datum/gas_mixture/air)
- var/list/cached_gases = air.gases
-
var/old_heat_capacity = air.heat_capacity()
- var/heat_scale = min(air.temperature/STIMULUM_HEAT_SCALE,cached_gases[/datum/gas/tritium],cached_gases[/datum/gas/plasma],cached_gases[/datum/gas/nitryl])
+ var/heat_scale = min(air.return_temperature()/STIMULUM_HEAT_SCALE,air.get_moles(/datum/gas/tritium),air.get_moles(/datum/gas/plasma),air.get_moles(/datum/gas/nitryl))
var/stim_energy_change = heat_scale + STIMULUM_FIRST_RISE*(heat_scale**2) - STIMULUM_FIRST_DROP*(heat_scale**3) + STIMULUM_SECOND_RISE*(heat_scale**4) - STIMULUM_ABSOLUTE_DROP*(heat_scale**5)
- if ((cached_gases[/datum/gas/tritium] - heat_scale < 0 )|| (cached_gases[/datum/gas/plasma] - heat_scale < 0) || (cached_gases[/datum/gas/nitryl] - heat_scale < 0)) //Shouldn't produce gas from nothing.
+ if ((air.get_moles(/datum/gas/tritium) - heat_scale < 0 )|| (air.get_moles(/datum/gas/plasma) - heat_scale < 0) || (air.get_moles(/datum/gas/nitryl) - heat_scale < 0)) //Shouldn't produce gas from nothing.
return NO_REACTION
- cached_gases[/datum/gas/stimulum]+= heat_scale/10
- cached_gases[/datum/gas/tritium] -= heat_scale
- cached_gases[/datum/gas/plasma] -= heat_scale
- cached_gases[/datum/gas/nitryl] -= heat_scale
+ air.adjust_moles(/datum/gas/stimulum, heat_scale/10)
+ air.adjust_moles(/datum/gas/tritium, -heat_scale)
+ air.adjust_moles(/datum/gas/plasma, -heat_scale)
+ air.adjust_moles(/datum/gas/nitryl, -heat_scale)
SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, STIMULUM_RESEARCH_AMOUNT*max(stim_energy_change,0))
if(stim_energy_change)
var/new_heat_capacity = air.heat_capacity()
if(new_heat_capacity > MINIMUM_HEAT_CAPACITY)
- air.temperature = max(((air.temperature*old_heat_capacity + stim_energy_change)/new_heat_capacity),TCMB)
+ air.set_temperature(max(((air.return_temperature()*old_heat_capacity + stim_energy_change)/new_heat_capacity),TCMB))
return REACTING
/datum/gas_reaction/nobliumformation //Hyper-Noblium formation is extrememly endothermic, but requires high temperatures to start. Due to its high mass, hyper-nobelium uses large amounts of nitrogen and tritium. BZ can be used as a catalyst to make it less endothermic.
@@ -399,22 +392,21 @@
"TEMP" = 5000000)
/datum/gas_reaction/nobliumformation/react(datum/gas_mixture/air)
- var/list/cached_gases = air.gases
var/old_heat_capacity = air.heat_capacity()
- var/nob_formed = min((cached_gases[/datum/gas/nitrogen]+cached_gases[/datum/gas/tritium])/100,cached_gases[/datum/gas/tritium]/10,cached_gases[/datum/gas/nitrogen]/20)
- var/energy_taken = nob_formed*(NOBLIUM_FORMATION_ENERGY/(max(cached_gases[/datum/gas/bz],1)))
- if ((cached_gases[/datum/gas/tritium] - 10*nob_formed < 0) || (cached_gases[/datum/gas/nitrogen] - 20*nob_formed < 0))
+ var/nob_formed = min((air.get_moles(/datum/gas/nitrogen)+air.get_moles(/datum/gas/tritium))/100,air.get_moles(/datum/gas/tritium)/10,air.get_moles(/datum/gas/nitrogen)/20)
+ var/energy_taken = nob_formed*(NOBLIUM_FORMATION_ENERGY/(max(air.get_moles(/datum/gas/bz),1)))
+ if ((air.get_moles(/datum/gas/tritium) - 10*nob_formed < 0) || (air.get_moles(/datum/gas/nitrogen) - 20*nob_formed < 0))
return NO_REACTION
- cached_gases[/datum/gas/tritium] -= 10*nob_formed
- cached_gases[/datum/gas/nitrogen] -= 20*nob_formed
- cached_gases[/datum/gas/hypernoblium]+= nob_formed
+ air.adjust_moles(/datum/gas/tritium, -10*nob_formed)
+ air.adjust_moles(/datum/gas/nitrogen, -20*nob_formed)
+ air.adjust_moles(/datum/gas/hypernoblium,nob_formed)
SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, nob_formed*NOBLIUM_RESEARCH_AMOUNT)
if (nob_formed)
var/new_heat_capacity = air.heat_capacity()
if(new_heat_capacity > MINIMUM_HEAT_CAPACITY)
- air.temperature = max(((air.temperature*old_heat_capacity - energy_taken)/new_heat_capacity),TCMB)
+ air.set_temperature(max(((air.return_temperature()*old_heat_capacity - energy_taken)/new_heat_capacity),TCMB))
/datum/gas_reaction/miaster //dry heat sterilization: clears out pathogens in the air
@@ -429,16 +421,15 @@
)
/datum/gas_reaction/miaster/react(datum/gas_mixture/air, datum/holder)
- var/list/cached_gases = air.gases
// As the name says it, it needs to be dry
- if(cached_gases[/datum/gas/water_vapor] && cached_gases[/datum/gas/water_vapor]/air.total_moles() > 0.1)
+ if(air.get_moles(/datum/gas/water_vapor) && air.get_moles(/datum/gas/water_vapor)/air.total_moles() > 0.1)
return
//Replace miasma with oxygen
- var/cleaned_air = min(cached_gases[/datum/gas/miasma], 20 + (air.temperature - FIRE_MINIMUM_TEMPERATURE_TO_EXIST - 70) / 20)
- cached_gases[/datum/gas/miasma] -= cleaned_air
- cached_gases[/datum/gas/oxygen] += cleaned_air
+ var/cleaned_air = min(air.get_moles(/datum/gas/miasma), 20 + (air.return_temperature() - FIRE_MINIMUM_TEMPERATURE_TO_EXIST - 70) / 20)
+ air.adjust_moles(/datum/gas/miasma, -cleaned_air)
+ air.adjust_moles(/datum/gas/oxygen, cleaned_air)
//Possibly burning a bit of organic matter through maillard reaction, so a *tiny* bit more heat would be understandable
- air.temperature += cleaned_air * 0.002
+ air.set_temperature(air.return_temperature() + cleaned_air * 0.002)
SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, cleaned_air*MIASMA_RESEARCH_AMOUNT)//Turns out the burning of miasma is kinda interesting to scientists
diff --git a/code/modules/atmospherics/gasmixtures/zextools_broke.dm b/code/modules/atmospherics/gasmixtures/zextools_broke.dm
new file mode 100644
index 0000000000..eef6933edb
--- /dev/null
+++ b/code/modules/atmospherics/gasmixtures/zextools_broke.dm
@@ -0,0 +1,304 @@
+#ifdef EXTOOLS_BROKE
+
+/datum/gas_mixture
+ var/list/gases = list()
+ var/temperature = 0 //kelvins
+ var/tmp/temperature_archived = 0
+ var/volume = CELL_VOLUME //liters
+ var/last_share = 0
+
+/datum/gas_mixture/heat_capacity() //joules per kelvin
+ var/list/cached_gases = gases
+ var/list/cached_gasheats = GLOB.meta_gas_specific_heats
+ . = 0
+ for(var/id in cached_gases)
+ . += cached_gases[id] * cached_gasheats[id]
+
+/datum/gas_mixture/turf/heat_capacity() // Same as above except vacuums return HEAT_CAPACITY_VACUUM
+ var/list/cached_gases = gases
+ var/list/cached_gasheats = GLOB.meta_gas_specific_heats
+ for(var/id in cached_gases)
+ . += cached_gases[id] * cached_gasheats[id]
+ if(!.)
+ . += HEAT_CAPACITY_VACUUM //we want vacuums in turfs to have the same heat capacity as space
+
+//prefer this to gas_mixture/total_moles in performance critical areas
+#define TOTAL_MOLES(cached_gases, out_var)\
+ out_var = 0;\
+ for(var/total_moles_id in cached_gases){\
+ out_var += cached_gases[total_moles_id];\
+ }
+
+#define THERMAL_ENERGY(gas) (gas.temperature * gas.heat_capacity())
+
+/datum/gas_mixture/total_moles()
+ var/cached_gases = gases
+ TOTAL_MOLES(cached_gases, .)
+
+/datum/gas_mixture/return_pressure() //kilopascals
+ if(volume > 0) // to prevent division by zero
+ var/cached_gases = gases
+ TOTAL_MOLES(cached_gases, .)
+ . *= R_IDEAL_GAS_EQUATION * temperature / volume
+ return
+ return 0
+
+/datum/gas_mixture/return_temperature() //kelvins
+ return temperature
+
+/datum/gas_mixture/set_min_heat_capacity(n)
+ return
+/datum/gas_mixture/set_temperature(new_temp)
+ temperature = new_temp
+/datum/gas_mixture/set_volume(new_volume)
+ volume = new_volume
+/datum/gas_mixture/get_moles(gas_type)
+ return gases[gas_type]
+/datum/gas_mixture/set_moles(gas_type, moles)
+ gases[gas_type] = moles
+/datum/gas_mixture/scrub_into(datum/gas_mixture/target, list/gases)
+ if(isnull(target))
+ return FALSE
+
+ var/list/removed_gases = target.gases
+
+ //Filter it
+ var/datum/gas_mixture/filtered_out = new
+ var/list/filtered_gases = filtered_out.gases
+ filtered_out.temperature = removed.temperature
+ for(var/gas in filter_types & removed_gases)
+ filtered_gases[gas] = removed_gases[gas]
+ removed_gases[gas] = 0
+ merge(filtered_out)
+/datum/gas_mixture/mark_immutable()
+ return
+/datum/gas_mixture/get_gases()
+ return gases
+/datum/gas_mixture/multiply(factor)
+ for(var/id in gases)
+ gases[id] *= factor
+/datum/gas_mixture/get_last_share()
+ return last_share
+/datum/gas_mixture/clear()
+ gases.Cut()
+
+/datum/gas_mixture/return_volume()
+ return volume // wow!
+
+/datum/gas_mixture/thermal_energy()
+ return THERMAL_ENERGY(src)
+
+/datum/gas_mixture/archive()
+ temperature_archived = temperature
+ gas_archive = gases.Copy()
+ return 1
+
+/datum/gas_mixture/merge(datum/gas_mixture/giver)
+ if(!giver)
+ return 0
+
+ //heat transfer
+ if(abs(temperature - giver.temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER)
+ var/self_heat_capacity = heat_capacity()
+ var/giver_heat_capacity = giver.heat_capacity()
+ var/combined_heat_capacity = giver_heat_capacity + self_heat_capacity
+ if(combined_heat_capacity)
+ temperature = (giver.temperature * giver_heat_capacity + temperature * self_heat_capacity) / combined_heat_capacity
+
+ var/list/cached_gases = gases //accessing datum vars is slower than proc vars
+ var/list/giver_gases = giver.gases
+ //gas transfer
+ for(var/giver_id in giver_gases)
+ cached_gases[giver_id] += giver_gases[giver_id]
+
+ return 1
+
+/datum/gas_mixture/remove(amount)
+ var/sum
+ var/list/cached_gases = gases
+ TOTAL_MOLES(cached_gases, sum)
+ amount = min(amount, sum) //Can not take more air than tile has!
+ if(amount <= 0)
+ return null
+ var/datum/gas_mixture/removed = new type
+ var/list/removed_gases = removed.gases //accessing datum vars is slower than proc vars
+
+ removed.temperature = temperature
+ for(var/id in cached_gases)
+ removed_gases[id] = QUANTIZE((cached_gases[id] / sum) * amount)
+ cached_gases[id] -= removed_gases[id]
+ GAS_GARBAGE_COLLECT(gases)
+
+ return removed
+
+/datum/gas_mixture/remove_ratio(ratio)
+ if(ratio <= 0)
+ return null
+ ratio = min(ratio, 1)
+
+ var/list/cached_gases = gases
+ var/datum/gas_mixture/removed = new type
+ var/list/removed_gases = removed.gases //accessing datum vars is slower than proc vars
+
+ removed.temperature = temperature
+ for(var/id in cached_gases)
+ removed_gases[id] = QUANTIZE(cached_gases[id] * ratio)
+ cached_gases[id] -= removed_gases[id]
+
+ GAS_GARBAGE_COLLECT(gases)
+
+ return removed
+
+/datum/gas_mixture/copy()
+ var/list/cached_gases = gases
+ var/datum/gas_mixture/copy = new type
+ var/list/copy_gases = copy.gases
+
+ copy.temperature = temperature
+ for(var/id in cached_gases)
+ copy_gases[id] = cached_gases[id]
+
+ return copy
+
+
+/datum/gas_mixture/copy_from(datum/gas_mixture/sample)
+ var/list/cached_gases = gases //accessing datum vars is slower than proc vars
+ var/list/sample_gases = sample.gases
+
+ temperature = sample.temperature
+ for(var/id in sample_gases)
+ cached_gases[id] = sample_gases[id]
+
+ //remove all gases not in the sample
+ cached_gases &= sample_gases
+
+ return 1
+
+/datum/gas_mixture/copy_from_turf(turf/model)
+ parse_gas_string(model.initial_gas_mix)
+
+ //acounts for changes in temperature
+ var/turf/model_parent = model.parent_type
+ if(model.temperature != initial(model.temperature) || model.temperature != initial(model_parent.temperature))
+ temperature = model.temperature
+
+ return 1
+
+/datum/gas_mixture/share(datum/gas_mixture/sharer, atmos_adjacent_turfs = 4)
+
+ var/list/cached_gases = gases
+ var/list/sharer_gases = sharer.gases
+
+ var/temperature_delta = temperature_archived - sharer.temperature_archived
+ var/abs_temperature_delta = abs(temperature_delta)
+
+ var/old_self_heat_capacity = 0
+ var/old_sharer_heat_capacity = 0
+ if(abs_temperature_delta > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER)
+ old_self_heat_capacity = heat_capacity()
+ old_sharer_heat_capacity = sharer.heat_capacity()
+
+ var/heat_capacity_self_to_sharer = 0 //heat capacity of the moles transferred from us to the sharer
+ var/heat_capacity_sharer_to_self = 0 //heat capacity of the moles transferred from the sharer to us
+
+ var/moved_moles = 0
+ var/abs_moved_moles = 0
+
+ //we're gonna define these vars outside of this for loop because as it turns out, var declaration is pricy
+ var/delta
+ var/gas_heat_capacity
+ //and also cache this shit rq because that results in sanic speed for reasons byond explanation
+ var/list/cached_gasheats = GLOB.meta_gas_specific_heats
+ //GAS TRANSFER
+ for(var/id in cached_gases | sharer_gases) // transfer gases
+
+ delta = QUANTIZE(gas_archive[id] - sharer.gas_archive[id])/(atmos_adjacent_turfs+1) //the amount of gas that gets moved between the mixtures
+
+ if(delta && abs_temperature_delta > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER)
+ gas_heat_capacity = delta * cached_gasheats[id]
+ if(delta > 0)
+ heat_capacity_self_to_sharer += gas_heat_capacity
+ else
+ heat_capacity_sharer_to_self -= gas_heat_capacity //subtract here instead of adding the absolute value because we know that delta is negative.
+
+ cached_gases[id] -= delta
+ sharer_gases[id] += delta
+ moved_moles += delta
+ abs_moved_moles += abs(delta)
+
+ last_share = abs_moved_moles
+
+ //THERMAL ENERGY TRANSFER
+ if(abs_temperature_delta > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER)
+ var/new_self_heat_capacity = old_self_heat_capacity + heat_capacity_sharer_to_self - heat_capacity_self_to_sharer
+ var/new_sharer_heat_capacity = old_sharer_heat_capacity + heat_capacity_self_to_sharer - heat_capacity_sharer_to_self
+
+ //transfer of thermal energy (via changed heat capacity) between self and sharer
+ if(new_self_heat_capacity > MINIMUM_HEAT_CAPACITY)
+ temperature = (old_self_heat_capacity*temperature - heat_capacity_self_to_sharer*temperature_archived + heat_capacity_sharer_to_self*sharer.temperature_archived)/new_self_heat_capacity
+
+ if(new_sharer_heat_capacity > MINIMUM_HEAT_CAPACITY)
+ sharer.temperature = (old_sharer_heat_capacity*sharer.temperature-heat_capacity_sharer_to_self*sharer.temperature_archived + heat_capacity_self_to_sharer*temperature_archived)/new_sharer_heat_capacity
+ //thermal energy of the system (self and sharer) is unchanged
+
+ if(abs(old_sharer_heat_capacity) > MINIMUM_HEAT_CAPACITY)
+ if(abs(new_sharer_heat_capacity/old_sharer_heat_capacity - 1) < 0.1) // <10% change in sharer heat capacity
+ temperature_share(sharer, OPEN_HEAT_TRANSFER_COEFFICIENT)
+
+ if (initial(sharer.gc_share))
+ GAS_GARBAGE_COLLECT(sharer.gases)
+ if(temperature_delta > MINIMUM_TEMPERATURE_TO_MOVE || abs(moved_moles) > MINIMUM_MOLES_DELTA_TO_MOVE)
+ var/our_moles
+ TOTAL_MOLES(cached_gases,our_moles)
+ var/their_moles
+ TOTAL_MOLES(sharer_gases,their_moles)
+ return (temperature_archived*(our_moles + moved_moles) - sharer.temperature_archived*(their_moles - moved_moles)) * R_IDEAL_GAS_EQUATION / volume
+
+/datum/gas_mixture/temperature_share(datum/gas_mixture/sharer, conduction_coefficient, sharer_temperature, sharer_heat_capacity)
+ //transfer of thermal energy (via conduction) between self and sharer
+ if(sharer)
+ sharer_temperature = sharer.temperature_archived
+ var/temperature_delta = temperature_archived - sharer_temperature
+ if(abs(temperature_delta) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER)
+ var/self_heat_capacity = archived_heat_capacity()
+ sharer_heat_capacity = sharer_heat_capacity || sharer.archived_heat_capacity()
+
+ if((sharer_heat_capacity > MINIMUM_HEAT_CAPACITY) && (self_heat_capacity > MINIMUM_HEAT_CAPACITY))
+ var/heat = conduction_coefficient*temperature_delta* \
+ (self_heat_capacity*sharer_heat_capacity/(self_heat_capacity+sharer_heat_capacity))
+
+ temperature = max(temperature - heat/self_heat_capacity, TCMB)
+ sharer_temperature = max(sharer_temperature + heat/sharer_heat_capacity, TCMB)
+ if(sharer)
+ sharer.temperature = sharer_temperature
+ return sharer_temperature
+ //thermal energy of the system (self and sharer) is unchanged
+
+/datum/gas_mixture/compare(datum/gas_mixture/sample)
+ var/list/sample_gases = sample.gases //accessing datum vars is slower than proc vars
+ var/list/cached_gases = gases
+
+ for(var/id in cached_gases | sample_gases) // compare gases from either mixture
+ var/gas_moles = cached_gases[id]
+ var/sample_moles = sample_gases[id]
+ var/delta = abs(gas_moles - sample_moles)
+ if(delta > MINIMUM_MOLES_DELTA_TO_MOVE && \
+ delta > gas_moles * MINIMUM_AIR_RATIO_TO_MOVE)
+ return id
+
+ var/our_moles
+ TOTAL_MOLES(cached_gases, our_moles)
+ if(our_moles > MINIMUM_MOLES_DELTA_TO_MOVE)
+ var/temp = temperature
+ var/sample_temp = sample.temperature
+
+ var/temperature_delta = abs(temp - sample_temp)
+ if(temperature_delta > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND)
+ return "temp"
+
+ return ""
+
+/datum/gas_mixture/transfer_to(datum/gas_mixture/target, amount)
+ return merge(target.remove(amount))
+
+#endif
diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm
index b47f45b42d..6b89deeb80 100644
--- a/code/modules/atmospherics/machinery/airalarm.dm
+++ b/code/modules/atmospherics/machinery/airalarm.dm
@@ -241,7 +241,7 @@
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, "airalarm", name, 440, 650, master_ui, state)
+ ui = new(user, src, ui_key, "AirAlarm", name, 440, 650, master_ui, state)
ui.open()
/obj/machinery/airalarm/ui_data(mob/user)
@@ -269,7 +269,7 @@
"unit" = "kPa",
"danger_level" = cur_tlv.get_danger_level(pressure)
))
- var/temperature = environment.temperature
+ var/temperature = environment.return_temperature()
cur_tlv = TLV["temperature"]
data["environment_data"] += list(list(
"name" = "Temperature",
@@ -278,16 +278,16 @@
"danger_level" = cur_tlv.get_danger_level(temperature)
))
var/total_moles = environment.total_moles()
- var/partial_pressure = R_IDEAL_GAS_EQUATION * environment.temperature / environment.volume
- for(var/gas_id in environment.gases)
+ var/partial_pressure = R_IDEAL_GAS_EQUATION * environment.return_temperature() / environment.return_volume()
+ for(var/gas_id in environment.get_gases())
if(!(gas_id in TLV)) // We're not interested in this gas, it seems.
continue
cur_tlv = TLV[gas_id]
data["environment_data"] += list(list(
"name" = GLOB.meta_gas_names[gas_id],
- "value" = environment.gases[gas_id] / total_moles * 100,
+ "value" = environment.get_moles(gas_id) / total_moles * 100,
"unit" = "%",
- "danger_level" = cur_tlv.get_danger_level(environment.gases[gas_id] * partial_pressure)
+ "danger_level" = cur_tlv.get_danger_level(environment.get_moles(gas_id) * partial_pressure)
))
if(!locked || hasSiliconAccessInArea(user, PRIVILEDGES_SILICON|PRIVILEDGES_DRONE))
@@ -684,24 +684,21 @@
var/datum/tlv/cur_tlv
var/datum/gas_mixture/environment = location.return_air()
- var/list/env_gases = environment.gases
- var/partial_pressure = R_IDEAL_GAS_EQUATION * environment.temperature / environment.volume
+ var/partial_pressure = R_IDEAL_GAS_EQUATION * environment.return_temperature() / environment.return_volume()
cur_tlv = TLV["pressure"]
var/environment_pressure = environment.return_pressure()
var/pressure_dangerlevel = cur_tlv.get_danger_level(environment_pressure)
cur_tlv = TLV["temperature"]
- var/temperature_dangerlevel = cur_tlv.get_danger_level(environment.temperature)
+ var/temperature_dangerlevel = cur_tlv.get_danger_level(environment.return_temperature())
var/gas_dangerlevel = 0
- for(var/gas_id in env_gases)
+ for(var/gas_id in environment.get_gases())
if(!(gas_id in TLV)) // We're not interested in this gas, it seems.
continue
cur_tlv = TLV[gas_id]
- gas_dangerlevel = max(gas_dangerlevel, cur_tlv.get_danger_level(env_gases[gas_id] * partial_pressure))
-
- GAS_GARBAGE_COLLECT(environment.gases)
+ gas_dangerlevel = max(gas_dangerlevel, cur_tlv.get_danger_level(environment.get_moles(gas_id) * partial_pressure))
var/old_danger_level = danger_level
danger_level = max(pressure_dangerlevel, temperature_dangerlevel, gas_dangerlevel)
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm
index 6b685d4bc1..39a99148c2 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm
@@ -52,10 +52,10 @@
return null
//Calculate necessary moles to transfer using PV = nRT
- if(air2.temperature>0)
+ if(air2.return_temperature()>0)
var/pressure_delta = (input_starting_pressure - output_starting_pressure)/2
- var/transfer_moles = pressure_delta*air1.volume/(air2.temperature * R_IDEAL_GAS_EQUATION)
+ var/transfer_moles = pressure_delta*air1.return_volume()/(air2.return_temperature() * R_IDEAL_GAS_EQUATION)
last_pressure_delta = pressure_delta
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm
index 2dc0afac26..d1bb58b99a 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm
@@ -66,8 +66,8 @@
pressure_delta = min(pressure_delta, (air1.return_pressure() - input_pressure_min))
if(pressure_delta > 0)
- if(air1.temperature > 0)
- var/transfer_moles = pressure_delta*environment.volume/(air1.temperature * R_IDEAL_GAS_EQUATION)
+ if(air1.return_temperature() > 0)
+ var/transfer_moles = pressure_delta*environment.return_volume()/(air1.return_temperature() * R_IDEAL_GAS_EQUATION)
var/datum/gas_mixture/removed = air1.remove(transfer_moles)
//Removed can be null if there is no atmosphere in air1
@@ -81,20 +81,17 @@
parent1.update = 1
else //external -> output
- var/pressure_delta = 10000
+ if(environment.return_pressure() > 0)
+ var/our_multiplier = air2.return_volume() / (environment.return_temperature() * R_IDEAL_GAS_EQUATION)
+ var/moles_delta = 10000 * our_multiplier
+ if(pressure_checks&EXT_BOUND)
+ moles_delta = min(moles_delta, (environment_pressure - output_pressure_max) * environment.return_volume() / (environment.return_temperature() * R_IDEAL_GAS_EQUATION))
+ if(pressure_checks&INPUT_MIN)
+ moles_delta = min(moles_delta, (input_pressure_min - air2.return_pressure()) * our_multiplier)
- if(pressure_checks&EXT_BOUND)
- pressure_delta = min(pressure_delta, (environment_pressure - external_pressure_bound))
- if(pressure_checks&INPUT_MIN)
- pressure_delta = min(pressure_delta, (output_pressure_max - air2.return_pressure()))
-
- if(pressure_delta > 0)
- if(environment.temperature > 0)
- var/transfer_moles = pressure_delta*air2.volume/(environment.temperature * R_IDEAL_GAS_EQUATION)
-
- var/datum/gas_mixture/removed = loc.remove_air(transfer_moles)
- //removed can be null if there is no air in the location
- if(!removed)
+ if(moles_delta > 0)
+ var/datum/gas_mixture/removed = loc.remove_air(moles_delta)
+ if (isnull(removed)) // in space
return
air2.merge(removed)
@@ -182,8 +179,8 @@
..()
var/datum/gas_mixture/air1 = airs[1]
var/datum/gas_mixture/air2 = airs[2]
- air1.volume = 1000
- air2.volume = 1000
+ air1.set_volume(1000)
+ air2.set_volume(1000)
// Mapping
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm
index 051dc965ad..9e1908a500 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm
@@ -26,6 +26,21 @@ Passive gate is similar to the regular pump except:
construction_type = /obj/item/pipe/directional
pipe_state = "passivegate"
+ ui_x = 335
+ ui_y = 115
+
+/obj/machinery/atmospherics/components/binary/passive_gate/CtrlClick(mob/user)
+ if(can_interact(user))
+ on = !on
+ update_icon()
+ return ..()
+
+/obj/machinery/atmospherics/components/binary/passive_gate/AltClick(mob/user)
+ if(can_interact(user))
+ target_pressure = MAX_OUTPUT_PRESSURE
+ update_icon()
+ return ..()
+
/obj/machinery/atmospherics/components/binary/passive_gate/Destroy()
SSradio.remove_object(src,frequency)
return ..()
@@ -53,11 +68,11 @@ Passive gate is similar to the regular pump except:
return
//Calculate necessary moles to transfer using PV = nRT
- if((air1.total_moles() > 0) && (air1.temperature>0))
+ if((air1.total_moles() > 0) && (air1.return_temperature()>0))
var/pressure_delta = min(target_pressure - output_starting_pressure, (input_starting_pressure - output_starting_pressure)/2)
//Can not have a pressure delta that would cause output_pressure > input_pressure
- var/transfer_moles = pressure_delta*air2.volume/(air1.temperature * R_IDEAL_GAS_EQUATION)
+ var/transfer_moles = pressure_delta*air2.return_volume()/(air1.return_temperature() * R_IDEAL_GAS_EQUATION)
//Actually transfer the gas
var/datum/gas_mixture/removed = air1.remove(transfer_moles)
@@ -91,7 +106,7 @@ Passive gate is similar to the regular pump except:
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, "atmos_pump", name, 335, 115, master_ui, state)
+ ui = new(user, src, ui_key, "AtmosPump", name, ui_x, ui_y, master_ui, state)
ui.open()
/obj/machinery/atmospherics/components/binary/passive_gate/ui_data()
@@ -172,4 +187,4 @@ Passive gate is similar to the regular pump except:
/obj/machinery/atmospherics/components/binary/passive_gate/layer3
piping_layer = 3
- icon_state = "passgate_map-3"
\ No newline at end of file
+ icon_state = "passgate_map-3"
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm
index 0e41f78e20..d41df83e12 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm
@@ -77,9 +77,9 @@
return
//Calculate necessary moles to transfer using PV=nRT
- if((air1.total_moles() > 0) && (air1.temperature>0))
+ if((air1.total_moles() > 0) && (air1.return_temperature()>0))
var/pressure_delta = target_pressure - output_starting_pressure
- var/transfer_moles = pressure_delta*air2.volume/(air1.temperature * R_IDEAL_GAS_EQUATION)
+ var/transfer_moles = pressure_delta*air2.return_volume()/(air1.return_temperature() * R_IDEAL_GAS_EQUATION)
//Actually transfer the gas
var/datum/gas_mixture/removed = air1.remove(transfer_moles)
@@ -111,7 +111,7 @@
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, "atmos_pump", name, 335, 115, master_ui, state)
+ ui = new(user, src, ui_key, "AtmosPump", name, 335, 115, master_ui, state)
ui.open()
/obj/machinery/atmospherics/components/binary/pump/ui_data()
@@ -212,4 +212,4 @@
/obj/machinery/atmospherics/components/binary/pump/on/layer3
piping_layer = 3
- icon_state= "pump_on_map-3"
\ No newline at end of file
+ icon_state= "pump_on_map-3"
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm
index 1005f72afe..d95e4ec123 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm
@@ -65,7 +65,7 @@
if((input_starting_pressure < 0.01) || (output_starting_pressure > 9000))
return
- var/transfer_ratio = transfer_rate/air1.volume
+ var/transfer_ratio = transfer_rate/air1.return_volume()
var/datum/gas_mixture/removed = air1.remove_ratio(transfer_ratio)
@@ -96,7 +96,7 @@
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, "atmos_pump", name, 310, 115, master_ui, state)
+ ui = new(user, src, ui_key, "AtmosPump", name, 310, 115, master_ui, state)
ui.open()
/obj/machinery/atmospherics/components/binary/volume_pump/ui_data()
@@ -153,7 +153,7 @@
if("set_transfer_rate" in signal.data)
var/datum/gas_mixture/air1 = airs[1]
- transfer_rate = clamp(text2num(signal.data["set_transfer_rate"]),0,air1.volume)
+ transfer_rate = clamp(text2num(signal.data["set_transfer_rate"]),0,air1.return_volume())
if(on != old_on)
investigate_log("was turned [on ? "on" : "off"] by a remote signal", INVESTIGATE_ATMOS)
@@ -200,4 +200,4 @@
/obj/machinery/atmospherics/components/binary/volume_pump/on/layer3
piping_layer = 3
- icon_state = "volpump_map-3"
\ No newline at end of file
+ icon_state = "volpump_map-3"
diff --git a/code/modules/atmospherics/machinery/components/components_base.dm b/code/modules/atmospherics/machinery/components/components_base.dm
index 33fd160b1a..a8d9586fc4 100644
--- a/code/modules/atmospherics/machinery/components/components_base.dm
+++ b/code/modules/atmospherics/machinery/components/components_base.dm
@@ -15,8 +15,7 @@
..()
for(var/i in 1 to device_type)
- var/datum/gas_mixture/A = new
- A.volume = 200
+ var/datum/gas_mixture/A = new(200)
airs[i] = A
// Iconnery
@@ -117,7 +116,7 @@
var/times_lost = 0
for(var/i in 1 to device_type)
var/datum/gas_mixture/air = airs[i]
- lost += pressures*environment.volume/(air.temperature * R_IDEAL_GAS_EQUATION)
+ lost += pressures*environment.return_volume()/(air.return_temperature() * R_IDEAL_GAS_EQUATION)
times_lost++
var/shared_loss = lost/times_lost
@@ -171,3 +170,4 @@
/obj/machinery/atmospherics/components/analyzer_act(mob/living/user, obj/item/I)
atmosanalyzer_scan(airs, user, src)
+ return TRUE
\ No newline at end of file
diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm
index 78258dd10a..dd6952dfc6 100644
--- a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm
+++ b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm
@@ -94,7 +94,7 @@
//Calculate necessary moles to transfer using PV=nRT
- var/transfer_ratio = transfer_rate/air1.volume
+ var/transfer_ratio = transfer_rate/air1.return_volume()
//Actually transfer the gas
@@ -111,14 +111,13 @@
else
filtering = FALSE
- if(filtering && removed.gases[filter_type])
+ if(filtering && removed.get_moles(filter_type))
var/datum/gas_mixture/filtered_out = new
- filtered_out.temperature = removed.temperature
- filtered_out.gases[filter_type] = removed.gases[filter_type]
+ filtered_out.set_temperature(removed.return_temperature())
+ filtered_out.set_moles(filter_type, removed.get_moles(filter_type))
- removed.gases[filter_type] = 0
- GAS_GARBAGE_COLLECT(removed.gases)
+ removed.set_moles(filter_type, 0)
var/datum/gas_mixture/target = (air2.return_pressure() < 9000 ? air2 : air1)
target.merge(filtered_out)
@@ -138,7 +137,7 @@
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, "atmos_filter", name, 475, 185, master_ui, state)
+ ui = new(user, src, ui_key, "AtmosFilter", name, 475, 185, master_ui, state)
ui.open()
/obj/machinery/atmospherics/components/trinary/filter/ui_data()
@@ -280,4 +279,4 @@
critical_machine = TRUE
/obj/machinery/atmospherics/components/trinary/filter/flipped/critical
- critical_machine = TRUE
\ No newline at end of file
+ critical_machine = TRUE
diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm
index dcf0d09bee..758d27ab61 100644
--- a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm
+++ b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm
@@ -57,7 +57,7 @@
/obj/machinery/atmospherics/components/trinary/mixer/New()
..()
var/datum/gas_mixture/air3 = airs[3]
- air3.volume = 300
+ air3.set_volume(300)
airs[3] = air3
/obj/machinery/atmospherics/components/trinary/mixer/process_atmos()
@@ -81,26 +81,26 @@
return
//Calculate necessary moles to transfer using PV=nRT
- var/general_transfer = (target_pressure - output_starting_pressure) * air3.volume / R_IDEAL_GAS_EQUATION
+ var/general_transfer = (target_pressure - output_starting_pressure) * air3.return_volume() / R_IDEAL_GAS_EQUATION
- var/transfer_moles1 = air1.temperature ? node1_concentration * general_transfer / air1.temperature : 0
- var/transfer_moles2 = air2.temperature ? node2_concentration * general_transfer / air2.temperature : 0
+ var/transfer_moles1 = air1.return_temperature() ? node1_concentration * general_transfer / air1.return_temperature() : 0
+ var/transfer_moles2 = air2.return_temperature() ? node2_concentration * general_transfer / air2.return_temperature() : 0
var/air1_moles = air1.total_moles()
var/air2_moles = air2.total_moles()
if(!node2_concentration)
- if(air1.temperature <= 0)
+ if(air1.return_temperature() <= 0)
return
transfer_moles1 = min(transfer_moles1, air1_moles)
transfer_moles2 = 0
else if(!node1_concentration)
- if(air2.temperature <= 0)
+ if(air2.return_temperature() <= 0)
return
transfer_moles2 = min(transfer_moles2, air2_moles)
transfer_moles1 = 0
else
- if(air1.temperature <= 0 || air2.temperature <= 0)
+ if(air1.return_temperature() <= 0 || air2.return_temperature() <= 0)
return
if((transfer_moles2 <= 0) || (transfer_moles1 <= 0))
return
@@ -131,7 +131,7 @@
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, "atmos_mixer", name, ui_x, ui_y, master_ui, state)
+ ui = new(user, src, ui_key, "AtmosMixer", name, ui_x, ui_y, master_ui, state)
ui.open()
/obj/machinery/atmospherics/components/trinary/mixer/ui_data()
@@ -248,4 +248,4 @@
/obj/machinery/atmospherics/components/trinary/mixer/airmix/flipped/inverse
node1_concentration = O2STANDARD
- node2_concentration = N2STANDARD
\ No newline at end of file
+ node2_concentration = N2STANDARD
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
index 4f26a2f772..0f849af0e3 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
@@ -33,6 +33,8 @@
var/escape_in_progress = FALSE
var/message_cooldown
var/breakout_time = 300
+ ///Cryo will continue to treat people with 0 damage but existing wounds, but will sound off when damage healing is done in case doctors want to directly treat the wounds instead
+ var/treating_wounds = FALSE
fair_market_price = 10
payment_department = ACCOUNT_MED
@@ -174,19 +176,31 @@
return
if(mob_occupant.health >= mob_occupant.getMaxHealth()) // Don't bother with fully healed people.
- on = FALSE
- update_icon()
- playsound(src, 'sound/machines/cryo_warning.ogg', volume) // Bug the doctors.
- var/msg = "Patient fully restored."
- if(autoeject) // Eject if configured.
- msg += " Auto ejecting patient now."
- open_machine()
- radio.talk_into(src, msg, radio_channel)
- return
+ if(iscarbon(mob_occupant))
+ var/mob/living/carbon/C = mob_occupant
+ if(C.all_wounds)
+ if(!treating_wounds) // if we have wounds and haven't already alerted the doctors we're only dealing with the wounds, let them know
+ treating_wounds = TRUE
+ playsound(src, 'sound/machines/cryo_warning.ogg', volume) // Bug the doctors.
+ var/msg = "Patient vitals fully recovered, continuing automated wound treatment."
+ radio.talk_into(src, msg, radio_channel)
+ else // otherwise if we were only treating wounds and now we don't have any, turn off treating_wounds so we can boot 'em out
+ treating_wounds = FALSE
+
+ if(!treating_wounds)
+ on = FALSE
+ update_icon()
+ playsound(src, 'sound/machines/cryo_warning.ogg', volume) // Bug the doctors.
+ var/msg = "Patient fully restored."
+ if(autoeject) // Eject if configured.
+ msg += " Auto ejecting patient now."
+ open_machine()
+ radio.talk_into(src, msg, radio_channel)
+ return
var/datum/gas_mixture/air1 = airs[1]
- if(air1.gases.len)
+ if(air1.total_moles())
if(mob_occupant.bodytemperature < T0C) // Sleepytime. Why? More cryo magic.
// temperature factor goes from 1 to about 2.5
var/amount = max(1, (4 * log(T0C - mob_occupant.bodytemperature)) - 20) * knockout_factor * base_knockout
@@ -196,8 +210,7 @@
if(reagent_transfer == 0) // Magically transfer reagents. Because cryo magic.
beaker.reagents.trans_to(occupant, 1, efficiency * 0.25) // Transfer reagents.
beaker.reagents.reaction(occupant, VAPOR)
- air1.gases[/datum/gas/oxygen] -= max(0,air1.gases[/datum/gas/oxygen] - 2 / efficiency) //Let's use gas for this
- GAS_GARBAGE_COLLECT(air1.gases)
+ air1.adjust_moles(/datum/gas/oxygen, -max(0,air1.get_moles(/datum/gas/oxygen) - 2 / efficiency)) //Let's use gas for this
if(++reagent_transfer >= 10 * efficiency) // Throttle reagent transfer (higher efficiency will transfer the same amount but consume less from the beaker).
reagent_transfer = 0
@@ -211,7 +224,7 @@
var/datum/gas_mixture/air1 = airs[1]
- if(!nodes[1] || !airs[1] || !air1.gases.len || air1.gases[/datum/gas/oxygen] < 5) // Turn off if the machine won't work.
+ if(!nodes[1] || !airs[1] || air1.get_moles(/datum/gas/oxygen) < 5) // Turn off if the machine won't work.
on = FALSE
update_icon()
return
@@ -219,22 +232,21 @@
if(occupant)
var/mob/living/mob_occupant = occupant
var/cold_protection = 0
- var/temperature_delta = air1.temperature - mob_occupant.bodytemperature // The only semi-realistic thing here: share temperature between the cell and the occupant.
+ var/temperature_delta = air1.return_temperature() - mob_occupant.bodytemperature // The only semi-realistic thing here: share temperature between the cell and the occupant.
if(ishuman(occupant))
var/mob/living/carbon/human/H = occupant
- cold_protection = H.get_thermal_protection(air1.temperature, TRUE)
+ cold_protection = H.get_thermal_protection(air1.return_temperature(), TRUE)
if(abs(temperature_delta) > 1)
var/air_heat_capacity = air1.heat_capacity()
var/heat = ((1 - cold_protection) * 0.1 + conduction_coefficient) * temperature_delta * (air_heat_capacity * heat_capacity / (air_heat_capacity + heat_capacity))
- air1.temperature = max(air1.temperature - heat / air_heat_capacity, TCMB)
+ air1.set_temperature(max(air1.return_temperature() - heat / air_heat_capacity, TCMB))
mob_occupant.adjust_bodytemperature(heat / heat_capacity, TCMB)
- air1.gases[/datum/gas/oxygen] = max(0,air1.gases[/datum/gas/oxygen] - 0.5 / efficiency) // Magically consume gas? Why not, we run on cryo magic.
- GAS_GARBAGE_COLLECT(air1.gases)
+ air1.set_temperature(max(air1.return_temperature() - 0.5 / efficiency)) // Magically consume gas? Why not, we run on cryo magic.
/obj/machinery/atmospherics/components/unary/cryo_cell/power_change()
..()
@@ -264,8 +276,6 @@
return occupant
/obj/machinery/atmospherics/components/unary/cryo_cell/container_resist(mob/living/user)
- user.changeNext_move(CLICK_CD_BREAKOUT)
- user.last_special = world.time + CLICK_CD_BREAKOUT
user.visible_message("You see [user] kicking against the glass of [src]!", \
"You struggle inside [src], kicking the release with your foot... (this will take about [DisplayTimeText(breakout_time)].)", \
"You hear a thump from [src].")
@@ -326,7 +336,7 @@
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.notcontained_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
- ui = new(user, src, ui_key, "cryo", name, 400, 550, master_ui, state)
+ ui = new(user, src, ui_key, "Cryo", name, 400, 550, master_ui, state)
ui.open()
/obj/machinery/atmospherics/components/unary/cryo_cell/ui_data()
@@ -369,7 +379,7 @@
data["occupant"]["temperaturestatus"] = "bad"
var/datum/gas_mixture/air1 = airs[1]
- data["cellTemperature"] = round(air1.temperature, 1)
+ data["cellTemperature"] = round(air1.return_temperature(), 1)
data["isBeakerLoaded"] = beaker ? TRUE : FALSE
var/beakerContents = list()
@@ -439,7 +449,7 @@
var/datum/gas_mixture/G = airs[1]
if(G.total_moles() > 10)
- return G.temperature
+ return G.return_temperature()
return ..()
/obj/machinery/atmospherics/components/unary/cryo_cell/default_change_direction_wrench(mob/user, obj/item/wrench/W)
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/heat_exchanger.dm b/code/modules/atmospherics/machinery/components/unary_devices/heat_exchanger.dm
index a856ea1f3f..c0dfc5633e 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/heat_exchanger.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/heat_exchanger.dm
@@ -59,18 +59,18 @@
var/other_air_heat_capacity = partner_air_contents.heat_capacity()
var/combined_heat_capacity = other_air_heat_capacity + air_heat_capacity
- var/old_temperature = air_contents.temperature
- var/other_old_temperature = partner_air_contents.temperature
+ var/old_temperature = air_contents.return_temperature()
+ var/other_old_temperature = partner_air_contents.return_temperature()
if(combined_heat_capacity > 0)
- var/combined_energy = partner_air_contents.temperature*other_air_heat_capacity + air_heat_capacity*air_contents.temperature
+ var/combined_energy = partner_air_contents.return_temperature()*other_air_heat_capacity + air_heat_capacity*air_contents.return_temperature()
var/new_temperature = combined_energy/combined_heat_capacity
- air_contents.temperature = new_temperature
- partner_air_contents.temperature = new_temperature
+ air_contents.set_temperature(new_temperature)
+ partner_air_contents.set_temperature(new_temperature)
- if(abs(old_temperature-air_contents.temperature) > 1)
+ if(abs(old_temperature-air_contents.return_temperature()) > 1)
update_parents()
- if(abs(other_old_temperature-partner_air_contents.temperature) > 1)
+ if(abs(other_old_temperature-partner_air_contents.return_temperature()) > 1)
partner.update_parents()
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm
index 05720583f9..70672418a1 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm
@@ -20,6 +20,21 @@
pipe_state = "injector"
+ ui_x = 310
+ ui_y = 115
+
+/obj/machinery/atmospherics/components/unary/outlet_injector/CtrlClick(mob/user)
+ if(can_interact(user))
+ on = !on
+ update_icon()
+ return ..()
+
+/obj/machinery/atmospherics/components/unary/outlet_injector/AltClick(mob/user)
+ if(can_interact(user))
+ volume_rate = MAX_TRANSFER_RATE
+ update_icon()
+ return ..()
+
/obj/machinery/atmospherics/components/unary/outlet_injector/Destroy()
SSradio.remove_object(src,frequency)
return ..()
@@ -52,8 +67,8 @@
var/datum/gas_mixture/air_contents = airs[1]
- if(air_contents.temperature > 0)
- var/transfer_moles = (air_contents.return_pressure())*volume_rate/(air_contents.temperature * R_IDEAL_GAS_EQUATION)
+ if(air_contents.return_temperature() > 0)
+ var/transfer_moles = (air_contents.return_pressure())*volume_rate/(air_contents.return_temperature() * R_IDEAL_GAS_EQUATION)
var/datum/gas_mixture/removed = air_contents.remove(transfer_moles)
@@ -71,8 +86,8 @@
injecting = 1
- if(air_contents.temperature > 0)
- var/transfer_moles = (air_contents.return_pressure())*volume_rate/(air_contents.temperature * R_IDEAL_GAS_EQUATION)
+ if(air_contents.return_temperature() > 0)
+ var/transfer_moles = (air_contents.return_pressure())*volume_rate/(air_contents.return_temperature() * R_IDEAL_GAS_EQUATION)
var/datum/gas_mixture/removed = air_contents.remove(transfer_moles)
loc.assume_air(removed)
update_parents()
@@ -123,7 +138,7 @@
if("set_volume_rate" in signal.data)
var/number = text2num(signal.data["set_volume_rate"])
var/datum/gas_mixture/air_contents = airs[1]
- volume_rate = clamp(number, 0, air_contents.volume)
+ volume_rate = clamp(number, 0, air_contents.return_volume())
if("status" in signal.data)
spawn(2)
@@ -140,7 +155,7 @@
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, "atmos_pump", name, 310, 115, master_ui, state)
+ ui = new(user, src, ui_key, "AtmosPump", name, ui_x, ui_y, master_ui, state)
ui.open()
/obj/machinery/atmospherics/components/unary/outlet_injector/ui_data()
@@ -241,4 +256,4 @@
id = ATMOS_GAS_MONITOR_INPUT_INCINERATOR
/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/toxins_mixing_input
name = "toxins mixing input injector"
- id = ATMOS_GAS_MONITOR_INPUT_TOXINS_LAB
\ No newline at end of file
+ id = ATMOS_GAS_MONITOR_INPUT_TOXINS_LAB
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm b/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm
index a113484d20..3f5bb818ce 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm
@@ -30,14 +30,14 @@
if(pressure_delta > 0.5)
if(external_pressure < internal_pressure)
- var/air_temperature = (external.temperature > 0) ? external.temperature : internal.temperature
- var/transfer_moles = (pressure_delta * external.volume) / (air_temperature * R_IDEAL_GAS_EQUATION)
+ var/air_temperature = (external.return_temperature() > 0) ? external.return_temperature() : internal.return_temperature()
+ var/transfer_moles = (pressure_delta * external.return_volume()) / (air_temperature * R_IDEAL_GAS_EQUATION)
var/datum/gas_mixture/removed = internal.remove(transfer_moles)
external.merge(removed)
else
- var/air_temperature = (internal.temperature > 0) ? internal.temperature : external.temperature
- var/transfer_moles = (pressure_delta * internal.volume) / (air_temperature * R_IDEAL_GAS_EQUATION)
- transfer_moles = min(transfer_moles, external.total_moles() * internal.volume / external.volume)
+ var/air_temperature = (internal.return_temperature() > 0) ? internal.return_temperature() : external.return_temperature()
+ var/transfer_moles = (pressure_delta * internal.return_volume()) / (air_temperature * R_IDEAL_GAS_EQUATION)
+ transfer_moles = min(transfer_moles, external.total_moles() * internal.return_volume() / external.return_volume())
var/datum/gas_mixture/removed = external.remove(transfer_moles)
if(isnull(removed))
return
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm b/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm
index 81ca14a828..6188c919ac 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm
@@ -16,7 +16,7 @@
..()
var/datum/gas_mixture/air_contents = airs[1]
- air_contents.volume = 0
+ air_contents.set_volume(0)
/obj/machinery/atmospherics/components/unary/portables_connector/Destroy()
if(connected_device)
@@ -64,4 +64,4 @@
/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer3
piping_layer = 3
- icon_state = "connector_map-3"
\ No newline at end of file
+ icon_state = "connector_map-3"
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/relief_valve.dm b/code/modules/atmospherics/machinery/components/unary_devices/relief_valve.dm
index 1d8b875528..0893d2b9e6 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/relief_valve.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/relief_valve.dm
@@ -49,10 +49,10 @@
else if(!opened && our_pressure >= open_pressure)
opened = TRUE
update_icon_nopipes()
- if(opened && air_contents.temperature > 0)
+ if(opened && air_contents.return_temperature() > 0)
var/datum/gas_mixture/environment = loc.return_air()
var/pressure_delta = our_pressure - environment.return_pressure()
- var/transfer_moles = pressure_delta*200/(air_contents.temperature * R_IDEAL_GAS_EQUATION)
+ var/transfer_moles = pressure_delta*200/(air_contents.return_temperature() * R_IDEAL_GAS_EQUATION)
if(transfer_moles > 0)
var/datum/gas_mixture/removed = air_contents.remove(transfer_moles)
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/tank.dm b/code/modules/atmospherics/machinery/components/unary_devices/tank.dm
index 79ff24e8b7..2f3372462d 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/tank.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/tank.dm
@@ -1,4 +1,4 @@
-#define AIR_CONTENTS ((25*ONE_ATMOSPHERE)*(air_contents.volume)/(R_IDEAL_GAS_EQUATION*air_contents.temperature))
+#define AIR_CONTENTS ((25*ONE_ATMOSPHERE)*(air_contents.return_volume())/(R_IDEAL_GAS_EQUATION*air_contents.return_temperature()))
/obj/machinery/atmospherics/components/unary/tank
icon = 'icons/obj/atmospherics/pipes/pressure_tank.dmi'
icon_state = "generic"
@@ -15,10 +15,10 @@
/obj/machinery/atmospherics/components/unary/tank/New()
..()
var/datum/gas_mixture/air_contents = airs[1]
- air_contents.volume = volume
- air_contents.temperature = T20C
+ air_contents.set_volume(volume)
+ air_contents.set_temperature(T20C)
if(gas_type)
- air_contents.gases[gas_type] = AIR_CONTENTS
+ air_contents.set_moles(AIR_CONTENTS)
name = "[name] ([GLOB.meta_gas_names[gas_type]])"
/obj/machinery/atmospherics/components/unary/tank/air
@@ -28,8 +28,8 @@
/obj/machinery/atmospherics/components/unary/tank/air/New()
..()
var/datum/gas_mixture/air_contents = airs[1]
- air_contents.gases[/datum/gas/oxygen] = AIR_CONTENTS * 0.2
- air_contents.gases[/datum/gas/nitrogen] = AIR_CONTENTS * 0.8
+ air_contents.set_moles(/datum/gas/oxygen, AIR_CONTENTS * 0.2)
+ air_contents.set_moles(/datum/gas/nitrogen, AIR_CONTENTS * 0.8)
/obj/machinery/atmospherics/components/unary/tank/carbon_dioxide
gas_type = /datum/gas/carbon_dioxide
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm
index 7af3e57bc7..c6168a6c9c 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm
@@ -74,13 +74,13 @@
var/air_heat_capacity = air_contents.heat_capacity()
var/combined_heat_capacity = heat_capacity + air_heat_capacity
- var/old_temperature = air_contents.temperature
+ var/old_temperature = air_contents.return_temperature()
if(combined_heat_capacity > 0)
- var/combined_energy = heat_capacity * target_temperature + air_heat_capacity * air_contents.temperature
- air_contents.temperature = combined_energy/combined_heat_capacity
+ var/combined_energy = heat_capacity * target_temperature + air_heat_capacity * air_contents.return_temperature()
+ air_contents.set_temperature(combined_energy/combined_heat_capacity)
- var/temperature_delta= abs(old_temperature - air_contents.temperature)
+ var/temperature_delta= abs(old_temperature - air_contents.return_temperature())
if(temperature_delta > 1)
active_power_usage = (heat_capacity * temperature_delta) / 10 + idle_power_usage
update_parents()
@@ -129,7 +129,7 @@
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, "thermomachine", name, ui_x, ui_y, master_ui, state)
+ ui = new(user, src, ui_key, "ThermoMachine", name, ui_x, ui_y, master_ui, state)
ui.open()
/obj/machinery/atmospherics/components/unary/thermomachine/ui_data(mob/user)
@@ -142,7 +142,7 @@
data["initial"] = initial(target_temperature)
var/datum/gas_mixture/air1 = airs[1]
- data["temperature"] = air1.temperature
+ data["temperature"] = air1.return_temperature()
data["pressure"] = air1.return_pressure()
return data
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm
index 9788bcb4ee..1a86898f1f 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm
@@ -104,8 +104,8 @@
pressure_delta = min(pressure_delta, (air_contents.return_pressure() - internal_pressure_bound))
if(pressure_delta > 0)
- if(air_contents.temperature > 0)
- var/transfer_moles = pressure_delta*environment.volume/(air_contents.temperature * R_IDEAL_GAS_EQUATION)
+ if(air_contents.return_temperature() > 0)
+ var/transfer_moles = pressure_delta*environment.return_volume()/(air_contents.return_temperature() * R_IDEAL_GAS_EQUATION)
var/datum/gas_mixture/removed = air_contents.remove(transfer_moles)
@@ -113,21 +113,21 @@
air_update_turf()
else // external -> internal
- var/pressure_delta = 10000
- if(pressure_checks&EXT_BOUND)
- pressure_delta = min(pressure_delta, (environment_pressure - external_pressure_bound))
- if(pressure_checks&INT_BOUND)
- pressure_delta = min(pressure_delta, (internal_pressure_bound - air_contents.return_pressure()))
+ if(environment.return_pressure() > 0)
+ var/our_multiplier = air_contents.return_volume() / (environment.return_temperature() * R_IDEAL_GAS_EQUATION)
+ var/moles_delta = 10000 * our_multiplier
+ if(pressure_checks&EXT_BOUND)
+ moles_delta = min(moles_delta, (environment_pressure - external_pressure_bound) * environment.return_volume() / (environment.return_temperature() * R_IDEAL_GAS_EQUATION))
+ if(pressure_checks&INT_BOUND)
+ moles_delta = min(moles_delta, (internal_pressure_bound - air_contents.return_pressure()) * our_multiplier)
- if(pressure_delta > 0 && environment.temperature > 0)
- var/transfer_moles = pressure_delta * air_contents.volume / (environment.temperature * R_IDEAL_GAS_EQUATION)
+ if(moles_delta > 0)
+ var/datum/gas_mixture/removed = loc.remove_air(moles_delta)
+ if (isnull(removed)) // in space
+ return
- var/datum/gas_mixture/removed = loc.remove_air(transfer_moles)
- if (isnull(removed)) // in space
- return
-
- air_contents.merge(removed)
- air_update_turf()
+ air_contents.merge(removed)
+ air_update_turf()
update_parents()
//Radio remote control
@@ -295,7 +295,7 @@
/obj/machinery/atmospherics/components/unary/vent_pump/high_volume/New()
..()
var/datum/gas_mixture/air_contents = airs[1]
- air_contents.volume = 1000
+ air_contents.set_volume(1000)
// mapping
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm
index 10eac9c717..025c9734ca 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm
@@ -149,43 +149,29 @@
return FALSE
var/datum/gas_mixture/environment = tile.return_air()
var/datum/gas_mixture/air_contents = airs[1]
- var/list/env_gases = environment.gases
if(air_contents.return_pressure() >= 50*ONE_ATMOSPHERE)
return FALSE
if(scrubbing & SCRUBBING)
- if(length(env_gases & filter_types))
- var/transfer_moles = min(1, volume_rate/environment.volume)*environment.total_moles()
+ var/transfer_moles = min(1, volume_rate/environment.return_volume())*environment.total_moles()
- //Take a gas sample
- var/datum/gas_mixture/removed = tile.remove_air(transfer_moles)
+ //Take a gas sample
+ var/datum/gas_mixture/removed = tile.remove_air(transfer_moles)
- //Nothing left to remove from the tile
- if(isnull(removed))
- return FALSE
+ //Nothing left to remove from the tile
+ if(isnull(removed))
+ return FALSE
- var/list/removed_gases = removed.gases
+ removed.scrub_into(air_contents, filter_types)
- //Filter it
- var/datum/gas_mixture/filtered_out = new
- var/list/filtered_gases = filtered_out.gases
- filtered_out.temperature = removed.temperature
-
- for(var/gas in filter_types & removed_gases)
- filtered_gases[gas] = removed_gases[gas]
- removed_gases[gas] = 0
-
- GAS_GARBAGE_COLLECT(removed.gases)
-
- //Remix the resulting gases
- air_contents.merge(filtered_out)
- tile.assume_air(removed)
- tile.air_update_turf()
+ //Remix the resulting gases
+ tile.assume_air(removed)
+ tile.air_update_turf()
else //Just siphoning all air
- var/transfer_moles = environment.total_moles()*(volume_rate/environment.volume)
+ var/transfer_moles = environment.total_moles()*(volume_rate/environment.return_volume())
var/datum/gas_mixture/removed = tile.remove_air(transfer_moles)
diff --git a/code/modules/atmospherics/machinery/datum_pipeline.dm b/code/modules/atmospherics/machinery/datum_pipeline.dm
index 565bbb7b3c..098df67321 100644
--- a/code/modules/atmospherics/machinery/datum_pipeline.dm
+++ b/code/modules/atmospherics/machinery/datum_pipeline.dm
@@ -15,7 +15,7 @@
/datum/pipeline/Destroy()
SSair.networks -= src
- if(air && air.volume)
+ if(air && air.return_volume())
temporarily_store_air()
for(var/obj/machinery/atmospherics/pipe/P in members)
P.parent = null
@@ -76,7 +76,7 @@
possible_expansions -= borderline
- air.volume = volume
+ air.set_volume(volume)
/datum/pipeline/proc/addMachineryMember(obj/machinery/atmospherics/components/C)
other_atmosmch |= C
@@ -99,7 +99,7 @@
merge(E)
if(!members.Find(P))
members += P
- air.volume += P.volume
+ air.set_volume(air.return_volume() + P.volume)
else
A.setPipenet(src, N)
addMachineryMember(A)
@@ -107,7 +107,7 @@
/datum/pipeline/proc/merge(datum/pipeline/E)
if(E == src)
return
- air.volume += E.air.volume
+ air.set_volume(air.return_volume() + E.air.return_volume())
members.Add(E.members)
for(var/obj/machinery/atmospherics/pipe/S in E.members)
S.parent = src
@@ -139,18 +139,16 @@
for(var/obj/machinery/atmospherics/pipe/member in members)
member.air_temporary = new
- member.air_temporary.volume = member.volume
+ member.air_temporary.set_volume(member.volume)
member.air_temporary.copy_from(air)
- var/member_gases = member.air_temporary.gases
- for(var/id in member_gases)
- member_gases[id] *= member.volume/air.volume
+ member.air_temporary.multiply(member.volume/air.return_volume())
- member.air_temporary.temperature = air.temperature
+ member.air_temporary.set_temperature(air.return_temperature())
/datum/pipeline/proc/temperature_interact(turf/target, share_volume, thermal_conductivity)
var/total_heat_capacity = air.heat_capacity()
- var/partial_heat_capacity = total_heat_capacity*(share_volume/air.volume)
+ var/partial_heat_capacity = total_heat_capacity*(share_volume/air.return_volume())
var/target_temperature
var/target_heat_capacity
@@ -163,19 +161,19 @@
if(modeled_location.blocks_air)
if((modeled_location.heat_capacity>0) && (partial_heat_capacity>0))
- var/delta_temperature = air.temperature - target_temperature
+ var/delta_temperature = air.return_temperature() - target_temperature
var/heat = thermal_conductivity*delta_temperature* \
(partial_heat_capacity*target_heat_capacity/(partial_heat_capacity+target_heat_capacity))
- air.temperature -= heat/total_heat_capacity
+ air.set_temperature(air.return_temperature() - heat/total_heat_capacity)
modeled_location.TakeTemperature(heat/target_heat_capacity)
else
var/delta_temperature = 0
var/sharer_heat_capacity = 0
- delta_temperature = (air.temperature - target_temperature)
+ delta_temperature = (air.return_temperature() - target_temperature)
sharer_heat_capacity = target_heat_capacity
var/self_temperature_delta = 0
@@ -190,18 +188,18 @@
else
return 1
- air.temperature += self_temperature_delta
+ air.set_temperature(air.return_temperature() + self_temperature_delta)
modeled_location.TakeTemperature(sharer_temperature_delta)
else
if((target.heat_capacity>0) && (partial_heat_capacity>0))
- var/delta_temperature = air.temperature - target.temperature
+ var/delta_temperature = air.return_temperature() - target.return_temperature()
var/heat = thermal_conductivity*delta_temperature* \
(partial_heat_capacity*target.heat_capacity/(partial_heat_capacity+target.heat_capacity))
- air.temperature -= heat/total_heat_capacity
+ air.set_temperature(air.return_temperature() - heat/total_heat_capacity)
update = TRUE
/datum/pipeline/proc/return_air()
@@ -242,20 +240,18 @@
for(var/i in GL)
var/datum/gas_mixture/G = i
- total_gas_mixture.volume += G.volume
+ total_gas_mixture.set_volume(total_gas_mixture.return_volume() + G.return_volume())
total_gas_mixture.merge(G)
- total_thermal_energy += THERMAL_ENERGY(G)
+ total_thermal_energy += G.thermal_energy()
total_heat_capacity += G.heat_capacity()
- total_gas_mixture.temperature = total_heat_capacity ? total_thermal_energy/total_heat_capacity : 0
+ total_gas_mixture.set_temperature(total_heat_capacity ? total_thermal_energy/total_heat_capacity : 0)
- if(total_gas_mixture.volume > 0)
+ if(total_gas_mixture.return_volume() > 0)
//Update individual gas_mixtures by volume ratio
for(var/i in GL)
var/datum/gas_mixture/G = i
G.copy_from(total_gas_mixture)
- var/list/G_gases = G.gases
- for(var/id in G_gases)
- G_gases[id] *= G.volume/total_gas_mixture.volume
+ G.multiply(G.return_volume()/total_gas_mixture.return_volume())
diff --git a/code/modules/atmospherics/machinery/other/meter.dm b/code/modules/atmospherics/machinery/other/meter.dm
index fab70cc168..c17c93ab95 100644
--- a/code/modules/atmospherics/machinery/other/meter.dm
+++ b/code/modules/atmospherics/machinery/other/meter.dm
@@ -103,7 +103,7 @@
if (target)
var/datum/gas_mixture/environment = target.return_air()
if(environment)
- . = "The pressure gauge reads [round(environment.return_pressure(), 0.01)] kPa; [round(environment.temperature,0.01)] K ([round(environment.temperature-T0C,0.01)]°C)."
+ . = "The pressure gauge reads [round(environment.return_pressure(), 0.01)] kPa; [round(environment.return_temperature(),0.01)] K ([round(environment.return_temperature()-T0C,0.01)]°C)."
else
. = "The sensor error light is blinking."
else
diff --git a/code/modules/atmospherics/machinery/other/miner.dm b/code/modules/atmospherics/machinery/other/miner.dm
index c90d388a1d..1842211fd2 100644
--- a/code/modules/atmospherics/machinery/other/miner.dm
+++ b/code/modules/atmospherics/machinery/other/miner.dm
@@ -131,8 +131,8 @@
if(!isopenturf(O))
return FALSE
var/datum/gas_mixture/merger = new
- merger.gases[spawn_id] = (spawn_mol)
- merger.temperature = spawn_temp
+ merger.set_moles(spawn_id, spawn_mol)
+ merger.set_temperature(spawn_temp)
O.assume_air(merger)
O.air_update_turf(TRUE)
diff --git a/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm b/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm
index 4da053d3c8..7c170f8afc 100644
--- a/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm
+++ b/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm
@@ -28,14 +28,14 @@
if(islava(T))
environment_temperature = 5000
else if(T.blocks_air)
- environment_temperature = T.temperature
+ environment_temperature = T.return_temperature()
else
var/turf/open/OT = T
environment_temperature = OT.GetTemperature()
else
- environment_temperature = T.temperature
+ environment_temperature = T.return_temperature()
- if(abs(environment_temperature-pipe_air.temperature) > minimum_temperature_difference)
+ if(abs(environment_temperature-pipe_air.return_temperature()) > minimum_temperature_difference)
parent.temperature_interact(T, volume, thermal_conductivity)
@@ -44,11 +44,11 @@
var/hc = pipe_air.heat_capacity()
var/mob/living/heat_source = buckled_mobs[1]
//Best guess-estimate of the total bodytemperature of all the mobs, since they share the same environment it's ~ok~ to guess like this
- var/avg_temp = (pipe_air.temperature * hc + (heat_source.bodytemperature * buckled_mobs.len) * 3500) / (hc + (buckled_mobs ? buckled_mobs.len * 3500 : 0))
+ var/avg_temp = (pipe_air.return_temperature() * hc + (heat_source.bodytemperature * buckled_mobs.len) * 3500) / (hc + (buckled_mobs ? buckled_mobs.len * 3500 : 0))
for(var/m in buckled_mobs)
var/mob/living/L = m
L.bodytemperature = avg_temp
- pipe_air.temperature = avg_temp
+ pipe_air.set_temperature(avg_temp)
/obj/machinery/atmospherics/pipe/heat_exchanging/process()
if(!parent)
@@ -57,9 +57,9 @@
var/datum/gas_mixture/pipe_air = return_air()
//Heat causes pipe to glow
- if(pipe_air.temperature && (icon_temperature > 500 || pipe_air.temperature > 500)) //glow starts at 500K
- if(abs(pipe_air.temperature - icon_temperature) > 10)
- icon_temperature = pipe_air.temperature
+ if(pipe_air.return_temperature() && (icon_temperature > 500 || pipe_air.return_temperature() > 500)) //glow starts at 500K
+ if(abs(pipe_air.return_temperature() - icon_temperature) > 10)
+ icon_temperature = pipe_air.return_temperature()
var/h_r = heat2colour_r(icon_temperature)
var/h_g = heat2colour_g(icon_temperature)
@@ -76,7 +76,7 @@
//burn any mobs buckled based on temperature
if(has_buckled_mobs())
var/heat_limit = 1000
- if(pipe_air.temperature > heat_limit + 1)
+ if(pipe_air.return_temperature() > heat_limit + 1)
for(var/m in buckled_mobs)
var/mob/living/buckled_mob = m
- buckled_mob.apply_damage(4 * log(pipe_air.temperature - heat_limit), BURN, BODY_ZONE_CHEST)
+ buckled_mob.apply_damage(4 * log(pipe_air.return_temperature() - heat_limit), BURN, BODY_ZONE_CHEST)
diff --git a/code/modules/atmospherics/machinery/pipes/pipes.dm b/code/modules/atmospherics/machinery/pipes/pipes.dm
index 4a6170c251..23fd2292ff 100644
--- a/code/modules/atmospherics/machinery/pipes/pipes.dm
+++ b/code/modules/atmospherics/machinery/pipes/pipes.dm
@@ -64,6 +64,7 @@
/obj/machinery/atmospherics/pipe/analyzer_act(mob/living/user, obj/item/I)
atmosanalyzer_scan(parent.air, user, src)
+ return TRUE
/obj/machinery/atmospherics/pipe/returnPipenet()
return parent
diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm
index 03463ff0f7..12ba7e79b9 100644
--- a/code/modules/atmospherics/machinery/portable/canister.dm
+++ b/code/modules/atmospherics/machinery/portable/canister.dm
@@ -5,6 +5,8 @@
desc = "A canister for the storage of gas."
icon_state = "yellow"
density = TRUE
+ ui_x = 300
+ ui_y = 232
var/valve_open = FALSE
var/obj/machinery/atmospherics/components/binary/passive_gate/pump
@@ -34,6 +36,7 @@
var/restricted = FALSE
req_access = list()
+ var/update = 0
var/static/list/label2types = list(
"n2" = /obj/machinery/portable_atmospherics/canister/nitrogen,
"o2" = /obj/machinery/portable_atmospherics/canister/oxygen,
@@ -159,11 +162,11 @@
/obj/machinery/portable_atmospherics/canister/proto
name = "prototype canister"
+
/obj/machinery/portable_atmospherics/canister/proto/default
name = "prototype canister"
desc = "The best way to fix an atmospheric emergency... or the best way to introduce one."
icon_state = "proto"
- icon_state = "proto"
volume = 5000
max_integrity = 300
temperature_resistance = 2000 + T0C
@@ -171,6 +174,7 @@
can_min_release_pressure = (ONE_ATMOSPHERE / 30)
prototype = TRUE
+
/obj/machinery/portable_atmospherics/canister/proto/default/oxygen
name = "prototype canister"
desc = "A prototype canister for a prototype bike, what could go wrong?"
@@ -192,6 +196,7 @@
update_icon()
+
/obj/machinery/portable_atmospherics/canister/Destroy()
qdel(pump)
pump = null
@@ -200,14 +205,14 @@
/obj/machinery/portable_atmospherics/canister/proc/create_gas()
if(gas_type)
if(starter_temp)
- air_contents.temperature = starter_temp
- air_contents.gases[gas_type] = (maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)
+ air_contents.set_temperature(starter_temp)
+ air_contents.set_moles(gas_type,(maximum_pressure * filled) * air_contents.return_volume() / (R_IDEAL_GAS_EQUATION * air_contents.return_temperature()))
if(starter_temp)
- air_contents.temperature = starter_temp
+ air_contents.set_temperature(starter_temp)
/obj/machinery/portable_atmospherics/canister/air/create_gas()
- air_contents.gases[/datum/gas/oxygen] = (O2STANDARD * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)
- air_contents.gases[/datum/gas/nitrogen] = (N2STANDARD * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)
+ air_contents.set_moles(/datum/gas/oxygen, (O2STANDARD * maximum_pressure * filled) * air_contents.return_volume() / (R_IDEAL_GAS_EQUATION * air_contents.return_temperature()))
+ air_contents.set_moles(/datum/gas/nitrogen, (N2STANDARD * maximum_pressure * filled) * air_contents.return_volume() / (R_IDEAL_GAS_EQUATION * air_contents.return_temperature()))
/obj/machinery/portable_atmospherics/canister/update_icon_state()
if(stat & BROKEN)
@@ -215,7 +220,6 @@
/obj/machinery/portable_atmospherics/canister/update_overlays()
. = ..()
-
if(holding)
. += "can-open"
if(connected_port)
@@ -245,7 +249,8 @@
new /obj/item/stack/sheet/metal (loc, 5)
qdel(src)
-/obj/machinery/portable_atmospherics/canister/welder_act(mob/living/user, obj/item/I)
+obj/machinery/portable_atmospherics/canister/welder_act(mob/living/user, obj/item/I)
+ ..()
if(user.a_intent == INTENT_HARM)
return FALSE
@@ -263,6 +268,7 @@
/obj/machinery/portable_atmospherics/canister/obj_break(damage_flag)
if((stat & BROKEN) || (flags_1 & NODECONSTRUCT_1))
return
+ stat |= BROKEN
canister_break()
/obj/machinery/portable_atmospherics/canister/proc/canister_break()
@@ -272,10 +278,9 @@
T.assume_air(expelled_gas)
air_update_turf()
- stat |= BROKEN
+ obj_break()
density = FALSE
- playsound(src.loc, 'sound/effects/spray.ogg', 10, 1, -3)
- update_icon()
+ playsound(src.loc, 'sound/effects/spray.ogg', 10, TRUE, -3)
investigate_log("was destroyed.", INVESTIGATE_ATMOS)
if(holding)
@@ -318,7 +323,7 @@
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.physical_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
- ui = new(user, src, ui_key, "canister", name, 420, 405, master_ui, state)
+ ui = new(user, src, ui_key, "Canister", name, ui_x, ui_y, master_ui, state)
ui.open()
/obj/machinery/portable_atmospherics/canister/ui_data()
@@ -353,7 +358,7 @@
return
switch(action)
if("relabel")
- var/label = input("New canister label:", name) as null|anything in label2types
+ var/label = input("New canister label:", name) as null|anything in sortList(label2types)
if(label && !..())
var/newtype = label2types[label]
if(newtype)
@@ -396,8 +401,8 @@
logmsg = "Valve was opened by [key_name(usr)], starting a transfer into \the [holding || "air"]. "
if(!holding)
var/list/danger = list()
- for(var/id in air_contents.gases)
- var/gas = air_contents.gases[id]
+ for(var/id in air_contents.get_gases())
+ var/gas = air_contents.get_moles(id)
if(!GLOB.meta_gas_dangers[id])
continue
if(gas > (GLOB.meta_gas_visibility[id] || MOLES_GAS_VISIBLE)) //if moles_visible is undefined, default to default visibility
diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm
index 952db8315a..fa57e683c4 100644
--- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm
+++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm
@@ -18,9 +18,8 @@
..()
SSair.atmos_machinery += src
- air_contents = new
- air_contents.volume = volume
- air_contents.temperature = T20C
+ air_contents = new(volume)
+ air_contents.set_temperature(T20C)
return 1
@@ -146,6 +145,7 @@
/obj/machinery/portable_atmospherics/analyzer_act(mob/living/user, obj/item/I)
atmosanalyzer_scan(air_contents, user, src)
+ return TRUE
/obj/machinery/portable_atmospherics/attacked_by(obj/item/I, mob/user, attackchain_flags = NONE, damage_multiplier = 1)
if(I.force < 10 && !(stat & BROKEN))
diff --git a/code/modules/atmospherics/machinery/portable/pump.dm b/code/modules/atmospherics/machinery/portable/pump.dm
index 377e9285e3..7f1dc4d20f 100644
--- a/code/modules/atmospherics/machinery/portable/pump.dm
+++ b/code/modules/atmospherics/machinery/portable/pump.dm
@@ -8,6 +8,8 @@
name = "portable air pump"
icon_state = "psiphon:0"
density = TRUE
+ ui_x = 300
+ ui_y = 315
var/on = FALSE
var/direction = PUMP_OUT
@@ -32,7 +34,6 @@
/obj/machinery/portable_atmospherics/pump/update_icon_state()
icon_state = "psiphon:[on]"
-
/obj/machinery/portable_atmospherics/pump/update_overlays()
. = ..()
if(holding)
@@ -79,14 +80,14 @@
on = FALSE
update_icon()
else if(on && holding && direction == PUMP_OUT)
- investigate_log("[key_name(user)] started a transfer into [holding]. ", INVESTIGATE_ATMOS)
+ investigate_log("[key_name(user)] started a transfer into [holding].", INVESTIGATE_ATMOS)
/obj/machinery/portable_atmospherics/pump/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.physical_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
- ui = new(user, src, ui_key, "portable_pump", name, 300, 315, master_ui, state)
+ ui = new(user, src, ui_key, "PortablePump", name, ui_x, ui_y, master_ui, state)
ui.open()
/obj/machinery/portable_atmospherics/pump/ui_data()
@@ -115,20 +116,20 @@
if("power")
on = !on
if(on && !holding)
- var/plasma = air_contents.gases[/datum/gas/plasma]
- var/n2o = air_contents.gases[/datum/gas/nitrous_oxide]
+ var/plasma = air_contents.get_moles(/datum/gas/plasma)
+ var/n2o = air_contents.get_moles(/datum/gas/nitrous_oxide)
if(n2o || plasma)
message_admins("[ADMIN_LOOKUPFLW(usr)] turned on a pump that contains [n2o ? "N2O" : ""][n2o && plasma ? " & " : ""][plasma ? "Plasma" : ""] at [ADMIN_VERBOSEJMP(src)]")
log_admin("[key_name(usr)] turned on a pump that contains [n2o ? "N2O" : ""][n2o && plasma ? " & " : ""][plasma ? "Plasma" : ""] at [AREACOORD(src)]")
else if(on && direction == PUMP_OUT)
- investigate_log("[key_name(usr)] started a transfer into [holding]. ", INVESTIGATE_ATMOS)
+ investigate_log("[key_name(usr)] started a transfer into [holding].", INVESTIGATE_ATMOS)
. = TRUE
if("direction")
if(direction == PUMP_OUT)
direction = PUMP_IN
else
if(on && holding)
- investigate_log("[key_name(usr)] started a transfer into [holding]. ", INVESTIGATE_ATMOS)
+ investigate_log("[key_name(usr)] started a transfer into [holding].", INVESTIGATE_ATMOS)
direction = PUMP_OUT
. = TRUE
if("pressure")
@@ -142,10 +143,6 @@
else if(pressure == "max")
pressure = PUMP_MAX_PRESSURE
. = TRUE
- else if(pressure == "input")
- pressure = input("New release pressure ([PUMP_MIN_PRESSURE]-[PUMP_MAX_PRESSURE] kPa):", name, pump.target_pressure) as num|null
- if(!isnull(pressure) && !..())
- . = TRUE
else if(text2num(pressure) != null)
pressure = text2num(pressure)
. = TRUE
@@ -154,7 +151,6 @@
investigate_log("was set to [pump.target_pressure] kPa by [key_name(usr)].", INVESTIGATE_ATMOS)
if("eject")
if(holding)
- holding.forceMove(drop_location())
- holding = null
+ replace_tank(usr, FALSE)
. = TRUE
update_icon()
diff --git a/code/modules/atmospherics/machinery/portable/scrubber.dm b/code/modules/atmospherics/machinery/portable/scrubber.dm
index 3dfce7c1bf..bc703b8bbd 100644
--- a/code/modules/atmospherics/machinery/portable/scrubber.dm
+++ b/code/modules/atmospherics/machinery/portable/scrubber.dm
@@ -2,6 +2,8 @@
name = "portable air scrubber"
icon_state = "pscrubber:0"
density = TRUE
+ ui_x = 320
+ ui_y = 350
var/on = FALSE
var/volume_rate = 1000
@@ -40,20 +42,13 @@
scrub(T.return_air())
/obj/machinery/portable_atmospherics/scrubber/proc/scrub(var/datum/gas_mixture/mixture)
- var/transfer_moles = min(1, volume_rate / mixture.volume) * mixture.total_moles()
+ var/transfer_moles = min(1, volume_rate / mixture.return_volume()) * mixture.total_moles()
var/datum/gas_mixture/filtering = mixture.remove(transfer_moles) // Remove part of the mixture to filter.
- var/datum/gas_mixture/filtered = new
if(!filtering)
return
- filtered.temperature = filtering.temperature
- for(var/gas in filtering.gases & scrubbing)
- filtered.gases[gas] = filtering.gases[gas] // Shuffle the "bad" gasses to the filtered mixture.
- filtering.gases[gas] = 0
- GAS_GARBAGE_COLLECT(filtering.gases)
-
- air_contents.merge(filtered) // Store filtered out gasses.
+ filtering.scrub_into(air_contents,scrubbing)
mixture.merge(filtering) // Returned the cleaned gas.
if(!holding)
air_update_turf()
@@ -71,7 +66,7 @@
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.physical_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
- ui = new(user, src, ui_key, "portable_scrubber", name, 320, 335, master_ui, state)
+ ui = new(user, src, ui_key, "PortableScrubber", name, ui_x, ui_y, master_ui, state)
ui.open()
/obj/machinery/portable_atmospherics/scrubber/ui_data()
diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm
index f841ae20ca..3426208fae 100644
--- a/code/modules/awaymissions/capture_the_flag.dm
+++ b/code/modules/awaymissions/capture_the_flag.dm
@@ -7,7 +7,7 @@
#define AMMO_DROP_LIFETIME 300
#define CTF_REQUIRED_PLAYERS 4
-/obj/item/twohanded/ctf
+/obj/item/ctf
name = "banner"
icon = 'icons/obj/items_and_weapons.dmi'
icon_state = "banner"
@@ -16,6 +16,7 @@
righthand_file = 'icons/mob/inhands/equipment/banners_righthand.dmi'
desc = "A banner with Nanotrasen's logo on it."
slowdown = 2
+ item_flags = SLOWS_WHILE_IN_HAND
throw_speed = 0
throw_range = 1
force = 200
@@ -28,16 +29,20 @@
var/obj/effect/ctf/flag_reset/reset
var/reset_path = /obj/effect/ctf/flag_reset
-/obj/item/twohanded/ctf/Destroy()
+/obj/item/ctf/Destroy()
QDEL_NULL(reset)
return ..()
-/obj/item/twohanded/ctf/Initialize()
+/obj/item/ctf/Initialize()
. = ..()
if(!reset)
reset = new reset_path(get_turf(src))
-/obj/item/twohanded/ctf/process()
+/obj/item/ctf/ComponentInitialize()
+ . = ..()
+ AddComponent(/datum/component/two_handed)
+
+/obj/item/ctf/process()
if(is_ctf_target(loc)) //don't reset from someone's hands.
return PROCESS_KILL
if(world.time > reset_cooldown)
@@ -48,8 +53,7 @@
to_chat(M, "\The [src] has been returned to base!")
STOP_PROCESSING(SSobj, src)
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/item/twohanded/ctf/attack_hand(mob/living/user)
+/obj/item/ctf/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
if(!is_ctf_target(user) && !anyonecanpickup)
to_chat(user, "Non players shouldn't be moving the flag!")
return
@@ -73,7 +77,7 @@
STOP_PROCESSING(SSobj, src)
..()
-/obj/item/twohanded/ctf/dropped(mob/user)
+/obj/item/ctf/dropped(mob/user)
..()
user.anchored = FALSE
user.status_flags |= CANPUSH
@@ -86,7 +90,7 @@
anchored = TRUE
-/obj/item/twohanded/ctf/red
+/obj/item/ctf/red
name = "red flag"
icon_state = "banner-red"
item_state = "banner-red"
@@ -95,7 +99,7 @@
reset_path = /obj/effect/ctf/flag_reset/red
-/obj/item/twohanded/ctf/blue
+/obj/item/ctf/blue
name = "blue flag"
icon_state = "banner-blue"
item_state = "banner-blue"
@@ -276,8 +280,8 @@
attack_ghost(ghost)
/obj/machinery/capture_the_flag/attackby(obj/item/I, mob/user, params)
- if(istype(I, /obj/item/twohanded/ctf))
- var/obj/item/twohanded/ctf/flag = I
+ if(istype(I, /obj/item/ctf))
+ var/obj/item/ctf/flag = I
if(flag.team != src.team)
user.transferItemToLoc(flag, get_turf(flag.reset), TRUE)
points++
@@ -294,7 +298,7 @@
if(istype(mob_area, /area/ctf))
to_chat(M, "[team] team wins!")
to_chat(M, "Teams have been cleared. Click on the machines to vote to begin another round.")
- for(var/obj/item/twohanded/ctf/W in M)
+ for(var/obj/item/ctf/W in M)
M.dropItemToGround(W)
M.dust()
for(var/obj/machinery/control_point/control in GLOB.machines)
@@ -335,7 +339,7 @@
var/list/ctf_object_typecache = typecacheof(list(
/obj/machinery,
/obj/effect/ctf,
- /obj/item/twohanded/ctf
+ /obj/item/ctf
))
for(var/atm in A)
if (isturf(A) || ismob(A) || isarea(A))
@@ -674,10 +678,7 @@
/obj/machinery/control_point/attackby(mob/user, params)
capture(user)
-/obj/machinery/control_point/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/machinery/control_point/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
capture(user)
/obj/machinery/control_point/proc/capture(mob/user)
diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm
index c11267a5f3..e68c45a84c 100644
--- a/code/modules/awaymissions/corpse.dm
+++ b/code/modules/awaymissions/corpse.dm
@@ -594,8 +594,7 @@
assignedrole = "Space Bar Patron"
job_description = "Space Bar Patron"
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/effect/mob_spawn/human/alive/space_bar_patron/attack_hand(mob/user)
+/obj/effect/mob_spawn/human/alive/space_bar_patron/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
var/despawn = alert("Return to cryosleep? (Warning, Your mob will be deleted!)",,"Yes","No")
if(despawn == "No" || !loc || !Adjacent(user))
return
@@ -661,5 +660,5 @@
/datum/outfit/lavaknight/captain
name ="Cydonian Knight Captain"
- l_pocket = /obj/item/twohanded/dualsaber/hypereutactic
+ l_pocket = /obj/item/dualsaber/hypereutactic
id = /obj/item/card/id/knight/captain
diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm
index 4f155d4174..157fdb7bc7 100644
--- a/code/modules/awaymissions/gateway.dm
+++ b/code/modules/awaymissions/gateway.dm
@@ -1,246 +1,329 @@
+/// Station home gateway
GLOBAL_DATUM(the_gateway, /obj/machinery/gateway/centerstation)
+/// List of possible gateway destinations.
+GLOBAL_LIST_EMPTY(gateway_destinations)
+
+/**
+ * Corresponds to single entry in gateway control.
+ *
+ * Will NOT be added automatically to GLOB.gateway_destinations list.
+ */
+/datum/gateway_destination
+ var/name = "Unknown Destination"
+ var/wait = 0 /// How long after roundstart this destination becomes active
+ var/enabled = TRUE /// If disabled, the destination won't be availible
+ var/hidden = FALSE /// Will not show on gateway controls at all.
+
+/* Can a gateway link to this destination right now. */
+/datum/gateway_destination/proc/is_availible()
+ return enabled && (world.time - SSticker.round_start_time >= wait)
+
+/* Returns user-friendly description why you can't connect to this destination, displayed in UI */
+/datum/gateway_destination/proc/get_availible_reason()
+ . = "Unreachable"
+ if(world.time - SSticker.round_start_time < wait)
+ . = "Connection desynchronized. Recalibration in progress."
+
+/* Check if the movable is allowed to arrive at this destination (exile implants mostly) */
+/datum/gateway_destination/proc/incoming_pass_check(atom/movable/AM)
+ return TRUE
+
+/* Get the actual turf we'll arrive at */
+/datum/gateway_destination/proc/get_target_turf()
+ CRASH("get target turf not implemented for this destination type")
+
+/* Called after moving the movable to target turf */
+/datum/gateway_destination/proc/post_transfer(atom/movable/AM)
+ if (ismob(AM))
+ var/mob/M = AM
+ if (M.client)
+ M.client.move_delay = max(world.time + 5, M.client.move_delay)
+
+/* Called when gateway activates with this destination. */
+/datum/gateway_destination/proc/activate(obj/machinery/gateway/activated)
+ return
+
+/* Called when gateway targeting this destination deactivates. */
+/datum/gateway_destination/proc/deactivate(obj/machinery/gateway/deactivated)
+ return
+
+/* Returns data used by gateway controller ui */
+/datum/gateway_destination/proc/get_ui_data()
+ . = list()
+ .["ref"] = REF(src)
+ .["name"] = name
+ .["availible"] = is_availible()
+ .["reason"] = get_availible_reason()
+ if(wait)
+ .["timeout"] = max(1 - (wait - (world.time - SSticker.round_start_time)) / wait, 0)
+
+/* Destination is another gateway */
+/datum/gateway_destination/gateway
+ /// The gateway this destination points at
+ var/obj/machinery/gateway/target_gateway
+
+/* We set the target gateway target to activator gateway */
+/datum/gateway_destination/gateway/activate(obj/machinery/gateway/activated)
+ if(!target_gateway.target)
+ target_gateway.activate(activated)
+
+/* We turn off the target gateway if it's linked with us */
+/datum/gateway_destination/gateway/deactivate(obj/machinery/gateway/deactivated)
+ if(target_gateway.target == deactivated.destination)
+ target_gateway.deactivate()
+
+/datum/gateway_destination/gateway/is_availible()
+ return ..() && target_gateway.calibrated && !target_gateway.target && target_gateway.powered()
+
+/datum/gateway_destination/gateway/get_availible_reason()
+ . = ..()
+ if(!target_gateway.calibrated)
+ . = "Exit gateway malfunction. Manual recalibration required."
+ if(target_gateway.target)
+ . = "Exit gateway in use."
+ if(!target_gateway.powered())
+ . = "Exit gateway unpowered."
+
+/datum/gateway_destination/gateway/get_target_turf()
+ return get_step(target_gateway.portal,SOUTH)
+
+/datum/gateway_destination/gateway/post_transfer(atom/movable/AM)
+ . = ..()
+ addtimer(CALLBACK(AM,/atom/movable.proc/setDir,SOUTH),0)
+
+/* Special home destination, so we can check exile implants */
+/datum/gateway_destination/gateway/home
+
+/datum/gateway_destination/gateway/home/incoming_pass_check(atom/movable/AM)
+ if(isliving(AM))
+ if(check_exile_implant(AM))
+ return FALSE
+ else
+ for(var/mob/living/L in AM.contents)
+ if(check_exile_implant(L))
+ target_gateway.say("Rejecting [AM]: Exile implant detected in contained lifeform.")
+ return FALSE
+ if(AM.has_buckled_mobs())
+ for(var/mob/living/L in AM.buckled_mobs)
+ if(check_exile_implant(L))
+ target_gateway.say("Rejecting [AM]: Exile implant detected in close proximity lifeform.")
+ return FALSE
+ return TRUE
+
+/datum/gateway_destination/gateway/home/proc/check_exile_implant(mob/living/L)
+ for(var/obj/item/implant/exile/E in L.implants)//Checking that there is an exile implant
+ to_chat(L, "The station gate has detected your exile implant and is blocking your entry.")
+ return TRUE
+ return FALSE
+
+
+/* Destination is one ore more turfs - created by landmarks */
+/datum/gateway_destination/point
+ var/list/target_turfs = list()
+ /// Used by away landmarks
+ var/id
+
+/datum/gateway_destination/point/get_target_turf()
+ return pick(target_turfs)
+
+/* Dense invisible object starting the teleportation. Created by gateways on activation. */
+/obj/effect/gateway_portal_bumper
+ var/obj/machinery/gateway/gateway
+ density = TRUE
+ invisibility = INVISIBILITY_ABSTRACT
+
+/obj/effect/gateway_portal_bumper/Bumped(atom/movable/AM)
+ if(get_dir(src,AM) == SOUTH)
+ gateway.Transfer(AM)
+
+/obj/effect/gateway_portal_bumper/Destroy(force)
+ . = ..()
+ gateway = null
/obj/machinery/gateway
name = "gateway"
desc = "A mysterious gateway built by unknown hands, it allows for faster than light travel to far-flung locations."
icon = 'icons/obj/machines/gateway.dmi'
icon_state = "off"
- density = TRUE
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
- var/active = 0
- var/checkparts = TRUE
- var/list/obj/effect/landmark/randomspawns = list()
+
+ // 3x2 offset by one row
+ pixel_x = -32
+ pixel_y = -32
+ bound_height = 64
+ bound_width = 96
+ bound_x = -32
+ bound_y = 0
+ density = TRUE
+
+ use_power = IDLE_POWER_USE
+ idle_power_usage = 100
+ active_power_usage = 5000
+
var/calibrated = TRUE
- var/list/linked = list()
- var/can_link = FALSE //Is this the centerpiece?
+ /// Type of instanced gateway destination, needs to be subtype of /datum/gateway_destination/gateway
+ var/destination_type = /datum/gateway_destination/gateway
+ /// Name of the generated destination
+ var/destination_name = "Unknown Gateway"
+ /// This is our own destination, pointing at this gateway
+ var/datum/gateway_destination/gateway/destination
+ /// This is current active destination
+ var/datum/gateway_destination/target
+ /// bumper object, the thing that starts actual teleport
+ var/obj/effect/gateway_portal_bumper/portal
/obj/machinery/gateway/Initialize()
- randomspawns = GLOB.awaydestinations
+ generate_destination()
update_icon()
- if(!istype(src, /obj/machinery/gateway/centerstation) && !istype(src, /obj/machinery/gateway/centeraway))
- switch(dir)
- if(SOUTH,SOUTHEAST,SOUTHWEST)
- density = FALSE
return ..()
-/obj/machinery/gateway/proc/toggleoff()
- for(var/obj/machinery/gateway/G in linked)
- G.active = 0
- G.update_icon()
- active = 0
+/obj/machinery/gateway/proc/generate_destination()
+ destination = new destination_type
+ destination.name = destination_name
+ destination.target_gateway = src
+ GLOB.gateway_destinations += destination
+
+/obj/machinery/gateway/proc/deactivate()
+ var/datum/gateway_destination/dest = target
+ target = null
+ dest.deactivate(src)
+ QDEL_NULL(portal)
+ if(use_power == ACTIVE_POWER_USE)
+ use_power = IDLE_POWER_USE
update_icon()
-/obj/machinery/gateway/proc/detect()
- if(!can_link)
- return FALSE
- linked = list() //clear the list
- var/turf/T = loc
- var/ready = FALSE
-
- for(var/i in GLOB.alldirs)
- T = get_step(loc, i)
- var/obj/machinery/gateway/G = locate(/obj/machinery/gateway) in T
- if(G)
- linked.Add(G)
- continue
-
- //this is only done if we fail to find a part
- ready = FALSE
- toggleoff()
- break
-
- if((linked.len == 8) || !checkparts)
- ready = TRUE
- return ready
+/obj/machinery/gateway/process()
+ if((stat & (NOPOWER)) && use_power)
+ if(target)
+ deactivate()
+ return
/obj/machinery/gateway/update_icon_state()
- icon_state = active ? "on" : "off"
+ if(target)
+ icon_state = "on"
+ else
+ icon_state = "off"
-/obj/machinery/gateway/attack_hand(mob/user)
- . = ..()
- if(.)
- return
- if(!detect())
- return
- if(!active)
- toggleon(user)
- return
- toggleoff()
-
-/obj/machinery/gateway/proc/toggleon(mob/user)
- return FALSE
-
-/obj/machinery/gateway/safe_throw_at()
+/obj/machinery/gateway/safe_throw_at(atom/target, range, speed, mob/thrower, spin = TRUE, diagonals_first = FALSE, datum/callback/callback, force = MOVE_FORCE_STRONG, gentle = FALSE)
return
+/obj/machinery/gateway/proc/generate_bumper()
+ portal = new(get_turf(src))
+ portal.gateway = src
+
+/obj/machinery/gateway/proc/activate(datum/gateway_destination/D)
+ if(!powered() || target)
+ return
+ target = D
+ target.activate(destination)
+ generate_bumper()
+ if(use_power == IDLE_POWER_USE)
+ use_power = ACTIVE_POWER_USE
+ update_icon()
+
+/obj/machinery/gateway/proc/Transfer(atom/movable/AM)
+ if(!target || !target.incoming_pass_check(AM))
+ return
+ AM.forceMove(target.get_target_turf())
+ target.post_transfer(AM)
+
+/* Station's primary gateway */
+/obj/machinery/gateway/centerstation
+ destination_type = /datum/gateway_destination/gateway/home
+ destination_name = "Home Gateway"
+
/obj/machinery/gateway/centerstation/Initialize()
. = ..()
if(!GLOB.the_gateway)
GLOB.the_gateway = src
- update_icon()
- wait = world.time + CONFIG_GET(number/gateway_delay) //+ thirty minutes default
- awaygate = locate(/obj/machinery/gateway/centeraway)
/obj/machinery/gateway/centerstation/Destroy()
if(GLOB.the_gateway == src)
GLOB.the_gateway = null
return ..()
-//this is da important part wot makes things go
-/obj/machinery/gateway/centerstation
- density = TRUE
- icon_state = "offcenter"
- use_power = IDLE_POWER_USE
-
- //warping vars
- var/wait = 0 //this just grabs world.time at world start
- var/obj/machinery/gateway/centeraway/awaygate = null
- can_link = TRUE
-
-/obj/machinery/gateway/centerstation/update_icon_state()
- icon_state = active ? "oncenter" : "offcenter"
-
-/obj/machinery/gateway/centerstation/process()
- if((stat & (NOPOWER)) && use_power)
- if(active)
- toggleoff()
- return
-
- if(active)
- use_power(5000)
-
-/obj/machinery/gateway/centerstation/toggleon(mob/user)
- if(!detect())
- return
- if(!powered())
- return
- if(!awaygate)
- to_chat(user, "Error: No destination found.")
- return
- if(world.time < wait)
- to_chat(user, "Error: Warpspace triangulation in progress. Estimated time to completion: [DisplayTimeText(wait - world.time)].")
- return
-
- for(var/obj/machinery/gateway/G in linked)
- G.active = 1
- G.update_icon()
- active = 1
- update_icon()
-
-//okay, here's the good teleporting stuff
-/obj/machinery/gateway/centerstation/Bumped(atom/movable/AM)
- if(!active)
- return
- if(!detect())
- return
- if(!awaygate || QDELETED(awaygate))
- return
-
- if(awaygate.calibrated)
- AM.forceMove(get_step(awaygate.loc, SOUTH))
- AM.setDir(SOUTH)
- if (ismob(AM))
- var/mob/M = AM
- if (M.client)
- M.client.move_delay = max(world.time + 5, M.client.move_delay)
- return
+/obj/machinery/gateway/multitool_act(mob/living/user, obj/item/I)
+ if(calibrated)
+ to_chat(user, "The gate is already calibrated, there is no work for you to do here.")
else
- var/obj/effect/landmark/dest = pick(randomspawns)
- if(dest)
- AM.forceMove(get_turf(dest))
- AM.setDir(SOUTH)
- use_power(5000)
- return
-
-/obj/machinery/gateway/centeraway/attackby(obj/item/W, mob/user, params)
- if(istype(W, /obj/item/multitool))
- if(calibrated)
- to_chat(user, "\black The gate is already calibrated, there is no work for you to do here.")
- return
- else
- to_chat(user, "Recalibration successful!: \black This gate's systems have been fine tuned. Travel to this gate will now be on target.")
- calibrated = TRUE
- return
-
-/////////////////////////////////////Away////////////////////////
-
-
-/obj/machinery/gateway/centeraway
- density = TRUE
- icon_state = "offcenter"
- use_power = NO_POWER_USE
- var/obj/machinery/gateway/centerstation/stationgate = null
- can_link = TRUE
-
-
-/obj/machinery/gateway/centeraway/Initialize()
- . = ..()
- update_icon()
- stationgate = locate(/obj/machinery/gateway/centerstation)
-
-
-/obj/machinery/gateway/centeraway/update_icon_state()
- icon_state = active ? "oncenter" : "offcenter"
-
-/obj/machinery/gateway/centeraway/toggleon(mob/user)
- if(!detect())
- return
- if(!stationgate)
- to_chat(user, "Error: No destination found.")
- return
-
- for(var/obj/machinery/gateway/G in linked)
- G.active = 1
- G.update_icon()
- active = 1
- update_icon()
-
-/obj/machinery/gateway/centeraway/proc/check_exile_implant(mob/living/L)
- for(var/obj/item/implant/exile/E in L.implants)//Checking that there is an exile implant
- to_chat(L, "\black The station gate has detected your exile implant and is blocking your entry.")
- return TRUE
- return FALSE
-
-/obj/machinery/gateway/centeraway/Bumped(atom/movable/AM)
- if(!detect())
- return
- if(!active)
- return
- if(!stationgate || QDELETED(stationgate))
- return
- if(isliving(AM))
- if(check_exile_implant(AM))
- return
- else
- for(var/mob/living/L in AM.contents)
- if(check_exile_implant(L))
- say("Rejecting [AM]: Exile implant detected in contained lifeform.")
- return
- if(AM.has_buckled_mobs())
- for(var/mob/living/L in AM.buckled_mobs)
- if(check_exile_implant(L))
- say("Rejecting [AM]: Exile implant detected in close proximity lifeform.")
- return
- AM.forceMove(get_step(stationgate.loc, SOUTH))
- AM.setDir(SOUTH)
- if (ismob(AM))
- var/mob/M = AM
- if (M.client)
- M.client.move_delay = max(world.time + 5, M.client.move_delay)
-
-
-/obj/machinery/gateway/centeraway/admin
- desc = "A mysterious gateway built by unknown hands, this one seems more compact."
-
-/obj/machinery/gateway/centeraway/admin/Initialize()
- . = ..()
- if(stationgate && !stationgate.awaygate)
- stationgate.awaygate = src
-
-/obj/machinery/gateway/centeraway/admin/detect()
+ to_chat(user, "Recalibration successful!: \black This gate's systems have been fine tuned. Travel to this gate will now be on target.")
+ calibrated = TRUE
return TRUE
+/* Doesn't need control console or power, always links to home when interacting. */
+/obj/machinery/gateway/away
+ density = TRUE
+ use_power = NO_POWER_USE
+
+/obj/machinery/gateway/away/interact(mob/user, special_state)
+ . = ..()
+ if(!target)
+ if(!GLOB.the_gateway)
+ to_chat(user,"Home gateway is not responding!")
+ if(GLOB.the_gateway.target)
+ to_chat(user,"Home gateway already in use!")
+ return
+ activate(GLOB.the_gateway.destination)
+ else
+ deactivate()
+
+/* Gateway control computer */
+/obj/machinery/computer/gateway_control
+ name = "Gateway Control"
+ desc = "Human friendly interface to the mysterious gate next to it."
+ var/obj/machinery/gateway/G
+
+/obj/machinery/computer/gateway_control/Initialize(mapload, obj/item/circuitboard/C)
+ . = ..()
+ try_to_linkup()
+
+/obj/machinery/computer/gateway_control/ui_interact(mob/user, ui_key = "main", datum/tgui/ui, force_open, datum/tgui/master_ui, 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, "Gateway", name, ui_x, ui_y, master_ui, state)
+ ui.open()
+
+/obj/machinery/computer/gateway_control/ui_data(mob/user)
+ . = ..()
+ .["gateway_present"] = G
+ .["gateway_status"] = G ? G.powered() : FALSE
+ .["current_target"] = G?.target?.get_ui_data()
+ var/list/destinations = list()
+ if(G)
+ for(var/datum/gateway_destination/D in GLOB.gateway_destinations)
+ if(D == G.destination)
+ continue
+ destinations += list(D.get_ui_data())
+ .["destinations"] = destinations
+
+/obj/machinery/computer/gateway_control/ui_act(action, list/params)
+ . = ..()
+ if(.)
+ return
+ switch(action)
+ if("linkup")
+ try_to_linkup()
+ return TRUE
+ if("activate")
+ var/datum/gateway_destination/D = locate(params["destination"]) in GLOB.gateway_destinations
+ try_to_connect(D)
+ return TRUE
+ if("deactivate")
+ if(G && G.target)
+ G.deactivate()
+ return TRUE
+
+/obj/machinery/computer/gateway_control/proc/try_to_linkup()
+ G = locate(/obj/machinery/gateway) in view(7,get_turf(src))
+
+/obj/machinery/computer/gateway_control/proc/try_to_connect(datum/gateway_destination/D)
+ if(!D || !G)
+ return
+ if(!D.is_availible() || G.target)
+ return
+ G.activate(D)
/obj/item/paper/fluff/gateway
- info = "Congratulations,
Your station has been selected to carry out the Gateway Project.
The equipment will be shipped to you at the start of the next quarter. You are to prepare a secure location to house the equipment as outlined in the attached documents.
--Nanotrasen Blue Space Research"
+ info = "Congratulations,
Your station has been selected to carry out the Gateway Project.
The equipment will be shipped to you at the start of the next quarter. You are to prepare a secure location to house the equipment as outlined in the attached documents.
--Nanotrasen Bluespace Research"
name = "Confidential Correspondence, Pg 1"
diff --git a/code/modules/awaymissions/mission_code/Academy.dm b/code/modules/awaymissions/mission_code/Academy.dm
index f714a86f22..129e6d7a2b 100644
--- a/code/modules/awaymissions/mission_code/Academy.dm
+++ b/code/modules/awaymissions/mission_code/Academy.dm
@@ -189,6 +189,8 @@
if(!ishuman(user) || !user.mind || (user.mind in SSticker.mode.wizards))
to_chat(user, "You feel the magic of the dice is restricted to ordinary humans! You should leave it alone.")
user.dropItemToGround(src)
+ return
+ return ..()
/obj/item/dice/d20/fate/proc/effect(var/mob/living/carbon/human/user,roll)
diff --git a/code/modules/awaymissions/mission_code/Cabin.dm b/code/modules/awaymissions/mission_code/Cabin.dm
index a13fecd11c..1b099a22db 100644
--- a/code/modules/awaymissions/mission_code/Cabin.dm
+++ b/code/modules/awaymissions/mission_code/Cabin.dm
@@ -1,20 +1,39 @@
/*Cabin areas*/
-/area/awaymission/snowforest
- name = "Snow Forest"
- icon_state = "away"
- requires_power = FALSE
- dynamic_lighting = DYNAMIC_LIGHTING_ENABLED
-
/area/awaymission/cabin
name = "Cabin"
icon_state = "away2"
requires_power = TRUE
dynamic_lighting = DYNAMIC_LIGHTING_ENABLED
-/area/awaymission/snowforest/lumbermill
+/area/awaymission/cabin/snowforest
+ name = "Snow Forest"
+ icon_state = "away"
+ dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
+
+/area/awaymission/cabin/snowforest/sovietsurface
+ name = "Snow Forest"
+ icon_state = "awaycontent29"
+ requires_power = FALSE
+
+/area/awaymission/cabin/lumbermill
name = "Lumbermill"
icon_state = "away3"
+ requires_power = FALSE
+ dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
+
+/area/awaymission/cabin/caves/sovietcave
+ name = "Soviet Bunker"
+ icon_state = "awaycontent4"
+
+/area/awaymission/cabin/caves
+ name = "North Snowdin Caves"
+ icon_state = "awaycontent15"
+ dynamic_lighting = DYNAMIC_LIGHTING_FORCED
+
+/area/awaymission/cabin/caves/mountain
+ name = "North Snowdin Mountains"
+ icon_state = "awaycontent24"
/obj/structure/firepit
name = "firepit"
@@ -92,7 +111,7 @@
egg_type = null
speak = list()
-/*Cabin's forest*/
+/*Cabin's forest. Removed in the new cabin map since it was buggy and I prefer manual placement.*/
/datum/mapGenerator/snowy
modules = list(/datum/mapGeneratorModule/bottomlayer/snow, \
/datum/mapGeneratorModule/snow/pineTrees, \
@@ -136,4 +155,4 @@
endTurfX = 159
endTurfY = 157
startTurfX = 37
- startTurfY = 35
+ startTurfY = 35
\ No newline at end of file
diff --git a/code/modules/awaymissions/mission_code/snowdin.dm b/code/modules/awaymissions/mission_code/snowdin.dm
index fc797d227c..c7e2609436 100644
--- a/code/modules/awaymissions/mission_code/snowdin.dm
+++ b/code/modules/awaymissions/mission_code/snowdin.dm
@@ -475,43 +475,26 @@
/obj/effect/spawner/lootdrop/snowdin/dungeonlite
name = "dungeon lite"
- loot = list(/obj/item/melee/classic_baton = 11,
- /obj/item/melee/classic_baton/telescopic = 12,
- /obj/item/book/granter/spell/smoke = 10,
+ loot = list(/obj/item/book/granter/spell/smoke = 10,
/obj/item/book/granter/spell/blind = 10,
/obj/item/storage/firstaid/regular = 45,
/obj/item/storage/firstaid/toxin = 35,
/obj/item/storage/firstaid/brute = 27,
/obj/item/storage/firstaid/fire = 27,
/obj/item/storage/toolbox/syndicate = 12,
- /obj/item/grenade/plastic/c4 = 7,
/obj/item/grenade/clusterbuster/smoke = 15,
/obj/item/clothing/under/chameleon = 13,
- /obj/item/clothing/shoes/chameleon/noslip = 10,
/obj/item/borg/upgrade/ddrill = 3)
/obj/effect/spawner/lootdrop/snowdin/dungeonmid
name = "dungeon mid"
- loot = list(/obj/item/defibrillator/compact = 6,
- /obj/item/storage/firstaid/tactical = 35,
- /obj/item/shield/energy = 6,
- /obj/item/shield/riot/tele = 12,
- /obj/item/dnainjector/lasereyesmut = 7,
- /obj/item/gun/magic/wand/fireball/inert = 3,
+ loot = list(/obj/item/shield/riot = 12,
/obj/item/pneumatic_cannon = 15,
- /obj/item/melee/transforming/energy/sword = 7,
- /obj/item/book/granter/spell/knock = 15,
- /obj/item/book/granter/spell/summonitem = 20,
- /obj/item/book/granter/spell/forcewall = 17,
/obj/item/storage/backpack/holding = 12,
- /obj/item/grenade/spawnergrenade/manhacks = 6,
- /obj/item/grenade/spawnergrenade/spesscarp = 7,
- /obj/item/grenade/clusterbuster/inferno = 3,
/obj/item/stack/sheet/mineral/diamond{amount = 15} = 10,
/obj/item/stack/sheet/mineral/uranium{amount = 15} = 10,
/obj/item/stack/sheet/mineral/plasma{amount = 15} = 10,
/obj/item/stack/sheet/mineral/gold{amount = 15} = 10,
- /obj/item/book/granter/spell/barnyard = 4,
/obj/item/pickaxe/drill/diamonddrill = 6,
/obj/item/borg/upgrade/vtec = 7,
/obj/item/borg/upgrade/disablercooler = 7)
@@ -519,21 +502,12 @@
/obj/effect/spawner/lootdrop/snowdin/dungeonheavy
name = "dungeon heavy"
- loot = list(/obj/item/twohanded/singularityhammer = 25,
- /obj/item/twohanded/mjollnir = 10,
- /obj/item/twohanded/fireaxe = 25,
+ loot = list(/obj/item/fireaxe = 25,
/obj/item/organ/brain/alien = 17,
- /obj/item/twohanded/dualsaber = 15,
- /obj/item/organ/heart/demon = 7,
- /obj/item/gun/ballistic/automatic/c20r/unrestricted = 16,
- /obj/item/gun/magic/wand/resurrection/inert = 15,
- /obj/item/gun/magic/wand/resurrection = 10,
- /obj/item/uplink/old = 2,
- /obj/item/book/granter/spell/charge = 12,
- /obj/item/grenade/clusterbuster/spawner_manhacks = 15,
- /obj/item/book/granter/spell/fireball = 10,
+ /obj/item/organ/heart/cursed = 7,
+ /obj/item/book/granter/spell/forcewall = 17,
+ /obj/item/gun/magic/wand/fireball/inert = 3,
/obj/item/pickaxe/drill/jackhammer = 30,
- /obj/item/borg/upgrade/syndicate = 13,
/obj/item/borg/upgrade/selfrepair = 17)
/obj/effect/spawner/lootdrop/snowdin/dungeonmisc
@@ -544,7 +518,7 @@
loot = list(/obj/item/stack/sheet/mineral/snow{amount = 25} = 10,
/obj/item/toy/snowball = 15,
/obj/item/shovel = 10,
- /obj/item/twohanded/spear = 8,
+ /obj/item/spear = 8,
)
//special items//--
diff --git a/code/modules/awaymissions/mission_code/spacebattle.dm b/code/modules/awaymissions/mission_code/spacebattle.dm
deleted file mode 100644
index a477a223b2..0000000000
--- a/code/modules/awaymissions/mission_code/spacebattle.dm
+++ /dev/null
@@ -1,51 +0,0 @@
-//Spacebattle Areas
-
-/area/awaymission/spacebattle
- name = "Space Battle"
- icon_state = "awaycontent1"
- requires_power = FALSE
-
-/area/awaymission/spacebattle/cruiser
- name = "Nanotrasen Cruiser"
- icon_state = "awaycontent2"
-
-/area/awaymission/spacebattle/syndicate1
- name = "Syndicate Assault Ship 1"
- icon_state = "awaycontent3"
-
-/area/awaymission/spacebattle/syndicate2
- name = "Syndicate Assault Ship 2"
- icon_state = "awaycontent4"
-
-/area/awaymission/spacebattle/syndicate3
- name = "Syndicate Assault Ship 3"
- icon_state = "awaycontent5"
-
-/area/awaymission/spacebattle/syndicate4
- name = "Syndicate War Sphere 1"
- icon_state = "awaycontent6"
-
-/area/awaymission/spacebattle/syndicate5
- name = "Syndicate War Sphere 2"
- icon_state = "awaycontent7"
-
-/area/awaymission/spacebattle/syndicate6
- name = "Syndicate War Sphere 3"
- icon_state = "awaycontent8"
-
-/area/awaymission/spacebattle/syndicate7
- name = "Syndicate Fighter"
- icon_state = "awaycontent9"
-
-/area/awaymission/spacebattle/secret
- name = "Hidden Chamber"
- icon_state = "awaycontent10"
-
-/mob/living/simple_animal/hostile/syndicate/ranged/spacebattle
- loot = list(/obj/effect/mob_spawn/human/corpse/syndicatesoldier,
- /obj/item/gun/ballistic/automatic/c20r,
- /obj/item/shield/energy)
-
-/mob/living/simple_animal/hostile/syndicate/melee/spacebattle
- deathmessage = "falls limp as they release their grip from the energy weapons, activating their self-destruct function!"
- loot = list(/obj/effect/mob_spawn/human/corpse/syndicatesoldier)
diff --git a/code/modules/awaymissions/zlevel.dm b/code/modules/awaymissions/zlevel.dm
index 6c8d8287d8..1e2e1fe43c 100644
--- a/code/modules/awaymissions/zlevel.dm
+++ b/code/modules/awaymissions/zlevel.dm
@@ -15,24 +15,28 @@
INIT_ANNOUNCE("Loaded [name] in [(REALTIMEOFDAY - start_time)/10]s!")
GLOB.random_zlevels_generated[name] = TRUE
-/proc/reset_gateway_spawns(reset = FALSE)
- for(var/obj/machinery/gateway/G in world)
- if(reset)
- G.randomspawns = GLOB.awaydestinations
- else
- G.randomspawns.Add(GLOB.awaydestinations)
-
/obj/effect/landmark/awaystart
name = "away mission spawn"
desc = "Randomly picked away mission spawn points."
+ var/id
+ var/delay = TRUE // If the generated destination should be delayed by configured gateway delay
-/obj/effect/landmark/awaystart/New()
- GLOB.awaydestinations += src
- ..()
+/obj/effect/landmark/awaystart/Initialize()
+ . = ..()
+ var/datum/gateway_destination/point/current
+ for(var/datum/gateway_destination/point/D in GLOB.gateway_destinations)
+ if(D.id == id)
+ current = D
+ if(!current)
+ current = new
+ current.id = id
+ if(delay)
+ current.wait = CONFIG_GET(number/gateway_delay)
+ GLOB.gateway_destinations += current
+ current.target_turfs += get_turf(src)
-/obj/effect/landmark/awaystart/Destroy()
- GLOB.awaydestinations -= src
- return ..()
+/obj/effect/landmark/awaystart/nodelay
+ delay = FALSE
/proc/generateMapList(filename)
. = list()
diff --git a/code/modules/cargo/bounties/assistant.dm b/code/modules/cargo/bounties/assistant.dm
index 4af28d78cc..744c01a257 100644
--- a/code/modules/cargo/bounties/assistant.dm
+++ b/code/modules/cargo/bounties/assistant.dm
@@ -31,7 +31,7 @@
description = "CentCom's security forces are going through budget cuts. You will be paid if you ship a set of spears."
reward = 1000
required_count = 5
- wanted_types = list(/obj/item/twohanded/spear)
+ wanted_types = list(/obj/item/spear)
/datum/bounty/item/assistant/toolbox
name = "Toolboxes"
@@ -134,7 +134,7 @@
description = "Central Command is looking to commission a new BirdBoat-class station. You've been ordered to supply the potted plants."
reward = 2000
required_count = 8
- wanted_types = list(/obj/item/twohanded/required/kirbyplants)
+ wanted_types = list(/obj/item/kirbyplants)
// /datum/bounty/item/assistant/earmuffs
// name = "Earmuffs"
@@ -160,7 +160,7 @@
name = "Chainsaw"
description = "The chef at CentCom is having trouble butchering her animals. She requests one chainsaw, please."
reward = 2500
- wanted_types = list(/obj/item/twohanded/required/chainsaw)
+ wanted_types = list(/obj/item/chainsaw)
/datum/bounty/item/assistant/ied
name = "IED"
diff --git a/code/modules/cargo/bounties/engineering.dm b/code/modules/cargo/bounties/engineering.dm
index 99e6aa2bdc..b84fd2ca2c 100644
--- a/code/modules/cargo/bounties/engineering.dm
+++ b/code/modules/cargo/bounties/engineering.dm
@@ -10,9 +10,7 @@
if(!..())
return FALSE
var/obj/item/tank/T = O
- if(!T.air_contents.gases[gas_type])
- return FALSE
- return T.air_contents.gases[gas_type] >= moles_required
+ return T.air_contents.get_moles(gas_type) >= moles_required
//datum/bounty/item/engineering/gas/nitryl_tank
// name = "Full Tank of Nitryl"
diff --git a/code/modules/cargo/bounties/mining.dm b/code/modules/cargo/bounties/mining.dm
index 1f3266af62..cd8d5707d8 100644
--- a/code/modules/cargo/bounties/mining.dm
+++ b/code/modules/cargo/bounties/mining.dm
@@ -22,7 +22,7 @@
name = "Bone Axe"
description = "Station 12 has had their fire axes stolen by marauding clowns. Ship them a bone axe as a replacement."
reward = 3500
- wanted_types = list(/obj/item/twohanded/fireaxe/boneaxe)
+ wanted_types = list(/obj/item/fireaxe/boneaxe)
/datum/bounty/item/mining/bone_armor
name = "Bone Armor"
diff --git a/code/modules/cargo/bounties/science.dm b/code/modules/cargo/bounties/science.dm
index a4632f7ed0..ffa608f8fd 100644
--- a/code/modules/cargo/bounties/science.dm
+++ b/code/modules/cargo/bounties/science.dm
@@ -119,7 +119,7 @@
/datum/bounty/item/science/noneactive_reactivearmor
name = "Reactive Armor Shells"
- description = "Do to the breakthroughs in anomalies, we can not keep up in making reactive armor shells, can you send us a few?"
+ description = "Due to the breakthroughs in anomalies, we can not keep up in making reactive armor shells, can you send us a few?"
reward = 2000
required_count = 5
wanted_types = list(/obj/item/reactive_armour_shell, /obj/item/clothing/suit/armor/reactive)
@@ -138,14 +138,14 @@
/datum/bounty/item/science/anomaly_neutralizer
name = "Anomaly Neutralizers"
- description = "An idea for a long time was to use an unstable Supermatter Shard to help create the breeding grounds for an unstable part of space to harvest any anomalies we want. It worked a little too well and now were out of anomaly neutralizers please send us a baker's dozen."
+ description = "An idea for a long time was to use an unstable Supermatter Shard to help create the breeding grounds for an unstable part of space to harvest any anomalies we want. It worked a little too well and now we're out of anomaly neutralizers, please send us a baker's dozen."
reward = 2500
required_count = 13
wanted_types = list(/obj/item/anomaly_neutralizer)
/datum/bounty/item/science/integrated_circuit_printer
name = "Integrated Circuit Printer"
- description = "due to a paperwork error, a newly made integrated circuit manufacturer line is missing three of its printers needed to operate. Until the paper work is corrected we are outsourcing this problem, so please send us three integrated circuit printers."
+ description = "Due to a paperwork error, a newly made integrated circuit manufacturer line is missing three of its printers needed to operate. Until the paper work is corrected we are outsourcing this problem, so please send us three integrated circuit printers."
reward = 2000
required_count = 3
wanted_types = list(/obj/item/integrated_circuit_printer)
@@ -159,7 +159,7 @@
/datum/bounty/item/science/nanite_trash
name = "Nanite Based Gear"
- description = "CC wants to make nanite based gear available to a new wing of devolvement but lacks the hand held tools to get it full up and running. Please send us any you have."
+ description = "CC wants to make nanite based gear available to a new wing of development but lacks the hand held tools to get it fully up and running. Please send us any you have."
reward = 2500
required_count = 20 //Its just metal
wanted_types = list( /obj/item/nanite_remote, /obj/item/nanite_remote/comm, /obj/item/nanite_scanner)
diff --git a/code/modules/cargo/centcom_podlauncher.dm b/code/modules/cargo/centcom_podlauncher.dm
index 3418f78dbd..f33ea7059b 100644
--- a/code/modules/cargo/centcom_podlauncher.dm
+++ b/code/modules/cargo/centcom_podlauncher.dm
@@ -55,7 +55,7 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
- ui = new(user, src, ui_key, "centcom_podlauncher", "Config/Launch Supplypod", 700, 700, master_ui, state)
+ ui = new(user, src, ui_key, "CentcomPodLauncher", "Config/Launch Supplypod", 700, 700, master_ui, state)
ui.open()
/datum/centcom_podlauncher/ui_data(mob/user) //Sends info about the pod to the UI.
diff --git a/code/modules/cargo/console.dm b/code/modules/cargo/console.dm
index 6968a5ccd8..8a438a1342 100644
--- a/code/modules/cargo/console.dm
+++ b/code/modules/cargo/console.dm
@@ -18,6 +18,7 @@
var/obj/item/radio/headset/radio
/// var that tracks message cooldown
var/message_cooldown
+ var/list/loaded_coupons
light_color = "#E2853D"//orange
@@ -73,7 +74,7 @@
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, "cargo", name, ui_x, ui_y, master_ui, state)
+ ui = new(user, src, ui_key, "Cargo", name, ui_x, ui_y, master_ui, state)
ui.open()
/obj/machinery/computer/cargo/ui_data()
@@ -134,6 +135,8 @@
"cost" = P.cost,
"id" = pack,
"desc" = P.desc || P.name, // If there is a description, use it. Otherwise use the pack's name.
+ "private_goody" = P.goody == PACK_GOODY_PRIVATE,
+ "goody" = P.goody == PACK_GOODY_PUBLIC,
"access" = P.access,
"can_private_buy" = P.can_private_buy
))
@@ -215,8 +218,22 @@
if(isnull(reason) || ..())
return
+ if(pack.goody == PACK_GOODY_PRIVATE && !self_paid)
+ playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE)
+ say("ERROR: Private small crates may only be purchased by private accounts.")
+ return
+
+ var/obj/item/coupon/applied_coupon
+ for(var/i in loaded_coupons)
+ var/obj/item/coupon/coupon_check = i
+ if(pack.type == coupon_check.discounted_pack)
+ say("Coupon found! [round(coupon_check.discount_pct_off * 100)]% off applied!")
+ coupon_check.moveToNullspace()
+ applied_coupon = coupon_check
+ break
+
var/turf/T = get_turf(src)
- var/datum/supply_order/SO = new(pack, name, rank, ckey, reason, account)
+ var/datum/supply_order/SO = new(pack, name, rank, ckey, reason, account, applied_coupon)
SO.generateRequisition(T)
if(requestonly && !self_paid)
SSshuttle.requestlist += SO
@@ -229,6 +246,9 @@
var/id = text2num(params["id"])
for(var/datum/supply_order/SO in SSshuttle.shoppinglist)
if(SO.id == id)
+ if(SO.applied_coupon)
+ say("Coupon refunded.")
+ SO.applied_coupon.forceMove(get_turf(src))
SSshuttle.shoppinglist -= SO
. = TRUE
break
diff --git a/code/modules/cargo/coupon.dm b/code/modules/cargo/coupon.dm
new file mode 100644
index 0000000000..1c1f2a36e1
--- /dev/null
+++ b/code/modules/cargo/coupon.dm
@@ -0,0 +1,52 @@
+
+#define COUPON_OMEN "omen"
+
+/obj/item/coupon
+ name = "coupon"
+ desc = "It doesn't matter if you didn't want it before, what matters now is that you've got a coupon for it!"
+ icon_state = "data_1"
+ icon = 'icons/obj/card.dmi'
+ item_flags = NOBLUDGEON
+ w_class = WEIGHT_CLASS_TINY
+ attack_speed = CLICK_CD_RAPID
+ var/datum/supply_pack/discounted_pack
+ var/discount_pct_off = 0.05
+ var/obj/machinery/computer/cargo/inserted_console
+
+/// Choose what our prize is :D
+/obj/item/coupon/proc/generate()
+ discounted_pack = pick(subtypesof(/datum/supply_pack/goody))
+ var/list/chances = list("0.10" = 4, "0.15" = 8, "0.20" = 10, "0.25" = 8, "0.50" = 4, COUPON_OMEN = 1)
+ discount_pct_off = pickweight(chances)
+ if(discount_pct_off == COUPON_OMEN)
+ name = "coupon - fuck you"
+ desc = "The small text reads, 'You will be slaughtered'... That doesn't sound right, does it?"
+ if(ismob(loc))
+ var/mob/M = loc
+ to_chat(M, "The coupon reads 'fuck you' in large, bold text... is- is that a prize, or?")
+ M.AddComponent(/datum/component/omen, TRUE, src)
+ else
+ discount_pct_off = text2num(discount_pct_off)
+ name = "coupon - [round(discount_pct_off * 100)]% off [initial(discounted_pack.name)]"
+
+/obj/item/coupon/attack_obj(obj/O, mob/living/user)
+ if(!istype(O, /obj/machinery/computer/cargo))
+ return ..()
+ if(discount_pct_off == COUPON_OMEN)
+ to_chat(user, "\The [O] validates the coupon as authentic, but refuses to accept it...")
+ O.say("Coupon fulfillment already in progress...")
+ user.DelayNextAction()
+ return
+
+ inserted_console = O
+ LAZYADD(inserted_console.loaded_coupons, src)
+ inserted_console.say("Coupon for [initial(discounted_pack.name)] applied!")
+ forceMove(inserted_console)
+
+/obj/item/coupon/Destroy()
+ if(inserted_console)
+ LAZYREMOVE(inserted_console.loaded_coupons, src)
+ inserted_console = null
+ . = ..()
+
+#undef COUPON_OMEN
diff --git a/code/modules/cargo/exports/large_objects.dm b/code/modules/cargo/exports/large_objects.dm
index 2b93a25a61..2943130a19 100644
--- a/code/modules/cargo/exports/large_objects.dm
+++ b/code/modules/cargo/exports/large_objects.dm
@@ -169,15 +169,13 @@
/datum/export/large/gas_canister/get_cost(obj/O)
var/obj/machinery/portable_atmospherics/canister/C = O
var/worth = 10
- var/gases = C.air_contents.gases
-
- worth += gases[/datum/gas/bz]*3
- worth += gases[/datum/gas/stimulum]*25
- worth += gases[/datum/gas/hypernoblium]*1000
- worth += gases[/datum/gas/miasma]*2
- worth += gases[/datum/gas/tritium]*7
- worth += gases[/datum/gas/pluoxium]*6
- worth += gases[/datum/gas/nitryl]*30
+ worth += C.air_contents.get_moles(/datum/gas/bz)*3
+ worth += C.air_contents.get_moles(/datum/gas/stimulum)*25
+ worth += C.air_contents.get_moles(/datum/gas/hypernoblium)*1000
+ worth += C.air_contents.get_moles(/datum/gas/miasma)*2
+ worth += C.air_contents.get_moles(/datum/gas/tritium)*7
+ worth += C.air_contents.get_moles(/datum/gas/pluoxium)*6
+ worth += C.air_contents.get_moles(/datum/gas/nitryl)*30
return worth
@@ -303,7 +301,7 @@
export_types = list(/obj/mecha/combat/durand)
/datum/export/large/mech/phazon
- cost = 35000 //Little over half do to needing a core
+ cost = 35000 //Little over half due to needing a core
unit_name = "working phazon"
export_types = list(/obj/mecha/combat/phazon)
diff --git a/code/modules/cargo/exports/organs_robotics.dm b/code/modules/cargo/exports/organs_robotics.dm
index a6c5ee93ca..7f54e675ca 100644
--- a/code/modules/cargo/exports/organs_robotics.dm
+++ b/code/modules/cargo/exports/organs_robotics.dm
@@ -144,7 +144,7 @@
/datum/export/robotics/surgery_gear_basic
cost = 10
unit_name = "surgery tool"
- export_types = list(/obj/item/retractor, /obj/item/hemostat, /obj/item/cautery, /obj/item/surgicaldrill, /obj/item/scalpel, /obj/item/circular_saw, /obj/item/surgical_drapes)
+ export_types = list(/obj/item/retractor, /obj/item/hemostat, /obj/item/cautery, /obj/item/surgicaldrill, /obj/item/scalpel, /obj/item/circular_saw, /obj/item/bonesetter, /obj/item/surgical_drapes)
/datum/export/robotics/mech_weapon_laser
cost = 300 //Sadly just metal and glass
diff --git a/code/modules/cargo/exports/sheets.dm b/code/modules/cargo/exports/sheets.dm
index 120bfbe5e4..a562210164 100644
--- a/code/modules/cargo/exports/sheets.dm
+++ b/code/modules/cargo/exports/sheets.dm
@@ -155,3 +155,10 @@
cost = 30
message = "of paperframes"
export_types = list(/obj/item/stack/sheet/paperframes)
+
+/datum/export/stack/telecrystal
+ unit_name = "raw"
+ cost = 1000
+ message = "telecrystals"
+ export_types = list(/obj/item/stack/telecrystal)
+
diff --git a/code/modules/cargo/exports/tools.dm b/code/modules/cargo/exports/tools.dm
index a889f0ed13..6769dfec40 100644
--- a/code/modules/cargo/exports/tools.dm
+++ b/code/modules/cargo/exports/tools.dm
@@ -1,5 +1,5 @@
/datum/export/tool
- k_elasticity = 1/500 //Tool selling almost allways fine a target
+ k_elasticity = 1/500 //Tool selling almost always find a target
/datum/export/tool/toolbox
cost = 6
diff --git a/code/modules/cargo/exports/weapons.dm b/code/modules/cargo/exports/weapons.dm
index 2342603bde..983348a358 100644
--- a/code/modules/cargo/exports/weapons.dm
+++ b/code/modules/cargo/exports/weapons.dm
@@ -267,7 +267,7 @@
/datum/export/weapon/duelsaber
cost = 360 //Get it?
unit_name = "energy saber"
- export_types = list(/obj/item/twohanded/dualsaber)
+ export_types = list(/obj/item/dualsaber)
/datum/export/weapon/esword
cost = 130
diff --git a/code/modules/cargo/expressconsole.dm b/code/modules/cargo/expressconsole.dm
index 9fe427c45a..dc7e4b5a06 100644
--- a/code/modules/cargo/expressconsole.dm
+++ b/code/modules/cargo/expressconsole.dm
@@ -13,6 +13,8 @@
All sales are near instantaneous - please choose carefully"
icon_screen = "supply_express"
circuit = /obj/item/circuitboard/computer/cargo/express
+ ui_x = 600
+ ui_y = 700
blockade_warning = "Bluespace instability detected. Delivery impossible."
req_access = list(ACCESS_QM)
var/message
@@ -90,7 +92,7 @@
/obj/machinery/computer/cargo/express/ui_interact(mob/living/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) // Remember to use the appropriate state.
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
- ui = new(user, src, ui_key, "cargo_express", name, 600, 700, master_ui, state)
+ ui = new(user, src, ui_key, "CargoExpress", name, ui_x, ui_y, master_ui, state)
ui.open()
/obj/machinery/computer/cargo/express/ui_data(mob/user)
diff --git a/code/modules/cargo/order.dm b/code/modules/cargo/order.dm
index 3d1caf6ba6..4fa6a4eade 100644
--- a/code/modules/cargo/order.dm
+++ b/code/modules/cargo/order.dm
@@ -27,10 +27,12 @@
var/orderer_rank
var/orderer_ckey
var/reason
+ var/discounted_pct
var/datum/supply_pack/pack
var/datum/bank_account/paying_account
+ var/obj/item/coupon/applied_coupon
-/datum/supply_order/New(datum/supply_pack/pack, orderer, orderer_rank, orderer_ckey, reason, paying_account)
+/datum/supply_order/New(datum/supply_pack/pack, orderer, orderer_rank, orderer_ckey, reason, paying_account, coupon)
id = SSshuttle.ordernum++
src.pack = pack
src.orderer = orderer
@@ -38,6 +40,7 @@
src.orderer_ckey = orderer_ckey
src.reason = reason
src.paying_account = paying_account
+ src.applied_coupon = coupon
/datum/supply_order/proc/generateRequisition(turf/T)
var/obj/item/paper/P = new(T)
@@ -57,58 +60,64 @@
P.update_icon()
return P
-/datum/supply_order/proc/generateManifest(obj/structure/closet/crate/C)
- var/obj/item/paper/fluff/jobs/cargo/manifest/P = new(C, id, pack.cost)
+/datum/supply_order/proc/generateManifest(obj/container, owner, packname) //generates-the-manifests.
+ var/obj/item/paper/fluff/jobs/cargo/manifest/P = new(container, id, 0)
var/station_name = (P.errors & MANIFEST_ERROR_NAME) ? new_station_name() : station_name()
- P.name = "shipping manifest - #[id] ([pack.name])"
+ P.name = "shipping manifest - [packname?"#[id] ([pack.name])":"(Grouped Item Crate)"]"
P.info += "
"
+ if(P.errors & MANIFEST_ERROR_ITEM)
+ var/static/list/blacklisted_error = typecacheof(list(
+ /obj/structure/closet/crate/secure,
+ /obj/structure/closet/crate/large,
+ /obj/structure/closet/secure_closet/goodies
+ ))
+ if(blacklisted_error[container.type])
+ P.errors &= ~MANIFEST_ERROR_ITEM
+ else
+ var/lost = max(round(container.contents.len / 10), 1)
+ while(--lost >= 0)
+ qdel(pick(container.contents))
+
P.update_icon()
- P.forceMove(C)
- C.manifest = P
- C.update_icon()
+ P.forceMove(container)
+
+ if(istype(container, /obj/structure/closet/crate))
+ var/obj/structure/closet/crate/C = container
+ C.manifest = P
+ C.update_icon()
return P
/datum/supply_order/proc/generate(atom/A)
var/obj/structure/closet/crate/C = pack.generate(A, paying_account)
- var/obj/item/paper/fluff/jobs/cargo/manifest/M = generateManifest(C)
-
- if(M.errors & MANIFEST_ERROR_ITEM)
- if(istype(C, /obj/structure/closet/crate/secure) || istype(C, /obj/structure/closet/crate/large))
- M.errors &= ~MANIFEST_ERROR_ITEM
- else
- var/lost = max(round(C.contents.len / 10), 1)
- while(--lost >= 0)
- qdel(pick(C.contents))
+ generateManifest(C, paying_account, pack)
return C
-//Paperwork for NT
-/obj/item/folder/paperwork
- name = "Incomplete Paperwork"
- desc = "These should've been filled out four months ago! Unfinished grant papers issued by Nanotrasen's finance department. Complete this page for additional funding."
- icon = 'icons/obj/bureaucracy.dmi'
- icon_state = "docs_generic"
-
-/obj/item/folder/paperwork_correct
- name = "Finished Paperwork"
- desc = "A neat stack of filled-out forms, in triplicate and signed. Is there anything more satisfying? Make sure they get stamped."
- icon = 'icons/obj/bureaucracy.dmi'
- icon_state = "docs_verified"
+/datum/supply_order/proc/generateCombo(var/miscbox, var/misc_own, var/misc_contents)
+ for (var/I in misc_contents)
+ new I(miscbox)
+ generateManifest(miscbox, misc_own, "")
+ return
diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm
index f82e16ad5c..7ec3a775a5 100644
--- a/code/modules/cargo/packs.dm
+++ b/code/modules/cargo/packs.dm
@@ -15,6 +15,7 @@
var/special_enabled = FALSE
var/DropPodOnly = FALSE //only usable by the Bluespace Drop Pod via the express cargo console
var/admin_spawned = FALSE //Can only an admin spawn this crate?
+ var/goody = PACK_GOODY_NONE //Small items can be grouped into a single crate.They also come in a closet/lockbox instead of a full crate, so the 700 min doesn't apply
var/can_private_buy = TRUE //Can it be purchased privately by each crewmember?
/datum/supply_pack/proc/generate(atom/A, datum/bank_account/paying_account)
diff --git a/code/modules/cargo/packs/armory.dm b/code/modules/cargo/packs/armory.dm
index 3a3357cc42..835457536f 100644
--- a/code/modules/cargo/packs/armory.dm
+++ b/code/modules/cargo/packs/armory.dm
@@ -37,15 +37,6 @@
contains = list(/obj/item/storage/box/chemimp)
crate_name = "chemical implant crate"
-/datum/supply_pack/security/armory/combatknives
- name = "Combat Knives Crate"
- desc = "Contains three sharpened combat knives. Each knife guaranteed to fit snugly inside any Nanotrasen-standard boot. Requires Armory access to open."
- cost = 3200
- contains = list(/obj/item/kitchen/knife/combat,
- /obj/item/kitchen/knife/combat,
- /obj/item/kitchen/knife/combat)
- crate_name = "combat knife crate"
-
/datum/supply_pack/security/armory/ballistic
name = "Combat Shotguns Crate"
desc = "For when the enemy absolutely needs to be replaced with lead. Contains three Aussec-designed Combat Shotguns, with three Shotgun Bandoliers, as well as seven buchshot and 12g shotgun slugs. Requires Armory access to open."
diff --git a/code/modules/cargo/packs/costumes_toys.dm b/code/modules/cargo/packs/costumes_toys.dm
index c181d6fb74..08f9a927c6 100644
--- a/code/modules/cargo/packs/costumes_toys.dm
+++ b/code/modules/cargo/packs/costumes_toys.dm
@@ -301,3 +301,36 @@
/obj/item/clothing/head/wizard/fake)
crate_name = "wizard costume crate"
crate_type = /obj/structure/closet/crate/wooden
+
+/datum/supply_pack/costumes_toys/wedding
+ name = "Wedding Crate"
+ desc = "Tie the knot IN SPACE! Hold your own extravagant wedding with this crate of suits and bridal gowns. Complete with champagne, cake, and the luxurious cost you would expect for an event to remember."
+ cost = 10000 // weddings are absurdly expensive and so is this crate
+ contains = list(/obj/item/clothing/under/suit/black_really, //we don't actually need suits since you can vend them but the crate should feel "complete"
+ /obj/item/clothing/under/suit/black_really,
+ /obj/item/clothing/under/suit/charcoal,
+ /obj/item/clothing/under/suit/charcoal,
+ /obj/item/clothing/under/suit/navy,
+ /obj/item/clothing/under/suit/navy,
+ /obj/item/clothing/under/suit/burgundy,
+ /obj/item/clothing/under/suit/burgundy, // A pair of each "fancy suit" color for variety
+ /obj/item/clothing/under/suit/white,
+ /obj/item/clothing/under/suit/white, // white is a weird color for a groom but some people are weird
+ /obj/item/clothing/under/suit/polychromic,
+ /obj/item/clothing/under/suit/polychromic, // in case you can't be satisfied with the most fitting choices, of course.
+ /obj/item/clothing/under/dress/wedding,
+ /obj/item/clothing/under/dress/wedding, // this is what you actually bought the crate for. You can't get these anywhere else.
+ /obj/item/clothing/under/dress/wedding/orange,
+ /obj/item/clothing/under/dress/wedding/orange,
+ /obj/item/clothing/under/dress/wedding/purple,
+ /obj/item/clothing/under/dress/wedding/purple,
+ /obj/item/clothing/under/dress/wedding/blue,
+ /obj/item/clothing/under/dress/wedding/blue,
+ /obj/item/clothing/under/dress/wedding/red,
+ /obj/item/clothing/under/dress/wedding/red, // two of each
+ /obj/item/reagent_containers/food/drinks/bottle/champagne, //appropriate booze for a wedding
+ /obj/item/reagent_containers/food/snacks/store/cake/vanilla_cake, // we don't have a full wedding cake but this will do
+ /obj/item/storage/fancy/ringbox/silver,
+ /obj/item/storage/fancy/ringbox/silver) //diamond rings cost the same price as this crate via cargo so we're not giving you two for free. Wedding rings are traditionally less valuable anyway.
+ crate_name = "wedding crate"
+
diff --git a/code/modules/cargo/packs/engineering.dm b/code/modules/cargo/packs/engineering.dm
index 22258d19a7..9af18e13f6 100644
--- a/code/modules/cargo/packs/engineering.dm
+++ b/code/modules/cargo/packs/engineering.dm
@@ -90,16 +90,6 @@
crate_name = "industrial rcd"
crate_type = /obj/structure/closet/crate/secure/engineering
-/datum/supply_pack/engineering/powergamermitts
- name = "Insulated Gloves Crate"
- desc = "The backbone of modern society. Barely ever ordered for actual engineering. Contains three insulated gloves."
- cost = 2300 //Made of pure-grade bullshittinium
- contains = list(/obj/item/clothing/gloves/color/yellow,
- /obj/item/clothing/gloves/color/yellow,
- /obj/item/clothing/gloves/color/yellow)
- crate_name = "insulated gloves crate"
- crate_type = /obj/structure/closet/crate/engineering/electrical
-
/datum/supply_pack/engineering/inducers
name = "NT-75 Electromagnetic Power Inducers Crate"
desc = "No rechargers? No problem, with the NT-75 EPI, you can recharge any standard cell-based equipment anytime, anywhere. Contains two Inducers."
@@ -162,6 +152,7 @@
/obj/item/storage/toolbox/mechanical)
cost = 1200
crate_name = "toolbox crate"
+ special = TRUE //Department resupply shuttle loan event.
/datum/supply_pack/engineering/bsa
name = "Bluespace Artillery Parts"
diff --git a/code/modules/cargo/packs/goodies.dm b/code/modules/cargo/packs/goodies.dm
new file mode 100644
index 0000000000..2ff02d0473
--- /dev/null
+++ b/code/modules/cargo/packs/goodies.dm
@@ -0,0 +1,83 @@
+
+/datum/supply_pack/goody
+ access = NONE
+ group = "Goodies"
+ goody = PACK_GOODY_PRIVATE
+
+/datum/supply_pack/goody/combatknives_single
+ name = "Combat Knife Single-Pack"
+ desc = "Contains one sharpened combat knive. Guaranteed to fit snugly inside any Nanotrasen-standard boot."
+ cost = 800
+ contains = list(/obj/item/kitchen/knife/combat)
+
+/datum/supply_pack/goody/sologamermitts
+ name = "Insulated Gloves Single-Pack"
+ desc = "The backbone of modern society. Barely ever ordered for actual engineering."
+ cost = 800
+ contains = list(/obj/item/clothing/gloves/color/yellow)
+
+/datum/supply_pack/goody/firstaidbruises_single
+ name = "Bruise Treatment Kit Single-Pack"
+ desc = "A single brute first-aid kit, perfect for recovering from being crushed in an airlock. Did you know people get crushed in airlocks all the time? Interesting..."
+ cost = 330
+ contains = list(/obj/item/storage/firstaid/brute)
+
+/datum/supply_pack/goody/firstaidburns_single
+ name = "Burn Treatment Kit Single-Pack"
+ desc = "A single burn first-aid kit. The advertisement displays a winking atmospheric technician giving a thumbs up, saying \"Mistakes happen!\""
+ cost = 330
+ contains = list(/obj/item/storage/firstaid/fire)
+
+/datum/supply_pack/goody/firstaid_single
+ name = "First Aid Kit Single-Pack"
+ desc = "A single first-aid kit, fit for healing most types of bodily harm."
+ cost = 250
+ contains = list(/obj/item/storage/firstaid/regular)
+
+/datum/supply_pack/goody/firstaidoxygen_single
+ name = "Oxygen Deprivation Kit Single-Pack"
+ desc = "A single oxygen deprivation first-aid kit, marketed heavily to those with crippling fears of asphyxiation."
+ cost = 330
+ contains = list(/obj/item/storage/firstaid/o2)
+
+/datum/supply_pack/goody/firstaidtoxins_single
+ name = "Toxin Treatment Kit Single-Pack"
+ desc = "A single first aid kit focused on healing damage dealt by heavy toxins."
+ cost = 330
+ contains = list(/obj/item/storage/firstaid/toxin)
+
+/datum/supply_pack/goody/toolbox // mostly just to water down coupon probability
+ name = "Mechanical Toolbox"
+ desc = "A fully stocked mechanical toolbox, for when you're too lazy to just print them out."
+ cost = 300
+ contains = list(/obj/item/storage/toolbox/mechanical)
+
+/datum/supply_pack/goody/electrical_toolbox // mostly just to water down coupon probability
+ name = "Mechanical Toolbox"
+ desc = "A fully stocked electrical toolbox, for when you're too lazy to just print them out."
+ cost = 300
+ contains = list(/obj/item/storage/toolbox/electrical)
+
+/datum/supply_pack/goody/valentine
+ name = "Valentine Card"
+ desc = "Make an impression on that special someone! Comes with one valentine card and a free candy heart!"
+ cost = 150
+ contains = list(/obj/item/valentine, /obj/item/reagent_containers/food/snacks/candyheart)
+
+/datum/supply_pack/goody/beeplush
+ name = "Bee Plushie"
+ desc = "The most important thing you could possibly spend your hard-earned money on."
+ cost = 1500
+ contains = list(/obj/item/toy/plush/beeplushie)
+
+/datum/supply_pack/goody/beach_ball
+ name = "Beach Ball"
+ desc = "The simple beach ball is one of Nanotrasen's most popular products. 'Why do we make beach balls? Because we can! (TM)' - Nanotrasen"
+ cost = 200
+ contains = list(/obj/item/toy/beach_ball)
+
+/datum/supply_pack/goody/hell_single
+ name = "Hellgun Single-Pack"
+ desc = "Contains one hellgun, an old pattern of laser gun infamous for its ability to horribly disfigure targets with burns. Technically violates the Space Geneva Convention when used on humanoids."
+ cost = 1500
+ contains = list(/obj/item/gun/energy/laser/hellgun)
diff --git a/code/modules/cargo/packs/materials.dm b/code/modules/cargo/packs/materials.dm
index 771f7ce222..0cf12fbc5d 100644
--- a/code/modules/cargo/packs/materials.dm
+++ b/code/modules/cargo/packs/materials.dm
@@ -14,53 +14,60 @@
//////////////////////////////////////////////////////////////////////////////
/datum/supply_pack/materials/cardboard50
+ goody = PACK_GOODY_PUBLIC
name = "50 Cardboard Sheets"
desc = "Create a bunch of boxes."
- cost = 1000
+ cost = 300 //thrice their export value
contains = list(/obj/item/stack/sheet/cardboard/fifty)
- crate_name = "cardboard sheets crate"
/datum/supply_pack/materials/glass50
+ goody = PACK_GOODY_PUBLIC
name = "50 Glass Sheets"
desc = "Let some nice light in with fifty glass sheets!"
- cost = 850
+ cost = 300 //double their export value
contains = list(/obj/item/stack/sheet/glass/fifty)
- crate_name = "glass sheets crate"
/datum/supply_pack/materials/metal50
+ goody = PACK_GOODY_PUBLIC
name = "50 Metal Sheets"
desc = "Any construction project begins with a good stack of fifty metal sheets!"
- cost = 850
+ cost = 300 //double their export value
contains = list(/obj/item/stack/sheet/metal/fifty)
- crate_name = "metal sheets crate"
/datum/supply_pack/materials/plasteel20
+ goody = PACK_GOODY_PUBLIC
name = "20 Plasteel Sheets"
desc = "Reinforce the station's integrity with twenty plasteel sheets!"
- cost = 4700
+ cost = 4000
contains = list(/obj/item/stack/sheet/plasteel/twenty)
- crate_name = "plasteel sheets crate"
-
-/datum/supply_pack/materials/plasteel50
- name = "50 Plasteel Sheets"
- desc = "For when you REALLY have to reinforce something."
- cost = 9050
- contains = list(/obj/item/stack/sheet/plasteel/fifty)
- crate_name = "plasteel sheets crate"
/datum/supply_pack/materials/plastic50
+ goody = PACK_GOODY_PUBLIC
name = "50 Plastic Sheets"
desc = "Build a limitless amount of toys with fifty plastic sheets!"
- cost = 950
- contains = list(/obj/item/stack/sheet/plastic/fifty)
- crate_name = "plastic sheets crate"
+ cost = 200 // double their export
+ contains = list(/obj/item/stack/sheet/plastic/twenty)
/datum/supply_pack/materials/sandstone30
+ goody = PACK_GOODY_PUBLIC
name = "30 Sandstone Blocks"
desc = "Neither sandy nor stoney, these thirty blocks will still get the job done."
- cost = 800
+ cost = 150 // five times their export
contains = list(/obj/item/stack/sheet/mineral/sandstone/thirty)
- crate_name = "sandstone blocks crate"
+
+/datum/supply_pack/materials/wood50
+ goody = PACK_GOODY_PUBLIC
+ name = "50 Wood Planks"
+ desc = "Turn cargo's boring metal groundwork into beautiful panelled flooring and much more with fifty wooden planks!"
+ cost = 400 // 6-7 planks shy from having equal import/export prices
+ contains = list(/obj/item/stack/sheet/mineral/wood/twenty)
+
+/datum/supply_pack/materials/rcdammo
+ goody = PACK_GOODY_PUBLIC
+ name = "Large RCD ammo Single-Pack"
+ desc = "A single large compressed RCD matter pack, to help with any holes or projects people might be working on."
+ cost = 600
+ contains = list(/obj/item/rcd_ammo/large)
/datum/supply_pack/materials/rawlumber
name = "50 Towercap Logs"
@@ -74,35 +81,6 @@
for(var/i in 1 to 49)
new /obj/item/grown/log(.)
-/datum/supply_pack/materials/wood50
- name = "50 Wood Planks"
- desc = "Turn cargo's boring metal groundwork into beautiful panelled flooring and much more with fifty wooden planks!"
- cost = 1450
- contains = list(/obj/item/stack/sheet/mineral/wood/fifty)
- crate_name = "wood planks crate"
-
-/datum/supply_pack/materials/rcdammo
- name = "Spare RCD ammo"
- desc = "This crate contains sixteen RCD compressed matter packs, to help with any holes or projects people might be working on."
- cost = 3750
- contains = list(/obj/item/rcd_ammo,
- /obj/item/rcd_ammo,
- /obj/item/rcd_ammo,
- /obj/item/rcd_ammo,
- /obj/item/rcd_ammo,
- /obj/item/rcd_ammo,
- /obj/item/rcd_ammo,
- /obj/item/rcd_ammo,
- /obj/item/rcd_ammo,
- /obj/item/rcd_ammo,
- /obj/item/rcd_ammo,
- /obj/item/rcd_ammo,
- /obj/item/rcd_ammo,
- /obj/item/rcd_ammo,
- /obj/item/rcd_ammo,
- /obj/item/rcd_ammo)
- crate_name = "rcd ammo"
-
//////////////////////////////////////////////////////////////////////////////
///////////////////////////// Canisters //////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
diff --git a/code/modules/cargo/packs/medical.dm b/code/modules/cargo/packs/medical.dm
index ab188f235b..5eacc2f583 100644
--- a/code/modules/cargo/packs/medical.dm
+++ b/code/modules/cargo/packs/medical.dm
@@ -114,7 +114,9 @@
/obj/item/storage/box/medsprays,
/obj/item/storage/box/syringes,
/obj/item/storage/box/bodybags,
- /obj/item/storage/pill_bottle/stimulant)
+ /obj/item/storage/pill_bottle/stimulant,
+ /obj/item/stack/medical/bone_gel,
+ /obj/item/stack/medical/bone_gel)
crate_name = "medical supplies crate"
/datum/supply_pack/medical/adv_surgery_tools
@@ -141,34 +143,6 @@
///////////////////////////// Medical Kits ///////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
-/datum/supply_pack/medical/firstaidbruises
- name = "Bruise Treatment Kit Crate"
- desc = "Contains three first aid kits focused on healing bruises and broken bones."
- cost = 1000
- contains = list(/obj/item/storage/firstaid/brute,
- /obj/item/storage/firstaid/brute,
- /obj/item/storage/firstaid/brute)
- crate_name = "brute treatment kit crate"
-
-/datum/supply_pack/medical/firstaidburns
- name = "Burn Treatment Kit Crate"
- desc = "Contains three first aid kits focused on healing severe burns."
- cost = 1000
- contains = list(/obj/item/storage/firstaid/fire,
- /obj/item/storage/firstaid/fire,
- /obj/item/storage/firstaid/fire)
- crate_name = "burn treatment kit crate"
-
-/datum/supply_pack/medical/firstaid
- name = "First Aid Kit Crate"
- desc = "Contains four first aid kits for healing most types of wounds."
- cost = 1000
- contains = list(/obj/item/storage/firstaid/regular,
- /obj/item/storage/firstaid/regular,
- /obj/item/storage/firstaid/regular,
- /obj/item/storage/firstaid/regular)
- crate_name = "first aid kit crate"
-
/datum/supply_pack/medical/sprays
name = "Medical Sprays"
desc = "Contains two cans of Styptic Spray, Silver Sulfadiazine Spray, Synthflesh Spray and Sterilizer Compound Spray."
@@ -183,35 +157,6 @@
/obj/item/reagent_containers/medspray/sterilizine)
crate_name = "medical supplies crate"
-/datum/supply_pack/medical/firstaidmixed
- name = "Mixed Medical Kits"
- desc = "Contains one of each medical kits for dealing with a variety of injured crewmembers."
- cost = 1250
- contains = list(/obj/item/storage/firstaid/toxin,
- /obj/item/storage/firstaid/o2,
- /obj/item/storage/firstaid/brute,
- /obj/item/storage/firstaid/fire,
- /obj/item/storage/firstaid/regular)
- crate_name = "medical supplies crate"
-
-/datum/supply_pack/medical/firstaidoxygen
- name = "Oxygen Deprivation Kit Crate"
- desc = "Contains three first aid kits focused on helping oxygen deprivation victims."
- cost = 1000
- contains = list(/obj/item/storage/firstaid/o2,
- /obj/item/storage/firstaid/o2,
- /obj/item/storage/firstaid/o2)
- crate_name = "oxygen deprivation kit crate"
-
-/datum/supply_pack/medical/firstaidtoxins
- name = "Toxin Treatment Kit Crate"
- desc = "Contains three first aid kits focused on healing damage dealt by heavy toxins."
- cost = 1000
- contains = list(/obj/item/storage/firstaid/toxin,
- /obj/item/storage/firstaid/toxin,
- /obj/item/storage/firstaid/toxin)
- crate_name = "toxin treatment kit crate"
-
/datum/supply_pack/medical/advrad
name = "Radiation Treatment Crate Deluxe"
desc = "A crate for when radiation is out of hand... Contains two rad-b-gone kits, one bottle of anti radiation deluxe pills, as well as a radiation treatment deluxe pill bottle!"
diff --git a/code/modules/cargo/packs/misc.dm b/code/modules/cargo/packs/misc.dm
index 5265b2c2f6..a84e22f6f9 100644
--- a/code/modules/cargo/packs/misc.dm
+++ b/code/modules/cargo/packs/misc.dm
@@ -294,11 +294,11 @@
name = "Potted Plants Crate"
desc = "Spruce up the station with these lovely plants! Contains a random assortment of five potted plants from Nanotrasen's potted plant research division. Warranty void if thrown."
cost = 730
- contains = list(/obj/item/twohanded/required/kirbyplants/random,
- /obj/item/twohanded/required/kirbyplants/random,
- /obj/item/twohanded/required/kirbyplants/random,
- /obj/item/twohanded/required/kirbyplants/random,
- /obj/item/twohanded/required/kirbyplants/random)
+ contains = list(/obj/item/kirbyplants/random,
+ /obj/item/kirbyplants/random,
+ /obj/item/kirbyplants/random,
+ /obj/item/kirbyplants/random,
+ /obj/item/kirbyplants/random)
crate_name = "potted plants crate"
crate_type = /obj/structure/closet/crate/hydroponics
@@ -333,45 +333,58 @@
//////////////////////////// Misc + Decor ////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
-/datum/supply_pack/misc/carpet_exotic
- name = "Exotic Carpet Crate"
- desc = "Exotic carpets straight from Space Russia, for all your decorating needs. Contains 100 tiles each of 10 different flooring patterns."
- cost = 7000
- contains = list(/obj/item/stack/tile/carpet/blue/fifty,
- /obj/item/stack/tile/carpet/blue/fifty,
- /obj/item/stack/tile/carpet/cyan/fifty,
- /obj/item/stack/tile/carpet/cyan/fifty,
- /obj/item/stack/tile/carpet/green/fifty,
- /obj/item/stack/tile/carpet/green/fifty,
- /obj/item/stack/tile/carpet/orange/fifty,
- /obj/item/stack/tile/carpet/orange/fifty,
- /obj/item/stack/tile/carpet/purple/fifty,
- /obj/item/stack/tile/carpet/purple/fifty,
- /obj/item/stack/tile/carpet/red/fifty,
- /obj/item/stack/tile/carpet/red/fifty,
- /obj/item/stack/tile/carpet/royalblue/fifty,
- /obj/item/stack/tile/carpet/royalblue/fifty,
- /obj/item/stack/tile/carpet/royalblack/fifty,
- /obj/item/stack/tile/carpet/royalblack/fifty,
- /obj/item/stack/tile/carpet/blackred/fifty,
- /obj/item/stack/tile/carpet/blackred/fifty,
- /obj/item/stack/tile/carpet/monochrome/fifty,
- /obj/item/stack/tile/carpet/monochrome/fifty)
- crate_name = "exotic carpet crate"
-
/datum/supply_pack/misc/carpet
- name = "Premium Carpet Crate"
- desc = "Plasteel floor tiles getting on your nerves? These stacks of extra soft carpet will tie any room together. Contains some classic carpet, along with black, red, and monochrome varients."
- cost = 1350
- contains = list(/obj/item/stack/tile/carpet/fifty,
- /obj/item/stack/tile/carpet/fifty,
- /obj/item/stack/tile/carpet/black/fifty,
- /obj/item/stack/tile/carpet/black/fifty,
- /obj/item/stack/tile/carpet/blackred/fifty,
- /obj/item/stack/tile/carpet/blackred/fifty,
- /obj/item/stack/tile/carpet/monochrome/fifty,
- /obj/item/stack/tile/carpet/monochrome/fifty)
- crate_name = "premium carpet crate"
+ goody = PACK_GOODY_PUBLIC
+ name = "Classic Carpet Single-Pack"
+ desc = "Plasteel floor tiles getting on your nerves? This 50 units stack of extra soft carpet will tie any room together."
+ cost = 200
+ contains = list(/obj/item/stack/tile/carpet/fifty)
+
+/datum/supply_pack/misc/carpet/black
+ name = "Black Carpet Single-Pack"
+ contains = list(/obj/item/stack/tile/carpet/black/fifty)
+
+/datum/supply_pack/misc/carpet/premium
+ name = "Monochrome Carpet Single-Pack"
+ desc = "Exotic carpets for all your decorating needs. This 30 units stack of extra soft carpet will tie any room together."
+ cost = 250
+ contains = list(/obj/item/stack/tile/carpet/monochrome/thirty)
+
+/datum/supply_pack/misc/carpet/premium/blackred
+ name = "Black-Red Carpet Single-Pack"
+ contains = list(/obj/item/stack/tile/carpet/blackred/thirty)
+
+/datum/supply_pack/misc/carpet/premium/royalblack
+ name = "Royal Black Carpet Single-Pack"
+ contains = list(/obj/item/stack/tile/carpet/royalblack/thirty)
+
+/datum/supply_pack/misc/carpet/premium/royalblue
+ name = "Royal Blue Carpet Single-Pack"
+ contains = list(/obj/item/stack/tile/carpet/royalblue/thirty)
+
+/datum/supply_pack/misc/carpet/premium/red
+ name = "Red Carpet Single-Pack"
+ contains = list(/obj/item/stack/tile/carpet/red/thirty)
+
+/datum/supply_pack/misc/carpet/premium/purple
+ name = "Purple Carpet Single-Pack"
+ contains = list(/obj/item/stack/tile/carpet/purple/thirty)
+
+/datum/supply_pack/misc/carpet/premium/orange
+ name = "Orange Carpet Single-Pack"
+ contains = list(/obj/item/stack/tile/carpet/orange/thirty)
+
+/datum/supply_pack/misc/carpet/premium/green
+ name = "Green Carpet Single-Pack"
+ contains = list(/obj/item/stack/tile/carpet/green/thirty)
+
+/datum/supply_pack/misc/carpet/premium/cyan
+ name = "Cyan Carpet Single-Pack"
+ contains = list(/obj/item/stack/tile/carpet/cyan/thirty)
+
+/datum/supply_pack/misc/carpet/premium/blue
+ name = "Blue Carpet Single-Pack"
+ contains = list(/obj/item/stack/tile/carpet/blue/thirty)
/datum/supply_pack/misc/noslipfloor
name = "High-traction Floor Tiles"
@@ -417,3 +430,40 @@
crate_type = /obj/structure/closet/crate
+///Special supply crate that generates random syndicate gear up to a determined TC value
+
+/datum/supply_pack/misc/syndicate
+
+ name = "Assorted Syndicate Gear"
+
+ desc = "Contains a random assortment of syndicate gear."
+
+ special = TRUE ///Cannot be ordered via cargo
+
+ contains = list()
+
+ crate_name = "syndicate gear crate"
+
+ crate_type = /obj/structure/closet/crate
+
+ var/crate_value = 30 ///Total TC worth of contained uplink items
+
+
+//////////////////////////////////////////////////////////////////////////////
+//////////////////////////////// Syndicate Packs /////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+
+//Generate assorted uplink items, taking into account the same surplus modifiers used for surplus crates
+//(this is exclusively used for the rare variant of the stray cargo event!)
+/datum/supply_pack/misc/syndicate/fill(obj/structure/closet/crate/C)
+ var/list/uplink_items = get_uplink_items(SSticker.mode)
+ while(crate_value)
+ var/category = pick(uplink_items)
+ var/item = pick(uplink_items[category])
+ var/datum/uplink_item/I = uplink_items[category][item]
+ if(!I.surplus || prob(100 - I.surplus))
+ continue
+ if(crate_value < I.cost)
+ continue
+ crate_value -= I.cost
+ new I.item(C)
\ No newline at end of file
diff --git a/code/modules/cargo/packs/organic.dm b/code/modules/cargo/packs/organic.dm
index 249faae33d..0f01dfd5d9 100644
--- a/code/modules/cargo/packs/organic.dm
+++ b/code/modules/cargo/packs/organic.dm
@@ -361,6 +361,7 @@
/obj/item/seeds/reishi,
/obj/item/seeds/banana,
/obj/item/seeds/eggplant/eggy,
+ /obj/item/seeds/poppy/lily/trumpet,
/obj/item/seeds/random,
/obj/item/seeds/random)
crate_name = "exotic seeds crate"
diff --git a/code/modules/cargo/packs/security.dm b/code/modules/cargo/packs/security.dm
index a48874e974..738eb03fbf 100644
--- a/code/modules/cargo/packs/security.dm
+++ b/code/modules/cargo/packs/security.dm
@@ -228,3 +228,35 @@
access = ACCESS_ARMORY
crate_name = "sporting crate"
crate_type = /obj/structure/closet/crate/secure // Would have liked a wooden crate but access >:(
+
+/datum/supply_pack/security/dumdum
+ name = ".38 DumDum Speedloader"
+ desc = "Contains one speedloader of .38 DumDum ammunition, good for embedding in soft targets. Requires Security or Forensics access to open."
+ cost = 1200
+ access = FALSE
+ access_any = list(ACCESS_SECURITY, ACCESS_FORENSICS_LOCKERS)
+ contains = list(/obj/item/ammo_box/c38/dumdum)
+ crate_name = ".38 match crate"
+
+/datum/supply_pack/security/match
+ name = ".38 Match Grade Speedloader"
+ desc = "Contains one speedloader of match grade .38 ammunition, perfect for showing off trickshots. Requires Security or Forensics access to open."
+ cost = 1200
+ access = FALSE
+ access_any = list(ACCESS_SECURITY, ACCESS_FORENSICS_LOCKERS)
+ contains = list(/obj/item/ammo_box/c38/match)
+ crate_name = ".38 match crate"
+
+/datum/supply_pack/security/stingpack
+ name = "Stingbang Grenade Pack"
+ desc = "Contains five \"stingbang\" grenades, perfect for stopping riots and playing morally unthinkable pranks. Requires Security access to open."
+ cost = 2500
+ contains = list(/obj/item/storage/box/stingbangs)
+ crate_name = "stingbang grenade pack crate"
+
+/datum/supply_pack/security/stingpack/single
+ name = "Stingbang Single-Pack"
+ desc = "Contains one \"stingbang\" grenade, perfect for playing meanhearted pranks. Requires Security access to open."
+ cost = 1400
+ contains = list(/obj/item/grenade/stingbang)
+
diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm
index 0402dc683f..ae48fddfb4 100644
--- a/code/modules/client/client_defines.dm
+++ b/code/modules/client/client_defines.dm
@@ -19,6 +19,8 @@
///Next tick to reset the total message counter
var/total_count_reset = 0
var/ircreplyamount = 0
+ /// last time they tried to do an autobunker auth
+ var/autobunker_last_try = 0
/////////
//OTHER//
@@ -28,6 +30,9 @@
var/move_delay = 0
var/area = null
+ /// Last time we Click()ed. No clicking twice in one tick!
+ var/last_click = 0
+
///////////////
//SOUND STUFF//
///////////////
@@ -117,6 +122,8 @@
/// Messages currently seen by this client
var/list/seen_messages
+ ///A lazy list of atoms we've examined in the last EXAMINE_MORE_TIME (default 1.5) seconds, so that we will call [atom/proc/examine_more()] instead of [atom/proc/examine()] on them when examining
+ var/list/recent_examines
///When was the last time we warned them about not cryoing without an ahelp, set to -5 minutes so that rounstart cryo still warns
var/cryo_warned = -5 MINUTES
@@ -134,5 +141,13 @@
var/parallax_layers_max = 3
var/parallax_animate_timer
+ // List of all asset filenames sent to this client by the asset cache, along with their assoicated md5s
+ var/list/sent_assets = list()
+ /// List of all completed blocking send jobs awaiting acknowledgement by send_asset
+ var/list/completed_asset_jobs = list()
+ /// Last asset send job id.
+ var/last_asset_job = 0
+ var/last_completed_asset_job = 0
+
//world.time of when the crew manifest can be accessed
var/crew_manifest_delay
diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm
index d575a53afa..5c9b1eec2e 100644
--- a/code/modules/client/client_procs.dm
+++ b/code/modules/client/client_procs.dm
@@ -20,9 +20,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
When somebody clicks a link in game, this Topic is called first.
It does the stuff in this proc and then is redirected to the Topic() proc for the src=[0xWhatever]
(if specified in the link). ie locate(hsrc).Topic()
-
Such links can be spoofed.
-
Because of this certain things MUST be considered whenever adding a Topic() for something:
- Can it be fed harmful values which could cause runtimes?
- Is the Topic call an admin-only thing?
@@ -37,28 +35,11 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
return
// asset_cache
+ var/asset_cache_job
if(href_list["asset_cache_confirm_arrival"])
- var/job = text2num(href_list["asset_cache_confirm_arrival"])
- //because we skip the limiter, we have to make sure this is a valid arrival and not somebody tricking us
- // into letting append to a list without limit.
- if (job && job <= last_asset_job && !(job in completed_asset_jobs))
- completed_asset_jobs += job
+ asset_cache_job = asset_cache_confirm_arrival(href_list["asset_cache_confirm_arrival"])
+ if(!asset_cache_job)
return
- else if (job in completed_asset_jobs) //byond bug ID:2256651
- to_chat(src, "An error has been detected in how your client is receiving resources. Attempting to correct.... (If you keep seeing these messages you might want to close byond and reconnect)")
- src << browse("...", "window=asset_cache_browser")
- // Keypress passthrough
- if(href_list["__keydown"])
- var/keycode = browser_keycode_to_byond(href_list["__keydown"])
- if(keycode)
- keyDown(keycode)
- return
- if(href_list["__keyup"])
- var/keycode = browser_keycode_to_byond(href_list["__keyup"])
- if(keycode)
- keyUp(keycode)
- return
-
var/mtl = CONFIG_GET(number/minute_topic_limit)
if (!holder && mtl)
@@ -75,7 +56,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
topiclimiter[ADMINSWARNED_AT] = minute
msg += " Administrators have been informed."
log_game("[key_name(src)] Has hit the per-minute topic limit of [mtl] topic calls in a given game minute")
- message_admins("[ADMIN_LOOKUPFLW(src)] [ADMIN_KICK(usr)] Has hit the per-minute topic limit of [mtl] topic calls in a given game minute")
+ message_admins("[ADMIN_LOOKUPFLW(usr)] [ADMIN_KICK(usr)] Has hit the per-minute topic limit of [mtl] topic calls in a given game minute")
to_chat(src, "[msg]")
return
@@ -96,6 +77,27 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
if(!(href_list["_src_"] == "chat" && href_list["proc"] == "ping" && LAZYLEN(href_list) == 2))
log_href("[src] (usr:[usr]\[[COORD(usr)]\]) : [hsrc ? "[hsrc] " : ""][href]")
+ //byond bug ID:2256651
+ if (asset_cache_job && (asset_cache_job in completed_asset_jobs))
+ to_chat(src, "An error has been detected in how your client is receiving resources. Attempting to correct.... (If you keep seeing these messages you might want to close byond and reconnect)")
+ src << browse("...", "window=asset_cache_browser")
+ return
+ if (href_list["asset_cache_preload_data"])
+ asset_cache_preload_data(href_list["asset_cache_preload_data"])
+ return
+
+ // Keypress passthrough
+ if(href_list["__keydown"])
+ var/keycode = browser_keycode_to_byond(href_list["__keydown"])
+ if(keycode)
+ keyDown(keycode)
+ return
+ if(href_list["__keyup"])
+ var/keycode = browser_keycode_to_byond(href_list["__keyup"])
+ if(keycode)
+ keyUp(keycode)
+ return
+
// Admin PM
if(href_list["priv_msg"])
cmd_admin_pm(href_list["priv_msg"],null)
@@ -265,9 +267,7 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
else
prefs = new /datum/preferences(src)
GLOB.preferences_datums[ckey] = prefs
- if(SSinput.initialized)
- set_macros()
- update_movement_keys(prefs)
+ addtimer(CALLBACK(src, .proc/ensure_keys_set), 0) //prevents possible race conditions
prefs.last_ip = address //these are gonna be used for banning
prefs.last_id = computer_id //these are gonna be used for banning
@@ -461,11 +461,21 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
Master.UpdateTickRate()
+/client/proc/ensure_keys_set()
+ if(SSinput.initialized)
+ set_macros()
+ update_movement_keys(prefs)
+
//////////////
//DISCONNECT//
//////////////
/client/Del()
+ if(!gc_destroyed)
+ Destroy()
+ return ..()
+
+/client/Destroy()
if(credits)
QDEL_LIST(credits)
log_access("Logout: [key_name(src)]")
@@ -499,9 +509,7 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
movingmob.client_mobs_in_contents -= mob
UNSETEMPTY(movingmob.client_mobs_in_contents)
Master.UpdateTickRate()
- return ..()
-
-/client/Destroy()
+ . = ..()
return QDEL_HINT_HARDDEL_NOW
/client/proc/set_client_age_from_db(connectiontopic)
@@ -766,6 +774,9 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
ip_intel = res.intel
/client/Click(atom/object, atom/location, control, params, ignore_spam = FALSE)
+ if(last_click > world.time - world.tick_lag)
+ return
+ last_click = world.time
var/ab = FALSE
var/list/L = params2list(params)
if (object && object == middragatom && L["left"])
@@ -858,8 +869,14 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
'html/browser/playeroptions.css',
)
spawn (10) //removing this spawn causes all clients to not get verbs.
+
+ //load info on what assets the client has
+ src << browse('code/modules/asset_cache/validate_assets.html', "window=asset_cache_browser")
+
//Precache the client with all other assets slowly, so as to not block other browse() calls
getFilesSlow(src, SSassets.preload, register_asset = FALSE)
+ addtimer(CALLBACK(GLOBAL_PROC, /proc/getFilesSlow, src, SSassets.preload, FALSE), 5 SECONDS)
+
#if (PRELOAD_RSC == 0)
for (var/name in GLOB.vox_sounds)
var/file = GLOB.vox_sounds[name]
@@ -879,13 +896,13 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
/client/vv_edit_var(var_name, var_value)
switch (var_name)
- if ("holder")
+ if (NAMEOF(src, holder))
return FALSE
- if ("ckey")
+ if (NAMEOF(src, ckey))
return FALSE
- if ("key")
+ if (NAMEOF(src, key))
return FALSE
- if("view")
+ if(NAMEOF(src, view))
change_view(var_value)
return TRUE
. = ..()
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 347a77059a..85c9b0f265 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -83,24 +83,24 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/gender = MALE //gender of character (well duh)
var/age = 30 //age of character
var/underwear = "Nude" //underwear type
- var/undie_color = "FFF"
+ var/undie_color = "FFFFFF"
var/undershirt = "Nude" //undershirt type
- var/shirt_color = "FFF"
+ var/shirt_color = "FFFFFF"
var/socks = "Nude" //socks type
- var/socks_color = "FFF"
+ var/socks_color = "FFFFFF"
var/backbag = DBACKPACK //backpack type
var/jumpsuit_style = PREF_SUIT //suit/skirt
var/hair_style = "Bald" //Hair type
- var/hair_color = "000" //Hair color
+ var/hair_color = "000000" //Hair color
var/facial_hair_style = "Shaved" //Face hair type
- var/facial_hair_color = "000" //Facial hair color
+ var/facial_hair_color = "000000" //Facial hair color
var/skin_tone = "caucasian1" //Skin color
var/use_custom_skin_tone = FALSE
- var/eye_color = "000" //Eye color
+ var/eye_color = "000000" //Eye color
var/datum/species/pref_species = new /datum/species/human() //Mutant race
- var/list/features = list("mcolor" = "FFF",
- "mcolor2" = "FFF",
- "mcolor3" = "FFF",
+ var/list/features = list("mcolor" = "FFFFFF",
+ "mcolor2" = "FFFFFF",
+ "mcolor3" = "FFFFFF",
"tail_lizard" = "Smooth",
"tail_human" = "None",
"snout" = "Round",
@@ -131,23 +131,23 @@ GLOBAL_LIST_EMPTY(preferences_datums)
"cock_shape" = DEF_COCK_SHAPE,
"cock_length" = COCK_SIZE_DEF,
"cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF,
- "cock_color" = "fff",
+ "cock_color" = "ffffff",
"cock_taur" = FALSE,
"has_balls" = FALSE,
- "balls_color" = "fff",
+ "balls_color" = "ffffff",
"balls_shape" = DEF_BALLS_SHAPE,
"balls_size" = BALLS_SIZE_DEF,
"balls_cum_rate" = CUM_RATE,
"balls_cum_mult" = CUM_RATE_MULT,
"balls_efficiency" = CUM_EFFICIENCY,
"has_breasts" = FALSE,
- "breasts_color" = "fff",
+ "breasts_color" = "ffffff",
"breasts_size" = BREASTS_SIZE_DEF,
"breasts_shape" = DEF_BREASTS_SHAPE,
"breasts_producing" = FALSE,
"has_vag" = FALSE,
"vag_shape" = DEF_VAGINA_SHAPE,
- "vag_color" = "fff",
+ "vag_color" = "ffffff",
"has_womb" = FALSE,
"balls_visibility" = GEN_VISIBLE_NO_UNDIES,
"breasts_visibility"= GEN_VISIBLE_NO_UNDIES,
@@ -162,6 +162,13 @@ GLOBAL_LIST_EMPTY(preferences_datums)
"body_model" = MALE,
"body_size" = RESIZE_DEFAULT_SIZE
)
+ var/custom_speech_verb = "default" //if your say_mod is to be something other than your races
+ var/custom_tongue = "default" //if your tongue is to be something other than your races
+
+ /// Security record note section
+ var/security_records
+ /// Medical record note section
+ var/medical_records
var/list/custom_names = list()
var/preferred_ai_core_display = "Blue"
@@ -232,6 +239,13 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/autostand = TRUE
var/auto_ooc = FALSE
+ /// If we have persistent scars enabled
+ var/persistent_scars = TRUE
+ /// We have 5 slots for persistent scars, if enabled we pick a random one to load (empty by default) and scars at the end of the shift if we survived as our original person
+ var/list/scars_list = list("1" = "", "2" = "", "3" = "", "4" = "", "5" = "")
+ /// Which of the 5 persistent scar slots we randomly roll to load for this round, if enabled. Actually rolled in [/datum/preferences/proc/load_character(slot)]
+ var/scars_index = 1
+
/datum/preferences/New(client/C)
parent = C
@@ -338,6 +352,24 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Custom job preferences: "
dat += "Preferred AI Core Display: [preferred_ai_core_display] "
dat += "Preferred Security Department: [prefered_security_department] "
+ dat += " Records "
+ dat += " Security Records "
+ if(length_char(security_records) <= 40)
+ if(!length(security_records))
+ dat += "\[...\]"
+ else
+ dat += "[security_records]"
+ else
+ dat += "[TextPreview(security_records)]... "
+
+ dat += " Medical Records "
+ if(length_char(medical_records) <= 40)
+ if(!length(medical_records))
+ dat += "\[...\] "
+ else
+ dat += "[medical_records]"
+ else
+ dat += "[TextPreview(medical_records)]... "
dat += ""
//Character Appearance
@@ -440,6 +472,13 @@ GLOBAL_LIST_EMPTY(preferences_datums)
else if(use_skintones || mutant_colors)
dat += ""
+ dat += APPEARANCE_CATEGORY_COLUMN
+ dat += "
Speech preferences
"
+ dat += "Custom Speech Verb: "
+ dat += "[custom_speech_verb] "
+ dat += "Custom Tongue: "
+ dat += "[custom_tongue] "
+
if(HAIR in pref_species.species_traits)
dat += APPEARANCE_CATEGORY_COLUMN
@@ -793,6 +832,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Socks Color:Change "
dat += "Backpack:[backbag]"
dat += "Jumpsuit: [jumpsuit_style] "
+ if(CAN_SCAR in pref_species.species_traits)
+ dat += " Temporal Scarring: [(persistent_scars) ? "Enabled" : "Disabled"]"
+ dat += "Clear scar slots"
dat += "Uplink Location:[uplink_spawn_loc]"
dat += ""
@@ -1088,6 +1130,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Hypno:[(cit_toggles & NEVER_HYPNO) ? "Disallowed" : "Allowed"] "
dat += "Aphrodisiacs:[(cit_toggles & NO_APHRO) ? "Disallowed" : "Allowed"] "
dat += "Ass Slapping:[(cit_toggles & NO_ASS_SLAP) ? "Disallowed" : "Allowed"] "
+ dat += "Automatic Wagging:[(cit_toggles & NO_AUTO_WAG) ? "Disabled" : "Enabled"] "
dat += ""
dat += " "
if(5) // Custom keybindings
@@ -1637,6 +1680,16 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(new_age)
age = max(min( round(text2num(new_age)), AGE_MAX),AGE_MIN)
+ if("security_records")
+ var/rec = stripped_multiline_input(usr, "Set your security record note section. This should be IC!", "Security Records", html_decode(security_records), MAX_FLAVOR_LEN, TRUE)
+ if(!isnull(rec))
+ security_records = rec
+
+ if("medical_records")
+ var/rec = stripped_multiline_input(usr, "Set your medical record note section. This should be IC!", "Security Records", html_decode(medical_records), MAX_FLAVOR_LEN, TRUE)
+ if(!isnull(rec))
+ medical_records = rec
+
if("flavor_text")
var/msg = stripped_multiline_input(usr, "Set the flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!", "Flavor Text", html_decode(features["flavor_text"]), MAX_FLAVOR_LEN, TRUE)
if(!isnull(msg))
@@ -1655,7 +1708,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if("hair")
var/new_hair = input(user, "Choose your character's hair colour:", "Character Preference","#"+hair_color) as color|null
if(new_hair)
- hair_color = sanitize_hexcolor(new_hair)
+ hair_color = sanitize_hexcolor(new_hair, 6)
if("hair_style")
var/new_hair_style
@@ -1672,7 +1725,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if("facial")
var/new_facial = input(user, "Choose your character's facial-hair colour:", "Character Preference","#"+facial_hair_color) as color|null
if(new_facial)
- facial_hair_color = sanitize_hexcolor(new_facial)
+ facial_hair_color = sanitize_hexcolor(new_facial, 6)
if("facial_hair_style")
var/new_facial_hair_style
@@ -1697,7 +1750,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if("undie_color")
var/n_undie_color = input(user, "Choose your underwear's color.", "Character Preference", "#[undie_color]") as color|null
if(n_undie_color)
- undie_color = sanitize_hexcolor(n_undie_color)
+ undie_color = sanitize_hexcolor(n_undie_color, 6)
if("undershirt")
var/new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference") as null|anything in GLOB.undershirt_list
@@ -1707,7 +1760,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if("shirt_color")
var/n_shirt_color = input(user, "Choose your undershirt's color.", "Character Preference", "#[shirt_color]") as color|null
if(n_shirt_color)
- shirt_color = sanitize_hexcolor(n_shirt_color)
+ shirt_color = sanitize_hexcolor(n_shirt_color, 6)
if("socks")
var/new_socks = input(user, "Choose your character's socks:", "Character Preference") as null|anything in GLOB.socks_list
@@ -1717,12 +1770,12 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if("socks_color")
var/n_socks_color = input(user, "Choose your socks' color.", "Character Preference", "#[socks_color]") as color|null
if(n_socks_color)
- socks_color = sanitize_hexcolor(n_socks_color)
+ socks_color = sanitize_hexcolor(n_socks_color, 6)
if("eyes")
var/new_eyes = input(user, "Choose your character's eye colour:", "Character Preference","#"+eye_color) as color|null
if(new_eyes)
- eye_color = sanitize_hexcolor(new_eyes)
+ eye_color = sanitize_hexcolor(new_eyes, 6)
if("species")
var/result = input(user, "Select a species", "Species Selection") as null|anything in GLOB.roundstart_race_names
@@ -1746,11 +1799,11 @@ GLOBAL_LIST_EMPTY(preferences_datums)
//Now that we changed our species, we must verify that the mutant colour is still allowed.
var/temp_hsv = RGBtoHSV(features["mcolor"])
- if(features["mcolor"] == "#000" || (!(MUTCOLORS_PARTSONLY in pref_species.species_traits) && ReadHSV(temp_hsv)[3] < ReadHSV("#202020")[3]))
+ if(features["mcolor"] == "#000000" || (!(MUTCOLORS_PARTSONLY in pref_species.species_traits) && ReadHSV(temp_hsv)[3] < ReadHSV("#202020")[3]))
features["mcolor"] = pref_species.default_color
- if(features["mcolor2"] == "#000" || (!(MUTCOLORS_PARTSONLY in pref_species.species_traits) && ReadHSV(temp_hsv)[3] < ReadHSV("#202020")[3]))
+ if(features["mcolor2"] == "#000000" || (!(MUTCOLORS_PARTSONLY in pref_species.species_traits) && ReadHSV(temp_hsv)[3] < ReadHSV("#202020")[3]))
features["mcolor2"] = pref_species.default_color
- if(features["mcolor3"] == "#000" || (!(MUTCOLORS_PARTSONLY in pref_species.species_traits) && ReadHSV(temp_hsv)[3] < ReadHSV("#202020")[3]))
+ if(features["mcolor3"] == "#000000" || (!(MUTCOLORS_PARTSONLY in pref_species.species_traits) && ReadHSV(temp_hsv)[3] < ReadHSV("#202020")[3]))
features["mcolor3"] = pref_species.default_color
if("custom_species")
@@ -1767,7 +1820,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(new_mutantcolor == "#000000")
features["mcolor"] = pref_species.default_color
else if((MUTCOLORS_PARTSONLY in pref_species.species_traits) || ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3]) // mutantcolors must be bright, but only if they affect the skin
- features["mcolor"] = sanitize_hexcolor(new_mutantcolor)
+ features["mcolor"] = sanitize_hexcolor(new_mutantcolor, 6)
else
to_chat(user, "Invalid color. Your color is not bright enough.")
@@ -1778,7 +1831,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(new_mutantcolor == "#000000")
features["mcolor2"] = pref_species.default_color
else if((MUTCOLORS_PARTSONLY in pref_species.species_traits) || ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3]) // mutantcolors must be bright, but only if they affect the skin
- features["mcolor2"] = sanitize_hexcolor(new_mutantcolor)
+ features["mcolor2"] = sanitize_hexcolor(new_mutantcolor, 6)
else
to_chat(user, "Invalid color. Your color is not bright enough.")
@@ -1789,7 +1842,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(new_mutantcolor == "#000000")
features["mcolor3"] = pref_species.default_color
else if((MUTCOLORS_PARTSONLY in pref_species.species_traits) || ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3]) // mutantcolors must be bright, but only if they affect the skin
- features["mcolor3"] = sanitize_hexcolor(new_mutantcolor)
+ features["mcolor3"] = sanitize_hexcolor(new_mutantcolor, 6)
else
to_chat(user, "Invalid color. Your color is not bright enough.")
@@ -1917,7 +1970,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if (new_horn_color == "#000000")
features["horns_color"] = "85615A"
else
- features["horns_color"] = sanitize_hexcolor(new_horn_color)
+ features["horns_color"] = sanitize_hexcolor(new_horn_color, 6)
if("wings")
var/new_wings
@@ -1931,7 +1984,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if (new_wing_color == "#000000")
features["wings_color"] = "#FFFFFF"
else
- features["wings_color"] = sanitize_hexcolor(new_wing_color)
+ features["wings_color"] = sanitize_hexcolor(new_wing_color, 6)
if("frills")
var/new_frills
@@ -2105,7 +2158,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(new_cockcolor == "#000000")
features["cock_color"] = pref_species.default_color
else if(ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3])
- features["cock_color"] = sanitize_hexcolor(new_cockcolor)
+ features["cock_color"] = sanitize_hexcolor(new_cockcolor, 6)
else
to_chat(user,"Invalid color. Your color is not bright enough.")
@@ -2145,7 +2198,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(new_ballscolor == "#000000")
features["balls_color"] = pref_species.default_color
else if(ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3])
- features["balls_color"] = sanitize_hexcolor(new_ballscolor)
+ features["balls_color"] = sanitize_hexcolor(new_ballscolor, 6)
else
to_chat(user,"Invalid color. Your color is not bright enough.")
@@ -2172,7 +2225,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(new_breasts_color == "#000000")
features["breasts_color"] = pref_species.default_color
else if(ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3])
- features["breasts_color"] = sanitize_hexcolor(new_breasts_color)
+ features["breasts_color"] = sanitize_hexcolor(new_breasts_color, 6)
else
to_chat(user,"Invalid color. Your color is not bright enough.")
@@ -2194,7 +2247,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(new_vagcolor == "#000000")
features["vag_color"] = pref_species.default_color
else if(ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3])
- features["vag_color"] = sanitize_hexcolor(new_vagcolor)
+ features["vag_color"] = sanitize_hexcolor(new_vagcolor, 6)
else
to_chat(user,"Invalid color. Your color is not bright enough.")
@@ -2313,17 +2366,26 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/min = CONFIG_GET(number/body_size_min)
var/max = CONFIG_GET(number/body_size_max)
var/danger = CONFIG_GET(number/threshold_body_size_slowdown)
- var/new_body_size = input(user, "Choose your desired sprite size:\n([min*100]%-[max*100]%), Warning: May make your character look distorted[danger > min ? ", and an exponential slowdown will occur for those smaller than [danger*100]%!" : "!"]", "Character Preference", features["body_size"]*100) as num|null
+ var/new_body_size = input(user, "Choose your desired sprite size: ([min*100]%-[max*100]%)\nWarning: This may make your character look distorted[danger > min ? "! Additionally, a proportional movement speed penalty will be applied to characters smaller than [danger*100]%." : "!"]", "Character Preference", features["body_size"]*100) as num|null
if (new_body_size)
new_body_size = clamp(new_body_size * 0.01, min, max)
var/dorfy
- if(danger > new_body_size)
- dorfy = alert(user, "The chosen size appears to be smaller than the threshold of [danger*100]%, which will lead to an added exponential slowdown. Are you sure about that?", "Dwarfism Alert", "Yes", "Move it to the threshold", "No")
- if(!dorfy || dorfy == "Move it above the threshold")
+ if((new_body_size + 0.01) < danger) // Adding 0.01 as a dumb fix to prevent the warning message from appearing when exactly at threshold... Not sure why that happens in the first place.
+ dorfy = alert(user, "You have chosen a size below the slowdown threshold of [danger*100]%. For balancing purposes, the further you go below this percentage, the slower your character will be. Do you wish to keep this size?", "Speed Penalty Alert", "Yes", "Move it to the threshold", "No")
+ if(dorfy == "Move it to the threshold")
new_body_size = danger
+ if(!dorfy) //Aborts if this var is somehow empty
+ return
if(dorfy != "No")
features["body_size"] = new_body_size
-
+ if("tongue")
+ var/selected_custom_tongue = input(user, "Choose your desired tongue (none means your species tongue)", "Character Preference") as null|anything in GLOB.roundstart_tongues
+ if(selected_custom_tongue)
+ custom_tongue = selected_custom_tongue
+ if("speech_verb")
+ var/selected_custom_speech_verb = input(user, "Choose your desired speech verb (none means your species speech verb)", "Character Preference") as null|anything in GLOB.speech_verbs
+ if(selected_custom_speech_verb)
+ custom_speech_verb = selected_custom_speech_verb
else
switch(href_list["preference"])
//CITADEL PREFERENCES EDIT - I can't figure out how to modularize these, so they have to go here. :c -Pooj
@@ -2494,6 +2556,17 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if("hear_midis")
toggles ^= SOUND_MIDI
+ if("persistent_scars")
+ persistent_scars = !persistent_scars
+
+ if("clear_scars")
+ to_chat(user, "All scar slots cleared. Please save character to confirm.")
+ scars_list["1"] = ""
+ scars_list["2"] = ""
+ scars_list["3"] = ""
+ scars_list["4"] = ""
+ scars_list["5"] = ""
+
if("lobby_music")
toggles ^= SOUND_LOBBY
if((toggles & SOUND_LOBBY) && user.client && isnewplayer(user))
@@ -2572,6 +2645,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if("bimbo")
cit_toggles ^= BIMBOFICATION
+ if("auto_wag")
+ cit_toggles ^= NO_AUTO_WAG
+
//END CITADEL EDIT
if("ambientocclusion")
@@ -2720,6 +2796,19 @@ GLOBAL_LIST_EMPTY(preferences_datums)
character.dna.update_body_size(old_size)
+ //speech stuff
+ if(custom_tongue != "default")
+ var/new_tongue = GLOB.roundstart_tongues[custom_tongue]
+ if(new_tongue)
+ var/obj/item/organ/tongue/T = character.getorganslot(ORGAN_SLOT_TONGUE)
+ if(T)
+ qdel(T)
+ var/obj/item/organ/tongue/new_custom_tongue = new new_tongue
+ new_custom_tongue.Insert(character)
+ if(custom_speech_verb != "default")
+ character.dna.species.say_mod = custom_speech_verb
+
+
SEND_SIGNAL(character, COMSIG_HUMAN_PREFS_COPIED_TO, src, icon_updates, roundstart_checks)
//let's be sure the character updates
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 1ec3fc6404..59d99674eb 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -194,7 +194,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
if(current_version < 31)
S["wing_color"] >> features["wings_color"]
S["horn_color"] >> features["horns_color"]
-
+
if(current_version < 33)
features["flavor_text"] = html_encode(features["flavor_text"])
features["silicon_flavor_text"] = html_encode(features["silicon_flavor_text"])
@@ -224,6 +224,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
var/needs_update = savefile_needs_update(S)
if(needs_update == -2) //fatal, can't load any data
return 0
+
+ . = TRUE
//general preferences
S["ooccolor"] >> ooccolor
@@ -440,6 +442,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
if(needs_update == -2) //fatal, can't load any data
return 0
+ . = TRUE
+
//Species
var/species_id
S["species"] >> species_id
@@ -453,6 +457,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
if(newtype)
pref_species = new newtype
+
+ scars_index = rand(1,5)
+
//Character
S["real_name"] >> real_name
S["nameless"] >> nameless
@@ -479,6 +486,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["backbag"] >> backbag
S["jumpsuit_style"] >> jumpsuit_style
S["uplink_loc"] >> uplink_spawn_loc
+ S["custom_speech_verb"] >> custom_speech_verb
+ S["custom_tongue"] >> custom_tongue
S["feature_mcolor"] >> features["mcolor"]
S["feature_lizard_tail"] >> features["tail_lizard"]
S["feature_lizard_snout"] >> features["snout"]
@@ -495,6 +504,12 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["feature_insect_markings"] >> features["insect_markings"]
S["feature_horns_color"] >> features["horns_color"]
S["feature_wings_color"] >> features["wings_color"]
+ S["persistent_scars"] >> persistent_scars
+ S["scars1"] >> scars_list["1"]
+ S["scars2"] >> scars_list["2"]
+ S["scars3"] >> scars_list["3"]
+ S["scars4"] >> scars_list["4"]
+ S["scars5"] >> scars_list["5"]
//Custom names
@@ -513,6 +528,10 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
//Quirks
S["all_quirks"] >> all_quirks
+ //Records
+ S["security_records"] >> security_records
+ S["medical_records"] >> medical_records
+
//Citadel code
S["feature_genitals_use_skintone"] >> features["genitals_use_skintone"]
S["feature_mcolor2"] >> features["mcolor2"]
@@ -617,14 +636,14 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
facial_hair_style = sanitize_inlist(facial_hair_style, GLOB.facial_hair_styles_list)
underwear = sanitize_inlist(underwear, GLOB.underwear_list)
undershirt = sanitize_inlist(undershirt, GLOB.undershirt_list)
- undie_color = sanitize_hexcolor(undie_color, 3, FALSE, initial(undie_color))
- shirt_color = sanitize_hexcolor(shirt_color, 3, FALSE, initial(shirt_color))
+ undie_color = sanitize_hexcolor(undie_color, 6, FALSE, initial(undie_color))
+ shirt_color = sanitize_hexcolor(shirt_color, 6, FALSE, initial(shirt_color))
socks = sanitize_inlist(socks, GLOB.socks_list)
- socks_color = sanitize_hexcolor(socks_color, 3, FALSE, initial(socks_color))
+ socks_color = sanitize_hexcolor(socks_color, 6, FALSE, initial(socks_color))
age = sanitize_integer(age, AGE_MIN, AGE_MAX, initial(age))
- hair_color = sanitize_hexcolor(hair_color, 3, 0)
- facial_hair_color = sanitize_hexcolor(facial_hair_color, 3, 0)
- eye_color = sanitize_hexcolor(eye_color, 3, 0)
+ hair_color = sanitize_hexcolor(hair_color, 6, FALSE)
+ facial_hair_color = sanitize_hexcolor(facial_hair_color, 6, FALSE)
+ eye_color = sanitize_hexcolor(eye_color, 6, FALSE)
var/static/allow_custom_skintones
if(isnull(allow_custom_skintones))
@@ -635,12 +654,12 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
else
skin_tone = sanitize_inlist(skin_tone, GLOB.skin_tones - GLOB.nonstandard_skin_tones, initial(skin_tone))
- features["horns_color"] = sanitize_hexcolor(features["horns_color"], 3, FALSE, "85615a")
- features["wings_color"] = sanitize_hexcolor(features["wings_color"], 3, FALSE, "FFFFFF")
+ features["horns_color"] = sanitize_hexcolor(features["horns_color"], 6, FALSE, "85615a")
+ features["wings_color"] = sanitize_hexcolor(features["wings_color"], 6, FALSE, "FFFFFF")
backbag = sanitize_inlist(backbag, GLOB.backbaglist, initial(backbag))
jumpsuit_style = sanitize_inlist(jumpsuit_style, GLOB.jumpsuitlist, initial(jumpsuit_style))
uplink_spawn_loc = sanitize_inlist(uplink_spawn_loc, GLOB.uplink_spawn_loc_list, initial(uplink_spawn_loc))
- features["mcolor"] = sanitize_hexcolor(features["mcolor"], 3, 0)
+ features["mcolor"] = sanitize_hexcolor(features["mcolor"], 6, FALSE)
features["tail_lizard"] = sanitize_inlist(features["tail_lizard"], GLOB.tails_list_lizard)
features["tail_human"] = sanitize_inlist(features["tail_human"], GLOB.tails_list_human)
features["snout"] = sanitize_inlist(features["snout"], GLOB.snouts_list)
@@ -684,20 +703,32 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
features["cock_shape"] = sanitize_inlist(features["cock_shape"], GLOB.cock_shapes_list, DEF_COCK_SHAPE)
features["balls_shape"] = sanitize_inlist(features["balls_shape"], GLOB.balls_shapes_list, DEF_BALLS_SHAPE)
features["vag_shape"] = sanitize_inlist(features["vag_shape"], GLOB.vagina_shapes_list, DEF_VAGINA_SHAPE)
- features["breasts_color"] = sanitize_hexcolor(features["breasts_color"], 3, FALSE, "FFF")
- features["cock_color"] = sanitize_hexcolor(features["cock_color"], 3, FALSE, "FFF")
- features["balls_color"] = sanitize_hexcolor(features["balls_color"], 3, FALSE, "FFF")
- features["vag_color"] = sanitize_hexcolor(features["vag_color"], 3, FALSE, "FFF")
+ features["breasts_color"] = sanitize_hexcolor(features["breasts_color"], 6, FALSE, "FFFFFF")
+ features["cock_color"] = sanitize_hexcolor(features["cock_color"], 6, FALSE, "FFFFFF")
+ features["balls_color"] = sanitize_hexcolor(features["balls_color"], 6, FALSE, "FFFFFF")
+ features["vag_color"] = sanitize_hexcolor(features["vag_color"], 6, FALSE, "FFFFFF")
features["breasts_visibility"] = sanitize_inlist(features["breasts_visibility"], safe_visibilities, GEN_VISIBLE_NO_UNDIES)
features["cock_visibility"] = sanitize_inlist(features["cock_visibility"], safe_visibilities, GEN_VISIBLE_NO_UNDIES)
features["balls_visibility"] = sanitize_inlist(features["balls_visibility"], safe_visibilities, GEN_VISIBLE_NO_UNDIES)
features["vag_visibility"] = sanitize_inlist(features["vag_visibility"], safe_visibilities, GEN_VISIBLE_NO_UNDIES)
+ custom_speech_verb = sanitize_inlist(custom_speech_verb, GLOB.speech_verbs, "default")
+ custom_tongue = sanitize_inlist(custom_tongue, GLOB.roundstart_tongues, "default")
+
+ security_records = copytext(security_records, 1, MAX_FLAVOR_LEN)
+ medical_records = copytext(medical_records, 1, MAX_FLAVOR_LEN)
features["flavor_text"] = copytext(features["flavor_text"], 1, MAX_FLAVOR_LEN)
features["silicon_flavor_text"] = copytext(features["silicon_flavor_text"], 1, MAX_FLAVOR_LEN)
features["ooc_notes"] = copytext(features["ooc_notes"], 1, MAX_FLAVOR_LEN)
+ persistent_scars = sanitize_integer(persistent_scars)
+ scars_list["1"] = sanitize_text(scars_list["1"])
+ scars_list["2"] = sanitize_text(scars_list["2"])
+ scars_list["3"] = sanitize_text(scars_list["3"])
+ scars_list["4"] = sanitize_text(scars_list["4"])
+ scars_list["5"] = sanitize_text(scars_list["5"])
+
joblessrole = sanitize_integer(joblessrole, 1, 3, initial(joblessrole))
//Validate job prefs
for(var/j in job_preferences)
@@ -756,6 +787,13 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
WRITE_FILE(S["jumpsuit_style"] , jumpsuit_style)
WRITE_FILE(S["uplink_loc"] , uplink_spawn_loc)
WRITE_FILE(S["species"] , pref_species.id)
+ WRITE_FILE(S["custom_speech_verb"] , custom_speech_verb)
+ WRITE_FILE(S["custom_tongue"] , custom_tongue)
+
+ // records
+ WRITE_FILE(S["security_records"] , security_records)
+ WRITE_FILE(S["medical_records"] , medical_records)
+
WRITE_FILE(S["feature_mcolor"] , features["mcolor"])
WRITE_FILE(S["feature_lizard_tail"] , features["tail_lizard"])
WRITE_FILE(S["feature_human_tail"] , features["tail_human"])
@@ -822,6 +860,13 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
WRITE_FILE(S["vore_taste"] , vore_taste)
WRITE_FILE(S["belly_prefs"] , belly_prefs)
+ WRITE_FILE(S["persistent_scars"] , persistent_scars)
+ WRITE_FILE(S["scars1"] , scars_list["1"])
+ WRITE_FILE(S["scars2"] , scars_list["2"])
+ WRITE_FILE(S["scars3"] , scars_list["3"])
+ WRITE_FILE(S["scars4"] , scars_list["4"])
+ WRITE_FILE(S["scars5"] , scars_list["5"])
+
//gear loadout
if(chosen_gear.len)
var/text_to_save = chosen_gear.Join("|")
diff --git a/code/modules/client/verbs/autobunker.dm b/code/modules/client/verbs/autobunker.dm
new file mode 100644
index 0000000000..03200c5f0b
--- /dev/null
+++ b/code/modules/client/verbs/autobunker.dm
@@ -0,0 +1,37 @@
+/client/verb/bunker_auto_authorize()
+ set name = "Auto Authorize Panic Bunker"
+ set desc = "Authorizes your account in the panic bunker of any servers connected to this function."
+ set category = "OOC"
+
+ if(autobunker_last_try + 5 SECONDS > world.time)
+ to_chat(src, "Function on cooldown, try again in 5 seconds.")
+ return
+ autobunker_last_try = world.time
+
+ world.send_cross_server_bunker_overrides(key, src)
+
+/world/proc/send_cross_server_bunker_overrides(key, client/C)
+ var/comms_key = CONFIG_GET(string/comms_key)
+ if(!comms_key)
+ return
+ var/list/message = list()
+ message["ckey"] = key
+ message["source"] = "[CONFIG_GET(string/cross_comms_name)]"
+ message["key"] = comms_key
+ message["auto_bunker_override"] = TRUE
+ var/list/servers = CONFIG_GET(keyed_list/cross_server_bunker_override)
+ if(!length(servers))
+ to_chat(C, "AUTOBUNKER: No servers are configured to receive from this one.")
+ return
+ log_admin("[key] ([key_name(C)]) has initiated an autobunker authentication with linked servers.")
+ for(var/name in servers)
+ var/returned = world.Export("[servers[name]]?[list2params(message)]")
+ switch(returned)
+ if("Bad Key")
+ to_chat(C, "AUTOBuNKER: [name] failed to authenticate with this server.")
+ if("Function Disabled")
+ to_chat(C, "AUTOBUNKER: [name] has autobunker receive disabled.")
+ if("Success")
+ to_chat(C, "AUTOBUNKER: Successfully authenticated with [name]. Panic bunker bypass granted to [key]..")
+ else
+ to_chat(C, "AUTOBUNKER: Unknown error ([name]).")
diff --git a/code/modules/client/verbs/minimap.dm b/code/modules/client/verbs/minimap.dm
index 3d213dc210..3cdb1d57a8 100644
--- a/code/modules/client/verbs/minimap.dm
+++ b/code/modules/client/verbs/minimap.dm
@@ -6,5 +6,7 @@
if(!CONFIG_GET(flag/minimaps_enabled))
to_chat(usr, "Minimap generation is not enabled in the server's configuration.")
return
-
+ if(!SSminimaps.station_minimap)
+ to_chat(usr, "Minimap generation is in progress, please wait!")
+ return
SSminimaps.station_minimap.show(src)
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index a28061db10..d540336b86 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -4,7 +4,7 @@
max_integrity = 200
integrity_failure = 0.4
block_priority = BLOCK_PRIORITY_CLOTHING
- var/damaged_clothes = 0 //similar to machine's BROKEN stat and structure's broken var
+ var/damaged_clothes = CLOTHING_PRISTINE //similar to machine's BROKEN stat and structure's broken var
var/flash_protect = 0 //What level of bright light protection item has. 1 = Flashers, Flashes, & Flashbangs | 2 = Welding | -1 = OH GOD WELDING BURNT OUT MY RETINAS
var/tint = 0 //Sets the item's level of visual impairment tint, normally set to the same as flash_protect
var/up = 0 //but separated to allow items to protect but not impair vision, like space helmets
@@ -28,6 +28,9 @@
var/clothing_flags = NONE
+ // What items can be consumed to repair this clothing (must by an /obj/item/stack)
+ var/repairable_by = /obj/item/stack/sheet/cloth
+
//Var modification - PLEASE be careful with this I know who you are and where you live
var/list/user_vars_to_edit //VARNAME = VARVALUE eg: "name" = "butts"
var/list/user_vars_remembered //Auto built by the above + dropped() + equipped()
@@ -45,7 +48,20 @@
var/list/species_restricted = null
//Basically syntax is species_restricted = list("Species Name","Species Name")
//Add a "exclude" string to do the opposite, making it only only species listed that can't wear it.
- //You append this to clothing objects.
+ //You append this to clothing objects
+
+
+
+ // How much clothing damage has been dealt to each of the limbs of the clothing, assuming it covers more than one limb
+ var/list/damage_by_parts
+ // How much integrity is in a specific limb before that limb is disabled (for use in [/obj/item/clothing/proc/take_damage_zone], and only if we cover multiple zones.) Set to 0 to disable shredding.
+ var/limb_integrity = 0
+ // How many zones (body parts, not precise) we have disabled so far, for naming purposes
+ var/zones_disabled
+ ///These are armor values that protect the wearer, taken from the clothing's armor datum. List updates on examine because it's currently only used to print armor ratings to chat in Topic().
+ var/list/armor_list = list()
+ ///These are armor values that protect the clothing, taken from its armor datum. List updates on examine because it's currently only used to print armor ratings to chat in Topic().
+ var/list/durability_list = list()
/obj/item/clothing/Initialize()
. = ..()
@@ -73,7 +89,7 @@
tastes = list("dust" = 1, "lint" = 1)
/obj/item/clothing/attack(mob/M, mob/user, def_zone)
- if(user.a_intent != INTENT_HARM && ismoth(M))
+ if(user.a_intent != INTENT_HARM && isinsect(M))
var/obj/item/reagent_containers/food/snacks/clothing/clothing_as_food = new
clothing_as_food.name = name
if(clothing_as_food.attack(M, user, def_zone))
@@ -83,15 +99,105 @@
return ..()
/obj/item/clothing/attackby(obj/item/W, mob/user, params)
- if(damaged_clothes && istype(W, /obj/item/stack/sheet/cloth))
- var/obj/item/stack/sheet/cloth/C = W
- C.use(1)
- update_clothes_damaged_state(FALSE)
- obj_integrity = max_integrity
- to_chat(user, "You fix the damage on [src] with [C].")
+ if(damaged_clothes && istype(W, repairable_by))
+ var/obj/item/stack/S = W
+ switch(damaged_clothes)
+ if(CLOTHING_DAMAGED)
+ S.use(1)
+ repair(user, params)
+ if(CLOTHING_SHREDDED)
+ if(S.amount < 3)
+ to_chat(user, "You require 3 [S.name] to repair [src].")
+ return
+ to_chat(user, "You begin fixing the damage to [src] with [S]...")
+ if(do_after(user, 6 SECONDS, TRUE, src))
+ if(S.use(3))
+ repair(user, params)
return 1
return ..()
+// Set the clothing's integrity back to 100%, remove all damage to bodyparts, and generally fix it up
+/obj/item/clothing/proc/repair(mob/user, params)
+ damaged_clothes = CLOTHING_PRISTINE
+ update_clothes_damaged_state(FALSE)
+ obj_integrity = max_integrity
+ name = initial(name) // remove "tattered" or "shredded" if there's a prefix
+ body_parts_covered = initial(body_parts_covered)
+ slot_flags = initial(slot_flags)
+ damage_by_parts = null
+ if(user)
+ UnregisterSignal(user, COMSIG_MOVABLE_MOVED)
+ to_chat(user, "You fix the damage on [src].")
+
+/**
+ * take_damage_zone() is used for dealing damage to specific bodyparts on a worn piece of clothing, meant to be called from [/obj/item/bodypart/proc/check_woundings_mods()]
+ *
+ * This proc only matters when a bodypart that this clothing is covering is harmed by a direct attack (being on fire or in space need not apply), and only if this clothing covers
+ * more than one bodypart to begin with. No point in tracking damage by zone for a hat, and I'm not cruel enough to let you fully break them in a few shots.
+ * Also if limb_integrity is 0, then this clothing doesn't have bodypart damage enabled so skip it.
+ *
+ * Arguments:
+ * * def_zone: The bodypart zone in question
+ * * damage_amount: Incoming damage
+ * * damage_type: BRUTE or BURN
+ * * armour_penetration: If the attack had armour_penetration
+ */
+/obj/item/clothing/proc/take_damage_zone(def_zone, damage_amount, damage_type, armour_penetration)
+ if(!def_zone || !limb_integrity || (initial(body_parts_covered) in GLOB.bitflags)) // the second check sees if we only cover one bodypart anyway and don't need to bother with this
+ return
+ var/list/covered_limbs = body_parts_covered2organ_names(body_parts_covered) // what do we actually cover?
+ if(!(def_zone in covered_limbs))
+ return
+
+ var/damage_dealt = take_damage(damage_amount * 0.1, damage_type, armour_penetration, FALSE) * 10 // only deal 10% of the damage to the general integrity damage, then multiply it by 10 so we know how much to deal to limb
+ LAZYINITLIST(damage_by_parts)
+ damage_by_parts[def_zone] += damage_dealt
+ if(damage_by_parts[def_zone] > limb_integrity)
+ disable_zone(def_zone, damage_type)
+
+/**
+ * disable_zone() is used to disable a given bodypart's protection on our clothing item, mainly from [/obj/item/clothing/proc/take_damage_zone()]
+ *
+ * This proc disables all protection on the specified bodypart for this piece of clothing: it'll be as if it doesn't cover it at all anymore (because it won't!)
+ * If every possible bodypart has been disabled on the clothing, we put it out of commission entirely and mark it as shredded, whereby it will have to be repaired in
+ * order to equip it again. Also note we only consider it damaged if there's more than one bodypart disabled.
+ *
+ * Arguments:
+ * * def_zone: The bodypart zone we're disabling
+ * * damage_type: Only really relevant for the verb for describing the breaking, and maybe obj_destruction()
+ */
+/obj/item/clothing/proc/disable_zone(def_zone, damage_type)
+ var/list/covered_limbs = body_parts_covered2organ_names(body_parts_covered)
+ if(!(def_zone in covered_limbs))
+ return
+
+ var/zone_name = parse_zone(def_zone)
+ var/break_verb = ((damage_type == BRUTE) ? "torn" : "burned")
+
+ if(iscarbon(loc))
+ var/mob/living/carbon/C = loc
+ C.visible_message("The [zone_name] on [C]'s [src.name] is [break_verb] away!", "The [zone_name] on your [src.name] is [break_verb] away!", vision_distance = COMBAT_MESSAGE_RANGE)
+ RegisterSignal(C, COMSIG_MOVABLE_MOVED, .proc/bristle)
+
+ zones_disabled++
+ for(var/i in zone2body_parts_covered(def_zone))
+ body_parts_covered &= ~i
+
+ if(body_parts_covered == NONE) // if there are no more parts to break then the whole thing is kaput
+ obj_destruction((damage_type == BRUTE ? "melee" : "laser")) // melee/laser is good enough since this only procs from direct attacks anyway and not from fire/bombs
+ return
+
+ damaged_clothes = CLOTHING_DAMAGED
+ switch(zones_disabled)
+ if(1)
+ name = "damaged [initial(name)]"
+ if(2)
+ name = "mangy [initial(name)]"
+ if(3 to INFINITY) // take better care of your shit, dude
+ name = "tattered [initial(name)]"
+
+ update_clothes_damaged_state()
+
/obj/item/clothing/Destroy()
user_vars_remembered = null //Oh god somebody put REFERENCES in here? not to worry, we'll clean it up
return ..()
@@ -100,6 +206,7 @@
..()
if(!istype(user))
return
+ UnregisterSignal(user, COMSIG_MOVABLE_MOVED)
if(LAZYLEN(user_vars_remembered))
for(var/variable in user_vars_remembered)
if(variable in user.vars)
@@ -112,7 +219,9 @@
if (!istype(user))
return
if(slot_flags & slotdefine2slotbit(slot)) //Was equipped to a valid slot for this item?
- if (LAZYLEN(user_vars_to_edit))
+ if(iscarbon(user) && LAZYLEN(zones_disabled))
+ RegisterSignal(user, COMSIG_MOVABLE_MOVED, .proc/bristle)
+ if(LAZYLEN(user_vars_to_edit))
for(var/variable in user_vars_to_edit)
if(variable in user.vars)
LAZYSET(user_vars_remembered, variable, user.vars[variable])
@@ -120,8 +229,19 @@
/obj/item/clothing/examine(mob/user)
. = ..()
- if(damaged_clothes)
- . += "It looks damaged!"
+ if(damaged_clothes == CLOTHING_SHREDDED)
+ . += "It is completely shredded and requires mending before it can be worn again!"
+ return
+ for(var/zone in damage_by_parts)
+ var/pct_damage_part = damage_by_parts[zone] / limb_integrity * 100
+ var/zone_name = parse_zone(zone)
+ switch(pct_damage_part)
+ if(100 to INFINITY)
+ . += "The [zone_name] is useless and requires mending!"
+ if(60 to 99)
+ . += "The [zone_name] is heavily shredded!"
+ if(30 to 59)
+ . += "The [zone_name] is partially shredded."
var/datum/component/storage/pockets = GetComponent(/datum/component/storage)
if(pockets)
var/list/how_cool_are_your_threads = list("")
@@ -137,10 +257,91 @@
how_cool_are_your_threads += "Adding or removing items from [src] makes no noise.\n"
how_cool_are_your_threads += ""
. += how_cool_are_your_threads.Join()
+
+ if(LAZYLEN(armor_list))
+ armor_list.Cut()
+ if(armor.bio)
+ armor_list += list("TOXIN" = armor.bio)
+ if(armor.bomb)
+ armor_list += list("EXPLOSIVE" = armor.bomb)
+ if(armor.bullet)
+ armor_list += list("BULLET" = armor.bullet)
+ if(armor.energy)
+ armor_list += list("ENERGY" = armor.energy)
+ if(armor.laser)
+ armor_list += list("LASER" = armor.laser)
+ if(armor.magic)
+ armor_list += list("MAGIC" = armor.magic)
+ if(armor.melee)
+ armor_list += list("MELEE" = armor.melee)
+ if(armor.rad)
+ armor_list += list("RADIATION" = armor.rad)
+
+ if(LAZYLEN(durability_list))
+ durability_list.Cut()
+ if(armor.fire)
+ durability_list += list("FIRE" = armor.fire)
+ if(armor.acid)
+ durability_list += list("ACID" = armor.acid)
+
+ if(LAZYLEN(armor_list) || LAZYLEN(durability_list))
+ . += "It has a tag listing its protection classes."
+
+/obj/item/clothing/Topic(href, href_list)
+ . = ..()
+
+ if(href_list["list_armor"])
+ var/list/readout = list("PROTECTION CLASSES (I-X)")
+ if(LAZYLEN(armor_list))
+ readout += "\nARMOR"
+ for(var/dam_type in armor_list)
+ var/armor_amount = armor_list[dam_type]
+ readout += "\n[dam_type] [armor_to_protection_class(armor_amount)]" //e.g. BOMB IV
+ if(LAZYLEN(durability_list))
+ readout += "\nDURABILITY"
+ for(var/dam_type in durability_list)
+ var/durability_amount = durability_list[dam_type]
+ readout += "\n[dam_type] [armor_to_protection_class(durability_amount)]" //e.g. FIRE II
+ readout += ""
+
+ to_chat(usr, "[readout.Join()]")
+
+/**
+ * Rounds armor_value to nearest 10, divides it by 10 and then expresses it in roman numerals up to 10
+ *
+ * Rounds armor_value to nearest 10, divides it by 10
+ * and then expresses it in roman numerals up to 10
+ * Arguments:
+ * * armor_value - Number we're converting
+ */
+/obj/item/clothing/proc/armor_to_protection_class(armor_value)
+ armor_value = round(armor_value,10) / 10
+ switch (armor_value)
+ if (1)
+ . = "I"
+ if (2)
+ . = "II"
+ if (3)
+ . = "III"
+ if (4)
+ . = "IV"
+ if (5)
+ . = "V"
+ if (6)
+ . = "VI"
+ if (7)
+ . = "VII"
+ if (8)
+ . = "VIII"
+ if (9)
+ . = "IX"
+ if (10 to INFINITY)
+ . = "X"
+ return .
/obj/item/clothing/obj_break(damage_flag)
- if(!damaged_clothes)
- update_clothes_damaged_state(TRUE)
+ damaged_clothes = CLOTHING_DAMAGED
+ update_clothes_damaged_state()
if(ismob(loc)) //It's not important enough to warrant a message if nobody's wearing it
var/mob/M = loc
to_chat(M, "Your [name] starts to fall apart!")
@@ -149,7 +350,6 @@
var/index = "[REF(initial(icon))]-[initial(icon_state)]"
var/static/list/damaged_clothes_icons = list()
if(damaging)
- damaged_clothes = 1
var/icon/damaged_clothes_icon = damaged_clothes_icons[index]
if(!damaged_clothes_icon)
damaged_clothes_icon = icon(initial(icon), initial(icon_state), , 1) //we only want to apply damaged effect to the initial icon_state for each object
@@ -157,12 +357,10 @@
damaged_clothes_icon.Blend(icon('icons/effects/item_damage.dmi', "itemdamaged"), ICON_MULTIPLY) //adds damage effect and the remaining white areas become transparant
damaged_clothes_icon = fcopy_rsc(damaged_clothes_icon)
damaged_clothes_icons[index] = damaged_clothes_icon
- add_overlay(damaged_clothes_icon, 1)
+ add_overlay(damaged_clothes_icon, TRUE)
else
- damaged_clothes = 0
cut_overlay(damaged_clothes_icons[index], TRUE)
-
/*
SEE_SELF // can see self, no matter what
SEE_MOBS // can see all mobs, no matter what
@@ -222,16 +420,25 @@ BLIND // can't see anything
/obj/item/clothing/obj_destruction(damage_flag)
- if(damage_flag == "bomb" || damage_flag == "melee")
+ if(damage_flag == "bomb")
var/turf/T = get_turf(src)
spawn(1) //so the shred survives potential turf change from the explosion.
var/obj/effect/decal/cleanable/shreds/Shreds = new(T)
Shreds.desc = "The sad remains of what used to be [name]."
deconstruct(FALSE)
+ else if(!(damage_flag in list("acid", "fire")))
+ damaged_clothes = CLOTHING_SHREDDED
+ body_parts_covered = NONE
+ name = "shredded [initial(name)]"
+ slot_flags = NONE
+ update_clothes_damaged_state()
+ if(ismob(loc))
+ var/mob/M = loc
+ M.visible_message("[M]'s [src.name] falls off, completely shredded!", "Your [src.name] falls off, completely shredded!", vision_distance = COMBAT_MESSAGE_RANGE)
+ M.dropItemToGround(src)
else
..()
-
//Species-restricted clothing check. - Thanks Oraclestation, BS13, /vg/station etc.
/obj/item/clothing/mob_can_equip(mob/M, slot, disable_warning = TRUE)
@@ -265,3 +472,12 @@ BLIND // can't see anything
return FALSE
return TRUE
+
+
+
+/// If we're a clothing with at least 1 shredded/disabled zone, give the wearer a periodic heads up letting them know their clothes are damaged
+/obj/item/clothing/proc/bristle(mob/living/L)
+ if(!istype(L))
+ return
+ if(prob(0.2))
+ to_chat(L, "The damaged threads on your [src.name] chafe!")
diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm
index 8cbc416b2e..01effea6f2 100644
--- a/code/modules/clothing/glasses/_glasses.dm
+++ b/code/modules/clothing/glasses/_glasses.dm
@@ -203,6 +203,12 @@
icon_state = "hipster_glasses"
item_state = "hipster_glasses"
+/obj/item/clothing/glasses/regular/circle
+ name = "circle glasses"
+ desc = "Why would you wear something so controversial yet so brave?"
+ icon_state = "circle_glasses"
+ item_state = "circle_glasses"
+
//Here lies green glasses, so ugly they died. RIP
/obj/item/clothing/glasses/sunglasses
diff --git a/code/modules/clothing/glasses/disablerglasses.dm b/code/modules/clothing/glasses/disablerglasses.dm
index a46e4c8339..51fb1cec87 100644
--- a/code/modules/clothing/glasses/disablerglasses.dm
+++ b/code/modules/clothing/glasses/disablerglasses.dm
@@ -4,7 +4,9 @@
var/beamtype = /obj/item/projectile/beam/disabler //change for adminbus
/obj/item/clothing/glasses/hud/security/sunglasses/disablers/ranged_attack(mob/living/carbon/human/user,atom/A, params)
- user.changeNext_move(CLICK_CD_RANGE)
+ if(!user.CheckActionCooldown(CLICK_CD_RANGE))
+ return
+ user.last_action = world.time
var/obj/item/projectile/beam/disabler/LE = new beamtype( loc )
playsound(usr.loc, 'sound/weapons/taser2.ogg', 75, 1)
LE.firer = src
@@ -12,4 +14,4 @@
LE.preparePixelProjectile(A, src, params)
LE.fire()
return TRUE
- //shamelessly copied
\ No newline at end of file
+ //shamelessly copied
diff --git a/code/modules/clothing/gloves/_gloves.dm b/code/modules/clothing/gloves/_gloves.dm
index ddf5e4b584..a206b9adc7 100644
--- a/code/modules/clothing/gloves/_gloves.dm
+++ b/code/modules/clothing/gloves/_gloves.dm
@@ -34,7 +34,7 @@
if(blood_DNA)
. += mutable_appearance('icons/effects/blood.dmi', "bloodyhands", color = blood_DNA_to_color())
-/obj/item/clothing/gloves/update_clothes_damaged_state(damaging = TRUE)
+/obj/item/clothing/gloves/update_clothes_damaged_state()
..()
if(ismob(loc))
var/mob/M = loc
diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm
index 1b5cd6c7d2..56d6e7d38f 100644
--- a/code/modules/clothing/gloves/color.dm
+++ b/code/modules/clothing/gloves/color.dm
@@ -23,14 +23,15 @@
if(iscarbon(target) && proximity)
var/mob/living/carbon/C = target
var/mob/living/carbon/U = user
- var/success = C.equip_to_slot_if_possible(new /obj/item/clothing/gloves/color/yellow/sprayon, ITEM_SLOT_GLOVES, TRUE, TRUE)
+ var/success = C.equip_to_slot_if_possible(new /obj/item/clothing/gloves/color/yellow/sprayon, ITEM_SLOT_GLOVES, TRUE, TRUE, clothing_check = TRUE)
if(success)
if(C == user)
C.visible_message("[U] sprays their hands with glittery rubber!")
else
C.visible_message("[U] sprays glittery rubber on the hands of [C]!")
else
- C.visible_message("The rubber fails to stick to [C]'s hands!")
+ user.visible_message("The rubber fails to stick to [C]'s hands!",
+ "The rubber fails to stick to [C]'s [(SLOT_GLOVES in C.check_obscured_slots()) ? "unexposed" : ""] hands!")
qdel(src)
diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm
index a8017631bd..1c3ac0f340 100644
--- a/code/modules/clothing/gloves/miscellaneous.dm
+++ b/code/modules/clothing/gloves/miscellaneous.dm
@@ -45,8 +45,8 @@
REMOVE_TRAIT(user, secondary_trait, GLOVE_TRAIT)
if(ishuman(user))
var/mob/living/carbon/human/H = user
- H.dna.species.punchdamagehigh = initial(H.dna.species.punchdamagehigh)
- H.dna.species.punchdamagelow = initial(H.dna.species.punchdamagelow)
+ H.dna.species.punchdamagehigh -= enhancement
+ H.dna.species.punchdamagelow -= enhancement
return ..()
/obj/item/clothing/gloves/fingerless/pugilist/chaplain
@@ -105,11 +105,11 @@
return
var/mob/living/M = loc
- M.changeNext_move(CLICK_CD_RAPID)
+ M.SetNextAction(CLICK_CD_RAPID)
if(warcry)
M.say("[warcry]", ignore_spam = TRUE, forced = TRUE)
- return FALSE
+ return NO_AUTO_CLICKDELAY_HANDLING | ATTACK_IGNORE_ACTION
/obj/item/clothing/gloves/fingerless/pugilist/rapid/AltClick(mob/user)
var/input = stripped_input(user,"What do you want your battlecry to be? Max length of 6 characters.", ,"", 7)
@@ -135,9 +135,9 @@
if(target.stat != CONSCIOUS) //Can't hug people who are dying/dead
return FALSE
else
- M.changeNext_move(CLICK_CD_RAPID)
+ M.SetNextAction(CLICK_CD_RAPID)
- return FALSE
+ return NO_AUTO_CLICKDELAY_HANDLING | ATTACK_IGNORE_ACTION
/obj/item/clothing/gloves/botanic_leather
name = "botanist's leather gloves"
@@ -196,3 +196,15 @@
transfer_prints = FALSE
strip_mod = 5
strip_silence = TRUE
+
+/obj/item/clothing/gloves/evening
+ name = "evening gloves"
+ desc = "Thin, pretty gloves intended for use in regal feminine attire, but knowing Space China these are just for some maid fetish."
+ icon_state = "evening"
+ item_state = "evening"
+ strip_delay = 40
+ equip_delay_other = 20
+ cold_protection = HANDS
+ min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
+ strip_mod = 0.9
+ custom_price = PRICE_ALMOST_CHEAP
diff --git a/code/modules/clothing/head/_head.dm b/code/modules/clothing/head/_head.dm
index 475e7a4e51..dc07d5e050 100644
--- a/code/modules/clothing/head/_head.dm
+++ b/code/modules/clothing/head/_head.dm
@@ -8,6 +8,7 @@
var/blockTracking = 0 //For AI tracking
var/can_toggle = null
dynamic_hair_suffix = "+generic"
+ var/datum/beepsky_fashion/beepsky_fashion //the associated datum for applying this to a secbot
/obj/item/clothing/head/Initialize()
. = ..()
@@ -56,7 +57,7 @@
if(blood_DNA)
. += mutable_appearance('icons/effects/blood.dmi', "helmetblood", color = blood_DNA_to_color())
-/obj/item/clothing/head/update_clothes_damaged_state(damaging = TRUE)
+/obj/item/clothing/head/update_clothes_damaged_state()
..()
if(ismob(loc))
var/mob/M = loc
diff --git a/code/modules/clothing/head/beanie.dm b/code/modules/clothing/head/beanie.dm
index 4117e88811..e79095863a 100644
--- a/code/modules/clothing/head/beanie.dm
+++ b/code/modules/clothing/head/beanie.dm
@@ -74,6 +74,10 @@
icon_state = "beaniedurathread"
armor = list("melee" = 25, "bullet" = 10, "laser" = 20,"energy" = 10, "bomb" = 30, "bio" = 15, "rad" = 20, "fire" = 100, "acid" = 50)
-
+/obj/item/clothing/head/beanie/waldo
+ name = "red striped bobble hat"
+ desc = "If you're going on a worldwide hike, you'll need some cold protection."
+ icon_state = "waldo_hat"
+ item_state = "waldo_hat"
//No dog fashion sprites yet :( poor Ian can't be dope like the rest of us yet
\ No newline at end of file
diff --git a/code/modules/clothing/head/collectable.dm b/code/modules/clothing/head/collectable.dm
index 314142d0cc..20cb7cc824 100644
--- a/code/modules/clothing/head/collectable.dm
+++ b/code/modules/clothing/head/collectable.dm
@@ -27,7 +27,9 @@
icon_state = "chef"
item_state = "chef"
dynamic_hair_suffix = ""
+
dog_fashion = /datum/dog_fashion/head/chef
+ beepsky_fashion = /datum/beepsky_fashion/chef
/obj/item/clothing/head/collectable/paper
name = "collectable paper hat"
@@ -42,6 +44,8 @@
icon_state = "tophat"
item_state = "that"
+ beepsky_fashion = /datum/beepsky_fashion/tophat
+
/obj/item/clothing/head/collectable/captain
name = "collectable captain's hat"
desc = "A collectable hat that'll make you look just like a real comdom!"
@@ -49,6 +53,7 @@
item_state = "caphat"
dog_fashion = /datum/dog_fashion/head/captain
+ beepsky_fashion = /datum/beepsky_fashion/captain
/obj/item/clothing/head/collectable/police
name = "collectable police officer's hat"
@@ -91,6 +96,7 @@
item_state = "pirate"
dog_fashion = /datum/dog_fashion/head/pirate
+ beepsky_fashion = /datum/beepsky_fashion/pirate
/obj/item/clothing/head/collectable/kitty
name = "collectable kitty ears"
@@ -100,6 +106,7 @@
dynamic_hair_suffix = ""
dog_fashion = /datum/dog_fashion/head/kitty
+ beepsky_fashion = /datum/beepsky_fashion/cat
/obj/item/clothing/head/collectable/rabbitears
name = "collectable rabbit ears"
@@ -116,6 +123,7 @@
icon_state = "wizard"
dog_fashion = /datum/dog_fashion/head/blue_wizard
+ beepsky_fashion = /datum/beepsky_fashion/wizard
/obj/item/clothing/head/collectable/hardhat
name = "collectable hard hat"
diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm
index 80d0b7c8a8..12a4a43ca7 100644
--- a/code/modules/clothing/head/hardhat.dm
+++ b/code/modules/clothing/head/hardhat.dm
@@ -15,6 +15,7 @@
dynamic_hair_suffix = "+generic"
dog_fashion = /datum/dog_fashion/head
+ beepsky_fashion = /datum/beepsky_fashion/engineer
/obj/item/clothing/head/hardhat/ComponentInitialize()
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index 642888ffaf..662318fb82 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -244,7 +244,7 @@
icon_state = "knight_greyscale"
item_state = "knight_greyscale"
armor = list("melee" = 35, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 10, "bio" = 10, "rad" = 10, "fire" = 40, "acid" = 40)
- material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS | MATERIAL_EFFECTS //Can change color and add prefix
+ material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS //Can change color and add prefix
/obj/item/clothing/head/helmet/skull
name = "skull helmet"
@@ -386,3 +386,9 @@
cold_protection = HEAD
min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
armor = list("melee" = 10, "bullet" = 5, "laser" = 5,"energy" = 5, "bomb" = 5, "bio" = 50, "rad" = 20, "fire" = -10, "acid" = 0)
+
+/obj/item/clothing/head/helmet/police
+ name = "police officer's hat"
+ desc = "A police officer's Hat. This hat emphasizes that you are THE LAW."
+ icon_state = "policehelm"
+ dynamic_hair_suffix = ""
diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm
index 638a0c2f23..5af694ea1b 100644
--- a/code/modules/clothing/head/jobs.dm
+++ b/code/modules/clothing/head/jobs.dm
@@ -13,7 +13,9 @@
strip_delay = 10
equip_delay_other = 10
dynamic_hair_suffix = ""
+
dog_fashion = /datum/dog_fashion/head/chef
+ beepsky_fashion = /datum/beepsky_fashion/chef
/obj/item/clothing/head/chefhat/suicide_act(mob/user)
user.visible_message("[user] is donning [src]! It looks like [user.p_theyre()] trying to become a chef.")
@@ -33,7 +35,9 @@
flags_inv = 0
armor = list("melee" = 40, "bullet" = 30, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
strip_delay = 60
+
dog_fashion = /datum/dog_fashion/head/captain
+ beepsky_fashion = /datum/beepsky_fashion/captain
//Captain: This is no longer space-worthy
/obj/item/clothing/head/caphat/parade
diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm
index 54435f0daa..72d0f68c18 100644
--- a/code/modules/clothing/head/misc.dm
+++ b/code/modules/clothing/head/misc.dm
@@ -20,9 +20,11 @@
desc = "It's an amish looking hat."
icon_state = "tophat"
item_state = "that"
- dog_fashion = /datum/dog_fashion/head
throwforce = 1
+ dog_fashion = /datum/dog_fashion/head
+ beepsky_fashion = /datum/beepsky_fashion/tophat
+
/obj/item/clothing/head/canada
name = "striped red tophat"
desc = "It smells like fresh donut holes. / Il sent comme des trous de beignets frais."
@@ -126,7 +128,9 @@
desc = "Yarr."
icon_state = "pirate"
item_state = "pirate"
+
dog_fashion = /datum/dog_fashion/head/pirate
+ beepsky_fashion = /datum/beepsky_fashion/pirate
/obj/item/clothing/head/pirate/captain
name = "pirate captain hat"
@@ -189,6 +193,8 @@
desc = "A really cool hat if you're a mobster. A really lame hat if you're not."
pocket_storage_component_path = /datum/component/storage/concrete/pockets/small
+ beepsky_fashion = /datum/beepsky_fashion/fedora
+
/obj/item/clothing/head/fedora/suicide_act(mob/user)
if(user.gender == FEMALE)
return 0
@@ -205,7 +211,9 @@
item_state = "sombrero"
desc = "You can practically taste the fiesta."
flags_inv = HIDEHAIR
+
dog_fashion = /datum/dog_fashion/head/sombrero
+ beepsky_fashion = /datum/beepsky_fashion/sombrero
/obj/item/clothing/head/sombrero/green
name = "green sombrero"
@@ -213,6 +221,7 @@
item_state = "greensombrero"
desc = "As elegant as a dancing cactus."
flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS
+
dog_fashion = null
/obj/item/clothing/head/sombrero/shamebrero
@@ -220,6 +229,7 @@
icon_state = "shamebrero"
item_state = "shamebrero"
desc = "Once it's on, it never comes off."
+
dog_fashion = null
/obj/item/clothing/head/sombrero/shamebrero/Initialize()
@@ -248,7 +258,9 @@
item_state = "that"
cold_protection = HEAD
min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
+
dog_fashion = /datum/dog_fashion/head/santa
+ beepsky_fashion = /datum/beepsky_fashion/santa
/obj/item/clothing/head/jester
name = "jester hat"
@@ -286,6 +298,8 @@
resistance_flags = FIRE_PROOF
dynamic_hair_suffix = ""
+ beepsky_fashion = /datum/beepsky_fashion/king
+
/obj/item/clothing/head/crown/fancy
name = "magnificent crown"
desc = "A crown worn by only the highest emperors of the land space."
@@ -391,7 +405,9 @@
name = "cowboy hat"
desc = "A standard brown cowboy hat, yeehaw."
icon_state = "cowboyhat"
- item_state= "cowboyhat"
+ item_state = "cowboyhat"
+
+ beepsky_fashion = /datum/beepsky_fashion/cowboy
/obj/item/clothing/head/cowboyhat/black
name = "black cowboy hat"
@@ -429,3 +445,27 @@
icon_state = "russobluecamohat"
item_state = "russobluecamohat"
dynamic_hair_suffix = ""
+
+/obj/item/clothing/head/hunter
+ name = "bounty hunting hat"
+ desc = "Ain't nobody gonna cheat the hangman in my town."
+ icon_state = "hunter"
+ item_state = "hunter"
+ armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 15, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
+ resistance_flags = FIRE_PROOF | ACID_PROOF
+
+/obj/item/clothing/head/kepi
+ name = "kepi"
+ desc = "A white cap with visor. Oui oui, mon capitane!"
+ icon_state = "kepi"
+
+/obj/item/clothing/head/kepi/old
+ icon_state = "kepi_old"
+ desc = "A flat, white circular cap with a visor, that demands some honor from it's wearer."
+
+/obj/item/clothing/head/maid
+ name = "maid headband"
+ desc = "Maid in China."
+ icon_state = "maid"
+ item_state = "maid"
+ dynamic_hair_suffix = ""
diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm
index 5582947732..3774ce575f 100644
--- a/code/modules/clothing/head/misc_special.dm
+++ b/code/modules/clothing/head/misc_special.dm
@@ -50,6 +50,8 @@
flags_cover = HEADCOVERSEYES
heat = 1000
+ beepsky_fashion = /datum/beepsky_fashion/cake
+
/obj/item/clothing/head/hardhat/cakehat/process()
var/turf/location = src.loc
if(ishuman(location))
@@ -131,6 +133,7 @@
dynamic_hair_suffix = ""
dog_fashion = /datum/dog_fashion/head/kitty
+ beepsky_fashion = /datum/beepsky_fashion/cat
/obj/item/clothing/head/kitty/equipped(mob/living/carbon/human/user, slot)
if(ishuman(user) && slot == SLOT_HEAD)
@@ -238,7 +241,7 @@
item_state = "foilhat"
armor = list("melee" = 0, "bullet" = 0, "laser" = -5,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = -5, "fire" = 0, "acid" = 0)
equip_delay_other = 140
- var/datum/brain_trauma/mild/phobia/paranoia
+ var/datum/brain_trauma/mild/phobia/conspiracies/paranoia
var/warped = FALSE
clothing_flags = IGNORE_HAT_TOSS
@@ -255,7 +258,8 @@
return
if(paranoia)
QDEL_NULL(paranoia)
- paranoia = new("conspiracies")
+ paranoia = new()
+ paranoia.clonable = FALSE
user.gain_trauma(paranoia, TRAUMA_RESILIENCE_MAGIC)
to_chat(user, "As you don the foiled hat, an entire world of conspiracy theories and seemingly insane ideas suddenly rush into your mind. What you once thought unbelievable suddenly seems.. undeniable. Everything is connected and nothing happens just by accident. You know too much and now they're out to get you. ")
@@ -286,7 +290,7 @@
if(!target.IsUnconscious())
to_chat(target, "Your zealous conspirationism rapidly dissipates as the donned hat warps up into a ruined mess. All those theories starting to sound like nothing but a ridicolous fanfare.")
-/obj/item/clothing/head/foilhat/attack_hand(mob/user)
+/obj/item/clothing/head/foilhat/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(!warped && iscarbon(user))
var/mob/living/carbon/C = user
if(src == C.head)
diff --git a/code/modules/clothing/masks/_masks.dm b/code/modules/clothing/masks/_masks.dm
index 7df38661e5..94f7ee179a 100644
--- a/code/modules/clothing/masks/_masks.dm
+++ b/code/modules/clothing/masks/_masks.dm
@@ -8,6 +8,7 @@
var/modifies_speech = FALSE
var/mask_adjusted = 0
var/adjusted_flags = null
+ var/datum/beepsky_fashion/beepsky_fashion //the associated datum for applying this to a secbot
/obj/item/clothing/mask/attack_self(mob/user)
if(CHECK_BITFIELD(clothing_flags, VOICEBOX_TOGGLABLE))
@@ -37,7 +38,7 @@
if(blood_DNA)
. += mutable_appearance('icons/effects/blood.dmi', "maskblood", color = blood_DNA_to_color())
-/obj/item/clothing/mask/update_clothes_damaged_state(damaging = TRUE)
+/obj/item/clothing/mask/update_clothes_damaged_state()
..()
if(ismob(loc))
var/mob/M = loc
diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm
index 2778c6abeb..4c26a0863e 100644
--- a/code/modules/clothing/masks/gasmask.dm
+++ b/code/modules/clothing/masks/gasmask.dm
@@ -231,3 +231,16 @@
A.UpdateButtonIcon()
to_chat(M, "The Tiki Mask has now changed into the [choice] Mask!")
return TRUE
+
+/obj/item/clothing/mask/gas/tiki_mask/yalp_elor
+ icon_state = "tiki_yalp"
+ item_state = "tiki_yalp"
+ actions_types = list()
+
+/obj/item/clothing/mask/gas/hunter
+ name = "bounty hunting mask"
+ desc = "A custom tactical mask with decals added."
+ icon_state = "hunter"
+ item_state = "hunter"
+ resistance_flags = FIRE_PROOF | ACID_PROOF
+ flags_inv = HIDEFACIALHAIR|HIDEFACE|HIDEEYES|HIDEEARS|HIDEHAIR
diff --git a/code/modules/clothing/masks/hailer.dm b/code/modules/clothing/masks/hailer.dm
index 086d47e8bf..a7038f7ec9 100644
--- a/code/modules/clothing/masks/hailer.dm
+++ b/code/modules/clothing/masks/hailer.dm
@@ -185,3 +185,9 @@
playsound(src.loc, "sound/voice/complionator/[phrase_sound].ogg", 100, 0, 4)
cooldown = world.time
cooldown_special = world.time
+
+/obj/item/clothing/mask/gas/sechailer/swat/spacepol
+ name = "spacepol mask"
+ desc = "A close-fitting tactical mask created in cooperation with a certain megacorporation, comes with an especially aggressive Compli-o-nator 3000."
+ icon_state = "spacepol"
+ item_state = "spacepol"
diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm
index 6a836cad7b..51a526d089 100644
--- a/code/modules/clothing/neck/_neck.dm
+++ b/code/modules/clothing/neck/_neck.dm
@@ -219,7 +219,7 @@
lock = TRUE
return
-/obj/item/clothing/neck/petcollar/locked/attack_hand(mob/user)
+/obj/item/clothing/neck/petcollar/locked/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(loc == user && user.get_item_by_slot(SLOT_NECK) && lock != FALSE)
to_chat(user, "The collar is locked! You'll need unlock the collar before you can take it off!")
return
diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm
index d692f9c3fb..afe74de6a0 100644
--- a/code/modules/clothing/outfits/standard.dm
+++ b/code/modules/clothing/outfits/standard.dm
@@ -123,7 +123,7 @@
l_pocket = /obj/item/reagent_containers/food/snacks/grown/banana
r_pocket = /obj/item/bikehorn
id = /obj/item/card/id
- r_hand = /obj/item/twohanded/fireaxe
+ r_hand = /obj/item/fireaxe
/datum/outfit/tunnel_clown/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
if(visualsOnly)
@@ -148,7 +148,7 @@
suit = /obj/item/clothing/suit/apron
l_pocket = /obj/item/kitchen/knife
r_pocket = /obj/item/scalpel
- r_hand = /obj/item/twohanded/fireaxe
+ r_hand = /obj/item/fireaxe
/datum/outfit/psycho/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
for(var/obj/item/carried_item in H.get_equipped_items(TRUE))
diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm
index 802dd7265e..49256b490d 100644
--- a/code/modules/clothing/shoes/_shoes.dm
+++ b/code/modules/clothing/shoes/_shoes.dm
@@ -18,6 +18,16 @@
mutantrace_variation = STYLE_DIGITIGRADE
var/last_bloodtype = "" //used to track the last bloodtype to have graced these shoes; makes for better performing footprint shenanigans
var/last_blood_DNA = "" //same as last one
+ var/last_blood_color = ""
+
+ ///Whether these shoes have laces that can be tied/untied
+ var/can_be_tied = TRUE
+ ///Are we currently tied? Can either be SHOES_UNTIED, SHOES_TIED, or SHOES_KNOTTED
+ var/tied = SHOES_TIED
+ ///How long it takes to lace/unlace these shoes
+ var/lace_time = 5 SECONDS
+ ///any alerts we have active
+ var/obj/screen/alert/our_alert
/obj/item/clothing/shoes/ComponentInitialize()
. = ..()
@@ -42,12 +52,22 @@
playsound(user, 'sound/weapons/genhit2.ogg', 50, 1)
return(BRUTELOSS)
+/obj/item/clothing/shoes/examine(mob/user)
+ . = ..()
+
+ if(!ishuman(loc))
+ return ..()
+ if(tied == SHOES_UNTIED)
+ . += "The shoelaces are untied."
+ else if(tied == SHOES_KNOTTED)
+ . += "The shoelaces are all knotted together."
/obj/item/clothing/shoes/transfer_blood_dna(list/blood_dna, diseases)
..()
if(blood_dna.len)
last_bloodtype = blood_dna[blood_dna[blood_dna.len]]//trust me this works
last_blood_DNA = blood_dna[blood_dna.len]
+ last_blood_color = blood_dna["color"]
/obj/item/clothing/shoes/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE)
. = ..()
@@ -72,6 +92,9 @@
worn_y_dimension -= (offset * 2)
user.update_inv_shoes()
equipped_before_drop = TRUE
+ if(can_be_tied && tied == SHOES_UNTIED)
+ our_alert = user.throw_alert("shoealert", /obj/screen/alert/shoes/untied)
+ RegisterSignal(src, COMSIG_SHOES_STEP_ACTION, .proc/check_trip, override=TRUE)
/obj/item/clothing/shoes/proc/restore_offsets(mob/user)
equipped_before_drop = FALSE
@@ -79,11 +102,13 @@
worn_y_dimension = world.icon_size
/obj/item/clothing/shoes/dropped(mob/user)
+ if(our_alert && (our_alert.mob_viewer == user))
+ user.clear_alert("shoealert")
if(offset && equipped_before_drop)
restore_offsets(user)
. = ..()
-/obj/item/clothing/shoes/update_clothes_damaged_state(damaging = TRUE)
+/obj/item/clothing/shoes/update_clothes_damaged_state()
..()
if(ismob(loc))
var/mob/M = loc
@@ -99,3 +124,165 @@
/obj/item/proc/negates_gravity()
return FALSE
+
+/**
+ * adjust_laces adjusts whether our shoes (assuming they can_be_tied) and tied, untied, or knotted
+ *
+ * In addition to setting the state, it will deal with getting rid of alerts if they exist, as well as registering and unregistering the stepping signals
+ *
+ * Arguments:
+ * *
+ * * state: SHOES_UNTIED, SHOES_TIED, or SHOES_KNOTTED, depending on what you want them to become
+ * * user: used to check to see if we're the ones unknotting our own laces
+ */
+/obj/item/clothing/shoes/proc/adjust_laces(state, mob/user)
+ if(!can_be_tied)
+ return
+
+ var/mob/living/carbon/human/our_guy
+ if(ishuman(loc))
+ our_guy = loc
+
+ tied = state
+ if(tied == SHOES_TIED)
+ if(our_guy)
+ our_guy.clear_alert("shoealert")
+ UnregisterSignal(src, COMSIG_SHOES_STEP_ACTION)
+ else
+ if(tied == SHOES_UNTIED && our_guy && user == our_guy)
+ our_alert = our_guy.throw_alert("shoealert", /obj/screen/alert/shoes/untied) // if we're the ones unknotting our own laces, of course we know they're untied
+ RegisterSignal(src, COMSIG_SHOES_STEP_ACTION, .proc/check_trip, override=TRUE)
+
+/**
+ * handle_tying deals with all the actual tying/untying/knotting, inferring your intent from who you are in relation to the state of the laces
+ *
+ * If you're the wearer, you want them to move towards tied-ness (knotted -> untied -> tied). If you're not, you're pranking them, so you're moving towards knotted-ness (tied -> untied -> knotted)
+ *
+ * Arguments:
+ * *
+ * * user: who is the person interacting with the shoes?
+ */
+/obj/item/clothing/shoes/proc/handle_tying(mob/user)
+ ///our_guy here is the wearer, if one exists (and he must exist, or we don't care)
+ var/mob/living/carbon/human/our_guy = loc
+ if(!istype(our_guy))
+ return
+
+ if(!in_range(user, our_guy))
+ to_chat(user, "You aren't close enough to interact with [src]'s laces!")
+ return
+
+ if(user == loc && tied != SHOES_TIED) // if they're our own shoes, go tie-wards
+ if(INTERACTING_WITH(user, our_guy))
+ to_chat(user, "You're already interacting with [src]!")
+ return
+ user.visible_message("[user] begins [tied ? "unknotting" : "tying"] the laces of [user.p_their()] [src.name].", "You begin [tied ? "unknotting" : "tying"] the laces of your [src.name]...")
+
+ if(do_after(user, lace_time, needhand=TRUE, target=our_guy, extra_checks=CALLBACK(src, .proc/still_shoed, our_guy)))
+ to_chat(user, "You [tied ? "unknot" : "tie"] the laces of your [src.name].")
+ if(tied == SHOES_UNTIED)
+ adjust_laces(SHOES_TIED, user)
+ else
+ adjust_laces(SHOES_UNTIED, user)
+
+ else // if they're someone else's shoes, go knot-wards
+ var/mob/living/L = user
+ if(istype(L) && (L.mobility_flags & MOBILITY_STAND))
+ to_chat(user, "You must be on the floor to interact with [src]!")
+ return
+ if(tied == SHOES_KNOTTED)
+ to_chat(user, "The laces on [loc]'s [src.name] are already a hopelessly tangled mess!")
+ return
+ if(INTERACTING_WITH(user, our_guy))
+ to_chat(user, "You're already interacting with [src]!")
+ return
+
+ var/mod_time = lace_time
+ to_chat(user, "You quietly set to work [tied ? "untying" : "knotting"] [loc]'s [src.name]...")
+ if(HAS_TRAIT(user, TRAIT_CLUMSY)) // based clowns trained their whole lives for this
+ mod_time *= 0.75
+
+ if(do_after(user, mod_time, needhand=TRUE, target=our_guy, extra_checks=CALLBACK(src, .proc/still_shoed, our_guy)))
+ to_chat(user, "You [tied ? "untie" : "knot"] the laces on [loc]'s [src.name].")
+ if(tied == SHOES_UNTIED)
+ adjust_laces(SHOES_KNOTTED, user)
+ else
+ adjust_laces(SHOES_UNTIED, user)
+ else // if one of us moved
+ user.visible_message("[our_guy] stamps on [user]'s hand, mid-shoelace [tied ? "knotting" : "untying"]!", "Ow! [our_guy] stamps on your hand!", list(our_guy))
+ to_chat(our_guy, "You stamp on [user]'s hand! What the- [user.p_they()] [user.p_were()] [tied ? "knotting" : "untying"] your shoelaces!")
+ user.emote("scream")
+ if(istype(L))
+ var/obj/item/bodypart/ouchie = L.get_bodypart(pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM))
+ if(ouchie)
+ ouchie.receive_damage(brute = 10, stamina = 40)
+ L.Paralyze(10)
+
+///checking to make sure we're still on the person we're supposed to be, for lacing do_after's
+/obj/item/clothing/shoes/proc/still_shoed(mob/living/carbon/our_guy)
+ return (loc == our_guy)
+
+///check_trip runs on each step to see if we fall over as a result of our lace status. Knotted laces are a guaranteed trip, while untied shoes are just a chance to stumble
+/obj/item/clothing/shoes/proc/check_trip()
+ var/mob/living/carbon/human/our_guy = loc
+ if(!istype(our_guy)) // are they REALLY /our guy/?
+ return
+
+ if(tied == SHOES_KNOTTED)
+ our_guy.Paralyze(5)
+ our_guy.Knockdown(10)
+ our_guy.visible_message("[our_guy] trips on [our_guy.p_their()] knotted shoelaces and falls! What a klutz!", "You trip on your knotted shoelaces and fall over!")
+ SEND_SIGNAL(our_guy, COMSIG_ADD_MOOD_EVENT, "trip", /datum/mood_event/tripped) // well we realized they're knotted now!
+ our_alert = our_guy.throw_alert("shoealert", /obj/screen/alert/shoes/knotted)
+
+ else if(tied == SHOES_UNTIED)
+ var/wiser = TRUE // did we stumble and realize our laces are undone?
+ switch(rand(1, 1000))
+ if(1) // .1% chance to trip and fall over (note these are per step while our laces are undone)
+ our_guy.Paralyze(5)
+ our_guy.Knockdown(10)
+ SEND_SIGNAL(our_guy, COMSIG_ADD_MOOD_EVENT, "trip", /datum/mood_event/tripped) // well we realized they're knotted now!
+ our_guy.visible_message("[our_guy] trips on [our_guy.p_their()] untied shoelaces and falls! What a klutz!", "You trip on your untied shoelaces and fall over!")
+
+ if(2 to 5) // .4% chance to stumble and lurch forward
+ our_guy.throw_at(get_step(our_guy, our_guy.dir), 3, 2)
+ to_chat(our_guy, "You stumble on your untied shoelaces and lurch forward!")
+
+ if(6 to 13) // .7% chance to stumble and fling what we're holding
+ var/have_anything = FALSE
+ for(var/obj/item/I in our_guy.held_items)
+ have_anything = TRUE
+ our_guy.accident(I)
+ to_chat(our_guy, "You trip on your shoelaces a bit[have_anything ? ", flinging what you were holding" : ""]!")
+
+ if(14 to 25) // 1.3ish% chance to stumble and be a bit off balance (like being disarmed)
+ to_chat(our_guy, "You stumble a bit on your untied shoelaces!")
+ our_guy.ShoveOffBalance(SHOVE_OFFBALANCE_DURATION)
+ our_guy.Stagger(SHOVE_OFFBALANCE_DURATION) //yes, same.
+ if(26 to 1000)
+ wiser = FALSE
+ if(wiser)
+ SEND_SIGNAL(our_guy, COMSIG_ADD_MOOD_EVENT, "untied", /datum/mood_event/untied) // well we realized they're untied now!
+ our_alert = our_guy.throw_alert("shoealert", /obj/screen/alert/shoes/untied)
+
+
+/obj/item/clothing/shoes/on_attack_hand(mob/living/user, act_intent, unarmed_attack_flags)
+ if(!istype(user))
+ return ..()
+ if(loc == user && tied != SHOES_TIED && (user.mobility_flags & MOBILITY_USE))
+ handle_tying(user)
+ return
+ return ..()
+
+/obj/item/clothing/shoes/attack_self(mob/user)
+ . = ..()
+
+ if(INTERACTING_WITH(user, src))
+ to_chat(user, "You're already interacting with [src]!")
+ return
+
+ to_chat(user, "You begin [tied ? "untying" : "tying"] the laces on [src]...")
+
+ if(do_after(user, lace_time, needhand=TRUE, target=src,extra_checks=CALLBACK(src, .proc/still_shoed, user)))
+ to_chat(user, "You [tied ? "untie" : "tie"] the laces on [src].")
+ adjust_laces(tied ? SHOES_TIED : SHOES_UNTIED, user)
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index b68bef6329..b0d760ebd9 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -17,6 +17,7 @@
resistance_flags = NONE
permeability_coefficient = 0.05 //Thick soles, and covers the ankle
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes
+ lace_time = 12 SECONDS
/obj/item/clothing/shoes/combat/sneakboots
name = "insidious sneakboots"
@@ -49,6 +50,7 @@
strip_delay = 50
equip_delay_other = 50
permeability_coefficient = 0.9
+ can_be_tied = FALSE
/obj/item/clothing/shoes/sandal/marisa
desc = "A pair of magic black shoes."
@@ -73,6 +75,7 @@
resistance_flags = NONE
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 40, "acid" = 75)
custom_price = PRICE_ABOVE_EXPENSIVE
+ can_be_tied = FALSE
/obj/item/clothing/shoes/galoshes/dry
name = "absorbent galoshes"
@@ -99,6 +102,7 @@
icon_state = "clown_shoes"
slowdown = SHOES_SLOWDOWN+1
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes/clown
+ lace_time = 20 SECONDS // how the hell do these laces even work??
/obj/item/clothing/shoes/clown_shoes/Initialize()
. = ..()
@@ -130,6 +134,7 @@
resistance_flags = NONE
permeability_coefficient = 0.05 //Thick soles, and covers the ankle
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes
+ lace_time = 12 SECONDS
/obj/item/clothing/shoes/jackboots/fast
slowdown = -1
@@ -144,6 +149,7 @@
heat_protection = FEET|LEGS
max_heat_protection_temperature = SHOES_MAX_TEMP_PROTECT
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes
+ lace_time = 8 SECONDS
/obj/item/clothing/shoes/winterboots/ice_boots
name = "ice hiking boots"
@@ -177,6 +183,7 @@
strip_delay = 40
equip_delay_other = 40
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes
+ lace_time = 8 SECONDS
/obj/item/clothing/shoes/workboots/mining
name = "mining boots"
@@ -196,6 +203,7 @@
min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT
heat_protection = FEET
max_heat_protection_temperature = SHOES_MAX_TEMP_PROTECT
+ lace_time = 10 SECONDS
/obj/item/clothing/shoes/cult/alt
name = "cultist boots"
@@ -226,12 +234,14 @@
strip_delay = 100
equip_delay_other = 100
permeability_coefficient = 0.9
+ can_be_tied = FALSE
/obj/item/clothing/shoes/griffin
name = "griffon boots"
desc = "A pair of costume boots fashioned after bird talons."
icon_state = "griffinboots"
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes
+ lace_time = 8 SECONDS
/obj/item/clothing/shoes/bhop
name = "jump boots"
@@ -284,6 +294,7 @@
desc = "A giant, clunky pair of shoes crudely made out of bronze. Why would anyone wear these?"
icon = 'icons/obj/clothing/clockwork_garb.dmi'
icon_state = "clockwork_treads"
+ lace_time = 8 SECONDS
/obj/item/clothing/shoes/bronze/Initialize()
. = ..()
@@ -358,6 +369,7 @@
icon_state = "rus_shoes"
item_state = "rus_shoes"
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes
+ lace_time = 8 SECONDS
// kevin is into feet
/obj/item/clothing/shoes/wraps
@@ -365,6 +377,7 @@
desc = "Ankle coverings. These ones have a golden design."
icon_state = "gildedcuffs"
body_parts_covered = FALSE
+ can_be_tied = FALSE
/obj/item/clothing/shoes/wraps/silver
name = "silver leg wraps"
@@ -385,6 +398,7 @@
name = "cowboy boots"
desc = "A standard pair of brown cowboy boots."
icon_state = "cowboyboots"
+ can_be_tied = FALSE
/obj/item/clothing/shoes/cowboyboots/black
name = "black cowboy boots"
diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm
index 94ccdf94c6..4dc6fd1f6c 100644
--- a/code/modules/clothing/spacesuits/chronosuit.dm
+++ b/code/modules/clothing/spacesuits/chronosuit.dm
@@ -80,11 +80,11 @@
if(to_turf)
user.forceMove(to_turf)
user.SetStun(0)
- user.next_move = 1
+ user.SetNextAction(0, considered_action = FALSE, immediate = FALSE)
user.alpha = 255
user.update_atom_colour()
user.animate_movement = FORWARD_STEPS
- user.notransform = 0
+ user.mob_transforming = 0
user.anchored = FALSE
teleporting = 0
for(var/obj/item/I in user.held_items)
@@ -124,8 +124,8 @@
for(var/obj/item/I in user.held_items)
ADD_TRAIT(I, TRAIT_NODROP, CHRONOSUIT_TRAIT)
user.animate_movement = NO_STEPS
- user.changeNext_move(8 + phase_in_ds)
- user.notransform = 1
+ user.DelayNextAction(8 + phase_in_ds, considered_action = FALSE, immediate = FALSE)
+ user.mob_transforming = TRUE
user.anchored = TRUE
user.Stun(INFINITY)
diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm
index 695d25dbf4..b588deaf01 100644
--- a/code/modules/clothing/spacesuits/hardsuit.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -94,7 +94,7 @@
icon_state = "hardsuit-engineering"
item_state = "eng_hardsuit"
max_integrity = 300
- armor = list("melee" = 10, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 75, "fire" = 50, "acid" = 75)
+ armor = list("melee" = 10, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 75, "fire" = 50, "acid" = 75, "wound" = 10)
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/t_scanner, /obj/item/construction/rcd, /obj/item/pipe_dispenser)
siemens_coefficient = 0
var/obj/item/clothing/head/helmet/space/hardsuit/helmet
@@ -107,11 +107,7 @@
/obj/item/clothing/suit/space/hardsuit/Initialize()
if(jetpack && ispath(jetpack))
jetpack = new jetpack(src)
- . = ..()
-
-/obj/item/clothing/suit/space/hardsuit/attack_self(mob/user)
- user.changeNext_move(CLICK_CD_MELEE)
- ..()
+ return ..()
/obj/item/clothing/suit/space/hardsuit/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/tank/jetpack/suit))
@@ -167,7 +163,7 @@
desc = "A special helmet designed for work in a hazardous, low-pressure environment. Has radiation shielding."
icon_state = "hardsuit0-engineering"
item_state = "eng_helm"
- armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 75, "fire" = 100, "acid" = 75)
+ armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 75, "fire" = 100, "acid" = 75, "wound" = 10)
hardsuit_type = "engineering"
resistance_flags = FIRE_PROOF
@@ -176,7 +172,7 @@
desc = "A special suit that protects against hazardous, low pressure environments. Has radiation shielding."
icon_state = "hardsuit-engineering"
item_state = "eng_hardsuit"
- armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 75, "fire" = 100, "acid" = 75)
+ armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 75, "fire" = 100, "acid" = 75, "wound" = 10)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine
resistance_flags = FIRE_PROOF
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_ALL_TAURIC
@@ -188,7 +184,7 @@
icon_state = "hardsuit0-atmospherics"
item_state = "atmo_helm"
hardsuit_type = "atmospherics"
- armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 25, "fire" = 100, "acid" = 75)
+ armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 25, "fire" = 100, "acid" = 75, "wound" = 10)
heat_protection = HEAD //Uncomment to enable firesuit protection
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
@@ -197,7 +193,7 @@
desc = "A special suit that protects against hazardous, low pressure environments. Has thermal shielding."
icon_state = "hardsuit-atmospherics"
item_state = "atmo_hardsuit"
- armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 25, "fire" = 100, "acid" = 75)
+ armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 25, "fire" = 100, "acid" = 75, "wound" = 10)
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS //Uncomment to enable firesuit protection
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine/atmos
@@ -209,7 +205,7 @@
icon_state = "hardsuit0-white"
item_state = "ce_helm"
hardsuit_type = "white"
- armor = list("melee" = 40, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 90)
+ armor = list("melee" = 40, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 90, "wound" = 10)
heat_protection = HEAD
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
@@ -218,7 +214,7 @@
name = "advanced hardsuit"
desc = "An advanced suit that protects against hazardous, low pressure environments. Shines with a high polish."
item_state = "ce_hardsuit"
- armor = list("melee" = 40, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 50, "bio" = 100, "rad" = 95, "fire" = 100, "acid" = 90)
+ armor = list("melee" = 40, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 50, "bio" = 100, "rad" = 95, "fire" = 100, "acid" = 90, "wound" = 10)
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine/elite
@@ -234,7 +230,7 @@
max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
resistance_flags = FIRE_PROOF
heat_protection = HEAD
- armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 75)
+ armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 75, "wound" = 15)
brightness_on = 7
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator)
@@ -249,7 +245,7 @@
item_state = "mining_hardsuit"
max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
resistance_flags = FIRE_PROOF
- armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 75)
+ armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 75, "wound" = 15)
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/storage/bag/ore, /obj/item/pickaxe)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/mining
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
@@ -267,7 +263,7 @@
icon_state = "hardsuit1-syndi"
item_state = "syndie_helm"
hardsuit_type = "syndi"
- armor = list("melee" = 40, "bullet" = 50, "laser" = 30, "energy" = 15, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 90)
+ armor = list("melee" = 40, "bullet" = 50, "laser" = 30, "energy" = 15, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 90, "wound" = 25)
on = FALSE
var/obj/item/clothing/suit/space/hardsuit/syndi/linkedsuit = null
actions_types = list(/datum/action/item_action/toggle_helmet_mode)
@@ -345,7 +341,7 @@
item_state = "syndie_hardsuit"
hardsuit_type = "syndi"
w_class = WEIGHT_CLASS_NORMAL
- armor = list("melee" = 40, "bullet" = 50, "laser" = 30, "energy" = 15, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 90)
+ armor = list("melee" = 40, "bullet" = 50, "laser" = 30, "energy" = 15, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 90, "wound" = 25)
allowed = list(/obj/item/gun, /obj/item/ammo_box,/obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/transforming/energy/sword/saber, /obj/item/restraints/handcuffs, /obj/item/tank/internals)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/syndi
jetpack = /obj/item/tank/jetpack/suit
@@ -358,7 +354,7 @@
alt_desc = "An elite version of the syndicate helmet, with improved armour and fireproofing. It is in combat mode. Property of Gorlex Marauders."
icon_state = "hardsuit0-syndielite"
hardsuit_type = "syndielite"
- armor = list("melee" = 60, "bullet" = 60, "laser" = 50, "energy" = 25, "bomb" = 55, "bio" = 100, "rad" = 70, "fire" = 100, "acid" = 100)
+ armor = list("melee" = 60, "bullet" = 60, "laser" = 50, "energy" = 25, "bomb" = 55, "bio" = 100, "rad" = 70, "fire" = 100, "acid" = 100, "wound" = 25)
heat_protection = HEAD
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
resistance_flags = FIRE_PROOF | ACID_PROOF
@@ -376,7 +372,7 @@
icon_state = "hardsuit0-syndielite"
hardsuit_type = "syndielite"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/syndi/elite
- armor = list("melee" = 60, "bullet" = 60, "laser" = 50, "energy" = 25, "bomb" = 55, "bio" = 100, "rad" = 70, "fire" = 100, "acid" = 100)
+ armor = list("melee" = 60, "bullet" = 60, "laser" = 50, "energy" = 25, "bomb" = 55, "bio" = 100, "rad" = 70, "fire" = 100, "acid" = 100, "wound" = 25)
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
resistance_flags = FIRE_PROOF | ACID_PROOF
@@ -416,7 +412,7 @@
item_state = "wiz_helm"
hardsuit_type = "wiz"
resistance_flags = FIRE_PROOF | ACID_PROOF //No longer shall our kind be foiled by lone chemists with spray bottles!
- armor = list("melee" = 40, "bullet" = 40, "laser" = 40, "energy" = 20, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100)
+ armor = list("melee" = 40, "bullet" = 40, "laser" = 40, "energy" = 20, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100, "wound" = 30)
heat_protection = HEAD //Uncomment to enable firesuit protection
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
@@ -431,7 +427,7 @@
item_state = "wiz_hardsuit"
w_class = WEIGHT_CLASS_NORMAL
resistance_flags = FIRE_PROOF | ACID_PROOF
- armor = list("melee" = 40, "bullet" = 40, "laser" = 40, "energy" = 20, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100)
+ armor = list("melee" = 40, "bullet" = 40, "laser" = 40, "energy" = 20, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100, "wound" = 30)
allowed = list(/obj/item/teleportation_scroll, /obj/item/tank/internals)
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS //Uncomment to enable firesuit protection
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
@@ -451,7 +447,7 @@
item_state = "medical_helm"
hardsuit_type = "medical"
flash_protect = 0
- armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 60, "fire" = 60, "acid" = 75)
+ armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 60, "fire" = 60, "acid" = 75, "wound" = 10)
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS | SCAN_REAGENTS
@@ -474,7 +470,7 @@
item_state = "medical_hardsuit"
slowdown = 0.8
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/storage/firstaid, /obj/item/healthanalyzer, /obj/item/stack/medical)
- armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 60, "fire" = 60, "acid" = 75)
+ armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 60, "fire" = 60, "acid" = 75, "wound" = 10)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/medical
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_ALL_TAURIC
@@ -486,7 +482,7 @@
hardsuit_type = "rd"
resistance_flags = ACID_PROOF | FIRE_PROOF
max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
- armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 100, "bio" = 100, "rad" = 60, "fire" = 60, "acid" = 80)
+ armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 100, "bio" = 100, "rad" = 60, "fire" = 60, "acid" = 80, "wound" = 15)
var/obj/machinery/doppler_array/integrated/bomb_radar
clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS | SCAN_REAGENTS
actions_types = list(/datum/action/item_action/toggle_helmet_light, /datum/action/item_action/toggle_research_scanner)
@@ -516,7 +512,7 @@
max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT //Same as an emergency firesuit. Not ideal for extended exposure.
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/gun/energy/wormhole_projector,
/obj/item/hand_tele, /obj/item/aicard)
- armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 100, "bio" = 100, "rad" = 60, "fire" = 60, "acid" = 80)
+ armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 100, "bio" = 100, "rad" = 60, "fire" = 60, "acid" = 80, "wound" = 15)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/rd
//Security hardsuit
@@ -526,14 +522,14 @@
icon_state = "hardsuit0-sec"
item_state = "sec_helm"
hardsuit_type = "sec"
- armor = list("melee" = 35, "bullet" = 15, "laser" = 30,"energy" = 10, "bomb" = 10, "bio" = 100, "rad" = 50, "fire" = 75, "acid" = 75)
+ armor = list("melee" = 35, "bullet" = 15, "laser" = 30,"energy" = 10, "bomb" = 10, "bio" = 100, "rad" = 50, "fire" = 75, "acid" = 75, "wound" = 20)
/obj/item/clothing/suit/space/hardsuit/security
icon_state = "hardsuit-sec"
name = "security hardsuit"
desc = "A special suit that protects against hazardous, low pressure environments. Has an additional layer of armor."
item_state = "sec_hardsuit"
- armor = list("melee" = 35, "bullet" = 15, "laser" = 30, "energy" = 10, "bomb" = 10, "bio" = 100, "rad" = 50, "fire" = 75, "acid" = 75)
+ armor = list("melee" = 35, "bullet" = 15, "laser" = 30, "energy" = 10, "bomb" = 10, "bio" = 100, "rad" = 50, "fire" = 75, "acid" = 75, "wound" = 20)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/security
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_ALL_TAURIC
@@ -547,13 +543,13 @@
desc = "A special bulky helmet designed for work in a hazardous, low pressure environment. Has an additional layer of armor."
icon_state = "hardsuit0-hos"
hardsuit_type = "hos"
- armor = list("melee" = 45, "bullet" = 25, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 100, "rad" = 50, "fire" = 95, "acid" = 95)
+ armor = list("melee" = 45, "bullet" = 25, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 100, "rad" = 50, "fire" = 95, "acid" = 95, "wound" = 25)
/obj/item/clothing/suit/space/hardsuit/security/hos
icon_state = "hardsuit-hos"
name = "head of security's hardsuit"
desc = "A special bulky suit that protects against hazardous, low pressure environments. Has an additional layer of armor."
- armor = list("melee" = 45, "bullet" = 25, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 100, "rad" = 50, "fire" = 95, "acid" = 95)
+ armor = list("melee" = 45, "bullet" = 25, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 100, "rad" = 50, "fire" = 95, "acid" = 95, "wound" = 25)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/security/hos
jetpack = /obj/item/tank/jetpack/suit
@@ -563,7 +559,7 @@
icon_state = "capspace"
item_state = "capspacehelmet"
desc = "A tactical SWAT helmet MK.II boasting better protection and a horrible fashion sense."
- armor = list("melee" = 40, "bullet" = 50, "laser" = 50, "energy" = 25, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100)
+ armor = list("melee" = 40, "bullet" = 50, "laser" = 50, "energy" = 25, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100, "wound" = 15)
resistance_flags = FIRE_PROOF | ACID_PROOF
flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR //we want to see the mask
heat_protection = HEAD
@@ -578,7 +574,7 @@
desc = "A MK.II SWAT suit with streamlined joints and armor made out of superior materials, insulated against intense heat. The most advanced tactical armor available Usually reserved for heavy hitter corporate security, this one has a regal finish in Nanotrasen company colors. Better not let the assistants get a hold of it."
icon_state = "caparmor"
item_state = "capspacesuit"
- armor = list("melee" = 40, "bullet" = 50, "laser" = 50, "energy" = 25, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100)
+ armor = list("melee" = 40, "bullet" = 50, "laser" = 50, "energy" = 25, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100, "wound" = 15)
resistance_flags = FIRE_PROOF | ACID_PROOF
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT //this needed to be added a long fucking time ago
@@ -594,7 +590,7 @@
desc = "A special helmet designed for work in a hazardous, low-humor environment. Has radiation shielding."
icon_state = "hardsuit0-clown"
item_state = "hardsuit0-clown"
- armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 75, "fire" = 60, "acid" = 30)
+ armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 75, "fire" = 60, "acid" = 30, "wound" = 10)
hardsuit_type = "clown"
/obj/item/clothing/suit/space/hardsuit/clown
@@ -602,7 +598,7 @@
desc = "A special suit that protects against hazardous, low humor environments. Has radiation shielding. Only a true clown can wear it."
icon_state = "hardsuit-clown"
item_state = "clown_hardsuit"
- armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 75, "fire" = 60, "acid" = 30)
+ armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 75, "fire" = 60, "acid" = 30, "wound" = 10)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/clown
mutantrace_variation = STYLE_DIGITIGRADE
@@ -620,7 +616,7 @@
desc = "Early prototype RIG hardsuit helmet, designed to quickly shift over a user's head. Design constraints of the helmet mean it has no inbuilt cameras, thus it restricts the users visability."
icon_state = "hardsuit0-ancient"
item_state = "anc_helm"
- armor = list("melee" = 30, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 75)
+ armor = list("melee" = 30, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 75, "wound" = 10)
hardsuit_type = "ancient"
resistance_flags = FIRE_PROOF
@@ -629,7 +625,7 @@
desc = "Prototype powered RIG hardsuit. Provides excellent protection from the elements of space while being comfortable to move around in, thanks to the powered locomotives. Remains very bulky however."
icon_state = "hardsuit-ancient"
item_state = "anc_hardsuit"
- armor = list("melee" = 30, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 75)
+ armor = list("melee" = 30, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 75, "wound" = 10)
slowdown = 3
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ancient
resistance_flags = FIRE_PROOF
@@ -642,7 +638,7 @@
desc = "The Multi-Augmented Severe Operations Networked Resource Integration Gear is an man-portable tank designed for extreme environmental situations. It is excessively bulky, but rated for all but the most atomic of hazards. The specialized armor is surprisingly weak to conventional weaponry. The exo slot can attach most storage bags on to the suit."
icon_state = "hardsuit-ancient"
item_state = "anc_hardsuit"
- armor = list("melee" = 20, "bullet" = 15, "laser" = 15, "energy" = 45, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
+ armor = list("melee" = 20, "bullet" = 15, "laser" = 15, "energy" = 45, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "wound" = 10)
slowdown = 6 //Slow
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/storage, /obj/item/construction/rcd, /obj/item/pipe_dispenser)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ancient/mason
@@ -655,7 +651,7 @@
desc = "The M.A.S.O.N RIG helmet is complimentary to the rest of the armor. It features a very large, high powered flood lamp and robust flash protection."
icon_state = "hardsuit0-ancient"
item_state = "anc_helm"
- armor = list("melee" = 20, "bullet" = 15, "laser" = 15, "energy" = 45, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
+ armor = list("melee" = 20, "bullet" = 15, "laser" = 15, "energy" = 45, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "wound" = 10)
hardsuit_type = "ancient"
brightness_on = 16
flash_protect = 5 //We will not be flash by bombs
@@ -746,7 +742,7 @@
icon_state = "hardsuit-hos"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/security/hos
allowed = null
- armor = list("melee" = 30, "bullet" = 15, "laser" = 30, "energy" = 10, "bomb" = 10, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100)
+ armor = list("melee" = 30, "bullet" = 15, "laser" = 30, "energy" = 10, "bomb" = 10, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100, "wound" = 15)
resistance_flags = FIRE_PROOF | ACID_PROOF
var/max_charges = 3 //How many charges total the shielding has
var/current_charges //if null, will default to max_chargs
@@ -826,7 +822,7 @@
icon_state = "hardsuit1-syndi"
item_state = "syndie_hardsuit"
hardsuit_type = "syndi"
- armor = list("melee" = 40, "bullet" = 50, "laser" = 30, "energy" = 15, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100)
+ armor = list("melee" = 40, "bullet" = 50, "laser" = 30, "energy" = 15, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100, "wound" = 30)
allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/transforming/energy/sword/saber, /obj/item/restraints/handcuffs, /obj/item/tank/internals)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/syndi
slowdown = 0
@@ -842,7 +838,7 @@
icon_state = "hardsuit1-syndi"
item_state = "syndie_helm"
hardsuit_type = "syndi"
- armor = list("melee" = 40, "bullet" = 50, "laser" = 30, "energy" = 15, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100)
+ armor = list("melee" = 40, "bullet" = 50, "laser" = 30, "energy" = 15, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100, "wound" = 30)
///SWAT version
/obj/item/clothing/suit/space/hardsuit/shielded/swat
@@ -853,7 +849,7 @@
hardsuit_type = "syndi"
max_charges = 4
recharge_delay = 15
- armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
+ armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "wound" = 30)
strip_delay = 130
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/swat
@@ -865,7 +861,7 @@
icon_state = "deathsquad"
item_state = "deathsquad"
hardsuit_type = "syndi"
- armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
+ armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "wound" = 30)
strip_delay = 130
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
actions_types = list()
diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm
index 4166beef05..ee70f54ed0 100644
--- a/code/modules/clothing/spacesuits/miscellaneous.dm
+++ b/code/modules/clothing/spacesuits/miscellaneous.dm
@@ -22,7 +22,7 @@ Contains:
desc = "An advanced tactical space helmet."
icon_state = "deathsquad"
item_state = "deathsquad"
- armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
+ armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "wound" = 30)
strip_delay = 130
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
resistance_flags = FIRE_PROOF | ACID_PROOF
@@ -37,7 +37,7 @@ Contains:
icon_state = "deathsquad"
item_state = "swat_suit"
allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals, /obj/item/kitchen/knife/combat)
- armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
+ armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "wound" = 30)
strip_delay = 130
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
resistance_flags = FIRE_PROOF | ACID_PROOF
@@ -518,3 +518,14 @@ Contains:
desc = "A deep blue space helmet with a large red cross on the faceplate to designate the wearer as trained emergency medical personnel."
icon_state = "paramedic-eva-helmet"
item_state = "paramedic-eva-helmet"
+
+/obj/item/clothing/suit/space/hunter
+ name = "bounty hunting suit"
+ desc = "A custom version of the MK.II SWAT suit, modified to look rugged and tough. Works as a space suit, if you can find a helmet."
+ icon_state = "hunter"
+ item_state = "swat_suit"
+ allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals, /obj/item/kitchen/knife/combat)
+ armor = list("melee" = 60, "bullet" = 40, "laser" = 40, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
+ strip_delay = 130
+ resistance_flags = FIRE_PROOF | ACID_PROOF
+
diff --git a/code/modules/clothing/suits/_suits.dm b/code/modules/clothing/suits/_suits.dm
index 8de49c63de..0d16f9bdfa 100644
--- a/code/modules/clothing/suits/_suits.dm
+++ b/code/modules/clothing/suits/_suits.dm
@@ -10,6 +10,7 @@
var/blood_overlay_type = "suit"
var/togglename = null
var/suittoggled = FALSE
+ limb_integrity = 0 // disabled for most exo-suits
mutantrace_variation = STYLE_DIGITIGRADE
/obj/item/clothing/suit/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE)
@@ -28,7 +29,7 @@
if(A.above_suit)
. += U.accessory_overlay
-/obj/item/clothing/suit/update_clothes_damaged_state(damaging = TRUE)
+/obj/item/clothing/suit/update_clothes_damaged_state()
..()
if(ismob(loc))
var/mob/M = loc
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index 557b4860c9..b61743729f 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -8,7 +8,8 @@
equip_delay_other = 40
max_integrity = 250
resistance_flags = NONE
- armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
+ armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50, "wound" = 15)
+
/obj/item/clothing/suit/armor/Initialize()
. = ..()
@@ -57,7 +58,7 @@
icon_state = "hos"
item_state = "greatcoat"
body_parts_covered = CHEST|GROIN|ARMS|LEGS
- armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 90)
+ armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 90, "wound" = 20)
cold_protection = CHEST|GROIN|LEGS|ARMS
heat_protection = CHEST|GROIN|LEGS|ARMS
strip_delay = 80
@@ -123,7 +124,7 @@
icon_state = "capcarapace"
item_state = "armor"
body_parts_covered = CHEST|GROIN
- armor = list("melee" = 50, "bullet" = 40, "laser" = 50, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 90)
+ armor = list("melee" = 50, "bullet" = 40, "laser" = 50, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 90, "wound" = 10)
dog_fashion = null
resistance_flags = FIRE_PROOF
@@ -147,7 +148,7 @@
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
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)
+ armor = list("melee" = 50, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80, "wound" = 30)
blocks_shove_knockdown = TRUE
strip_delay = 80
equip_delay_other = 60
@@ -158,7 +159,7 @@
icon_state = "bonearmor"
item_state = "bonearmor"
blood_overlay_type = "armor"
- armor = list("melee" = 35, "bullet" = 25, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
+ armor = list("melee" = 35, "bullet" = 25, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50, "wound" = 10)
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS
/obj/item/clothing/suit/armor/bulletproof
@@ -167,7 +168,7 @@
icon_state = "bulletproof"
item_state = "armor"
blood_overlay_type = "armor"
- armor = list("melee" = 15, "bullet" = 60, "laser" = 10, "energy" = 10, "bomb" = 40, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
+ armor = list("melee" = 15, "bullet" = 60, "laser" = 10, "energy" = 10, "bomb" = 40, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50, "wound" = 20)
strip_delay = 70
equip_delay_other = 50
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON
@@ -285,8 +286,8 @@
desc = "A classic suit of armour, able to be made from many different materials."
icon_state = "knight_greyscale"
item_state = "knight_greyscale"
- armor = list("melee" = 35, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 10, "bio" = 10, "rad" = 10, "fire" = 40, "acid" = 40)
- material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS | MATERIAL_EFFECTS //Can change color and add prefix
+ armor = list("melee" = 35, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 10, "bio" = 10, "rad" = 10, "fire" = 40, "acid" = 40, "wound" = 15)
+ material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS //Can change color and add prefix
/obj/item/clothing/suit/armor/vest/durathread
name = "makeshift vest"
@@ -304,7 +305,7 @@
desc = "A bulletproof vest with forest camo. Good thing there's plenty of forests to hide in around here, right?"
icon_state = "rus_armor"
item_state = "rus_armor"
- armor = list("melee" = 25, "bullet" = 30, "laser" = 0, "energy" = 15, "bomb" = 10, "bio" = 0, "rad" = 20, "fire" = 20, "acid" = 50)
+ armor = list("melee" = 25, "bullet" = 30, "laser" = 0, "energy" = 15, "bomb" = 10, "bio" = 0, "rad" = 20, "fire" = 20, "acid" = 50, "wound" = 10)
/obj/item/clothing/suit/armor/vest/russian_coat
name = "russian battle coat"
@@ -315,4 +316,4 @@
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
- armor = list("melee" = 25, "bullet" = 20, "laser" = 20, "energy" = 10, "bomb" = 20, "bio" = 50, "rad" = 20, "fire" = -10, "acid" = 50)
+ armor = list("melee" = 25, "bullet" = 20, "laser" = 20, "energy" = 10, "bomb" = 20, "bio" = 50, "rad" = 20, "fire" = -10, "acid" = 50, "wound" = 10)
diff --git a/code/modules/clothing/suits/cloaks.dm b/code/modules/clothing/suits/cloaks.dm
index 0a3923b28c..d5f65e4fa8 100644
--- a/code/modules/clothing/suits/cloaks.dm
+++ b/code/modules/clothing/suits/cloaks.dm
@@ -59,7 +59,7 @@
name = "goliath cloak"
icon_state = "goliath_cloak"
desc = "A staunch, practical cape made out of numerous monster materials, it is coveted amongst exiles & hermits."
- allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/pickaxe, /obj/item/twohanded/spear, /obj/item/twohanded/bonespear, /obj/item/organ/regenerative_core/legion, /obj/item/kitchen/knife/combat/bone, /obj/item/kitchen/knife/combat/survival)
+ allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/pickaxe, /obj/item/spear, /obj/item/spear/bonespear, /obj/item/organ/regenerative_core/legion, /obj/item/kitchen/knife/combat/bone, /obj/item/kitchen/knife/combat/survival)
armor = list("melee" = 35, "bullet" = 10, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60) //a fair alternative to bone armor, requiring alternative materials and gaining a suit slot
hoodtype = /obj/item/clothing/head/hooded/cloakhood/goliath
body_parts_covered = CHEST|ARMS|LEGS
@@ -75,7 +75,7 @@
name = "drake armour"
icon_state = "dragon"
desc = "A suit of armour fashioned from the remains of an ash drake."
- allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/pickaxe, /obj/item/twohanded/spear)
+ allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/pickaxe, /obj/item/spear)
armor = list("melee" = 70, "bullet" = 20, "laser" = 35, "energy" = 25, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
hoodtype = /obj/item/clothing/head/hooded/cloakhood/drake
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index 4fec2f59e7..0b1121b22b 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -402,6 +402,30 @@
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON
+/obj/item/clothing/suit/jacket/flannel
+ name = "black flannel jacket"
+ desc = "Comfy and supposedly flammable."
+ icon_state = "flannel"
+ item_state = "flannel"
+
+/obj/item/clothing/suit/jacket/flannel/red
+ name = "red flannel jacket"
+ desc = "Comfy and supposedly flammable."
+ icon_state = "flannel_red"
+ item_state = "flannel_red"
+
+/obj/item/clothing/suit/jacket/flannel/aqua
+ name = "aqua flannel jacket"
+ desc = "Comfy and supposedly flammable."
+ icon_state = "flannel_aqua"
+ item_state = "flannel_aqua"
+
+/obj/item/clothing/suit/jacket/flannel/brown
+ name = "brown flannel jacket"
+ desc = "Comfy and supposedly flammable."
+ icon_state = "flannel_brown"
+ item_state = "flannel_brown"
+
/obj/item/clothing/suit/jacket/leather
name = "leather jacket"
desc = "Pompadour not included."
@@ -537,7 +561,7 @@
/obj/item/clothing/suit/hooded/wintercoat/captain
name = "captain's winter coat"
- desc = "A luxuriant winter coat, stuffed with the down of the endangered Uka bird and trimmed with genuine sable. The fabric is an indulgently soft micro-fiber, and the deep ultramarine color is only one that could be achieved with minute amounts of crystalline bluespace dust woven into the thread between the plectrums. Extremely lavish, and extremely durable. The tiny flakes of protective material make it nothing short of extremely light lamellar armor."
+ desc = "A luxurious winter coat, stuffed with the down of the endangered Uka bird and trimmed with genuine sable. The fabric is an indulgently soft micro-fiber, and the deep ultramarine color is only one that could be achieved with minute amounts of crystalline bluespace dust woven into the thread between the plectrums. Extremely lavish, and extremely durable. The tiny flakes of protective material make it nothing short of extremely light lamellar armor."
icon_state = "coatcaptain"
item_state = "coatcaptain"
armor = list("melee" = 25, "bullet" = 30, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 50)
@@ -565,7 +589,7 @@
/obj/item/clothing/suit/hooded/wintercoat/security
name = "security winter coat"
- desc = "A red, armor-padded winter coat. It glitters with a mild ablative coating and a robust air of authority. The zipper tab is a pair of jingly little handcuffs and got annoying after the first ten seconds."
+ desc = "A red, armor-padded winter coat. It glitters with a mild ablative coating and a robust air of authority. The zipper tab is a pair of jingly little handcuffs that get annoying after the first ten seconds."
icon_state = "coatsecurity"
item_state = "coatsecurity"
armor = list("melee" = 25, "bullet" = 15, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 45)
@@ -760,6 +784,17 @@
desc = "A green winter coat hood."
icon_state = "winterhood_hydro"
+/obj/item/clothing/suit/hooded/wintercoat/bar
+ name = "bartender winter coat"
+ desc = "A fancy winter coat with a waistcoat and flamboyant bowtie stuck onto it. The zipper tab is actually the bowtie."
+ icon_state = "coatbar"
+ item_state = "coatbar"
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/bar
+
+/obj/item/clothing/head/hooded/winterhood/bar
+ desc = "A fancy winter coat hood."
+ icon_state = "winterhood_bar"
+
/obj/item/clothing/suit/hooded/wintercoat/cosmic
name = "cosmic winter coat"
desc = "A starry winter coat that even glows softly."
@@ -867,7 +902,7 @@
icon_state = "coatnarsie"
item_state = "coatnarsie"
armor = list("melee" = 30, "bullet" = 20, "laser" = 30,"energy" = 10, "bomb" = 30, "bio" = 10, "rad" = 10, "fire" = 30, "acid" = 30)
- allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/restraints/legcuffs/bola/cult,/obj/item/melee/cultblade,/obj/item/melee/cultblade/dagger,/obj/item/reagent_containers/glass/beaker/unholywater,/obj/item/cult_shift,/obj/item/flashlight/flare/culttorch,/obj/item/twohanded/cult_spear)
+ allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/restraints/legcuffs/bola/cult,/obj/item/melee/cultblade,/obj/item/melee/cultblade/dagger,/obj/item/reagent_containers/glass/beaker/unholywater,/obj/item/cult_shift,/obj/item/flashlight/flare/culttorch,/obj/item/cult_spear)
hoodtype = /obj/item/clothing/head/hooded/winterhood/narsie
var/real = TRUE
@@ -1016,3 +1051,9 @@
/obj/item/clothing/head/hooded/winterhood/polychromic
icon_state = "winterhood_poly"
item_state = "winterhood_poly"
+
+/obj/item/clothing/suit/striped_sweater
+ name = "striped sweater"
+ desc = "Reminds you of someone, but you just can't put your finger on it..."
+ icon_state = "waldo_shirt"
+ item_state = "waldo_shirt"
diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm
index 639f2d3bfb..632d59187f 100644
--- a/code/modules/clothing/suits/toggles.dm
+++ b/code/modules/clothing/suits/toggles.dm
@@ -76,6 +76,7 @@
/obj/item/clothing/head/hooded
var/obj/item/clothing/suit/hooded/suit
+ dynamic_hair_suffix = ""
/obj/item/clothing/head/hooded/Destroy()
suit = null
@@ -164,7 +165,7 @@
RemoveHelmet()
..()
-/obj/item/clothing/suit/space/hardsuit/proc/RemoveHelmet()
+/obj/item/clothing/suit/space/hardsuit/proc/RemoveHelmet(message = TRUE)
if(!helmet)
return
suittoggled = FALSE
@@ -174,16 +175,18 @@
helmet.attack_self(H)
H.transferItemToLoc(helmet, src, TRUE)
H.update_inv_wear_suit()
- to_chat(H, "The helmet on the hardsuit disengages.")
+ if(message)
+ to_chat(H, "The helmet on the hardsuit disengages.")
playsound(src.loc, 'sound/mecha/mechmove03.ogg', 50, 1)
else
helmet.forceMove(src)
+ return TRUE
/obj/item/clothing/suit/space/hardsuit/dropped(mob/user)
..()
RemoveHelmet()
-/obj/item/clothing/suit/space/hardsuit/proc/ToggleHelmet()
+/obj/item/clothing/suit/space/hardsuit/proc/ToggleHelmet(message = TRUE)
var/mob/living/carbon/human/H = loc
if(!helmettype)
return
@@ -192,15 +195,19 @@
if(!suittoggled)
if(ishuman(src.loc))
if(H.wear_suit != src)
- to_chat(H, "You must be wearing [src] to engage the helmet!")
+ if(message)
+ to_chat(H, "You must be wearing [src] to engage the helmet!")
return
if(H.head)
- to_chat(H, "You're already wearing something on your head!")
+ if(message)
+ to_chat(H, "You're already wearing something on your head!")
return
else if(H.equip_to_slot_if_possible(helmet,SLOT_HEAD,0,0,1))
- to_chat(H, "You engage the helmet on the hardsuit.")
+ if(message)
+ to_chat(H, "You engage the helmet on the hardsuit.")
suittoggled = TRUE
H.update_inv_wear_suit()
playsound(src.loc, 'sound/mecha/mechmove03.ogg', 50, 1)
+ return TRUE
else
- RemoveHelmet()
+ return RemoveHelmet(message)
diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm
index 047dc7b7a3..977e916f87 100644
--- a/code/modules/clothing/suits/wiz_robe.dm
+++ b/code/modules/clothing/suits/wiz_robe.dm
@@ -4,11 +4,12 @@
icon_state = "wizard"
gas_transfer_coefficient = 0.01 // IT'S MAGICAL OKAY JEEZ +1 TO NOT DIE
permeability_coefficient = 0.01
- armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 20, "bio" = 20, "rad" = 20, "fire" = 100, "acid" = 100)
+ armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 20, "bio" = 20, "rad" = 20, "fire" = 100, "acid" = 100, "wound" = 20)
strip_delay = 50
equip_delay_other = 50
resistance_flags = FIRE_PROOF | ACID_PROOF
dog_fashion = /datum/dog_fashion/head/blue_wizard
+ beepsky_fashion = /datum/beepsky_fashion/wizard
var/magic_flags = SPELL_WIZARD_HAT
/obj/item/clothing/head/wizard/ComponentInitialize()
@@ -73,7 +74,7 @@
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.01
body_parts_covered = CHEST|GROIN|ARMS|LEGS
- armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 20, "bio" = 20, "rad" = 20, "fire" = 100, "acid" = 100)
+ armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 20, "bio" = 20, "rad" = 20, "fire" = 100, "acid" = 100, "wound" = 20)
allowed = list(/obj/item/teleportation_scroll)
flags_inv = HIDEJUMPSUIT
strip_delay = 50
diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm
index e0ecf24204..23cb2b1c15 100644
--- a/code/modules/clothing/under/_under.dm
+++ b/code/modules/clothing/under/_under.dm
@@ -5,8 +5,9 @@
permeability_coefficient = 0.9
block_priority = BLOCK_PRIORITY_UNIFORM
slot_flags = ITEM_SLOT_ICLOTHING
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0, "wound" = 5)
mutantrace_variation = STYLE_DIGITIGRADE|USE_TAUR_CLIP_MASK
+ limb_integrity = 30
var/fitted = FEMALE_UNIFORM_FULL // For use in alternate clothing styles for women
var/has_sensor = HAS_SENSORS // For the crew computer
var/random_sensor = TRUE
@@ -39,7 +40,7 @@
if(!attach_accessory(I, user))
return ..()
-/obj/item/clothing/under/update_clothes_damaged_state(damaging = TRUE)
+/obj/item/clothing/under/update_clothes_damaged_state()
..()
if(ismob(loc))
var/mob/M = loc
diff --git a/code/modules/clothing/under/jobs/cargo.dm b/code/modules/clothing/under/jobs/cargo.dm
index aa4db2fd30..8fbc343598 100644
--- a/code/modules/clothing/under/jobs/cargo.dm
+++ b/code/modules/clothing/under/jobs/cargo.dm
@@ -34,8 +34,9 @@
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON
/obj/item/clothing/under/rank/cargo/miner
- desc = "It's a snappy jumpsuit with a sturdy set of overalls. It is very dirty."
name = "shaft miner's jumpsuit"
+ desc = "It's a snappy jumpsuit with a sturdy set of overalls. It is very dirty."
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 0, "wound" = 10)
icon_state = "miner"
item_state = "miner"
diff --git a/code/modules/clothing/under/jobs/command.dm b/code/modules/clothing/under/jobs/command.dm
index a614e2fcb3..8272c36cf3 100644
--- a/code/modules/clothing/under/jobs/command.dm
+++ b/code/modules/clothing/under/jobs/command.dm
@@ -19,6 +19,7 @@
/obj/item/clothing/under/rank/captain/suit
name = "captain's suit"
desc = "A green suit and yellow necktie. Exemplifies authority."
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0, "wound" = 15)
icon_state = "green_suit"
item_state = "dg_suit"
can_adjust = FALSE
@@ -46,4 +47,4 @@
icon_state = "lewdcap"
item_state = "lewdcap"
can_adjust = FALSE
- mutantrace_variation = USE_TAUR_CLIP_MASK
+ mutantrace_variation = STYLE_DIGITIGRADE|USE_TAUR_CLIP_MASK
diff --git a/code/modules/clothing/under/jobs/medical.dm b/code/modules/clothing/under/jobs/medical.dm
index f50e5161b6..c4eedf93a4 100644
--- a/code/modules/clothing/under/jobs/medical.dm
+++ b/code/modules/clothing/under/jobs/medical.dm
@@ -22,7 +22,7 @@
icon_state = "cmoturtle"
item_state = "w_suit"
alt_covers_chest = TRUE
- mutantrace_variation = USE_TAUR_CLIP_MASK
+ mutantrace_variation = STYLE_DIGITIGRADE|USE_TAUR_CLIP_MASK
/obj/item/clothing/under/rank/medical/geneticist
desc = "It's made of a special fiber that gives special protection against biohazards. It has a genetics rank stripe on it."
@@ -85,12 +85,10 @@
item_state = "w_suit"
permeability_coefficient = 0.5
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0)
- can_adjust = FALSE
/obj/item/clothing/under/rank/medical/paramedic/light
desc = "It's made of a special fiber that provides minor protection against biohazards. It has a dark blue cross on the chest denoting that the wearer is a trained paramedic."
icon_state = "paramedic-light"
- can_adjust = TRUE
/obj/item/clothing/under/rank/medical/paramedic/skirt
name = "paramedic jumpskirt"
diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm
index 0061a4bc2d..7747d2e181 100644
--- a/code/modules/clothing/under/jobs/security.dm
+++ b/code/modules/clothing/under/jobs/security.dm
@@ -19,7 +19,7 @@
desc = "A tactical security jumpsuit for officers complete with Nanotrasen belt buckle."
icon_state = "rsecurity"
item_state = "r_suit"
- armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 30)
+ armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 30, "wound" = 10)
/obj/item/clothing/under/rank/security/officer/grey
name = "grey security jumpsuit"
@@ -67,7 +67,7 @@
desc = "A formal security suit for officers complete with Nanotrasen belt buckle."
icon_state = "rwarden"
item_state = "r_suit"
- armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 30)
+ armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 30, "wound" = 10)
/obj/item/clothing/under/rank/security/warden/grey
name = "grey security suit"
@@ -101,7 +101,7 @@
desc = "Someone who wears this means business."
icon_state = "detective"
item_state = "det"
- armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 30)
+ armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 30, "wound" = 10)
/obj/item/clothing/under/rank/security/detective/skirt
name = "detective's suitskirt"
@@ -138,7 +138,7 @@
desc = "A security jumpsuit decorated for those few with the dedication to achieve the position of Head of Security."
icon_state = "rhos"
item_state = "r_suit"
- armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
+ armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50, "wound" = 10)
strip_delay = 60
/obj/item/clothing/under/rank/security/head_of_security/skirt
@@ -192,3 +192,14 @@
icon_state = "hos_parade_fem"
item_state = "r_suit"
fitted = FEMALE_UNIFORM_TOP
+
+/*
+ *Spacepol
+ */
+
+/obj/item/clothing/under/rank/security/spacepol
+ name = "police uniform"
+ desc = "Space not controlled by megacorporations, planets, or pirates is under the jurisdiction of Spacepol."
+ icon_state = "spacepol"
+ item_state = "spacepol"
+ can_adjust = FALSE
\ No newline at end of file
diff --git a/code/modules/clothing/under/syndicate.dm b/code/modules/clothing/under/syndicate.dm
index 8a88e99d05..6a6c38d26e 100644
--- a/code/modules/clothing/under/syndicate.dm
+++ b/code/modules/clothing/under/syndicate.dm
@@ -73,6 +73,9 @@
item_state = "g_suit"
can_adjust = FALSE
+/obj/item/clothing/under/syndicate/camo/cosmetic
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
+
/obj/item/clothing/under/syndicate/soviet
name = "Ratnik 5 tracksuit"
desc = "Badly translated labels tell you to clean this in Vodka. Great for squatting in."
diff --git a/code/modules/detectivework/scanner.dm b/code/modules/detectivework/scanner.dm
index 9b114829e1..70e85a9cfb 100644
--- a/code/modules/detectivework/scanner.dm
+++ b/code/modules/detectivework/scanner.dm
@@ -18,6 +18,7 @@
var/list/log = list()
var/range = 8
var/view_check = TRUE
+ var/forensicPrintCount = 0
actions_types = list(/datum/action/item_action/displayDetectiveScanResults)
/datum/action/item_action/displayDetectiveScanResults
@@ -42,12 +43,15 @@
/obj/item/detective_scanner/proc/PrintReport()
// Create our paper
var/obj/item/paper/P = new(get_turf(src))
- P.name = "paper- 'Scanner Report'"
- P.info = "
Scanner Report
"
+
+ //This could be a global count like sec and med record printouts. See GLOB.data_core.medicalPrintCount AKA datacore.dm
+ var frNum = ++forensicPrintCount
+
+ P.name = text("FR-[] 'Forensic Record'", frNum)
+ P.info = text("
Forensic Record - (FR-[])
", frNum)
P.info += jointext(log, " ")
P.info += "Notes: "
- P.info_links = P.info
- P.updateinfolinks()
+ P.update_icon()
if(ismob(loc))
var/mob/M = loc
@@ -139,6 +143,8 @@
add_log("Blood:")
found_something = TRUE
for(var/B in blood)
+ if(B == "color")
+ continue
add_log("Type: [blood[B]] DNA: [B]")
//Fibers
@@ -216,4 +222,4 @@
return
to_chat(user, "Scanner Report")
for(var/iterLog in log)
- to_chat(user, iterLog)
\ No newline at end of file
+ to_chat(user, iterLog)
diff --git a/code/modules/emoji/emoji_parse.dm b/code/modules/emoji/emoji_parse.dm
index 65e8063ce0..33d32227e1 100644
--- a/code/modules/emoji/emoji_parse.dm
+++ b/code/modules/emoji/emoji_parse.dm
@@ -2,7 +2,8 @@
. = text
if(!CONFIG_GET(flag/emojis))
return
- var/static/list/emojis = icon_states(icon('icons/emoji.dmi'))
+ var/list/emojis = icon_states(icon('icons/emoji.dmi'))
+ emojis |= icon_states(icon('icons/emoji_32.dmi'))
var/parsed = ""
var/pos = 1
var/search = 0
@@ -18,7 +19,7 @@
var/datum/asset/spritesheet/sheet = get_asset_datum(/datum/asset/spritesheet/goonchat)
var/tag = sheet.icon_tag("emoji-[emoji]")
if(tag)
- parsed += tag
+ parsed += "[tag]" //evil way of enforcing 16x16
pos = search + length(text[pos])
else
parsed += copytext(text, pos, search)
@@ -34,7 +35,8 @@
. = text
if(!CONFIG_GET(flag/emojis))
return
- var/static/list/emojis = icon_states(icon('icons/emoji.dmi'))
+ var/list/emojis = icon_states(icon('icons/emoji.dmi'))
+ emojis |= icon_states(icon('icons/emoji_32.dmi'))
var/final = "" //only tags are added to this
var/pos = 1
var/search = 0
diff --git a/code/modules/events/_event.dm b/code/modules/events/_event.dm
index a8ab470d5d..b88bef1c87 100644
--- a/code/modules/events/_event.dm
+++ b/code/modules/events/_event.dm
@@ -17,9 +17,9 @@
var/holidayID = "" //string which should be in the SSeventss.holidays list if you wish this event to be holiday-specific
//anything with a (non-null) holidayID which does not match holiday, cannot run.
- var/wizardevent = 0
-
- var/alertadmins = 1 //should we let the admins know this event is firing
+ var/wizardevent = FALSE
+ var/random = FALSE //If the event has occured randomly, or if it was forced by an admin or in-game occurance
+ var/alert_observers = TRUE //should we let the ghosts and admins know this event is firing
//should be disabled on events that fire a lot
var/list/gamemode_blacklist = list() // Event won't happen in these gamemodes
@@ -33,7 +33,7 @@
min_players = CEILING(min_players * CONFIG_GET(number/events_min_players_mul), 1)
/datum/round_event_control/wizard
- wizardevent = 1
+ wizardevent = TRUE
var/can_be_midround_wizard = TRUE
// Checks if the event can be spawned. Used by event controller and "false alarm" event.
@@ -67,7 +67,7 @@
return EVENT_CANT_RUN
triggering = TRUE
- if (alertadmins)
+ if (alert_observers)
message_admins("Random Event triggering in 10 seconds: [name] (CANCEL)")
sleep(100)
var/gamemode = SSticker.mode.config_tag
@@ -92,7 +92,7 @@
log_admin_private("[key_name(usr)] cancelled event [name].")
SSblackbox.record_feedback("tally", "event_admin_cancelled", 1, typepath)
-/datum/round_event_control/proc/runEvent(random)
+/datum/round_event_control/proc/runEvent()
var/datum/round_event/E = new typepath()
E.current_players = get_active_player_count(alive_check = 1, afk_check = 1, human_check = 1)
E.control = src
@@ -101,10 +101,9 @@
testing("[time2text(world.time, "hh:mm:ss")] [E.type]")
if(random)
- if(alertadmins)
- deadchat_broadcast("[name] has just been randomly triggered!") //STOP ASSUMING IT'S BADMINS!
log_game("Random Event triggering: [name] ([typepath])")
-
+ if (alert_observers)
+ deadchat_broadcast("[name] has just been[random ? " randomly" : ""] triggered!") //STOP ASSUMING IT'S BADMINS!
return E
//Special admins setup
@@ -140,6 +139,17 @@
/datum/round_event/proc/start()
return
+/**
+ * Called after something followable has been spawned by an event
+ * Provides ghosts a follow link to an atom if possible
+ * Only called once.
+ */
+/datum/round_event/proc/announce_to_ghosts(atom/atom_of_interest)
+ if(control.alert_observers)
+ if (atom_of_interest)
+ notify_ghosts("[control.name] has an object of interest: [atom_of_interest]!", source=atom_of_interest, action=NOTIFY_ORBIT, header="Something's Interesting!")
+ return
+
//Called when the tick is equal to the announceWhen variable.
//Allows you to announce before starting or vice versa.
//Only called once.
diff --git a/code/modules/events/anomaly.dm b/code/modules/events/anomaly.dm
index d8122eac75..394294db37 100644
--- a/code/modules/events/anomaly.dm
+++ b/code/modules/events/anomaly.dm
@@ -8,7 +8,7 @@
/datum/round_event/anomaly
var/area/impact_area
- var/obj/effect/anomaly/newAnomaly
+ var/obj/effect/anomaly/anomaly_path = /obj/effect/anomaly/flux
announceWhen = 1
@@ -27,7 +27,7 @@
//Subtypes from the above that actually should explode.
var/list/unsafe_area_subtypes = typecacheof(list(/area/engine/break_room))
-
+
allowed_areas = make_associative(GLOB.the_station_areas) - safe_area_types + unsafe_area_subtypes
return safepick(typecache_filter_list(GLOB.sortedAreas,allowed_areas))
@@ -44,6 +44,9 @@
priority_announce("Localized energetic flux wave detected on long range scanners. Expected location of impact: [impact_area.name].", "Anomaly Alert")
/datum/round_event/anomaly/start()
- var/turf/T = safepick(get_area_turfs(impact_area))
+ var/turf/T = pick(get_area_turfs(impact_area))
+ var/newAnomaly
if(T)
- newAnomaly = new /obj/effect/anomaly/flux(T)
\ No newline at end of file
+ newAnomaly = new anomaly_path(T)
+ if (newAnomaly)
+ announce_to_ghosts(newAnomaly)
diff --git a/code/modules/events/anomaly_bluespace.dm b/code/modules/events/anomaly_bluespace.dm
index a6a0effa2b..395b3b88a5 100644
--- a/code/modules/events/anomaly_bluespace.dm
+++ b/code/modules/events/anomaly_bluespace.dm
@@ -1,6 +1,7 @@
/datum/round_event_control/anomaly/anomaly_bluespace
name = "Anomaly: Bluespace"
typepath = /datum/round_event/anomaly/anomaly_bluespace
+
max_occurrences = 1
weight = 5
gamemode_blacklist = list("dynamic")
@@ -8,15 +9,10 @@
/datum/round_event/anomaly/anomaly_bluespace
startWhen = 3
announceWhen = 10
-
+ anomaly_path = /obj/effect/anomaly/bluespace
/datum/round_event/anomaly/anomaly_bluespace/announce(fake)
if(prob(90))
priority_announce("Unstable bluespace anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
else
print_command_report("Unstable bluespace anomaly detected on long range scanners. Expected location: [impact_area.name].", "Unstable bluespace anomaly")
-
-/datum/round_event/anomaly/anomaly_bluespace/start()
- var/turf/T = safepick(get_area_turfs(impact_area))
- if(T)
- newAnomaly = new /obj/effect/anomaly/bluespace(T)
diff --git a/code/modules/events/anomaly_flux.dm b/code/modules/events/anomaly_flux.dm
index f4c78c0ec4..a9a7ed50b9 100644
--- a/code/modules/events/anomaly_flux.dm
+++ b/code/modules/events/anomaly_flux.dm
@@ -10,14 +10,10 @@
/datum/round_event/anomaly/anomaly_flux
startWhen = 10
announceWhen = 3
+ anomaly_path = /obj/effect/anomaly/flux
/datum/round_event/anomaly/anomaly_flux/announce(fake)
if(prob(90))
priority_announce("Localized hyper-energetic flux wave detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
else
print_command_report("Localized hyper-energetic flux wave detected on long range scanners. Expected location: [impact_area.name].","Localized hyper-energetic flux wave")
-
-/datum/round_event/anomaly/anomaly_flux/start()
- var/turf/T = safepick(get_area_turfs(impact_area))
- if(T)
- newAnomaly = new /obj/effect/anomaly/flux(T)
diff --git a/code/modules/events/anomaly_grav.dm b/code/modules/events/anomaly_grav.dm
index 8500b44597..cabd7face8 100644
--- a/code/modules/events/anomaly_grav.dm
+++ b/code/modules/events/anomaly_grav.dm
@@ -1,6 +1,7 @@
/datum/round_event_control/anomaly/anomaly_grav
name = "Anomaly: Gravitational"
typepath = /datum/round_event/anomaly/anomaly_grav
+
max_occurrences = 5
weight = 20
gamemode_blacklist = list("dynamic")
@@ -9,14 +10,10 @@
/datum/round_event/anomaly/anomaly_grav
startWhen = 3
announceWhen = 20
+ anomaly_path = /obj/effect/anomaly/grav
/datum/round_event/anomaly/anomaly_grav/announce(fake)
if(prob(90))
priority_announce("Gravitational anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
else
print_command_report("Gravitational anomaly detected on long range scanners. Expected location: [impact_area.name].", "Gravitational anomaly")
-
-/datum/round_event/anomaly/anomaly_grav/start()
- var/turf/T = safepick(get_area_turfs(impact_area))
- if(T)
- newAnomaly = new /obj/effect/anomaly/grav(T)
diff --git a/code/modules/events/anomaly_pyro.dm b/code/modules/events/anomaly_pyro.dm
index 9594727784..8c8fbd6d36 100644
--- a/code/modules/events/anomaly_pyro.dm
+++ b/code/modules/events/anomaly_pyro.dm
@@ -1,6 +1,7 @@
/datum/round_event_control/anomaly/anomaly_pyro
name = "Anomaly: Pyroclastic"
typepath = /datum/round_event/anomaly/anomaly_pyro
+
max_occurrences = 5
weight = 20
gamemode_blacklist = list("dynamic")
@@ -8,14 +9,10 @@
/datum/round_event/anomaly/anomaly_pyro
startWhen = 3
announceWhen = 10
+ anomaly_path = /obj/effect/anomaly/pyro
/datum/round_event/anomaly/anomaly_pyro/announce(fake)
if(prob(90))
priority_announce("Pyroclastic anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
else
print_command_report("Pyroclastic anomaly detected on long range scanners. Expected location: [impact_area.name].", "Pyroclastic anomaly")
-
-/datum/round_event/anomaly/anomaly_pyro/start()
- var/turf/T = safepick(get_area_turfs(impact_area))
- if(T)
- newAnomaly = new /obj/effect/anomaly/pyro(T)
diff --git a/code/modules/events/anomaly_vortex.dm b/code/modules/events/anomaly_vortex.dm
index f6eaea40d5..96d084873d 100644
--- a/code/modules/events/anomaly_vortex.dm
+++ b/code/modules/events/anomaly_vortex.dm
@@ -10,14 +10,10 @@
/datum/round_event/anomaly/anomaly_vortex
startWhen = 10
announceWhen = 3
+ anomaly_path = /obj/effect/anomaly/bhole
/datum/round_event/anomaly/anomaly_vortex/announce(fake)
if(prob(90))
priority_announce("Localized high-intensity vortex anomaly detected on long range scanners. Expected location: [impact_area.name]", "Anomaly Alert")
else
print_command_report("Localized high-intensity vortex anomaly detected on long range scanners. Expected location: [impact_area.name].","Vortex anomaly")
-
-/datum/round_event/anomaly/anomaly_vortex/start()
- var/turf/T = safepick(get_area_turfs(impact_area))
- if(T)
- newAnomaly = new /obj/effect/anomaly/bhole(T)
diff --git a/code/modules/events/brain_trauma.dm b/code/modules/events/brain_trauma.dm
new file mode 100644
index 0000000000..3e8182a827
--- /dev/null
+++ b/code/modules/events/brain_trauma.dm
@@ -0,0 +1,33 @@
+/datum/round_event_control/brain_trauma
+ name = "Spontaneous Brain Trauma"
+ typepath = /datum/round_event/brain_trauma
+ weight = 25
+
+/datum/round_event/brain_trauma
+ fakeable = FALSE
+
+/datum/round_event/brain_trauma/start()
+ for(var/mob/living/carbon/human/H in shuffle(GLOB.alive_mob_list))
+ if(!H.client)
+ continue
+ if(H.stat == DEAD) // What are you doing in this list
+ continue
+ if(!H.getorgan(/obj/item/organ/brain)) // If only I had a brain
+ continue
+
+ traumatize(H)
+ break
+
+/datum/round_event/brain_trauma/proc/traumatize(mob/living/carbon/human/H)
+ var/resistance = pick(
+ 65;TRAUMA_RESILIENCE_BASIC,
+ 30;TRAUMA_RESILIENCE_SURGERY,
+ 5;TRAUMA_RESILIENCE_LOBOTOMY)
+
+ var/trauma_type = pickweight(list(
+ BRAIN_TRAUMA_MILD = 60,
+ BRAIN_TRAUMA_SEVERE = 30,
+ BRAIN_TRAUMA_SPECIAL = 10
+ ))
+
+ H.gain_trauma_type(trauma_type, resistance)
diff --git a/code/modules/events/brand_intelligence.dm b/code/modules/events/brand_intelligence.dm
index e61af1368d..da5b4c0cb2 100644
--- a/code/modules/events/brand_intelligence.dm
+++ b/code/modules/events/brand_intelligence.dm
@@ -54,6 +54,7 @@
vendingMachines.Remove(originMachine)
originMachine.shut_up = 0
originMachine.shoot_inventory = 1
+ announce_to_ghosts(originMachine)
/datum/round_event/brand_intelligence/tick()
diff --git a/code/modules/events/camerafailure.dm b/code/modules/events/camerafailure.dm
index e8556e9118..8d7ef3204c 100644
--- a/code/modules/events/camerafailure.dm
+++ b/code/modules/events/camerafailure.dm
@@ -3,7 +3,7 @@
typepath = /datum/round_event/camera_failure
weight = 100
max_occurrences = 20
- alertadmins = 0
+ alert_observers = FALSE
/datum/round_event/camera_failure
fakeable = FALSE
diff --git a/code/modules/events/carp_migration.dm b/code/modules/events/carp_migration.dm
index e6cb043165..2c553fc8a7 100644
--- a/code/modules/events/carp_migration.dm
+++ b/code/modules/events/carp_migration.dm
@@ -10,6 +10,7 @@
/datum/round_event/carp_migration
announceWhen = 3
startWhen = 50
+ var/hasAnnounced = FALSE
/datum/round_event/carp_migration/setup()
startWhen = rand(40, 60)
@@ -22,10 +23,16 @@
/datum/round_event/carp_migration/start()
+ var/mob/living/simple_animal/hostile/carp/fish
for(var/obj/effect/landmark/carpspawn/C in GLOB.landmarks_list)
if(prob(95))
- new /mob/living/simple_animal/hostile/carp(C.loc)
+ fish = new (C.loc)
else
- new /mob/living/simple_animal/hostile/carp/megacarp(C.loc)
-
+ fish = new /mob/living/simple_animal/hostile/carp/megacarp(C.loc)
+ fishannounce(fish) //Prefer to announce the megacarps over the regular fishies
+ fishannounce(fish)
+/datum/round_event/carp_migration/proc/fishannounce(atom/fish)
+ if (!hasAnnounced)
+ announce_to_ghosts(fish) //Only anounce the first fish
+ hasAnnounced = TRUE
diff --git a/code/modules/events/dust.dm b/code/modules/events/dust.dm
index 802736d5d4..860685c787 100644
--- a/code/modules/events/dust.dm
+++ b/code/modules/events/dust.dm
@@ -4,7 +4,7 @@
weight = 200
max_occurrences = 1000
earliest_start = 0 MINUTES
- alertadmins = 0
+ alert_observers = FALSE
gamemode_blacklist = list("dynamic")
/datum/round_event/space_dust
diff --git a/code/modules/events/electrical_storm.dm b/code/modules/events/electrical_storm.dm
index 6e6abb1cd4..5e5e318e3c 100644
--- a/code/modules/events/electrical_storm.dm
+++ b/code/modules/events/electrical_storm.dm
@@ -4,7 +4,7 @@
earliest_start = 10 MINUTES
min_players = 5
weight = 40
- alertadmins = 0
+ alert_observers = FALSE
gamemode_blacklist = list("dynamic")
/datum/round_event/electrical_storm
diff --git a/code/modules/events/fake_virus.dm b/code/modules/events/fake_virus.dm
new file mode 100644
index 0000000000..77520198e8
--- /dev/null
+++ b/code/modules/events/fake_virus.dm
@@ -0,0 +1,30 @@
+/datum/round_event_control/fake_virus
+ name = "Fake Virus"
+ typepath = /datum/round_event/fake_virus
+ weight = 20
+
+/datum/round_event/fake_virus/start()
+ var/list/fake_virus_victims = list()
+ for(var/mob/living/carbon/human/H in shuffle(GLOB.player_list))
+ if(!H.client || H.stat == DEAD || H.InCritical())
+ continue
+ fake_virus_victims += H
+
+ //first we do hard status effect victims
+ var/defacto_min = min(3, LAZYLEN(fake_virus_victims))
+ if(defacto_min)// event will hit 1-3 people by default, but will do 1-2 or just 1 if only those many candidates are available
+ for(var/i=1; i<=rand(1,defacto_min); i++)
+ var/mob/living/carbon/human/hypochondriac = pick(fake_virus_victims)
+ hypochondriac.apply_status_effect(STATUS_EFFECT_FAKE_VIRUS)
+ fake_virus_victims -= hypochondriac
+
+ //then we do light one-message victims who simply cough or whatever once (have to repeat the process since the last operation modified our candidates list)
+ defacto_min = min(5, LAZYLEN(fake_virus_victims))
+ if(defacto_min)
+ for(var/i=1; i<=rand(1,defacto_min); i++)
+ var/mob/living/carbon/human/onecoughman = pick(fake_virus_victims)
+ if(prob(25))//1/4 odds to get a spooky message instead of coughing out loud
+ addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, onecoughman, "[pick("Your head hurts.", "Your head pounds.")]"), rand(30,150))
+ else
+ addtimer(CALLBACK(onecoughman, .mob/proc/emote, pick("cough", "sniff", "sneeze")), rand(30,150))//deliver the message with a slightly randomized time interval so there arent multiple people coughing at the exact same time
+ fake_virus_victims -= onecoughman
diff --git a/code/modules/events/fugitive_spawning.dm b/code/modules/events/fugitive_spawning.dm
new file mode 100644
index 0000000000..7b4628f135
--- /dev/null
+++ b/code/modules/events/fugitive_spawning.dm
@@ -0,0 +1,117 @@
+/datum/round_event_control/fugitives
+ name = "Spawn Fugitives"
+ typepath = /datum/round_event/ghost_role/fugitives
+ max_occurrences = 1
+ min_players = 20
+ earliest_start = 30 MINUTES //deadchat sink, lets not even consider it early on.
+ gamemode_blacklist = list("nuclear")
+
+/datum/round_event/ghost_role/fugitives
+ minimum_required = 1
+ role_name = "fugitive"
+ fakeable = FALSE
+
+/datum/round_event/ghost_role/fugitives/spawn_role()
+ var/list/possible_spawns = list()//Some xeno spawns are in some spots that will instantly kill the refugees, like atmos
+ for(var/turf/X in GLOB.xeno_spawn)
+ if(istype(X.loc, /area/maintenance))
+ possible_spawns += X
+ if(!possible_spawns.len)
+ message_admins("No valid spawn locations found, aborting...")
+ return MAP_ERROR
+ var/turf/landing_turf = pick(possible_spawns)
+ var/list/possible_backstories = list()
+ var/list/candidates = get_candidates(ROLE_TRAITOR, null, ROLE_TRAITOR)
+ if(candidates.len >= 1) //solo refugees
+ if(prob(30))
+ possible_backstories.Add("waldo") //less common as it comes with magicks and is kind of immershun shattering
+ else //For accurate deadchat feedback
+ minimum_required = 4
+ if(candidates.len >= 4)//group refugees
+ possible_backstories.Add("prisoner", "cultist", "synth")
+ if(!possible_backstories.len)
+ return NOT_ENOUGH_PLAYERS
+
+ var/backstory = pick(possible_backstories)
+ var/member_size = 3
+ var/leader
+ switch(backstory)
+ if("synth")
+ leader = pick_n_take(candidates)
+ if("waldo")
+ member_size = 0 //solo refugees have no leader so the member_size gets bumped to one a bit later
+ var/list/members = list()
+ var/list/spawned_mobs = list()
+ if(isnull(leader))
+ member_size++ //if there is no leader role, then the would be leader is a normal member of the team.
+
+ for(var/i in 1 to member_size)
+ members += pick_n_take(candidates)
+
+ for(var/mob/dead/selected in members)
+ var/mob/living/carbon/human/S = gear_fugitive(selected, landing_turf, backstory)
+ spawned_mobs += S
+ if(!isnull(leader))
+ gear_fugitive_leader(leader, landing_turf, backstory)
+
+//after spawning
+ playsound(src, 'sound/weapons/emitter.ogg', 50, TRUE)
+ new /obj/item/storage/toolbox/mechanical(landing_turf) //so they can actually escape maint
+ addtimer(CALLBACK(src, .proc/spawn_hunters), 10 MINUTES)
+ role_name = "fugitive hunter"
+ return SUCCESSFUL_SPAWN
+
+/datum/round_event/ghost_role/fugitives/proc/gear_fugitive(mob/dead/selected, turf/landing_turf, backstory) //spawns normal fugitive
+ var/datum/mind/player_mind = new /datum/mind(selected.key)
+ player_mind.active = TRUE
+ var/mob/living/carbon/human/S = new(landing_turf)
+ player_mind.transfer_to(S)
+ player_mind.assigned_role = "Fugitive"
+ player_mind.special_role = "Fugitive"
+ player_mind.add_antag_datum(/datum/antagonist/fugitive)
+ var/datum/antagonist/fugitive/fugitiveantag = player_mind.has_antag_datum(/datum/antagonist/fugitive)
+ INVOKE_ASYNC(fugitiveantag, /datum/antagonist/fugitive.proc/greet, backstory) //some fugitives have a sleep on their greet, so we don't want to stop the entire antag granting proc with fluff
+
+ switch(backstory)
+ if("prisoner")
+ S.equipOutfit(/datum/outfit/prisoner)
+ if("cultist")
+ S.equipOutfit(/datum/outfit/yalp_cultist)
+ if("waldo")
+ S.equipOutfit(/datum/outfit/waldo)
+ if("synth")
+ S.equipOutfit(/datum/outfit/synthetic)
+ message_admins("[ADMIN_LOOKUPFLW(S)] has been made into a Fugitive by an event.")
+ log_game("[key_name(S)] was spawned as a Fugitive by an event.")
+ spawned_mobs += S
+ return S
+
+ //special spawn for one member. it can be used for a special mob or simply to give one normal member special items.
+/datum/round_event/ghost_role/fugitives/proc/gear_fugitive_leader(mob/dead/leader, turf/landing_turf, backstory)
+ var/datum/mind/player_mind = new /datum/mind(leader.key)
+ player_mind.active = TRUE
+ //if you want to add a fugitive with a special leader in the future, make this switch with the backstory
+ var/mob/living/carbon/human/S = gear_fugitive(leader, landing_turf, backstory)
+ var/obj/item/choice_beacon/augments/A = new(S)
+ S.put_in_hands(A)
+ new /obj/item/autosurgeon(landing_turf)
+
+//security team gets called in after 10 minutes of prep to find the refugees
+/datum/round_event/ghost_role/fugitives/proc/spawn_hunters()
+ var/backstory = pick("space cop", "russian", "bounty hunter")
+ var/datum/map_template/shuttle/ship
+ if(backstory == "space cop")
+ ship = new /datum/map_template/shuttle/hunter/space_cop
+ else if (backstory == "russian")
+ ship = new /datum/map_template/shuttle/hunter/russian
+ else
+ ship = new /datum/map_template/shuttle/hunter/bounty
+ var/x = rand(TRANSITIONEDGE,world.maxx - TRANSITIONEDGE - ship.width)
+ var/y = rand(TRANSITIONEDGE,world.maxy - TRANSITIONEDGE - ship.height)
+ var/z = SSmapping.empty_space.z_value
+ var/turf/T = locate(x,y,z)
+ if(!T)
+ CRASH("Fugitive Hunters (Created from fugitive event) found no turf to load in")
+ if(!ship.load(T))
+ CRASH("Loading [backstory] ship failed!")
+ priority_announce("Unidentified ship detected near the station.")
diff --git a/code/modules/events/ghost_role.dm b/code/modules/events/ghost_role.dm
index e50d89a3a3..ae1d1320a5 100644
--- a/code/modules/events/ghost_role.dm
+++ b/code/modules/events/ghost_role.dm
@@ -37,7 +37,10 @@
signing up.")
else if(status == SUCCESSFUL_SPAWN)
message_admins("[role_name] spawned successfully.")
- if(!spawned_mobs.len)
+ if(spawned_mobs.len)
+ for(var/mob/M in spawned_mobs)
+ announce_to_ghosts(M)
+ else
message_admins("No mobs found in the `spawned_mobs` list, this is \
a bug.")
else
diff --git a/code/modules/events/heart_attack.dm b/code/modules/events/heart_attack.dm
index a47a8b81b4..b3bc571a4a 100644
--- a/code/modules/events/heart_attack.dm
+++ b/code/modules/events/heart_attack.dm
@@ -20,4 +20,4 @@
var/mob/living/carbon/human/winner = pickweight(heart_attack_contestants)
var/datum/disease/D = new /datum/disease/heart_failure()
winner.ForceContractDisease(D, FALSE, TRUE)
- notify_ghosts("[winner] is beginning to have a heart attack!", enter_link="(Click to orbit)", source=winner, action=NOTIFY_ORBIT)
+ announce_to_ghosts(winner)
\ No newline at end of file
diff --git a/code/modules/events/immovable_rod.dm b/code/modules/events/immovable_rod.dm
index d4f51e995e..89511a7b15 100644
--- a/code/modules/events/immovable_rod.dm
+++ b/code/modules/events/immovable_rod.dm
@@ -35,7 +35,8 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
var/z = pick(SSmapping.levels_by_trait(ZTRAIT_STATION))
var/turf/startT = spaceDebrisStartLoc(startside, z)
var/turf/endT = spaceDebrisFinishLoc(startside, z)
- new /obj/effect/immovablerod(startT, endT, C.special_target)
+ var/atom/rod = new /obj/effect/immovablerod(startT, endT, C.special_target)
+ announce_to_ghosts(rod)
/obj/effect/immovablerod
name = "immovable rod"
@@ -61,10 +62,6 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
z_original = z
destination = end
special_target = aimed_at
- if(notify)
- notify_ghosts("\A [src] is inbound!",
- enter_link="(Click to orbit)",
- source=src, action=NOTIFY_ORBIT)
GLOB.poi_list += src
var/special_target_valid = FALSE
@@ -146,7 +143,7 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
if(L && (L.density || prob(10)))
L.ex_act(EXPLODE_HEAVY)
-obj/effect/immovablerod/attack_hand(mob/living/user)
+obj/effect/immovablerod/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
if(ishuman(user))
var/mob/living/carbon/human/U = user
if(U.job in list("Research Director"))
diff --git a/code/modules/events/pirates.dm b/code/modules/events/pirates.dm
index b0b12f3944..f1803b03ee 100644
--- a/code/modules/events/pirates.dm
+++ b/code/modules/events/pirates.dm
@@ -80,8 +80,9 @@
var/mob/M = candidates[1]
spawner.create(M.ckey)
candidates -= M
+ announce_to_ghosts(M)
else
- notify_ghosts("Space pirates are waking up!", source = spawner, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_dnr_observers = TRUE)
+ announce_to_ghosts(spawner)
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") //CITADEL EDIT also metabreak here too
@@ -224,7 +225,8 @@
suit_type = /obj/item/clothing/suit/space
helmet_type = /obj/item/clothing/head/helmet/space
mask_type = /obj/item/clothing/mask/breath
- storage_type = /obj/item/tank/jetpack/void
+ storage_type = /obj/item/tank/internals/oxygen
+
/obj/machinery/loot_locator
name = "Booty Locator"
@@ -279,8 +281,9 @@
/obj/machinery/computer/piratepad_control
name = "cargo hold control terminal"
- resistance_flags = INDESTRUCTIBLE
- var/status_report = "Idle"
+ ui_x = 600
+ ui_y = 230
+ var/status_report = "Ready for delivery."
var/obj/machinery/piratepad/pad
var/warmup_time = 100
var/sending = FALSE
@@ -297,7 +300,6 @@
if (istype(I) && istype(I.buffer,/obj/machinery/piratepad))
to_chat(user, "You link [src] with [I.buffer] in [I] buffer.")
pad = I.buffer
- updateDialog()
return TRUE
/obj/machinery/computer/piratepad_control/LateInitialize()
@@ -310,29 +312,43 @@
else
pad = locate() in range(4,src)
-/obj/machinery/computer/piratepad_control/ui_interact(mob/user)
- . = ..()
- var/list/t = list()
- t += "
Cargo Hold Control "
- t += "Current cargo value : [points]"
- t += "
"
- if(!pad)
- t += "
No pad located.
"
- else
- t += " [status_report] "
- if(!sending)
- t += "Recalculate ValueSend"
- else
- t += "Stop sending"
+/obj/machinery/computer/piratepad_control/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
+ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
+ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "CargoHoldTerminal", name, ui_x, ui_y, master_ui, state)
+ ui.open()
- var/datum/browser/popup = new(user, "piratepad", name, 300, 500)
- popup.set_content(t.Join())
- popup.open()
+/obj/machinery/computer/piratepad_control/ui_data(mob/user)
+ var/list/data = list()
+ data["points"] = points
+ data["pad"] = pad ? TRUE : FALSE
+ data["sending"] = sending
+ data["status_report"] = status_report
+ return data
+
+/obj/machinery/computer/piratepad_control/ui_act(action, params)
+ if(..())
+ return
+ if(!pad)
+ return
+
+ switch(action)
+ if("recalc")
+ recalc()
+ . = TRUE
+ if("send")
+ start_sending()
+ . = TRUE
+ if("stop")
+ stop_sending()
+ . = TRUE
/obj/machinery/computer/piratepad_control/proc/recalc()
if(sending)
return
- status_report = "Predicted value: "
+ status_report = "Predicted value: "
+ var/value = 0
var/datum/export_report/ex = new
for(var/atom/movable/AM in get_turf(pad))
if(AM == pad)
@@ -340,7 +356,12 @@
export_item_and_contents(AM, EXPORT_PIRATE | EXPORT_CARGO | EXPORT_CONTRABAND | EXPORT_EMAG, apply_elastic = FALSE, dry_run = TRUE, external_report = ex)
for(var/datum/export/E in ex.total_amount)
- status_report += E.total_printout(ex,notes = FALSE) + " "
+ status_report += E.total_printout(ex,notes = FALSE)
+ status_report += " "
+ value += ex.total_value[E]
+
+ if(!value)
+ status_report += "0"
/obj/machinery/computer/piratepad_control/proc/send()
if(!sending)
@@ -353,14 +374,15 @@
continue
export_item_and_contents(AM, EXPORT_PIRATE | EXPORT_CARGO | EXPORT_CONTRABAND | EXPORT_EMAG, apply_elastic = FALSE, delete_unsold = FALSE, external_report = ex)
- status_report = "Sold: "
+ status_report = "Sold: "
var/value = 0
for(var/datum/export/E in ex.total_amount)
var/export_text = E.total_printout(ex,notes = FALSE) //Don't want nanotrasen messages, makes no sense here.
if(!export_text)
continue
- status_report += export_text + " "
+ status_report += export_text
+ status_report += " "
value += ex.total_value[E]
if(!total_report)
@@ -373,11 +395,12 @@
points += value
+ if(!value)
+ status_report += "Nothing"
pad.visible_message("[pad] activates!")
flick(pad.sending_state,pad)
pad.icon_state = pad.idle_state
sending = FALSE
- updateDialog()
/obj/machinery/computer/piratepad_control/proc/start_sending()
if(sending)
@@ -396,20 +419,6 @@
pad.icon_state = pad.idle_state
deltimer(sending_timer)
-/obj/machinery/computer/piratepad_control/Topic(href, href_list)
- if(..())
- return
- if(pad)
- if(href_list["recalc"])
- recalc()
- if(href_list["send"])
- start_sending()
- if(href_list["stop"])
- stop_sending()
- updateDialog()
- else
- updateDialog()
-
/datum/export/pirate
export_category = EXPORT_PIRATE
@@ -434,6 +443,8 @@
var/mob/living/carbon/human/H = AM
if(H.stat != CONSCIOUS || !H.mind || !H.mind.assigned_role) //mint condition only
return 0
+ else if("pirate" in H.faction) //can't ransom your fellow pirates to CentCom!
+ return 0
else
if(H.mind.assigned_role in GLOB.command_positions)
return 3000
diff --git a/code/modules/events/processor_overload.dm b/code/modules/events/processor_overload.dm
index cf6223bf0d..22e475a8ef 100644
--- a/code/modules/events/processor_overload.dm
+++ b/code/modules/events/processor_overload.dm
@@ -30,6 +30,7 @@
/datum/round_event/processor_overload/start()
for(var/obj/machinery/telecomms/processor/P in GLOB.telecomms_list)
if(prob(10))
+ announce_to_ghosts(P)
// Damage the surrounding area to indicate that it popped
explosion(get_turf(P), 0, 0, 2)
// Only a level 1 explosion actually damages the machine
diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm
index 85bcf4959d..7cf11848e8 100644
--- a/code/modules/events/spacevine.dm
+++ b/code/modules/events/spacevine.dm
@@ -171,10 +171,7 @@
var/turf/open/floor/T = holder.loc
if(istype(T))
var/datum/gas_mixture/GM = T.air
- if(!GM.gases[/datum/gas/oxygen])
- return
- GM.gases[/datum/gas/oxygen] = max(GM.gases[/datum/gas/oxygen] - severity * holder.energy, 0)
- GAS_GARBAGE_COLLECT(GM.gases)
+ GM.set_moles(/datum/gas/oxygen, max(GM.get_moles(/datum/gas/oxygen) - severity * holder.energy, 0))
/datum/spacevine_mutation/nitro_eater
name = "nitrogen consuming"
@@ -186,10 +183,7 @@
var/turf/open/floor/T = holder.loc
if(istype(T))
var/datum/gas_mixture/GM = T.air
- if(!GM.gases[/datum/gas/nitrogen])
- return
- GM.gases[/datum/gas/nitrogen] = max(GM.gases[/datum/gas/nitrogen] - severity * holder.energy, 0)
- GAS_GARBAGE_COLLECT(GM.gases)
+ GM.set_moles(/datum/gas/nitrogen, max(GM.get_moles(/datum/gas/nitrogen) - severity * holder.energy, 0))
/datum/spacevine_mutation/carbondioxide_eater
name = "CO2 consuming"
@@ -201,10 +195,7 @@
var/turf/open/floor/T = holder.loc
if(istype(T))
var/datum/gas_mixture/GM = T.air
- if(!GM.gases[/datum/gas/carbon_dioxide])
- return
- GM.gases[/datum/gas/carbon_dioxide] = max(GM.gases[/datum/gas/carbon_dioxide] - severity * holder.energy, 0)
- GAS_GARBAGE_COLLECT(GM.gases)
+ GM.set_moles(/datum/gas/carbon_dioxide, max(GM.get_moles(/datum/gas/carbon_dioxide) - severity * holder.energy, 0))
/datum/spacevine_mutation/plasma_eater
name = "toxins consuming"
@@ -216,10 +207,7 @@
var/turf/open/floor/T = holder.loc
if(istype(T))
var/datum/gas_mixture/GM = T.air
- if(!GM.gases[/datum/gas/plasma])
- return
- GM.gases[/datum/gas/plasma] = max(GM.gases[/datum/gas/plasma] - severity * holder.energy, 0)
- GAS_GARBAGE_COLLECT(GM.gases)
+ GM.set_moles(/datum/gas/plasma, max(GM.get_moles(/datum/gas/plasma) - severity * holder.energy, 0))
/datum/spacevine_mutation/thorns
name = "thorny"
@@ -336,7 +324,7 @@
damage_dealt *= 4
if(I.damtype == BURN)
damage_dealt *= 4
-
+ user.DelayNextAction()
for(var/datum/spacevine_mutation/SM in mutations)
damage_dealt = SM.on_hit(src, user, I, damage_dealt) //on_hit now takes override damage as arg and returns new value for other mutations to permutate further
take_damage(damage_dealt, I.damtype, "melee", 1)
@@ -357,8 +345,7 @@
for(var/datum/spacevine_mutation/SM in mutations)
SM.on_cross(src, AM)
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/structure/spacevine/attack_hand(mob/user)
+/obj/structure/spacevine/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
for(var/datum/spacevine_mutation/SM in mutations)
SM.on_hit(src, user)
user_unbuckle_mob(user, user)
@@ -368,6 +355,7 @@
for(var/datum/spacevine_mutation/SM in mutations)
SM.on_hit(src, user)
user_unbuckle_mob(user,user)
+ return ..()
/obj/structure/spacevine/attack_alien(mob/living/user)
eat(user)
@@ -383,7 +371,9 @@
/datum/spacevine_controller/New(turf/location, list/muts, potency, production, datum/round_event/event = null)
vines = list()
growth_queue = list()
- spawn_spacevine_piece(location, null, muts)
+ var/obj/structure/spacevine/SV = spawn_spacevine_piece(location, null, muts)
+ if (event)
+ event.announce_to_ghosts(SV)
START_PROCESSING(SSobj, src)
vine_mutations_list = list()
init_subtypes(/datum/spacevine_mutation/, vine_mutations_list)
diff --git a/code/modules/events/spider_infestation.dm b/code/modules/events/spider_infestation.dm
index 2cba5fc529..d1c327e0f7 100644
--- a/code/modules/events/spider_infestation.dm
+++ b/code/modules/events/spider_infestation.dm
@@ -35,6 +35,6 @@
var/spawn_type = /obj/structure/spider/spiderling
if(prob(66))
spawn_type = /obj/structure/spider/spiderling/nurse
- spawn_atom_to_turf(spawn_type, vent, 1, FALSE)
+ announce_to_ghosts(spawn_atom_to_turf(spawn_type, vent, 1, FALSE))
vents -= vent
spawncount--
diff --git a/code/modules/events/stray_cargo.dm b/code/modules/events/stray_cargo.dm
new file mode 100644
index 0000000000..031642c875
--- /dev/null
+++ b/code/modules/events/stray_cargo.dm
@@ -0,0 +1,99 @@
+///Spawns a cargo pod containing a random cargo supply pack on a random area of the station
+/datum/round_event_control/stray_cargo
+ name = "Stray Cargo Pod"
+ typepath = /datum/round_event/stray_cargo
+ weight = 5
+ max_occurrences = 4
+ earliest_start = 10 MINUTES
+
+///Spawns a cargo pod containing a random cargo supply pack on a random area of the station
+/datum/round_event/stray_cargo
+ var/area/impact_area ///Randomly picked area
+ var/list/possible_pack_types = list() ///List of possible supply packs dropped in the pod, if empty picks from the cargo list
+ var/static/list/stray_spawnable_supply_packs = list() ///List of default spawnable supply packs, filtered from the cargo list
+
+/datum/round_event/stray_cargo/announce(fake)
+ priority_announce("Stray cargo pod detected on long-range scanners. Expected location of impact: [impact_area.name].", "Collision Alert")
+
+/**
+* Tries to find a valid area, throws an error if none are found
+* Also randomizes the start timer
+*/
+/datum/round_event/stray_cargo/setup()
+ startWhen = rand(20, 40)
+ impact_area = find_event_area()
+ if(!impact_area)
+ CRASH("No valid areas for cargo pod found.")
+ var/list/turf_test = get_area_turfs(impact_area)
+ if(!turf_test.len)
+ CRASH("Stray Cargo Pod : No valid turfs found for [impact_area] - [impact_area.type]")
+
+ if(!stray_spawnable_supply_packs.len)
+ stray_spawnable_supply_packs = SSshuttle.supply_packs.Copy()
+ for(var/pack in stray_spawnable_supply_packs)
+ var/datum/supply_pack/pack_type = pack
+ if(initial(pack_type.special))
+ stray_spawnable_supply_packs -= pack
+
+///Spawns a random supply pack, puts it in a pod, and spawns it on a random tile of the selected area
+/datum/round_event/stray_cargo/start()
+ var/list/turf/valid_turfs = get_area_turfs(impact_area)
+ //Only target non-dense turfs to prevent wall-embedded pods
+ for(var/i in valid_turfs)
+ var/turf/T = i
+ if(T.density)
+ valid_turfs -= T
+ var/turf/LZ = pick(valid_turfs)
+ var/pack_type
+ if(possible_pack_types.len)
+ pack_type = pick(possible_pack_types)
+ else
+ pack_type = pick(stray_spawnable_supply_packs)
+ var/datum/supply_pack/SP = new pack_type
+ var/obj/structure/closet/crate/crate = SP.generate(null)
+ crate.locked = FALSE //Unlock secure crates
+ crate.update_icon()
+ var/obj/structure/closet/supplypod/pod = make_pod()
+ crate.forceMove(pod)
+ new /obj/effect/abstract/DPtarget(LZ, pod)
+
+///Handles the creation of the pod, in case it needs to be modified beforehand
+/datum/round_event/stray_cargo/proc/make_pod()
+ var/obj/structure/closet/supplypod/S = new
+ return S
+
+///Picks an area that wouldn't risk critical damage if hit by a pod explosion
+/datum/round_event/stray_cargo/proc/find_event_area()
+ var/static/list/allowed_areas
+ if(!allowed_areas)
+ ///Places that shouldn't explode
+ var/list/safe_area_types = typecacheof(list(
+ /area/ai_monitored/turret_protected/ai,
+ /area/ai_monitored/turret_protected/ai_upload,
+ /area/engine,
+ /area/shuttle)
+ )
+
+ ///Subtypes from the above that actually should explode.
+ var/list/unsafe_area_subtypes = typecacheof(list(/area/engine/break_room))
+ allowed_areas = make_associative(GLOB.the_station_areas) - safe_area_types + unsafe_area_subtypes
+ var/list/possible_areas = typecache_filter_list(GLOB.sortedAreas,allowed_areas)
+ if (length(possible_areas))
+ return pick(possible_areas)
+
+///A rare variant that drops a crate containing syndicate uplink items
+/datum/round_event_control/stray_cargo/syndicate
+ name = "Stray Syndicate Cargo Pod"
+ typepath = /datum/round_event/stray_cargo/syndicate
+ weight = 0
+ max_occurrences = 0
+ earliest_start = 30 MINUTES
+
+/datum/round_event/stray_cargo/syndicate
+ possible_pack_types = list(/datum/supply_pack/misc/syndicate)
+
+///Apply the syndicate pod skin
+/datum/round_event/stray_cargo/syndicate/make_pod()
+ var/obj/structure/closet/supplypod/S = new
+ S.setStyle(STYLE_SYNDICATE)
+ return S
diff --git a/code/modules/events/travelling_trader.dm b/code/modules/events/travelling_trader.dm
new file mode 100644
index 0000000000..08dae1b469
--- /dev/null
+++ b/code/modules/events/travelling_trader.dm
@@ -0,0 +1,332 @@
+/datum/round_event_control/travelling_trader
+ name = "Travelling Trader"
+ typepath = /datum/round_event/travelling_trader
+ weight = 10
+ max_occurrences = 3
+ earliest_start = 0 MINUTES
+
+/datum/round_event/travelling_trader
+ startWhen = 0
+ endWhen = 900 //you effectively have 15 minutes to complete the traders request, before they disappear
+ var/mob/living/carbon/human/dummy/travelling_trader/trader
+ var/atom/spawn_location //where the trader appears
+
+/datum/round_event/travelling_trader/setup()
+ if(GLOB.generic_event_spawns)
+ spawn_location = pick(GLOB.generic_event_spawns)
+ else
+ message_admins("No event spawn landmarks exist on the map while placing a travelling trader, resorting to random station turf. (go yell at a mapper)")
+ spawn_location = get_random_station_turf()
+
+/datum/round_event/travelling_trader/start()
+ //spawn a type of trader
+ var/trader_type = pick(subtypesof(/mob/living/carbon/human/dummy/travelling_trader))
+ trader = new trader_type(get_turf(spawn_location))
+ var/datum/effect_system/smoke_spread/smoke = new
+ smoke.set_up(1, spawn_location)
+ smoke.start()
+ trader.visible_message("[src] suddenly appears in a puff of smoke!")
+
+/datum/round_event/travelling_trader/announce(fake)
+ priority_announce("A mysterious figure has been detected on sensors at [get_area(spawn_location)]", "Mysterious Figure")
+
+/datum/round_event/travelling_trader/end()
+ if(trader)
+ trader.visible_message("The [src] has given up on waiting!")
+ qdel(trader)
+
+//the actual trader mob
+/mob/living/carbon/human/dummy/travelling_trader //similar to a dummy because we want to be resource-efficient
+ var/trader_name = "Debug Travelling Trader"
+ status_flags = GODMODE //avoid scenarios of people trying to kill the trader
+ move_resist = MOVE_FORCE_VERY_STRONG //you can't bluespace bodybag them!
+ var/datum/outfit/trader_outfit
+ var/list/possible_wanted_items //weighted list of possible things to request
+ var/list/possible_rewards //weighted list of possible things to give in return for the requested item
+ var/atom/requested_item //the thing they chose from possible_wanted_items
+ var/last_speech //last time someone tried interacting with them using their hand
+ var/last_refusal //last time they vocally refused an item given to them
+ var/initial_speech = "It looks like the coders did a mishap!" //first thing they say when interacted with, like a description
+ var/speech_verb = "says"
+ var/request_speech = "Please bring me a requested_item you shall be greatly rewarded!" //second thing they say when interacted with
+ var/acceptance_speech = "This is exactly what I wanted! I shall be on my way now, thank you.!"
+ var/refusal_speech = "A given_item? I wanted a requested_item!" //what they say when refusing an item
+ var/active = TRUE
+
+/mob/living/carbon/human/dummy/travelling_trader/proc/setup_speech(var/input_speech, var/obj/item/given_item)
+ if(requested_item)
+ input_speech = replacetext(input_speech, "requested_item", initial(requested_item.name))
+ if(given_item)
+ input_speech = replacetext(input_speech, "given_item", given_item.name)
+ return input_speech
+
+/mob/living/carbon/human/dummy/travelling_trader/on_attack_hand(mob/living/carbon/human/H)
+ if(active && last_speech + 3 < world.realtime) //can only talk once per 3 seconds, to avoid spam
+ last_speech = world.realtime
+ if(initial_speech)
+ visible_message("[src] [speech_verb] \"[setup_speech(initial_speech)]\"")
+ sleep(15)
+ if(active && request_speech) //they might not be active anymore because of the prior sleep!
+ visible_message("[src] [speech_verb] \"[setup_speech(request_speech)]\"")
+
+/mob/living/carbon/human/dummy/travelling_trader/attackby(obj/item/I, mob/user)
+ if(active)
+ if(check_item(I))
+ active = FALSE
+ visible_message("[src] [speech_verb] \"[setup_speech(acceptance_speech, I)]\"")
+ qdel(I)
+ sleep(15)
+ give_reward(user)
+ qdel(src)
+ else
+ if(last_refusal + 3 < world.realtime)
+ last_refusal = world.realtime
+ visible_message("[src] [speech_verb] \"[setup_speech(refusal_speech, I)]\"")
+
+/mob/living/carbon/human/dummy/travelling_trader/proc/check_item(var/obj/item/supplied_item) //sometimes we might want to care about the properties of the item, etc
+ return istype(supplied_item, requested_item)
+
+/mob/living/carbon/human/dummy/travelling_trader/proc/give_reward()
+ var/reward = pickweight(possible_rewards)
+ new reward(get_turf(src))
+
+/mob/living/carbon/human/dummy/travelling_trader/Initialize()
+ ..()
+ ADD_TRAIT(src,TRAIT_PIERCEIMMUNE, "trader_pierce_immune") //don't let people take their blood
+ equipOutfit(trader_outfit, TRUE)
+ for(var/obj/item/item in src.get_equipped_items())
+ ADD_TRAIT(item, TRAIT_NODROP, "trader_no_drop") //don't let people steal the travellers clothes!
+ item.resistance_flags |= INDESTRUCTIBLE //don't let people burn their clothes off, either.
+ if(!requested_item) //sometimes we already picked one
+ requested_item = pickweight(possible_wanted_items)
+ name = trader_name //gets changed in humans initialisation so we set it here
+
+/mob/living/carbon/human/dummy/travelling_trader/Destroy()
+ var/datum/effect_system/smoke_spread/smoke = new
+ smoke.set_up(1, loc)
+ smoke.start()
+ visible_message("[src] disappears in a puff of smoke, leaving something on the ground!")
+ ..()
+
+//travelling trader subtypes (the types that can actually spawn)
+//so far there's: cook / botanist / bartender / animal hunter / artifact dealer / surgeon (6 types!)
+
+//cook
+/mob/living/carbon/human/dummy/travelling_trader/cook
+ trader_name = "Otherworldly Chef"
+ trader_outfit = /datum/outfit/job/cook
+ initial_speech = "Mama-mia! I have came to this plane of existence, searching the greatest of foods!"
+ request_speech = "Can you fetch me the delicacy known as requested_item? I would pay you for your service!"
+ acceptance_speech = "Grazie! You have done me a service, my friend."
+ refusal_speech = "A given_item? Surely you must be joking!"
+ possible_rewards = list(/obj/item/paper/secretrecipe = 1,
+ /obj/item/pizzabox/infinite = 1,
+ /obj/item/kitchen/fork/throwing = 1,
+ /mob/living/simple_animal/cow/random = 1)
+
+/mob/living/carbon/human/dummy/travelling_trader/cook/Initialize()
+ //pick a random crafted food item as the requested item
+ var/datum/crafting_recipe/food_recipe = pick(subtypesof(/datum/crafting_recipe/food))
+ var/result = initial(food_recipe.result)
+ if(ispath(result, /obj/item/reagent_containers/food)) //not all food recipes make food objects (like cak/butterbear)
+ requested_item = result
+ else
+ requested_item = /obj/item/reagent_containers/food/snacks/copypasta
+ ..()
+
+//botanist
+/mob/living/carbon/human/dummy/travelling_trader/gardener
+ trader_name = "Otherworldly Gardener"
+ trader_outfit = /datum/outfit/job/botanist
+ initial_speech = "I have come across this realm in search of rare plants and believe this station may be able to help me.."
+ request_speech = "Are you able to bring me the plant known to you as: 'requested_item'? I could see that you get some reward for this task."
+ acceptance_speech = "Amazing! Ill finally be able to make that salad. Goodbye for now!"
+ refusal_speech = "A given_item? Did nobody ever teach you the basics of gardening?"
+ possible_rewards = list(/obj/item/seeds/cherry/bomb = 1,
+ /obj/item/storage/box/strange_seeds_5pack = 6,
+ /obj/item/clothing/suit/hooded/bee_costume = 2,
+ /obj/item/seeds/gatfruit = 1) //overall you have less chance of seeing them than a lifebringer just bringing the seeds to you directly
+
+
+/mob/living/carbon/human/dummy/travelling_trader/gardener/Initialize()
+ requested_item = pick(subtypesof(/obj/item/reagent_containers/food/snacks/grown) - list(/obj/item/reagent_containers/food/snacks/grown/shell,
+ /obj/item/reagent_containers/food/snacks/grown/shell/gatfruit,
+ /obj/item/reagent_containers/food/snacks/grown/cherry_bomb))
+ ..()
+
+//animal hunter
+/mob/living/carbon/human/dummy/travelling_trader/animal_hunter
+ trader_name = "Otherworldly Animal Specialist"
+ trader_outfit = /datum/outfit/job/doctor
+ initial_speech = "Greetings, lifeform. I am here to locate a special creature aboard your station."
+ request_speech = "Find me the creature known as 'requested_item' and you shall be rewarded for your efforts."
+ refusal_speech = "Do you think me to be a fool, lifeform? I know a requested_item when I see one."
+ possible_wanted_items = list(/mob/living/simple_animal/pet/dog/corgi/Ian = 1,
+ /mob/living/simple_animal/sloth/paperwork = 1,
+ /mob/living/carbon/monkey/punpun = 1,
+ /mob/living/simple_animal/pet/fox/Renault = 1,
+ /mob/living/simple_animal/hostile/carp/cayenne = 1,
+ /mob/living/simple_animal/pet/bumbles = 1,
+ /mob/living/simple_animal/parrot/Poly = 1)
+ possible_rewards = list(/mob/living/simple_animal/pet/dog/corgi/exoticcorgi = 1, //rewards are animals, friendly to only the person who handed the reward in!
+ /mob/living/simple_animal/cockroach = 1,
+ /mob/living/simple_animal/hostile/skeleton = 1,
+ /mob/living/simple_animal/hostile/stickman = 1,
+ /mob/living/simple_animal/hostile/stickman/dog = 1,
+ /mob/living/simple_animal/hostile/asteroid/fugu = 1,
+ /mob/living/simple_animal/hostile/bear = 1,
+ /mob/living/simple_animal/hostile/retaliate/clown/fleshclown = 1,
+ /mob/living/simple_animal/hostile/tree = 1,
+ /mob/living/simple_animal/hostile/mimic = 1,
+ /mob/living/simple_animal/hostile/shark = 1,
+ /mob/living/simple_animal/hostile/netherworld/blankbody = 1,
+ /mob/living/simple_animal/hostile/retaliate/goose = 1)
+
+mob/living/carbon/human/dummy/travelling_trader/animal_hunter/Initialize()
+ acceptance_speech = pick(list("This lifeform shall make for a great stew, thank you.", "This lifeform shall be of a true use to our cause, thank you.", "The lifeform is adequate. Goodbye.", "This lifeform shall make a great addition to my collection."))
+ //make sure they only ask for animals that are still alive
+ for(var/mob/living/animal in possible_wanted_items)
+ if(!(animal in GLOB.mob_living_list))
+ possible_wanted_items -= animal
+ if(!possible_wanted_items)
+ //all the pets are dead, so ask for a monkey, or sometimes a corgi (corgis are more annoying to get a hold of)
+ possible_wanted_items = list(/mob/living/simple_animal/pet/dog/corgi = 1, /mob/living/carbon/monkey = 3)
+ ..()
+
+/mob/living/carbon/human/dummy/travelling_trader/animal_hunter/check_item(var/obj/item/supplied_item) //item is likely to be in contents of whats supplied
+ for(var/atom/something in supplied_item.contents)
+ if(istype(something, requested_item))
+ qdel(something) //typically things holding mobs release the mob when the container is deleted, so delete the mob first here
+ return TRUE
+ return FALSE
+
+/mob/living/carbon/human/dummy/travelling_trader/animal_hunter/give_reward(var/mob/giver) //the reward is actually given in a jar, because releasing it onto the station might be a bad idea
+ var/obj/item/pet_carrier/bluespace/jar = new(get_turf(src))
+ var/chosen_animal = pickweight(possible_rewards)
+ var/mob/living/new_animal = new chosen_animal(jar)
+ if(giver && giver.tag)
+ new_animal.faction += "\[[giver.tag]\]"
+ jar.add_occupant(new_animal)
+ jar.name = "WARNING: [new_animal]"
+
+//bartender
+/mob/living/carbon/human/dummy/travelling_trader/bartender
+ trader_name = "Otherworldly Bartender"
+ trader_outfit = /datum/outfit/job/bartender
+ initial_speech = "Greetings, station inhabitor. I came to this dimension in the pursuit of a particular drink."
+ request_speech = "Bring me thirty units of the beverage known as 'requested_item'."
+ acceptance_speech = "This is truly the drink I have been seeking. Thank you."
+ refusal_speech = "Do not mess with me, simpleton, I do not wish for that which you are trying to give me."
+ possible_rewards = list(/obj/structure/reagent_dispensers/keg/neurotoxin = 1, //all kegs have 250u aside from neurotoxin/hearty punch which have 100u
+ /obj/structure/reagent_dispensers/keg/hearty_punch = 3,
+ /obj/structure/reagent_dispensers/keg/red_queen = 3,
+ /obj/structure/reagent_dispensers/keg/narsour = 3,
+ /obj/structure/reagent_dispensers/keg/quintuple_sec = 3)
+
+/mob/living/carbon/human/dummy/travelling_trader/bartender/Initialize() //pick a subtype of ethanol that isn't found in the default set of the booze dispensers reagents
+ requested_item = pick(subtypesof(/datum/reagent/consumable/ethanol) - list(/datum/reagent/consumable/ethanol/beer,
+ /datum/reagent/consumable/ethanol/kahlua,
+ /datum/reagent/consumable/ethanol/whiskey,
+ /datum/reagent/consumable/ethanol/wine,
+ /datum/reagent/consumable/ethanol/vodka,
+ /datum/reagent/consumable/ethanol/gin,
+ /datum/reagent/consumable/ethanol/rum,
+ /datum/reagent/consumable/ethanol/tequila,
+ /datum/reagent/consumable/ethanol/vermouth,
+ /datum/reagent/consumable/ethanol/cognac,
+ /datum/reagent/consumable/ethanol/ale,
+ /datum/reagent/consumable/ethanol/absinthe,
+ /datum/reagent/consumable/ethanol/hcider,
+ /datum/reagent/consumable/ethanol/creme_de_menthe,
+ /datum/reagent/consumable/ethanol/creme_de_cacao,
+ /datum/reagent/consumable/ethanol/creme_de_coconut,
+ /datum/reagent/consumable/ethanol/triple_sec,
+ /datum/reagent/consumable/ethanol/sake,
+ /datum/reagent/consumable/ethanol/applejack))
+ ..()
+
+/mob/living/carbon/human/dummy/travelling_trader/bartender/check_item(var/obj/item/supplied_item) //you need to check its reagents
+ if(istype(supplied_item, /obj/item/reagent_containers))
+ var/obj/item/reagent_containers/supplied_container = supplied_item
+ if(supplied_container.reagents.has_reagent(requested_item, 30))
+ return TRUE
+ return FALSE
+
+//artifact dealer
+/mob/living/carbon/human/dummy/travelling_trader/artifact_dealer
+ trader_name = "Otherworldly Artifact Dealer"
+ trader_outfit = /datum/outfit/artifact_dealer //he's cool enough to get his own outfit
+ initial_speech = "I have come here due to sensing the existence of an object of great power and importance."
+ request_speech = "Give to me the great object known as: requested_item and I shall make it worth your while, traveller."
+ acceptance_speech = "This is truly an artifact worthy of my collection, thank you."
+ refusal_speech = "A given_item? Hah! Worthless."
+ possible_wanted_items = list(/obj/item/pen/fountain/captain = 1, //various rare things and high risk but not useful things (i.e. champion belt, bedsheet, pen)
+ /obj/item/storage/belt/champion = 1,
+ /obj/item/clothing/shoes/wheelys = 1,
+ /obj/item/relic = 1,
+ /obj/item/flashlight/lamp/bananalamp = 1,
+ /obj/item/storage/box/hug = 1,
+ /obj/item/clothing/gloves/color/yellow = 1,
+ /obj/item/instrument/saxophone = 1,
+ /obj/item/bedsheet/captain = 1,
+ /obj/item/slime_extract/green = 1,
+ /obj/item/chainsaw = 1,
+ /obj/item/clothing/head/crown = 1)
+ possible_rewards = list(/obj/item/storage/bag/money/c5000 = 5,
+ /obj/item/circuitboard/computer/arcade/amputation = 2,
+ /obj/item/stack/sticky_tape/infinite = 2,
+ /obj/item/clothing/suit/hooded/wintercoat/cosmic = 2)
+
+/mob/living/carbon/human/dummy/travelling_trader/artifact_dealer/Initialize()
+ possible_rewards += list(pick(subtypesof(/obj/item/clothing/head/collectable)) = 1) //this is slightly lower because it's absolutely useless
+ ..()
+
+/datum/outfit/artifact_dealer
+ name = "Artifact Dealer"
+ uniform = /obj/item/clothing/under/suit/black_really
+ shoes = /obj/item/clothing/shoes/combat
+ head = /obj/item/clothing/head/that
+ glasses = /obj/item/clothing/glasses/monocle
+
+//surgeon
+/mob/living/carbon/human/dummy/travelling_trader/surgeon
+ trader_name = "Otherworldly Surgeon"
+ trader_outfit = /datum/outfit/otherworldly_surgeon
+ initial_speech = "Hello there, meatbag. You can provide me with something I want."
+ request_speech = "Find me the appendage you call 'requested_item'. I shall make sure it's worth your efforts."
+ acceptance_speech = "This shall do. Goodbye, meatbag."
+ refusal_speech = "That is not what I wish for. Give me a requested_item, or I shall take one by force."
+ possible_wanted_items = list(/obj/item/bodypart/l_arm = 4,
+ /obj/item/bodypart/r_arm = 4,
+ /obj/item/bodypart/l_leg = 4,
+ /obj/item/bodypart/r_leg = 4,
+ /obj/item/organ/tongue = 2,
+ /obj/item/organ/liver = 2,
+ /obj/item/organ/lungs = 2,
+ /obj/item/organ/heart = 2,
+ /obj/item/organ/eyes = 1,
+ /obj/item/organ/brain = 1,
+ /obj/item/bodypart/head = 1)
+ possible_rewards = list(/obj/item/organ/cyberimp/mouth/breathing_tube = 1,
+ /obj/item/organ/eyes/robotic/thermals = 1,
+ /obj/item/organ/cyberimp/arm/toolset = 1,
+ /obj/item/organ/cyberimp/arm/surgery = 1,
+ /obj/item/organ/cyberimp/arm/janitor = 1,
+ /obj/item/organ/cyberimp/arm/flash = 1,
+ /obj/item/organ/cyberimp/arm/shield = 1,
+ /obj/item/organ/cyberimp/eyes/hud/medical = 1,
+ /obj/item/organ/cyberimp/arm/baton = 1)
+
+/mob/living/carbon/human/dummy/travelling_trader/surgeon/give_reward()
+ var/chosen_implant = pickweight(possible_rewards)
+ var/new_implant = new chosen_implant
+ var/obj/item/autosurgeon/reward = new(get_turf(src))
+ reward.insert_organ(new_implant)
+
+/datum/outfit/otherworldly_surgeon
+ name = "Otherworldly Surgeon"
+ uniform = /obj/item/clothing/under/pants/white
+ shoes = /obj/item/clothing/shoes/sneakers/white
+ gloves = /obj/item/clothing/gloves/color/latex
+ mask = /obj/item/clothing/mask/surgical
+ suit = /obj/item/clothing/suit/apron/surgical
diff --git a/code/modules/events/vent_clog.dm b/code/modules/events/vent_clog.dm
index 48fb688d70..dc672cec45 100644
--- a/code/modules/events/vent_clog.dm
+++ b/code/modules/events/vent_clog.dm
@@ -140,22 +140,6 @@
typepath = /datum/round_event/vent_clog/plasma_decon
max_occurrences = 0
-/datum/round_event_control/vent_clog/female
- name = "Clogged Vents; Girlcum"
- typepath = /datum/round_event/vent_clog/female
- max_occurrences = 0
-
-/datum/round_event/vent_clog/female
- reagentsAmount = 100
-
-/datum/round_event_control/vent_clog/male
- name = "Clogged Vents: Semen"
- typepath = /datum/round_event/vent_clog/male
- max_occurrences = 0
-
-/datum/round_event/vent_clog/male
- reagentsAmount = 100
-
/datum/round_event/vent_clog/beer/announce()
priority_announce("The scrubbers network is experiencing an unexpected surge of pressurized beer. Some ejection of contents may occur.", "Atmospherics alert")
@@ -171,36 +155,6 @@
foam.start()
CHECK_TICK
-/datum/round_event/vent_clog/male/announce()
- priority_announce("The scrubbers network is experiencing a backpressure surge. Some ejaculation of contents may occur.", "Atmospherics alert")
-
-/datum/round_event/vent_clog/male/start()
- for(var/obj/machinery/atmospherics/components/unary/vent in vents)
- if(vent && vent.loc && !vent.welded)
- var/datum/reagents/R = new/datum/reagents(1000)
- R.my_atom = vent
- R.add_reagent(/datum/reagent/consumable/semen, reagentsAmount)
-
- var/datum/effect_system/foam_spread/foam = new
- foam.set_up(200, get_turf(vent), R)
- foam.start()
- CHECK_TICK
-
-/datum/round_event/vent_clog/female/announce()
- priority_announce("The scrubbers network is experiencing a backpressure squirt. Some ejection of contents may occur.", "Atmospherics alert")
-
-/datum/round_event/vent_clog/female/start()
- for(var/obj/machinery/atmospherics/components/unary/vent in vents)
- if(vent && vent.loc && !vent.welded)
- var/datum/reagents/R = new/datum/reagents(1000)
- R.my_atom = vent
- R.add_reagent(/datum/reagent/consumable/femcum, reagentsAmount)
-
- var/datum/effect_system/foam_spread/foam = new
- foam.set_up(200, get_turf(vent), R)
- foam.start()
- CHECK_TICK
-
/datum/round_event/vent_clog/plasma_decon/announce()
priority_announce("We are deploying an experimental plasma decontamination system. Please stand away from the vents and do not breathe the smoke that comes out.", "Central Command Update")
diff --git a/code/modules/events/wisdomcow.dm b/code/modules/events/wisdomcow.dm
new file mode 100644
index 0000000000..553dd8f309
--- /dev/null
+++ b/code/modules/events/wisdomcow.dm
@@ -0,0 +1,15 @@
+/datum/round_event_control/wisdomcow
+ name = "Wisdom cow"
+ typepath = /datum/round_event/wisdomcow
+ max_occurrences = 1
+ weight = 10
+
+/datum/round_event/wisdomcow/announce(fake)
+ priority_announce("A wise cow has been spotted in the area. Be sure to ask for her advice.", "Nanotrasen Cow Ranching Agency")
+
+/datum/round_event/wisdomcow/start()
+ var/turf/targetloc = get_random_station_turf()
+ new /mob/living/simple_animal/cow/wisdom(targetloc)
+ var/datum/effect_system/smoke_spread/smoke = new
+ smoke.set_up(1, targetloc)
+ smoke.start()
diff --git a/code/modules/events/wizard/embeddies.dm b/code/modules/events/wizard/embeddies.dm
new file mode 100644
index 0000000000..fe08b9c743
--- /dev/null
+++ b/code/modules/events/wizard/embeddies.dm
@@ -0,0 +1,46 @@
+/datum/round_event_control/wizard/embedpocalypse
+ name = "Make Everything Embeddable"
+ weight = 2
+ typepath = /datum/round_event/wizard/embedpocalypse
+ max_occurrences = 1
+ earliest_start = 0 MINUTES
+
+/datum/round_event/wizard/embedpocalypse/start()
+ for(var/obj/item/I in world)
+ CHECK_TICK
+
+ if(!(I.flags_1 & INITIALIZED_1))
+ continue
+
+ if(!I.embedding || I.embedding == EMBED_HARMLESS)
+ I.embedding = EMBED_POINTY
+ I.updateEmbedding()
+ I.name = "pointy [I.name]"
+
+ GLOB.embedpocalypse = TRUE
+ GLOB.stickpocalypse = FALSE // embedpocalypse takes precedence over stickpocalypse
+
+/datum/round_event_control/wizard/embedpocalypse/sticky
+ name = "Make Everything Sticky"
+ weight = 6
+ typepath = /datum/round_event/wizard/embedpocalypse/sticky
+ max_occurrences = 1
+ earliest_start = 0 MINUTES
+
+/datum/round_event_control/wizard/embedpocalypse/sticky/canSpawnEvent(players_amt, gamemode)
+ if(GLOB.embedpocalypse)
+ return FALSE
+
+/datum/round_event/wizard/embedpocalypse/sticky/start()
+ for(var/obj/item/I in world)
+ CHECK_TICK
+
+ if(!(I.flags_1 & INITIALIZED_1))
+ continue
+
+ if(!I.embedding)
+ I.embedding = EMBED_HARMLESS
+ I.updateEmbedding()
+ I.name = "sticky [I.name]"
+
+ GLOB.stickpocalypse = TRUE
diff --git a/code/modules/events/wizard/madness.dm b/code/modules/events/wizard/madness.dm
new file mode 100644
index 0000000000..ac86236623
--- /dev/null
+++ b/code/modules/events/wizard/madness.dm
@@ -0,0 +1,28 @@
+/datum/round_event_control/wizard/madness
+ name = "Curse of Madness"
+ weight = 1
+ typepath = /datum/round_event/wizard/madness
+ earliest_start = 0 MINUTES
+
+ var/forced_secret
+
+/datum/round_event_control/wizard/madness/admin_setup()
+ if(!check_rights(R_FUN))
+ return
+
+ var/suggested = pick(strings(REDPILL_FILE, "redpill_questions"))
+
+ forced_secret = (input(usr, "What horrifying truth will you reveal?", "Curse of Madness", sortList(suggested)) as text|null) || suggested
+
+/datum/round_event/wizard/madness/start()
+ var/datum/round_event_control/wizard/madness/C = control
+
+ var/horrifying_truth
+
+ if(C.forced_secret)
+ horrifying_truth = C.forced_secret
+ C.forced_secret = null
+ else
+ horrifying_truth = pick(strings(REDPILL_FILE, "redpill_questions"))
+
+ curse_of_madness(null, horrifying_truth)
diff --git a/code/modules/flufftext/Dreaming.dm b/code/modules/flufftext/Dreaming.dm
index 43c3337a4b..860d3898f2 100644
--- a/code/modules/flufftext/Dreaming.dm
+++ b/code/modules/flufftext/Dreaming.dm
@@ -1,7 +1,3 @@
-/mob/living/carbon/proc/handle_dreams()
- if(prob(10) && !dreaming)
- dream()
-
/mob/living/carbon/proc/dream()
set waitfor = FALSE
var/list/dream_fragments = list()
diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm
index 2e68c57abd..45ab6f6af1 100644
--- a/code/modules/food_and_drinks/drinks/drinks.dm
+++ b/code/modules/food_and_drinks/drinks/drinks.dm
@@ -23,7 +23,6 @@
gulp_size = max(round(reagents.total_volume / 5), 5)
/obj/item/reagent_containers/food/drinks/attack(mob/living/M, mob/user, def_zone)
-
if(!reagents || !reagents.total_volume)
to_chat(user, "[src] is empty!")
return 0
@@ -37,9 +36,6 @@
if(M == user)
user.visible_message("[user] swallows a gulp of [src].", "You swallow a gulp of [src].")
- if(HAS_TRAIT(M, TRAIT_VORACIOUS))
- M.changeNext_move(CLICK_CD_MELEE * 0.5) //chug! chug! chug!
-
else
M.visible_message("[user] attempts to feed the contents of [src] to [M].", "[user] attempts to feed the contents of [src] to [M].")
if(!do_mob(user, M))
@@ -56,6 +52,10 @@
playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1)
return 1
+/obj/item/reagent_containers/food/drinks/CheckAttackCooldown(mob/user, atom/target)
+ var/fast = HAS_TRAIT(user, TRAIT_VORACIOUS) && (user == target)
+ return user.CheckActionCooldown(fast? CLICK_CD_RANGE : CLICK_CD_MELEE)
+
/obj/item/reagent_containers/food/drinks/afterattack(obj/target, mob/user , proximity)
. = ..()
if(!proximity)
diff --git a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm
index 7361e50606..8e5069925f 100644
--- a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm
+++ b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm
@@ -94,7 +94,7 @@
list_reagents = list(/datum/reagent/consumable/nuka_cola = 50)
/obj/item/reagent_containers/food/drinks/drinkingglass/filled/syndicatebomb
- name = "Syndicat Bomb"
+ name = "Syndicate Bomb"
list_reagents = list(/datum/reagent/consumable/ethanol/syndicatebomb = 50)
/obj/item/reagent_containers/food/drinks/drinkingglass/attackby(obj/item/I, mob/user, params)
diff --git a/code/modules/food_and_drinks/food.dm b/code/modules/food_and_drinks/food.dm
index 203eb3eef6..f83a1222fd 100644
--- a/code/modules/food_and_drinks/food.dm
+++ b/code/modules/food_and_drinks/food.dm
@@ -6,7 +6,6 @@
/// get_random_food proc.
////////////////////////////////////////////////////////////////////////////////
-#define STOP_SERVING_BREAKFAST (15 MINUTES)
/obj/item/reagent_containers/food
possible_transfer_amounts = list()
@@ -51,5 +50,3 @@
if((foodtype & BREAKFAST) && world.time - SSticker.round_start_time < STOP_SERVING_BREAKFAST)
SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "breakfast", /datum/mood_event/breakfast)
last_check_time = world.time
-
-#undef STOP_SERVING_BREAKFAST
diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm
index ccac1d4a77..4b79dc1fd4 100644
--- a/code/modules/food_and_drinks/food/snacks.dm
+++ b/code/modules/food_and_drinks/food/snacks.dm
@@ -13,15 +13,31 @@ The nutriment reagent and bitesize variable replace the old heal_amt and amount
bitesize of 2, then it'll take 3 bites to eat. Unlike the old system, the contained reagents are evenly spread among all
the bites. No more contained reagents = no more bites.
-Here is an example of the new formatting for anyone who wants to add more food items.
+Food formatting and crafting examples.
```
-/obj/item/reagent_containers/food/snacks/xenoburger //Identification path for the object.
- name = "Xenoburger" //Name that displays in the UI.
- desc = "Smells caustic. Tastes like heresy." //Duh
- icon_state = "xburger" //Refers to an icon in food.dmi
- list_reagents = list(/datum/reagent/xenomicrobes = 10,
- /datum/reagent/consumable/nutriment = 2) //What's inside the snack.
- bitesize = 3 //This is the amount each bite consumes.
+/obj/item/reagent_containers/food/snacks/saltedcornchips //Identification path for the object.
+ name = "salted corn chips" //Name that displays when hovered over.
+ desc = "Manufactured in a far away factory." //Description on examine.
+ icon_state = "saltychip" //Refers to an icon, usually in food.dmi
+ bitesize = 3 //How many reagents are consumed in each bite.
+ list_reagents = list(/datum/reagent/consumable/nutriment = 6, //What's inside the snack, but only if spawned. For example, from a chemical reaction, vendor, or slime core spawn.
+ /datum/reagent/consumable/nutriment/vitamin = 2)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, //What's -added- to the food, in addition to the reagents contained inside the foods used to craft it. Basically, a reward for cooking.
+ /datum/reagent/consumable/nutriment/vitamin = 1) ^^For example. Egg+Egg = 2Egg + Bonus Reagents.
+ filling_color = "#F4A460" //What color it will use if put in a custom food.
+ tastes = list("salt" = 1, "oil" = 1) //Descriptive flavoring displayed when eaten. IE: "You taste a bit of salt and a bit of oil."
+ foodtype = GRAIN | JUNKFOOD //Tag for racial or custom food preferences. IE: Most Lizards cannot have GRAIN.
+
+Crafting Recipe (See files in code/modules/food_and_drinks/recipes/tablecraft/)
+
+/datum/crafting_recipe/food/nachos
+ name ="Salted Corn Chips" //Name that displays in the Crafting UI
+ reqs = list( //The list of ingredients to make the food.
+ /obj/item/reagent_containers/food/snacks/tortilla = 1,
+ /datum/reagent/consumable/sodiumchloride = 1 //As a note, reagents and non-food items don't get added to the food. If you
+ ) ^^want the reagents, make sure the food item has it listed under bonus_reagents.
+ result = /obj/item/reagent_containers/food/snacks/saltedcornchips //Resulting object.
+ subcategory = CAT_MISCFOOD //Subcategory the food falls under in the Food Tab of the crafting menu.
```
All foods are distributed among various categories. Use common sense.
@@ -113,8 +129,6 @@ All foods are distributed among various categories. Use common sense.
else if(fullness > (600 * (1 + M.overeatduration / 2000))) // The more you eat - the more you can eat
user.visible_message("[user] cannot force any more of \the [src] to go down [user.p_their()] throat!", "You cannot force any more of \the [src] to go down your throat!")
return 0
- if(HAS_TRAIT(M, TRAIT_VORACIOUS))
- M.changeNext_move(CLICK_CD_MELEE * 0.5) //nom nom nom
else
if(!isbrain(M)) //If you're feeding it to someone else.
if(fullness <= (600 * (1 + M.overeatduration / 1000)))
@@ -151,6 +165,10 @@ All foods are distributed among various categories. Use common sense.
return 0
+/obj/item/reagent_containers/food/snacks/CheckAttackCooldown(mob/user, atom/target)
+ var/fast = HAS_TRAIT(user, TRAIT_VORACIOUS) && (user == target)
+ return user.CheckActionCooldown(fast? CLICK_CD_RANGE : CLICK_CD_MELEE)
+
/obj/item/reagent_containers/food/snacks/examine(mob/user)
. = ..()
if(food_quality >= 70)
@@ -303,12 +321,12 @@ All foods are distributed among various categories. Use common sense.
var/obj/item/result
if(cooked_type)
result = new cooked_type(T)
- //if the result is food, set its food quality to the original food item's quality
- if(isfood(result))
- var/obj/item/reagent_containers/food/food_output = result
- food_output.adjust_food_quality(food_quality + M.quality_increase)
if(istype(M))
initialize_cooked_food(result, M.efficiency)
+ //if the result is food, set its food quality to the original food item's quality
+ if(isfood(result))
+ var/obj/item/reagent_containers/food/food_output = result
+ food_output.adjust_food_quality(food_quality + M.quality_increase)
else
initialize_cooked_food(result, 1)
SSblackbox.record_feedback("tally", "food_made", 1, result.type)
@@ -390,3 +408,13 @@ All foods are distributed among various categories. Use common sense.
TB.MouseDrop(over)
else
return ..()
+
+// //////////////////////////////////////////////Frying////////////////////////////////////////
+/atom/proc/fry(cook_time = 30) //you can truly fry anything
+ //don't fry reagent containers that aren't food items, indestructable items, or items that are already fried
+ if(isitem(src))
+ var/obj/item/fried_item = src
+ if(fried_item.resistance_flags & INDESTRUCTIBLE)
+ return
+ if(!GetComponent(/datum/component/fried) && (!reagents || isfood(src) || ismob(src)))
+ AddComponent(/datum/component/fried, frying_power = cook_time)
diff --git a/code/modules/food_and_drinks/food/snacks/meat.dm b/code/modules/food_and_drinks/food/snacks/meat.dm
index 7f75a93464..fe70739ab5 100644
--- a/code/modules/food_and_drinks/food/snacks/meat.dm
+++ b/code/modules/food_and_drinks/food/snacks/meat.dm
@@ -1,6 +1,7 @@
/obj/item/reagent_containers/food/snacks/meat
var/subjectname = ""
var/subjectjob = null
+ custom_materials = list(/datum/material/meat = MINERAL_MATERIAL_AMOUNT * 4)
/obj/item/reagent_containers/food/snacks/meat/slab
name = "meat"
@@ -82,6 +83,7 @@
/obj/item/reagent_containers/food/snacks/meat/slab/chicken
name = "chicken meat"
desc = "A slab of raw chicken. Remember to wash your hands!"
+ icon_state = "chickenbreast"
cooked_type = /obj/item/reagent_containers/food/snacks/meat/steak/chicken
slice_path = /obj/item/reagent_containers/food/snacks/meat/rawcutlet/chicken
tastes = list("chicken" = 1)
@@ -315,6 +317,15 @@
slice_path = /obj/item/reagent_containers/food/snacks/meat/rawcutlet/gondola
foodtype = RAW | MEAT
+/obj/item/reagent_containers/food/snacks/meat/slab/wisdomcow
+ name = "wisdom cow meat"
+ desc = "The meat from the legendary creature known as the wisdom cow. You monster."
+ list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/medicine/liquid_wisdom = 5)
+ tastes = list("meat" = 1, "wisdom" = 5)
+ filling_color = "#18e3ca"
+ cooked_type = /obj/item/reagent_containers/food/snacks/meat/steak/wisdomcow
+ slice_path = /obj/item/reagent_containers/food/snacks/meat/rawcutlet/wisdomcow
+
////////////////////////////////////// MEAT STEAKS ///////////////////////////////////////////////////////////
@@ -331,8 +342,14 @@
/obj/item/reagent_containers/food/snacks/meat/steak/chicken
name = "chicken steak" //Can you have chicken steaks? Maybe this should be renamed once it gets new sprites.
+ icon_state = "chickenbreast_cooked"
tastes = list("chicken" = 1)
+/obj/item/reagent_containers/food/snacks/meat/steak/fish
+ name = "fish fillet"
+ icon_state = "grilled_carp_slice"
+ tastes = list("charred sushi" = 1)
+
/obj/item/reagent_containers/food/snacks/meat/steak/plain
foodtype = MEAT
@@ -351,6 +368,7 @@
/obj/item/reagent_containers/food/snacks/meat/steak/bear
name = "bear steak"
+ icon_state = "bearcook"
tastes = list("meat" = 1, "salmon" = 1)
/obj/item/reagent_containers/food/snacks/meat/steak/xeno
@@ -374,6 +392,10 @@
name = "gondola steak"
tastes = list("meat" = 1, "tranquility" = 1)
+/obj/item/reagent_containers/food/snacks/meat/steak/wisdomcow
+ name = "wisdom cow steak"
+ tastes = list("meat" = 1, "wisdom" = 5)
+
//////////////////////////////// MEAT CUTLETS ///////////////////////////////////////////////////////
//Raw cutlets
@@ -441,6 +463,11 @@
cooked_type = /obj/item/reagent_containers/food/snacks/meat/cutlet/gondola
tastes = list("meat" = 1, "tranquility" = 1)
+/obj/item/reagent_containers/food/snacks/meat/rawcutlet/wisdomcow
+ name = "raw wisdom cow cutlet"
+ cooked_type = /obj/item/reagent_containers/food/snacks/meat/cutlet/wisdomcow
+ tastes = list("meat" = 1, "wisdom" = 5)
+
//Cooked cutlets
/obj/item/reagent_containers/food/snacks/meat/cutlet
@@ -488,3 +515,7 @@
/obj/item/reagent_containers/food/snacks/meat/cutlet/chicken
name = "chicken cutlet"
tastes = list("chicken" = 1)
+
+/obj/item/reagent_containers/food/snacks/meat/cutlet/wisdomcow
+ name = "wisdom cow cutlet"
+ tastes = list("meat" = 1, "wisdom" = 5)
diff --git a/code/modules/food_and_drinks/food/snacks_bread.dm b/code/modules/food_and_drinks/food/snacks_bread.dm
index f3d84f7169..0d7c715654 100644
--- a/code/modules/food_and_drinks/food/snacks_bread.dm
+++ b/code/modules/food_and_drinks/food/snacks_bread.dm
@@ -191,93 +191,6 @@
tastes = list("bread" = 1, "garlic" = 1, "butter" = 1)
foodtype = GRAIN
-/obj/item/reagent_containers/food/snacks/deepfryholder
- name = "Deep Fried Foods Holder Obj"
- desc = "If you can see this description the code for the deep fryer fucked up."
- icon = 'icons/obj/food/food.dmi'
- icon_state = ""
- bitesize = 2
- var/fried_garbage = FALSE //did you really fry a fire extinguisher?
-
-GLOBAL_VAR_INIT(frying_hardmode, TRUE)
-GLOBAL_VAR_INIT(frying_bad_chem_add_volume, TRUE)
-GLOBAL_LIST_INIT(frying_bad_chems, list(
-/datum/reagent/toxin/bad_food = 3,
-/datum/reagent/drug/aranesp = 2,
-/datum/reagent/toxin = 2,
-/datum/reagent/lithium = 2,
-/datum/reagent/mercury = 2,
-))
-
-/obj/item/reagent_containers/food/snacks/deepfryholder/Initialize(mapload, obj/item/fried)
- . = ..()
- name = fried.name //We'll determine the other stuff when it's actually removed
- appearance = fried.appearance
- layer = initial(layer)
- plane = initial(plane)
- lefthand_file = fried.lefthand_file
- righthand_file = fried.righthand_file
- item_state = fried.item_state
- desc = fried.desc
- w_class = fried.w_class
- slowdown = fried.slowdown
- equip_delay_self = fried.equip_delay_self
- equip_delay_other = fried.equip_delay_other
- strip_delay = fried.strip_delay
- species_exception = fried.species_exception
- item_flags = fried.item_flags
- obj_flags = fried.obj_flags
-
- if(isfood(fried))
- fried.reagents.trans_to(src, fried.reagents.total_volume)
- qdel(fried)
- else
- fried.forceMove(src)
- trash = fried
- fried_garbage = TRUE
-
-/obj/item/reagent_containers/food/snacks/deepfryholder/Destroy()
- if(trash)
- QDEL_NULL(trash)
- . = ..()
-
-/obj/item/reagent_containers/food/snacks/deepfryholder/On_Consume(mob/living/eater)
- if(fried_garbage && GLOB.frying_hardmode && GLOB.frying_bad_chems.len)
- var/R = rand(1, GLOB.frying_bad_chems.len)
- var/bad_chem = GLOB.frying_bad_chems[R]
- var/bad_chem_amount = GLOB.frying_bad_chems[bad_chem]
- eater.reagents.add_reagent(bad_chem, bad_chem_amount)
- //All fried inedible items also get condensed cooking oil added, which induces minor vomiting and heart damage
- eater.reagents.add_reagent(/datum/reagent/toxin/condensed_cooking_oil, 2)
- if(trash)
- QDEL_NULL(trash)
- ..()
-
-/obj/item/reagent_containers/food/snacks/deepfryholder/proc/fry(cook_time = 30)
- switch(cook_time)
- if(0 to 15)
- add_atom_colour(rgb(166,103,54), FIXED_COLOUR_PRIORITY)
- name = "lightly-fried [name]"
- desc = "[desc] It's been lightly fried in a deep fryer."
- adjust_food_quality(food_quality - 5)
- if(16 to 49)
- add_atom_colour(rgb(103,63,24), FIXED_COLOUR_PRIORITY)
- name = "fried [name]"
- desc = "[desc] It's been fried, increasing its tastiness value by [rand(1, 75)]%."
- adjust_food_quality(food_quality - 10)
- if(50 to 59)
- add_atom_colour(rgb(63,23,4), FIXED_COLOUR_PRIORITY)
- name = "deep-fried [name]"
- desc = "[desc] Deep-fried to perfection."
- adjust_food_quality(food_quality) //we shouldn't punish perfection in the fried arts
- if(60 to INFINITY)
- add_atom_colour(rgb(33,19,9), FIXED_COLOUR_PRIORITY)
- name = "the physical manifestation of the very concept of fried foods"
- desc = "A heavily-fried...something. Who can tell anymore?"
- adjust_food_quality(0) //good job, you're truly the best cook.
- filling_color = color
- foodtype |= FRIED
-
/obj/item/reagent_containers/food/snacks/butteredtoast
name = "buttered toast"
desc = "Butter lightly spread over a piece of toast."
diff --git a/code/modules/food_and_drinks/food/snacks_cake.dm b/code/modules/food_and_drinks/food/snacks_cake.dm
index f2253ee760..1117dbc3d3 100644
--- a/code/modules/food_and_drinks/food/snacks_cake.dm
+++ b/code/modules/food_and_drinks/food/snacks_cake.dm
@@ -312,7 +312,7 @@ obj/item/reagent_containers/food/snacks/store/cake/pound_cake
name = "pound cake"
desc = "A condensed cake made for filling people up quickly."
icon_state = "pound_cake"
- slices_num = 7 //Its ment to feed the party
+ slices_num = 7 //Its meant to feed the party
slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/pound_cake_slice
bonus_reagents = list(/datum/reagent/consumable/nutriment = 60)
tastes = list("cake" = 5, "sweetness" = 1, "batter" = 1)
diff --git a/code/modules/food_and_drinks/food/snacks_frozen.dm b/code/modules/food_and_drinks/food/snacks_frozen.dm
index b699477245..39c9c6c04f 100644
--- a/code/modules/food_and_drinks/food/snacks_frozen.dm
+++ b/code/modules/food_and_drinks/food/snacks_frozen.dm
@@ -91,7 +91,7 @@
icon = 'icons/obj/food/snowcones.dmi'
icon_state = "flavorless_sc"
trash = /obj/item/reagent_containers/food/drinks/sillycup //We dont eat paper cups
- bonus_reagents = list(/datum/reagent/water = 10) //Base line will allways give water
+ bonus_reagents = list(/datum/reagent/water = 10) //Base line will always give water
list_reagents = list(/datum/reagent/water = 1) // We dont get food for water/juices
filling_color = "#FFFFFF" //Ice is white
tastes = list("ice" = 1, "water" = 1)
diff --git a/code/modules/food_and_drinks/food/snacks_meat.dm b/code/modules/food_and_drinks/food/snacks_meat.dm
index c2a58b0821..2a4139dbb9 100644
--- a/code/modules/food_and_drinks/food/snacks_meat.dm
+++ b/code/modules/food_and_drinks/food/snacks_meat.dm
@@ -22,6 +22,7 @@
list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/toxin/carpotoxin = 2, /datum/reagent/consumable/nutriment/vitamin = 2)
bitesize = 6
filling_color = "#FA8072"
+ cooked_type = /obj/item/reagent_containers/food/snacks/meat/steak/fish
tastes = list("fish" = 1)
foodtype = MEAT
@@ -173,6 +174,27 @@
tastes = list("meat" = 1, "smoke" = 1)
foodtype = MEAT
+/obj/item/reagent_containers/food/snacks/meatloaf
+ name = "meatloaf"
+ desc = "Meat! In a loaf!"
+ icon_state = "meatloaf"
+ filling_color = "#8f0f0f"
+ list_reagents = list(/datum/reagent/consumable/nutriment = 10)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/consumable/ketchup = 5)
+ tastes = list("meat" = 1, "ketchup" = 1)
+ slices_num = 5
+ slice_path = /obj/item/reagent_containers/food/snacks/meatloaf_slice
+ foodtype = MEAT
+
+/obj/item/reagent_containers/food/snacks/meatloaf_slice
+ name = "meatloaf slice"
+ filling_color = "#8f0f0f"
+ desc = "Meat! In chunky slices!"
+ icon_state = "meatloaf_slice"
+ list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/ketchup = 1)
+ tastes = list("meat" = 1, "ketchup" = 1)
+ foodtype = MEAT
+
/obj/item/reagent_containers/food/snacks/kebab
trash = /obj/item/stack/rods
icon_state = "kebab"
@@ -301,6 +323,16 @@
desc = "A 'chicken' nugget vaguely shaped like a [shape]."
icon_state = "nugget_[shape]"
+/obj/item/reagent_containers/food/snacks/sweet_and_sour
+ name = "sweet and sour chicken"
+ desc = "More sweet than sour, but delicious nonetheless."
+ icon_state = "sweet_and_sour"
+ filling_color = "#B22222"
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1, /datum/reagent/consumable/soysauce = 2)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 9, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/consumable/soysauce = 2)
+ tastes = list("\"chicken\"" = 1)
+ foodtype = MEAT | PINEAPPLE
+
/obj/item/reagent_containers/food/snacks/pigblanket
name = "pig in a blanket"
desc = "A tiny sausage wrapped in a flakey, buttery roll. Free this pig from its blanket prison by eating it."
diff --git a/code/modules/food_and_drinks/food/snacks_other.dm b/code/modules/food_and_drinks/food/snacks_other.dm
index bc80ffe621..e0697cecea 100644
--- a/code/modules/food_and_drinks/food/snacks_other.dm
+++ b/code/modules/food_and_drinks/food/snacks_other.dm
@@ -136,6 +136,17 @@
tastes = list("fries" = 3, "cheese" = 1)
foodtype = VEGETABLES | GRAIN
+/obj/item/reagent_containers/food/snacks/chilicheesefries
+ name = "chili cheese fries"
+ desc = "Fries smothered in cheese -and- chilli."
+ icon_state = "chilicheesefries"
+ trash = /obj/item/trash/plate
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 2)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 7, /datum/reagent/consumable/nutriment/vitamin = 1)
+ filling_color = "#FFD700"
+ tastes = list("fries" = 3, "cheese" = 1)
+ foodtype = VEGETABLES | GRAIN
+
/obj/item/reagent_containers/food/snacks/badrecipe
name = "burned mess"
desc = "Someone should be demoted from cook for this."
@@ -537,6 +548,35 @@
tastes = list("butter" = 1)
foodtype = DAIRY
+/obj/item/reagent_containers/food/snacks/butter/margarine
+ name = "stick of margarine"
+ desc = "A stick of lightly salted vegetable oil."
+ icon_state = "marge"
+ list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/cornoil = 2, /datum/reagent/consumable/sodiumchloride = 1)
+ filling_color = "#FFD700"
+ tastes = list("butter" = 1)
+ foodtype = JUNKFOOD
+
+/obj/item/reagent_containers/food/snacks/mashedpotato
+ name = "mashed potatoes"
+ desc = "A diced and smashed potato, served with sour cream."
+ icon_state = "mashedpotato"
+ list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/consumable/sodiumchloride = 1)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1)
+ filling_color = "#FFD700"
+ tastes = list("butter" = 1, "sour cream" = 1)
+ foodtype = GRAIN
+
+/obj/item/reagent_containers/food/snacks/butteredpotato
+ name = "buttered potatoes"
+ desc = "Mashed potatoes served with an ample serving of butter, and sour cream."
+ icon_state = "buttermash"
+ list_reagents = list(/datum/reagent/consumable/nutriment = 7, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/consumable/sodiumchloride = 2)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 1)
+ filling_color = "#FFD700"
+ tastes = list("potatoes" = 1, "sour cream" = 1, "butter" = 1)
+ foodtype = GRAIN | DAIRY
+
/obj/item/reagent_containers/food/snacks/onionrings
name = "onion rings"
desc = "Onion slices coated in batter."
diff --git a/code/modules/food_and_drinks/food/snacks_pizza.dm b/code/modules/food_and_drinks/food/snacks_pizza.dm
index ebc67a28c1..f30c182963 100644
--- a/code/modules/food_and_drinks/food/snacks_pizza.dm
+++ b/code/modules/food_and_drinks/food/snacks_pizza.dm
@@ -10,6 +10,17 @@
tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1)
foodtype = GRAIN | DAIRY | VEGETABLES
+/obj/item/reagent_containers/food/snacks/pizzaslice/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/kitchen/rollingpin))
+ if(!isturf(loc))
+ to_chat(user, "You need to put [src] on a surface to roll it out!")
+ return
+ new /obj/item/stack/sheet/pizza(loc)
+ to_chat(user, "You smoosh [src] into a cheesy sheet.")
+ qdel(src)
+ return
+ return ..()
+
/obj/item/reagent_containers/food/snacks/pizzaslice
icon = 'icons/obj/food/pizzaspaghetti.dmi'
list_reagents = list(/datum/reagent/consumable/nutriment = 5)
diff --git a/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm b/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm
index 9096429228..a606b9fe5a 100644
--- a/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm
+++ b/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm
@@ -21,6 +21,17 @@
tastes = list("toast" = 1)
foodtype = GRAIN
+/obj/item/reagent_containers/food/snacks/baconlettucetomato
+ name = "blt sandwich"
+ desc = "The classic bacon, lettuce tomato sandwich."
+ icon = 'icons/obj/food/burgerbread.dmi'
+ icon_state = "blt"
+ trash = /obj/item/trash/plate
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/nutriment/vitamin = 2)
+ tastes = list("bacon" = 1, "lettuce" = 1, "tomato" = 1, "mayo" = 1)
+ foodtype = GRAIN | MEAT | VEGETABLES
+
/obj/item/reagent_containers/food/snacks/grilledcheese
name = "grilled cheese sandwich"
desc = "Goes great with Tomato soup!"
@@ -136,8 +147,19 @@
/obj/item/reagent_containers/food/snacks/tuna_sandwich
name = "tuna sandwich"
desc = "Both a salad and a sandwich in one."
+ icon = 'icons/obj/food/burgerbread.dmi'
icon_state = "tunasandwich"
- trash = /obj/item/trash/plate
+ list_reagents = list(/datum/reagent/consumable/nutriment = 12, /datum/reagent/consumable/nutriment/vitamin = 4)
bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 3)
tastes = list("tuna" = 4, "mayonnaise" = 2, "bread" = 2)
foodtype = GRAIN | MEAT
+
+/obj/item/reagent_containers/food/snacks/meatballsub
+ name = "meatball sub"
+ desc = "At some point, you need to be the cheif sub."
+ icon = 'icons/obj/food/food.dmi'
+ icon_state = "meatballsub"
+ list_reagents = list(/datum/reagent/consumable/nutriment = 12, /datum/reagent/consumable/nutriment/vitamin = 4)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 3)
+ tastes = list("meat" = 2, "toasted bread" = 1)
+ foodtype = GRAIN | MEAT
diff --git a/code/modules/food_and_drinks/food/snacks_soup.dm b/code/modules/food_and_drinks/food/snacks_soup.dm
index a6a251a84c..ffafcc6b1e 100644
--- a/code/modules/food_and_drinks/food/snacks_soup.dm
+++ b/code/modules/food_and_drinks/food/snacks_soup.dm
@@ -125,6 +125,15 @@
tastes = list("tomato" = 1, "mint" = 1)
foodtype = VEGETABLES
+/obj/item/reagent_containers/food/snacks/soup/bearchili
+ name = "bear chili"
+ desc = "Sensationally seasoned bear meat diced up with some peppers."
+ icon_state = "bearchili"
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/consumable/capsaicin = 1)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 10, /datum/reagent/medicine/morphine = 5, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/consumable/capsaicin = 5)
+ tastes = list("the outdoors" = 1, "hot peppers" = 1)
+ foodtype = VEGETABLES | MEAT
+
/obj/item/reagent_containers/food/snacks/soup/monkeysdelight
name = "monkey's delight"
desc = "A delicious soup with dumplings and hunks of monkey meat simmered to perfection, in a broth that tastes faintly of bananas."
@@ -253,6 +262,16 @@
filling_color = "#CC2B52"
foodtype = VEGETABLES | TOXIC
+/obj/item/reagent_containers/food/snacks/soup/spiral_soup
+ name = "spiral soup"
+ desc = "The swirling of this soup is both frightening, and enticing."
+ icon_state = "spiral_soup"
+ list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/liquidelectricity = 5, /datum/reagent/cryptobiolin = 10, /datum/reagent/toxin/rotatium = 10)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 1, /datum/reagent/cryptobiolin = 15, /datum/reagent/toxin/rotatium = 15, /datum/reagent/consumable/liquidelectricity = 2)
+ tastes = list("the floor" = 1, "the ceiling" = 1, "regret" = 2)
+ filling_color = "#4476e2"
+ foodtype = GROSS | TOXIC | VEGETABLES
+
/obj/item/reagent_containers/food/snacks/soup/bungocurry
name = "bungo curry"
desc = "A spicy vegetable curry made with the humble bungo fruit, Exotic!"
diff --git a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
index 0a3d172bb0..fecc9467a1 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
@@ -29,7 +29,7 @@ God bless America.
use_power = IDLE_POWER_USE
idle_power_usage = 5
layer = BELOW_OBJ_LAYER
- var/obj/item/reagent_containers/food/snacks/deepfryholder/frying //What's being fried RIGHT NOW?
+ var/obj/item/frying //What's being fried RIGHT NOW?
var/cook_time = 0
var/oil_use = 0.05 //How much cooking oil is used per tick
var/fry_speed = 1 //How quickly we fry food
@@ -91,25 +91,21 @@ God bless America.
if(I.resistance_flags & INDESTRUCTIBLE)
to_chat(user, "You don't feel it would be wise to fry [I]...")
return
- if(istype(I, /obj/item/reagent_containers/food/snacks/deepfryholder))
+ if(I.GetComponent(/datum/component/fried))
to_chat(user, "Your cooking skills are not up to the legendary Doublefry technique.")
return
if(default_unfasten_wrench(user, I))
return
else if(default_deconstruction_screwdriver(user, "fryer_off", "fryer_off" ,I)) //where's the open maint panel icon?!
return
+ else if(I.reagents && !isfood(I))
+ return
else
if(is_type_in_typecache(I, deepfry_blacklisted_items) || HAS_TRAIT(I, TRAIT_NODROP) || (I.item_flags & (ABSTRACT | DROPDEL)))
return ..()
else if(!frying && user.transferItemToLoc(I, src))
+ frying = I
to_chat(user, "You put [I] into [src].")
- frying = new/obj/item/reagent_containers/food/snacks/deepfryholder(src, I)
- //setup food quality for item depending on if it's edible or not
- if(isfood(I))
- var/obj/item/reagent_containers/food/original_food = I
- frying.adjust_food_quality(original_food.food_quality) //food quality remains unchanged until degree of frying is calculated
- else
- frying.adjust_food_quality(10) //inedible fried item has low quality
icon_state = "fryer_on"
fry_loop.start()
@@ -134,7 +130,7 @@ God bless America.
/obj/machinery/deepfryer/attack_ai(mob/user)
return
-/obj/machinery/deepfryer/attack_hand(mob/user)
+/obj/machinery/deepfryer/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(frying)
if(frying.loc == src)
to_chat(user, "You eject [frying] from [src].")
@@ -150,6 +146,8 @@ God bless America.
fry_loop.stop()
return
else if(user.pulling && user.a_intent == "grab" && iscarbon(user.pulling) && reagents.total_volume)
+ if(!user.CheckActionCooldown(CLICK_CD_MELEE))
+ return
if(user.grab_state < GRAB_AGGRESSIVE)
to_chat(user, "You need a better grip to do that!")
return
@@ -159,5 +157,5 @@ God bless America.
C.apply_damage(min(30, reagents.total_volume), BURN, BODY_ZONE_HEAD)
reagents.remove_any((reagents.total_volume/2))
C.DefaultCombatKnockdown(60)
- user.changeNext_move(CLICK_CD_MELEE)
+ user.DelayNextAction()
return ..()
diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
index dcea93f06f..e4148d849a 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
@@ -63,10 +63,7 @@
/obj/machinery/gibber/relaymove(mob/living/user)
go_out()
-/obj/machinery/gibber/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/machinery/gibber/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(stat & (NOPOWER|BROKEN))
return
if(operating)
diff --git a/code/modules/food_and_drinks/kitchen_machinery/grill.dm b/code/modules/food_and_drinks/kitchen_machinery/grill.dm
index 547ed244c0..09e1d7b1c6 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/grill.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/grill.dm
@@ -107,7 +107,7 @@
/obj/machinery/grill/attack_ai(mob/user)
return
-/obj/machinery/grill/attack_hand(mob/user)
+/obj/machinery/grill/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(grilled_item)
to_chat(user, "You take out [grilled_item] from [src].")
grilled_item.forceMove(drop_location())
diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
index 67a636eb9c..36e3b64487 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
@@ -160,7 +160,7 @@
/obj/machinery/smartfridge/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
- ui = new(user, src, ui_key, "smartvend", name, 440, 550, master_ui, state)
+ ui = new(user, src, ui_key, "SmartVend", name, 440, 550, master_ui, state)
ui.set_autoupdate(FALSE)
ui.open()
@@ -463,7 +463,7 @@
return TRUE
if(!O.reagents || !O.reagents.reagent_list.len) // other empty containers not accepted
return FALSE
- if(istype(O, /obj/item/reagent_containers/syringe) || istype(O, /obj/item/reagent_containers/glass/bottle) || istype(O, /obj/item/reagent_containers/glass/beaker) || istype(O, /obj/item/reagent_containers/spray) || istype(O, /obj/item/reagent_containers/medspray))
+ if(istype(O, /obj/item/reagent_containers/syringe) || istype(O, /obj/item/reagent_containers/glass/bottle) || istype(O, /obj/item/reagent_containers/glass/beaker) || istype(O, /obj/item/reagent_containers/spray) || istype(O, /obj/item/reagent_containers/medspray) || istype(O, /obj/item/reagent_containers/chem_pack))
return TRUE
return FALSE
diff --git a/code/modules/food_and_drinks/pizzabox.dm b/code/modules/food_and_drinks/pizzabox.dm
index 19ded25b08..a2603d07ab 100644
--- a/code/modules/food_and_drinks/pizzabox.dm
+++ b/code/modules/food_and_drinks/pizzabox.dm
@@ -106,8 +106,7 @@
START_PROCESSING(SSobj, src)
update_icon()
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/item/pizzabox/attack_hand(mob/user)
+/obj/item/pizzabox/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(user.get_inactive_held_item() != src)
return ..()
if(open)
diff --git a/code/modules/food_and_drinks/recipes/drinks_recipes.dm b/code/modules/food_and_drinks/recipes/drinks_recipes.dm
index 8d8049194b..c1a17b87a4 100644
--- a/code/modules/food_and_drinks/recipes/drinks_recipes.dm
+++ b/code/modules/food_and_drinks/recipes/drinks_recipes.dm
@@ -920,75 +920,75 @@
/datum/chemical_reaction/coldscales
name = "Cold Scales"
- id = /datum/reagent/consumable/ethanol/coldscales
- results = list(/datum/reagent/consumable/ethanol/coldscales = 3)
+ id = /datum/reagent/consumable/ethanol/species_drink/coldscales
+ results = list(/datum/reagent/consumable/ethanol/species_drink/coldscales = 3)
required_reagents = list(/datum/reagent/consumable/tea = 1, /datum/reagent/toxin/slimejelly = 1, /datum/reagent/consumable/menthol = 1)
/datum/chemical_reaction/oil_drum
name = "Oil Drum"
- id = /datum/reagent/consumable/ethanol/oil_drum
- results = list(/datum/reagent/consumable/ethanol/oil_drum = 3)
+ id = /datum/reagent/consumable/ethanol/species_drink/oil_drum
+ results = list(/datum/reagent/consumable/ethanol/species_drink/oil_drum = 3)
required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/oil = 1, /datum/reagent/consumable/ethanol/champagne = 12)
/datum/chemical_reaction/nord_king
name = "Nord King"
- id = /datum/reagent/consumable/ethanol/nord_king
- results = list(/datum/reagent/consumable/ethanol/nord_king = 10)
+ id = /datum/reagent/consumable/ethanol/species_drink/nord_king
+ results = list(/datum/reagent/consumable/ethanol/species_drink/nord_king = 10)
required_reagents = list(/datum/reagent/consumable/ethanol = 5, /datum/reagent/consumable/honey = 1, /datum/reagent/consumable/ethanol/red_mead = 10)
/datum/chemical_reaction/velvet_kiss
name = "Velvet Kiss"
- id = /datum/reagent/consumable/ethanol/velvet_kiss
- results = list(/datum/reagent/consumable/ethanol/velvet_kiss = 15) //Limited races use this
+ id = /datum/reagent/consumable/ethanol/species_drink/velvet_kiss
+ results = list(/datum/reagent/consumable/ethanol/species_drink/velvet_kiss = 15) //Limited races use this
required_reagents = list(/datum/reagent/blood = 5, /datum/reagent/consumable/tea = 1, /datum/reagent/consumable/ethanol/wine = 10)
/datum/chemical_reaction/abduction_fruit
name = "Abduction Fruit"
- id = /datum/reagent/consumable/ethanol/abduction_fruit
- results = list(/datum/reagent/consumable/ethanol/abduction_fruit = 3)
+ id = /datum/reagent/consumable/ethanol/species_drink/abduction_fruit
+ results = list(/datum/reagent/consumable/ethanol/species_drink/abduction_fruit = 3)
required_reagents = list(/datum/reagent/consumable/limejuice = 10, /datum/reagent/consumable/strawberryjuice = 5, /datum/reagent/consumable/watermelonjuice = 10)
/datum/chemical_reaction/bug_zapper
name = "Bug Zapper"
- id = /datum/reagent/consumable/ethanol/bug_zapper
- results = list(/datum/reagent/consumable/ethanol/bug_zapper = 20) //Harder to make
+ id = /datum/reagent/consumable/ethanol/species_drink/bug_zapper
+ results = list(/datum/reagent/consumable/ethanol/species_drink/bug_zapper = 20) //Harder to make
required_reagents = list(/datum/reagent/consumable/lemonjuice = 10, /datum/reagent/teslium = 1, /datum/reagent/copper = 10)
/datum/chemical_reaction/mush_crush
name = "Mush Crush"
- id = /datum/reagent/consumable/ethanol/mush_crush
- results = list(/datum/reagent/consumable/ethanol/mush_crush = 10)
+ id = /datum/reagent/consumable/ethanol/species_drink/mush_crush
+ results = list(/datum/reagent/consumable/ethanol/species_drink/mush_crush = 10)
required_reagents = list(/datum/reagent/iron = 5, /datum/reagent/ash = 5, /datum/reagent/toxin/coffeepowder = 10)
/datum/chemical_reaction/darkbrew
name = "Darkbrew"
- id = /datum/reagent/consumable/ethanol/darkbrew
- results = list(/datum/reagent/consumable/ethanol/darkbrew = 20)//Limited races use this
+ id = /datum/reagent/consumable/ethanol/species_drink/darkbrew
+ results = list(/datum/reagent/consumable/ethanol/species_drink/darkbrew = 20)//Limited races use this
required_reagents = list(/datum/reagent/liquid_dark_matter = 5, /datum/reagent/toxin/bungotoxin = 5, /datum/reagent/toxin/coffeepowder = 10)
/datum/chemical_reaction/hollow_bone
name = "Hollow Bone"
- id = /datum/reagent/consumable/ethanol/hollow_bone
- results = list(/datum/reagent/consumable/ethanol/hollow_bone = 10)
+ id = /datum/reagent/consumable/ethanol/species_drink/hollow_bone
+ results = list(/datum/reagent/consumable/ethanol/species_drink/hollow_bone = 10)
required_reagents = list(/datum/reagent/toxin/bonehurtingjuice = 5, /datum/reagent/consumable/milk = 10, /datum/reagent/consumable/coconutmilk = 10)
/datum/chemical_reaction/frisky_kitty
name = "Frisky Kitty"
- id = /datum/reagent/consumable/ethanol/frisky_kitty
- results = list(/datum/reagent/consumable/ethanol/frisky_kitty = 2)
+ id = /datum/reagent/consumable/ethanol/species_drink/frisky_kitty
+ results = list(/datum/reagent/consumable/ethanol/species_drink/frisky_kitty = 2)
required_reagents = list(/datum/reagent/consumable/catnip_tea = 1, /datum/reagent/consumable/milk = 1)
required_temp = 296 //Just above room temp (22.85'C)
/datum/chemical_reaction/jell_wyrm
name = "Jell Wyrm"
- id = /datum/reagent/consumable/ethanol/jell_wyrm
- results = list(/datum/reagent/consumable/ethanol/jell_wyrm = 2)
+ id = /datum/reagent/consumable/ethanol/species_drink/jell_wyrm
+ results = list(/datum/reagent/consumable/ethanol/species_drink/jell_wyrm = 2)
required_reagents = list(/datum/reagent/toxin/slimejelly = 1, /datum/reagent/toxin/carpotoxin = 1, /datum/reagent/carbondioxide = 5)
required_temp = 333 // (59.85'C)
/datum/chemical_reaction/laval_spit
name = "Laval Spit"
- id = /datum/reagent/consumable/ethanol/laval_spit
- results = list(/datum/reagent/consumable/ethanol/laval_spit = 20) //Limited use
+ id = /datum/reagent/consumable/ethanol/species_drink/laval_spit
+ results = list(/datum/reagent/consumable/ethanol/species_drink/laval_spit = 20) //Limited use
required_reagents = list(/datum/reagent/iron = 5, /datum/reagent/consumable/ethanol/mauna_loa = 10, /datum/reagent/sulfur = 5)
required_temp = 900 // (626.85'C)
diff --git a/code/modules/food_and_drinks/recipes/food_mixtures.dm b/code/modules/food_and_drinks/recipes/food_mixtures.dm
index ec96a4537c..541c972490 100644
--- a/code/modules/food_and_drinks/recipes/food_mixtures.dm
+++ b/code/modules/food_and_drinks/recipes/food_mixtures.dm
@@ -179,3 +179,14 @@
id = /datum/reagent/consumable/bbqsauce
results = list(/datum/reagent/consumable/bbqsauce = 5)
required_reagents = list(/datum/reagent/ash = 1, /datum/reagent/consumable/tomatojuice = 1, /datum/reagent/medicine/salglu_solution = 3, /datum/reagent/consumable/blackpepper = 1)
+
+/datum/chemical_reaction/margarine
+ name = "Margarine"
+ id = "margarine"
+ required_reagents = list(/datum/reagent/consumable/cornoil = 5, /datum/reagent/consumable/soymilk = 5, /datum/reagent/consumable/sodiumchloride = 1)
+ mix_message = "The ingredients solidify into a stick of margarine."
+
+/datum/chemical_reaction/margarine/on_reaction(datum/reagents/holder, multiplier)
+ var/location = get_turf(holder.my_atom)
+ for(var/i = 1, i <= multiplier, i++)
+ new /obj/item/reagent_containers/food/snacks/butter/margarine(location)
\ No newline at end of file
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 e8640886c2..53c3682e2c 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_egg.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_egg.dm
@@ -22,6 +22,15 @@
result = /obj/item/reagent_containers/food/snacks/baconegg
subcategory = CAT_EGG
+/datum/crafting_recipe/food/wrap
+ name = "Egg Wrap"
+ reqs = list(/datum/reagent/consumable/soysauce = 10,
+ /obj/item/reagent_containers/food/snacks/friedegg = 1,
+ /obj/item/reagent_containers/food/snacks/grown/cabbage = 1,
+ )
+ result = /obj/item/reagent_containers/food/snacks/eggwrap
+ subcategory = CAT_EGG
+
/datum/crafting_recipe/food/omelette
name = "Omelette"
reqs = list(
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 60b363c168..17ea36a160 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm
@@ -84,6 +84,17 @@
result = /obj/item/reagent_containers/food/snacks/nugget
subcategory = CAT_MEAT
+/datum/crafting_recipe/food/sweet_and_sour
+ name = "Sweet and sour \"chicken\""
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/nugget = 2,
+ /obj/item/reagent_containers/food/snacks/pineappleslice = 1,
+ /datum/reagent/consumable/soysauce = 2,
+ /datum/reagent/consumable/sodiumchloride = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/sweet_and_sour
+ subcategory = CAT_MEAT
+
/datum/crafting_recipe/food/corndog
name = "Corndog meal"
reqs = list(
@@ -135,6 +146,16 @@
result = /obj/item/reagent_containers/food/snacks/sausage
subcategory = CAT_MEAT
+/datum/crafting_recipe/food/meatloaf
+ name = "Meatloaf"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/meat/cutlet = 4,
+ /datum/reagent/consumable/eggyolk = 10,
+ /datum/reagent/consumable/ketchup = 5
+ )
+ result = /obj/item/reagent_containers/food/snacks/meatloaf
+ subcategory = CAT_MEAT
+
/datum/crafting_recipe/food/pigblanket
name = "Pig in a Blanket"
reqs = list(
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 359fadfb70..affb76cca7 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm
@@ -14,15 +14,6 @@
result = /obj/item/reagent_containers/food/snacks/chawanmushi
subcategory = CAT_MISCFOOD
-/datum/crafting_recipe/food/wrap
- name = "Egg Wrap"
- reqs = list(/datum/reagent/consumable/soysauce = 10,
- /obj/item/reagent_containers/food/snacks/friedegg = 1,
- /obj/item/reagent_containers/food/snacks/grown/cabbage = 1,
- )
- result = /obj/item/reagent_containers/food/snacks/eggwrap
- subcategory = CAT_MISCFOOD
-
/datum/crafting_recipe/food/khachapuri
name = "Khachapuri"
reqs = list(
@@ -93,6 +84,16 @@
result = /obj/item/reagent_containers/food/snacks/cheesyfries
subcategory = CAT_MISCFOOD
+/datum/crafting_recipe/food/chilicheesefries
+ name = "Chilli cheese fries"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/fries = 1,
+ /obj/item/reagent_containers/food/snacks/cheesewedge = 1,
+ /obj/item/reagent_containers/food/snacks/grown/chili = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/chilicheesefries
+ subcategory = CAT_MISCFOOD
+
/datum/crafting_recipe/food/eggplantparm
name ="Eggplant parmigiana"
reqs = list(
@@ -112,6 +113,25 @@
result = /obj/item/reagent_containers/food/snacks/loadedbakedpotato
subcategory = CAT_MISCFOOD
+/datum/crafting_recipe/food/mashedpotato
+ name = "Mashed potato"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/grown/potato = 1,
+ /datum/reagent/consumable/cream = 5,
+ /datum/reagent/consumable/sodiumchloride = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/mashedpotato
+ subcategory = CAT_MISCFOOD
+
+/datum/crafting_recipe/food/butteredpotato
+ name = "Buttered mash"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/mashedpotato = 1,
+ /obj/item/reagent_containers/food/snacks/butter = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/butteredpotato
+ subcategory = CAT_MISCFOOD
+
/datum/crafting_recipe/food/melonfruitbowl
name ="Melon fruit bowl"
reqs = list(
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 d2ea1da50a..81c5b4dd92 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm
@@ -25,6 +25,17 @@
result = /obj/item/reagent_containers/food/snacks/grilledcheese
subcategory = CAT_SANDWICH
+/datum/crafting_recipe/food/baconlettucetomato
+ name = "BLT sandwich"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/meat/bacon = 2,
+ /obj/item/reagent_containers/food/snacks/grown/cabbage = 1,
+ /obj/item/reagent_containers/food/snacks/grown/tomato = 1,
+ /datum/reagent/consumable/mayonnaise = 5
+ )
+ result = /obj/item/reagent_containers/food/snacks/baconlettucetomato
+ subcategory = CAT_SANDWICH
+
/datum/crafting_recipe/food/slimesandwich
name = "Jelly sandwich"
reqs = list(
@@ -99,11 +110,20 @@
/obj/item/reagent_containers/food/snacks/breadslice/plain = 2,
/obj/item/reagent_containers/food/snacks/tuna = 1,
/obj/item/reagent_containers/food/snacks/grown/onion = 1,
- /obj/item/reagent_containers/food/condiment/mayonnaise = 5
+ /datum/reagent/consumable/mayonnaise = 5
)
result = /obj/item/reagent_containers/food/snacks/tuna_sandwich
subcategory = CAT_SANDWICH
+/datum/crafting_recipe/food/meatballsub
+ name = "Meatball sub"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/meatball = 3,
+ /obj/item/reagent_containers/food/snacks/bun = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/meatballsub
+ subcategory = CAT_SANDWICH
+
/datum/crafting_recipe/food/hotdog
name = "Hot dog"
reqs = list(
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 8f4b4c2726..6372137edc 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm
@@ -13,6 +13,17 @@
result = /obj/item/reagent_containers/food/snacks/soup/amanitajelly
subcategory = CAT_SOUP
+/datum/crafting_recipe/food/bearchili
+ name = "Bear chili"
+ reqs = list(
+ /datum/reagent/water = 10,
+ /obj/item/reagent_containers/glass/bowl = 1,
+ /obj/item/reagent_containers/food/snacks/meat/steak/bear = 1,
+ /obj/item/reagent_containers/food/snacks/grown/chili = 1,
+ )
+ result = /obj/item/reagent_containers/food/snacks/soup/bearchili
+ subcategory = CAT_SOUP
+
/datum/crafting_recipe/food/beetsoup
name = "Beet soup"
reqs = list(
@@ -204,6 +215,18 @@
result = /obj/item/reagent_containers/food/snacks/soup/spacylibertyduff
subcategory = CAT_SOUP
+/datum/crafting_recipe/food/spiralsoup
+ name = "Spiral soup"
+ reqs = list(
+ /obj/item/reagent_containers/glass/bowl = 1,
+ /obj/item/reagent_containers/food/snacks/grown/mushroom/jupitercup = 2,
+ /datum/reagent/cryptobiolin = 15,
+ /datum/reagent/toxin/rotatium = 15,
+ /datum/reagent/consumable/milk = 10
+ )
+ result = /obj/item/reagent_containers/food/snacks/soup/spacylibertyduff
+ subcategory = CAT_SOUP
+
/datum/crafting_recipe/food/sweetpotatosoup
name = "Sweet potato soup"
reqs = list(
diff --git a/code/modules/goonchat/browserOutput.dm b/code/modules/goonchat/browserOutput.dm
index 6d9e141309..ce27dccb74 100644
--- a/code/modules/goonchat/browserOutput.dm
+++ b/code/modules/goonchat/browserOutput.dm
@@ -2,18 +2,30 @@
For the main html chat area
*********************************/
-//Precaching a bunch of shit
+/// Should match the value set in the browser js
+#define MAX_COOKIE_LENGTH 5
+
+//Precaching a bunch of shit. Someone ship this out of here
GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of icons for the browser output
-//On client, created on login
+//lazy renaming to chat_output, instead renamed to old chatOutput
+/**
+ * The chatOutput datum exists to handle the goonchat browser.
+ * On client, created on Client/New()
+ */
/datum/chatOutput
- var/client/owner //client ref
+ /// The client that owns us.
+ var/client/owner
+ /// How many times client data has been checked
var/total_checks = 0
- var/last_check = 0
- var/loaded = FALSE // Has the client loaded the browser output area?
- var/list/messageQueue //If they haven't loaded chat, this is where messages will go until they do
- var/cookieSent = FALSE // Has the client sent a cookie for analysis
- var/broken = FALSE
+ /// When to next clear the client data checks counter
+ var/next_time_to_clear = 0
+ /// Has the client loaded the browser output area?
+ var/loaded = FALSE
+ /// If they haven't loaded chat, this is where messages will go until they do
+ var/list/messageQueue
+ var/cookieSent = FALSE // Has the client sent a cookie for analysis
+ var/broken = FALSE
var/list/connectionHistory //Contains the connection history passed from chat cookie
var/adminMusicVolume = 25 //This is for the Play Global Sound verb
@@ -22,13 +34,18 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico
messageQueue = list()
connectionHistory = list()
+/**
+ * start: Tries to load the chat browser
+ * Aborts if a problem is encountered.
+ * Async because this is called from Client/New.
+ */
/datum/chatOutput/proc/start()
+ set waitfor = FALSE
//Check for existing chat
if(!owner)
return FALSE
if(!winexists(owner, "browseroutput")) // Oh goddamnit.
- set waitfor = FALSE
broken = TRUE
message_admins("Couldn't start chat for [key_name_admin(owner)]!")
. = FALSE
@@ -43,6 +60,7 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico
return TRUE
+/// Loads goonchat and sends assets.
/datum/chatOutput/proc/load()
set waitfor = FALSE
if(!owner)
@@ -53,6 +71,7 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico
owner << browse(file('code/modules/goonchat/browserassets/html/browserOutput.html'), "window=browseroutput")
+/// Interprets input from the client. Will send data back if required.
/datum/chatOutput/Topic(href, list/href_list)
if(usr.client != owner)
return TRUE
@@ -83,20 +102,22 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico
if("setMusicVolume")
data = setMusicVolume(arglist(params))
-
if("colorPresetPost") //User just swapped color presets in their goonchat preferences. Do we do anything else?
switch(href_list["preset"])
if("light")
owner.force_white_theme()
if("dark" || "normal")
owner.force_dark_theme()
-
+ // if("swaptodarkmode")
+ // swaptodarkmode()
+ // if("swaptolightmode")
+ // swaptolightmode()
if(data)
ehjax_send(data = data)
-//Called on chat output done-loading by JS.
+/// Called on chat output done-loading by JS.
/datum/chatOutput/proc/doneLoading()
if(loaded)
return
@@ -113,34 +134,75 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico
messageQueue = null
sendClientData()
+ syncRegex()
+
//do not convert to to_chat()
SEND_TEXT(owner, "Failed to load fancy chat, reverting to old chat. Certain features won't work.")
+/// Hides the standard output and makes the browser visible.
/datum/chatOutput/proc/showChat()
winset(owner, "output", "is-visible=false")
winset(owner, "browseroutput", "is-disabled=false;is-visible=true")
+/// Calls syncRegex on all currently owned chatOutput datums
+/proc/syncChatRegexes()
+ for (var/user in GLOB.clients)
+ var/client/C = user
+ var/datum/chatOutput/Cchat = C.chatOutput
+ if (Cchat && !Cchat.broken && Cchat.loaded)
+ Cchat.syncRegex()
+
+/// Used to dynamically add regexes to the browser output. Currently only used by the IC filter.
+/datum/chatOutput/proc/syncRegex()
+ var/list/regexes = list()
+ /*
+ if (config.ic_filter_regex)
+ regexes["show_filtered_ic_chat"] = list(
+ config.ic_filter_regex.name,
+ "ig",
+ "$1"
+ )
+ */
+ if (regexes.len)
+ ehjax_send(data = list("syncRegex" = regexes))
+
+/// Sends json encoded data to the browser.
/datum/chatOutput/proc/ehjax_send(client/C = owner, window = "browseroutput", data)
if(islist(data))
data = json_encode(data)
C << output("[data]", "[window]:ehjaxCallback")
-/datum/chatOutput/proc/sendMusic(music, pitch)
+/**
+ * Sends music data to the browser. If enabled by the browser, it will start playing.
+ * Arguments:
+ * music must be a https adress.
+ * extra_data is a list. The keys "pitch", "start" and "end" are used.
+ ** "pitch" determines the playback rate
+ ** "start" determines the start time of the sound
+ ** "end" determines when the musics stops playing
+ */
+/datum/chatOutput/proc/sendMusic(music, pitch, list/extra_data) //someone remove pitch
if(!findtext(music, GLOB.is_http_protocol))
return
var/list/music_data = list("adminMusic" = url_encode(url_encode(music)))
- if(pitch)
- music_data["musicRate"] = pitch
+
+ if(extra_data?.len)
+ music_data["musicRate"] = extra_data["pitch"] || pitch
+ music_data["musicSeek"] = extra_data["start"]
+ music_data["musicHalt"] = extra_data["end"]
+
ehjax_send(data = music_data)
+/// Stops music playing throw the browser.
/datum/chatOutput/proc/stopMusic()
ehjax_send(data = "stopMusic")
+/// Setter for adminMusicVolume. Sanitizes the value to between 0 and 100.
/datum/chatOutput/proc/setMusicVolume(volume = "")
if(volume)
adminMusicVolume = clamp(text2num(volume), 0, 100)
-//Sends client connection details to the chat to handle and save
+/// Sends client connection details to the chat to handle and save
/datum/chatOutput/proc/sendClientData()
//Get dem deets
var/list/deets = list("clientData" = list())
@@ -150,11 +212,11 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico
var/data = json_encode(deets)
ehjax_send(data = data)
-//Called by client, sent data to investigate (cookie history so far)
+/// Called by client, sent data to investigate (cookie history so far)
/datum/chatOutput/proc/analyzeClientData(cookie = "")
//Spam check
- if(world.time > last_check + (3 SECONDS))
- last_check = world.time
+ if(world.time > next_time_to_clear)
+ next_time_to_clear = world.time + (3 SECONDS)
total_checks = 0
total_checks += 1
@@ -172,12 +234,13 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico
if (connData && islist(connData) && connData.len > 0 && connData["connData"])
connectionHistory = connData["connData"] //lol fuck
var/list/found = new()
- if(connectionHistory.len > 5)
+
+ if(connectionHistory.len > MAX_COOKIE_LENGTH)
message_admins("[key_name(src.owner)] was kicked for an invalid ban cookie)")
qdel(owner)
return
- for(var/i in min(connectionHistory.len, 5) to 1 step -1)
+ for(var/i in connectionHistory.len to 1 step -1)
if(QDELETED(owner))
//he got cleaned up before we were done
return
@@ -191,45 +254,33 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico
//Uh oh this fucker has a history of playing on a banned account!!
if (found.len > 0)
- //TODO: add a new evasion ban for the CURRENT client details, using the matched row details
message_admins("[key_name(src.owner)] has a cookie from a banned account! (Matched: [found["ckey"]], [found["ip"]], [found["compid"]])")
log_admin_private("[key_name(owner)] has a cookie from a banned account! (Matched: [found["ckey"]], [found["ip"]], [found["compid"]])")
cookieSent = TRUE
-//Called by js client every 60 seconds
+/// Called by js client every 60 seconds
/datum/chatOutput/proc/ping()
return "pong"
-//Called by js client on js error
+/// Called by js client on js error
/datum/chatOutput/proc/debug(error)
log_world("\[[time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")]\] Client: [(src.owner.key ? src.owner.key : src.owner)] triggered JS error: [error]")
-//Global chat procs
-/proc/to_chat_immediate(target, message, handle_whitespace=TRUE)
+/// Global chat proc. to_chat_immediate will circumvent SSchat and send data as soon as possible.
+/proc/to_chat_immediate(target, message, handle_whitespace = TRUE, trailing_newline = TRUE, confidential = FALSE)
if(!target || !message)
return
- //Ok so I did my best but I accept that some calls to this will be for shit like sound and images
- //It stands that we PROBABLY don't want to output those to the browser output so just handle them here
- if (istype(target, /savefile))
- CRASH("Invalid message! [message]")
-
- if(!istext(message))
- if (istype(message, /image) || istype(message, /sound))
- CRASH("Invalid message! [message]")
- return
-
if(target == world)
target = GLOB.clients
var/original_message = message
- //Some macros remain in the string even after parsing and fuck up the eventual output
- message = replacetext(message, "\improper", "")
- message = replacetext(message, "\proper", "")
if(handle_whitespace)
message = replacetext(message, "\n", " ")
- message = replacetext(message, "\t", "[FOURSPACES][FOURSPACES]")
+ message = replacetext(message, "\t", "[FOURSPACES][FOURSPACES]") //EIGHT SPACES IN TOTAL!!
+ if(trailing_newline)
+ message += " "
if(islist(target))
// Do the double-encoding outside the loop to save nanoseconds
@@ -272,14 +323,19 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico
// url_encode it TWICE, this way any UTF-8 characters are able to be decoded by the Javascript.
C << output(url_encode(url_encode(message)), "browseroutput:output")
-/proc/to_chat(target, message, handle_whitespace = TRUE)
+/// Sends a text message to the target.
+/proc/to_chat(target, message, handle_whitespace = TRUE, trailing_newline = TRUE, confidential = FALSE)
if(Master.current_runlevel == RUNLEVEL_INIT || !SSchat?.initialized)
- to_chat_immediate(target, message, handle_whitespace)
+ to_chat_immediate(target, message, handle_whitespace, trailing_newline, confidential)
return
- SSchat.queue(target, message, handle_whitespace)
+ SSchat.queue(target, message, handle_whitespace, trailing_newline, confidential)
-/datum/chatOutput/proc/swaptolightmode() //Dark mode light mode stuff. Yell at KMC if this breaks! (See darkmode.dm for documentation)
+/// Dark mode light mode stuff. Yell at KMC if this breaks! (See darkmode.dm for documentation)
+/datum/chatOutput/proc/swaptolightmode()
owner.force_white_theme()
+/// Light mode stuff. (See darkmode.dm for documentation)
/datum/chatOutput/proc/swaptodarkmode()
owner.force_dark_theme()
+
+#undef MAX_COOKIE_LENGTH
diff --git a/code/modules/goonchat/browserassets/css/browserOutput.css b/code/modules/goonchat/browserassets/css/browserOutput.css
index 3455a97ba2..93c733391e 100644
--- a/code/modules/goonchat/browserassets/css/browserOutput.css
+++ b/code/modules/goonchat/browserassets/css/browserOutput.css
@@ -313,6 +313,8 @@ h1.alert, h2.alert {color: #000000;}
.rose {color: #ff5050;}
.info {color: #0000CC;}
.notice {color: #000099;}
+.tinynotice {color: #6685f5; font-style: italic; font-size: 85%;}
+.smallnotice {color: #6685f5; font-style: italic; font-size: 90%;}
.boldnotice {color: #000099; font-weight: bold;}
.adminnotice {color: #0000ff;}
.adminhelp {color: #ff0000; font-weight: bold;}
diff --git a/code/modules/goonchat/browserassets/html/browserOutput.html b/code/modules/goonchat/browserassets/html/browserOutput.html
index 0acb127517..ce51cd8de8 100644
--- a/code/modules/goonchat/browserassets/html/browserOutput.html
+++ b/code/modules/goonchat/browserassets/html/browserOutput.html
@@ -38,10 +38,10 @@
- Decrease font size-
- Increase font size+
- Decrease line height-
- Increase line height+
+ Decrease font size
+ Increase font size
+ Decrease line height
+ Increase line heightToggle ping displayHighlight stringSave chat log
diff --git a/code/modules/goonchat/browserassets/js/browserOutput.js b/code/modules/goonchat/browserassets/js/browserOutput.js
index 0d53b44ba8..ac30076de4 100644
--- a/code/modules/goonchat/browserassets/js/browserOutput.js
+++ b/code/modules/goonchat/browserassets/js/browserOutput.js
@@ -29,12 +29,13 @@ var opts = {
'scrollSnapTolerance': 10, //If within x pixels of bottom
'clickTolerance': 10, //Keep focus if outside x pixels of mousedown position on mouseup
'imageRetryDelay': 50, //how long between attempts to reload images (in ms)
- 'imageRetryLimit': 50, //how many attempts should we make?
+ 'imageRetryLimit': 50, //how many attempts should we make?
'popups': 0, //Amount of popups opened ever
'wasd': false, //Is the user in wasd mode?
'priorChatHeight': 0, //Thing for height-resizing detection
'restarting': false, //Is the round restarting?
'colorPreset': 0, // index in the color presets list.
+ //'darkmode':false, //Are we using darkmode? If not WHY ARE YOU LIVING IN 2009??? <- /tg/ take on darktheme
//Options menu
'selectedSubLoop': null, //Contains the interval loop for closing the selected sub menu
@@ -65,14 +66,17 @@ var opts = {
'volumeUpdateDelay': 5000, //Time from when the volume updates to data being sent to the server
'volumeUpdating': false, //True if volume update function set to fire
'updatedVolume': 0, //The volume level that is sent to the server
-
+ 'musicStartAt': 0, //The position the music starts playing
+ 'musicEndAt': 0, //The position the music... stops playing... if null, doesn't apply (so the music runs through)
+
'defaultMusicVolume': 25,
'messageCombining': true,
};
+var replaceRegexes = {};
-// Array of names for chat display color presets.
+// Array of names for chat display color presets. CIT SPECIFIC.
// If not set to normal, a CSS file `browserOutput_${name}.css` will be added to the head.
var colorPresets = [
'normal',
@@ -84,12 +88,6 @@ function clamp(val, min, max) {
return Math.max(min, Math.min(val, max))
}
-function outerHTML(el) {
- var wrap = document.createElement('div');
- wrap.appendChild(el.cloneNode(true));
- return wrap.innerHTML;
-}
-
//Polyfill for fucking date now because of course IE8 and below don't support it
if (!Date.now) {
Date.now = function now() {
@@ -103,6 +101,7 @@ if (typeof String.prototype.trim !== 'function') {
};
}
+// CIT SPECIFIC.
function updateColorPreset() {
var el = $("#colorPresetLink")[0];
el.href = "browserOutput_"+colorPresets[opts.colorPreset]+".css";
@@ -172,7 +171,7 @@ function byondDecode(message) {
// The replace for + is because FOR SOME REASON, BYOND replaces spaces with a + instead of %20, and a plus with %2b.
// Marvelous.
message = message.replace(/\+/g, "%20");
- try {
+ try {
// This is a workaround for the above not always working when BYOND's shitty url encoding breaks. (byond bug id:2399401)
if (decodeURIComponent) {
message = decodeURIComponent(message);
@@ -185,57 +184,71 @@ function byondDecode(message) {
return message;
}
-//Actually turns the highlight term match into appropriate html
-function addHighlightMarkup(match) {
- var extra = '';
- if (opts.highlightColor) {
- extra += ' style="background-color: '+opts.highlightColor+'"';
+function replaceRegex() {
+ var selectedRegex = replaceRegexes[$(this).attr('replaceRegex')];
+ if (selectedRegex) {
+ var replacedText = $(this).html().replace(selectedRegex[0], selectedRegex[1]);
+ $(this).html(replacedText);
}
- return ''+match+'';
+ $(this).removeAttr('replaceRegex');
}
-//Highlights words based on user settings
+// Get a highlight markup span
+function createHighlightMarkup() {
+ var extra = '';
+ if (opts.highlightColor) {
+ extra += ' style="background-color: ' + opts.highlightColor + '"';
+ }
+ return '';
+}
+
+// Get all child text nodes that match a regex pattern
+function getTextNodes(elem, pattern) {
+ var result = $([]);
+ $(elem).contents().each(function(idx, child) {
+ if (child.nodeType === 3 && /\S/.test(child.nodeValue) && pattern.test(child.nodeValue)) {
+ result = result.add(child);
+ }
+ else {
+ result = result.add(getTextNodes(child, pattern));
+ }
+ });
+ return result;
+}
+
+// Highlight all text terms matching the registered regex patterns
function highlightTerms(el) {
- if (el.children.length > 0) {
- for(var h = 0; h < el.children.length; h++){
- highlightTerms(el.children[h]);
- }
- }
+ var pattern = new RegExp("(" + opts.highlightTerms.join('|') + ")", 'gi');
+ var nodes = getTextNodes(el, pattern);
- var hasTextNode = false;
- for (var node = 0; node < el.childNodes.length; node++)
- {
- if (el.childNodes[node].nodeType === 3)
- {
- hasTextNode = true;
- break;
- }
- }
-
- if (hasTextNode) { //If element actually has text
- var newText = '';
- for (var c = 0; c < el.childNodes.length; c++) { //Each child element
- if (el.childNodes[c].nodeType === 3) { //Is it text only?
- var words = el.childNodes[c].data.split(' ');
- for (var w = 0; w < words.length; w++) { //Each word in the text
- var newWord = null;
- for (var i = 0; i < opts.highlightTerms.length; i++) { //Each highlight term
- if (opts.highlightTerms[i] && words[w].toLowerCase().indexOf(opts.highlightTerms[i].toLowerCase()) > -1) { //If a match is found
- newWord = words[w].replace("<", "<").replace(new RegExp(opts.highlightTerms[i], 'gi'), addHighlightMarkup);
- break;
- }
- if (window.console)
- console.log(newWord)
- }
- newText += newWord || words[w].replace("<", "<");
- newText += w >= words.length - 1 ? '' : ' ';
- }
- } else { //Every other type of element
- newText += outerHTML(el.childNodes[c]);
+ nodes.each(function (idx, node) {
+ var content = $(node).text();
+ var parent = $(node).parent();
+ var pre = $(node.previousSibling);
+ $(node).remove();
+ content.split(pattern).forEach(function (chunk) {
+ // Get our highlighted span/text node
+ var toInsert = null;
+ if (pattern.test(chunk)) {
+ var tmpElem = $(createHighlightMarkup());
+ tmpElem.text(chunk);
+ toInsert = tmpElem;
}
- }
- el.innerHTML = newText;
- }
+ else {
+ toInsert = document.createTextNode(chunk);
+ }
+
+ // Insert back into our element
+ if (pre.length == 0) {
+ var result = parent.prepend(toInsert);
+ pre = $(result[0].firstChild);
+ }
+ else {
+ pre.after(toInsert);
+ pre = $(pre[0].nextSibling);
+ }
+ });
+ });
}
function iconError(E) {
@@ -268,41 +281,96 @@ function output(message, flag) {
message = byondDecode(message).trim();
- //Stuff we do along with appending a message
- var atBottom = false;
- var bodyHeight = $('body').height();
- var messagesHeight = $messages.outerHeight();
- var scrollPos = $('body,html').scrollTop();
-
- //Should we snap the output to the bottom?
- if (bodyHeight + scrollPos >= messagesHeight - opts.scrollSnapTolerance) {
- atBottom = true;
- if ($('#newMessages').length) {
- $('#newMessages').remove();
- }
- //If not, put the new messages box in
- } else {
- if ($('#newMessages').length) {
- var messages = $('#newMessages .number').text();
- messages = parseInt(messages);
- messages++;
- $('#newMessages .number').text(messages);
- if (messages == 2) {
- $('#newMessages .messageWord').append('s');
+ //The behemoth of filter-code (for Admin message filters)
+ //Note: This is proooobably hella inefficient
+ var filteredOut = false;
+ if (opts.hasOwnProperty('showMessagesFilters') && !opts.showMessagesFilters['All'].show) {
+ //Get this filter type (defined by class on message)
+ var messageHtml = $.parseHTML(message),
+ messageClasses;
+ if (opts.hasOwnProperty('filterHideAll') && opts.filterHideAll) {
+ var internal = false;
+ messageClasses = (!!$(messageHtml).attr('class') ? $(messageHtml).attr('class').split(/\s+/) : false);
+ if (messageClasses) {
+ for (var i = 0; i < messageClasses.length; i++) { //Every class
+ if (messageClasses[i] == 'internal') {
+ internal = true;
+ break;
+ }
+ }
+ }
+ if (!internal) {
+ filteredOut = 'All';
}
} else {
- $messages.after('1 new message');
+ //If the element or it's child have any classes
+ if (!!$(messageHtml).attr('class') || !!$(messageHtml).children().attr('class')) {
+ messageClasses = $(messageHtml).attr('class').split(/\s+/);
+ if (!!$(messageHtml).children().attr('class')) {
+ messageClasses = messageClasses.concat($(messageHtml).children().attr('class').split(/\s+/));
+ }
+ var tempCount = 0;
+ for (var i = 0; i < messageClasses.length; i++) { //Every class
+ var thisClass = messageClasses[i];
+ $.each(opts.showMessagesFilters, function(key, val) { //Every filter
+ if (key !== 'All' && val.show === false && typeof val.match != 'undefined') {
+ for (var i = 0; i < val.match.length; i++) {
+ var matchClass = val.match[i];
+ if (matchClass == thisClass) {
+ filteredOut = key;
+ break;
+ }
+ }
+ }
+ if (filteredOut) return false;
+ });
+ if (filteredOut) break;
+ tempCount++;
+ }
+ } else {
+ if (!opts.showMessagesFilters['Misc'].show) {
+ filteredOut = 'Misc';
+ }
+ }
}
}
+ //Stuff we do along with appending a message
+ var atBottom = false;
+ if (!filteredOut) {
+ var bodyHeight = $('body').height();
+ var messagesHeight = $messages.outerHeight();
+ var scrollPos = $('body,html').scrollTop();
+
+ //Should we snap the output to the bottom?
+ if (bodyHeight + scrollPos >= messagesHeight - opts.scrollSnapTolerance) {
+ atBottom = true;
+ if ($('#newMessages').length) {
+ $('#newMessages').remove();
+ }
+ //If not, put the new messages box in
+ } else {
+ if ($('#newMessages').length) {
+ var messages = $('#newMessages .number').text();
+ messages = parseInt(messages);
+ messages++;
+ $('#newMessages .number').text(messages);
+ if (messages == 2) {
+ $('#newMessages .messageWord').append('s');
+ }
+ } else {
+ $messages.after('1 new message');
+ }
+ }
+ }
opts.messageCount++;
//Pop the top message off if history limit reached
- //if (opts.messageCount >= opts.messageLimit) {
- //$messages.children('div.entry:first-child').remove();
- //opts.messageCount--; //I guess the count should only ever equal the limit
- //}
+ if (opts.messageCount >= opts.messageLimit) {
+ $messages.children('div.entry:first-child').remove();
+ opts.messageCount--; //I guess the count should only ever equal the limit
+ }
// Create the element - if combining is off, we use it, and if it's on, we
// might discard it bug need to check its text content. Some messages vary
@@ -323,6 +391,7 @@ function output(message, flag) {
badge = $('', {'class': 'r', 'text': 2});
}
lastmessages.html(message);
+ lastmessages.find('[replaceRegex]').each(replaceRegex);
lastmessages.append(badge);
badge.animate({
"font-size": "0.9em"
@@ -340,6 +409,13 @@ function output(message, flag) {
//Actually append the message
entry.className = 'entry';
+ if (filteredOut) {
+ entry.className += ' hidden';
+ entry.setAttribute('data-filter', filteredOut);
+ }
+
+ $(entry).find('[replaceRegex]').each(replaceRegex);
+
$last_message = trimmed_message;
$messages[0].appendChild(entry);
$(entry).find("img.icon").error(iconError);
@@ -360,11 +436,11 @@ function output(message, flag) {
//Actually do the snap
//Stuff we can do after the message shows can go here, in the interests of responsiveness
if (opts.highlightTerms && opts.highlightTerms.length > 0) {
- highlightTerms(entry);
+ highlightTerms($(entry));
}
}
- if (atBottom) {
+ if (!filteredOut && atBottom) {
$('body,html').scrollTop($messages.outerHeight());
}
}
@@ -408,6 +484,20 @@ function toHex(n) {
return "0123456789ABCDEF".charAt((n-n%16)/16) + "0123456789ABCDEF".charAt(n%16);
}
+/*
+function swap() { //Swap to darkmode
+ if (opts.darkmode){
+ document.getElementById("sheetofstyles").href = "browserOutput_white.css";
+ opts.darkmode = false;
+ runByond('?_src_=chat&proc=swaptolightmode');
+ } else {
+ document.getElementById("sheetofstyles").href = "browserOutput.css";
+ opts.darkmode = true;
+ runByond('?_src_=chat&proc=swaptodarkmode');
+ }
+ setCookie('darkmode', (opts.darkmode ? 'true' : 'false'), 365);
+}
+*/
function handleClientData(ckey, ip, compid) {
//byond sends player info to here
var currentData = {'ckey': ckey, 'ip': ip, 'compid': compid};
@@ -488,6 +578,7 @@ function ehjaxCallback(data) {
} else if (data.adminMusic) {
if (typeof data.adminMusic === 'string') {
var adminMusic = byondDecode(data.adminMusic);
+ var bindLoadedData = false;
adminMusic = adminMusic.match(/https?:\/\/\S+/) || '';
if (data.musicRate) {
var newRate = Number(data.musicRate);
@@ -497,9 +588,32 @@ function ehjaxCallback(data) {
} else {
$('#adminMusic').prop('defaultPlaybackRate', 1.0);
}
+ if (data.musicSeek) {
+ opts.musicStartAt = Number(data.musicSeek) || 0;
+ bindLoadedData = true;
+ } else {
+ opts.musicStartAt = 0;
+ }
+ if (data.musicHalt) {
+ opts.musicEndAt = Number(data.musicHalt) || null;
+ bindLoadedData = true;
+ }
+ if (bindLoadedData) {
+ $('#adminMusic').one('loadeddata', adminMusicLoadedData);
+ }
$('#adminMusic').prop('src', adminMusic);
$('#adminMusic').trigger("play");
}
+ } else if (data.syncRegex) {
+ for (var i in data.syncRegex) {
+
+ var regexData = data.syncRegex[i];
+ var regexName = regexData[0];
+ var regexFlags = regexData[1];
+ var regexReplaced = regexData[2];
+
+ replaceRegexes[i] = [new RegExp(regexName, regexFlags), regexReplaced];
+ }
}
}
}
@@ -530,6 +644,27 @@ function sendVolumeUpdate() {
}
}
+function adminMusicEndCheck(event) {
+ if (opts.musicEndAt) {
+ if ($('#adminMusic').prop('currentTime') >= opts.musicEndAt) {
+ $('#adminMusic').off(event);
+ $('#adminMusic').trigger('pause');
+ $('#adminMusic').prop('src', '');
+ }
+ } else {
+ $('#adminMusic').off(event);
+ }
+}
+
+function adminMusicLoadedData(event) {
+ if (opts.musicStartAt && ($('#adminMusic').prop('duration') === Infinity || (opts.musicStartAt <= $('#adminMusic').prop('duration'))) ) {
+ $('#adminMusic').prop('currentTime', opts.musicStartAt);
+ }
+ if (opts.musicEndAt) {
+ $('#adminMusic').on('timeupdate', adminMusicEndCheck);
+ }
+}
+
function subSlideUp() {
$(this).removeClass('scroll');
$(this).css('height', '');
@@ -608,23 +743,32 @@ $(function() {
*
******************************************/
var savedConfig = {
- 'sfontSize': getCookie('fontsize'),
- 'slineHeight': getCookie('lineheight'),
+ fontsize: getCookie('fontsize'), //no need for compatabiliy, cookie name is the same
+ lineheight: getCookie('lineheight'),
'spingDisabled': getCookie('pingdisabled'),
'shighlightTerms': getCookie('highlightterms'),
'shighlightColor': getCookie('highlightcolor'),
'smusicVolume': getCookie('musicVolume'),
'smessagecombining': getCookie('messagecombining'),
+ 'sdarkmode': getCookie('darkmode'),
'scolorPreset': getCookie('colorpreset'),
};
- if (savedConfig.sfontSize) {
- $messages.css('font-size', savedConfig.sfontSize);
- internalOutput('Loaded font size setting of: '+savedConfig.sfontSize+'', 'internal');
+ if (savedConfig.fontsize) {
+ $messages.css('font-size', savedConfig.fontsize);
+ internalOutput('Loaded font size setting of: '+savedConfig.fontsize+'', 'internal');
}
- if (savedConfig.slineHeight) {
- $("body").css('line-height', savedConfig.slineHeight);
- internalOutput('Loaded line height setting of: '+savedConfig.slineHeight+'', 'internal');
+ if (savedConfig.lineheight) {
+ $("body").css('line-height', savedConfig.lineheight);
+ internalOutput('Loaded line height setting of: '+savedConfig.lineheight+'', 'internal');
+ }
+ // if(savedConfig.sdarkmode == 'true'){
+ // swap();
+ // }
+ if (savedConfig.scolorPreset) {
+ opts.colorPreset = Number(savedConfig.scolorPreset);
+ updateColorPreset();
+ internalOutput('Loaded color preset of: '+colorPresets[opts.colorPreset]+'', 'internal');
}
if (savedConfig.spingDisabled) {
if (savedConfig.spingDisabled == 'true') {
@@ -634,15 +778,11 @@ $(function() {
internalOutput('Loaded ping display of: '+(opts.pingDisabled ? 'hidden' : 'visible')+'', 'internal');
}
if (savedConfig.shighlightTerms) {
- var savedTerms = $.parseJSON(savedConfig.shighlightTerms);
- var actualTerms = '';
- for (var i = 0; i < savedTerms.length; i++) {
- if (savedTerms[i]) {
- actualTerms += savedTerms[i] + ', ';
- }
- }
+ var savedTerms = $.parseJSON(savedConfig.shighlightTerms).filter(function (entry) {
+ return entry !== null && /\S/.test(entry);
+ });
+ var actualTerms = savedTerms.length != 0 ? savedTerms.join(', ') : null;
if (actualTerms) {
- actualTerms = actualTerms.substring(0, actualTerms.length - 2);
internalOutput('Loaded highlight strings of: ' + actualTerms+'', 'internal');
opts.highlightTerms = savedTerms;
}
@@ -651,13 +791,6 @@ $(function() {
opts.highlightColor = savedConfig.shighlightColor;
internalOutput('Loaded highlight color of: '+savedConfig.shighlightColor+'', 'internal');
}
-
- if (savedConfig.scolorPreset) {
- opts.colorPreset = Number(savedConfig.scolorPreset);
- updateColorPreset();
- internalOutput('Loaded color preset of: '+colorPresets[opts.colorPreset]+'', 'internal');
- }
-
if (savedConfig.smusicVolume) {
var newVolume = clamp(savedConfig.smusicVolume, 0, 100);
$('#adminMusic').prop('volume', newVolume / 100);
@@ -669,7 +802,7 @@ $(function() {
else{
$('#adminMusic').prop('volume', opts.defaultMusicVolume / 100);
}
-
+
if (savedConfig.smessagecombining) {
if (savedConfig.smessagecombining == 'false') {
opts.messageCombining = false;
@@ -746,76 +879,17 @@ $(function() {
href = escaper(href);
runByond('?action=openLink&link='+href);
}
+ runByond('byond://winset?mapwindow.map.focus=true');
});
- //Fuck everything about this event. Will look into alternatives.
$('body').on('keydown', function(e) {
if (e.target.nodeName == 'INPUT' || e.target.nodeName == 'TEXTAREA') {
return;
}
-
if (e.ctrlKey || e.altKey || e.shiftKey) { //Band-aid "fix" for allowing ctrl+c copy paste etc. Needs a proper fix.
return;
}
-
- e.preventDefault()
-
- var k = e.which;
- // Hardcoded because else there would be no feedback message.
- if (k == 113) { // F2
- runByond('byond://winset?screenshot=auto');
- internalOutput('Screenshot taken', 'internal');
- }
-
- var c = "";
- switch (k) {
- case 8:
- c = 'BACK';
- case 9:
- c = 'TAB';
- case 13:
- c = 'ENTER';
- case 19:
- c = 'PAUSE';
- case 27:
- c = 'ESCAPE';
- case 33: // Page up
- c = 'NORTHEAST';
- case 34: // Page down
- c = 'SOUTHEAST';
- case 35: // End
- c = 'SOUTHWEST';
- case 36: // Home
- c = 'NORTHWEST';
- case 37:
- c = 'WEST';
- case 38:
- c = 'NORTH';
- case 39:
- c = 'EAST';
- case 40:
- c = 'SOUTH';
- case 45:
- c = 'INSERT';
- case 46:
- c = 'DELETE';
- case 93: // That weird thing to the right of alt gr.
- c = 'APPS';
-
- default:
- c = String.fromCharCode(k);
- }
-
- if (c.length == 0) {
- if (!e.shiftKey) {
- c = c.toLowerCase();
- }
- runByond('byond://winset?mapwindow.map.focus=true;mainwindow.input.text='+c);
- return false;
- } else {
- runByond('byond://winset?mapwindow.map.focus=true');
- return false;
- }
+ runByond('byond://winset?mapwindow.map.focus=true');
});
//Mildly hacky fix for scroll issues on mob change (interface gets resized sometimes, messing up snap-scroll)
@@ -843,6 +917,9 @@ $(function() {
$('#toggleOptions').click(function(e) {
handleToggleClick($subOptions, $(this));
});
+ // $('#darkmodetoggle').click(function(e) {
+ // swap();
+ // });
$('#toggleAudio').click(function(e) {
handleToggleClick($subAudio, $(this));
});
@@ -856,41 +933,31 @@ $(function() {
});
$('#decreaseFont').click(function(e) {
- var fontSize = parseInt($messages.css('font-size'));
- fontSize = fontSize - 1 + 'px';
- $messages.css({'font-size': fontSize});
- setCookie('fontsize', fontSize, 365);
- internalOutput('Font size set to '+fontSize+'', 'internal');
+ savedConfig.fontsize = Math.max(parseInt(savedConfig.fontsize || 13) - 1, 1) + 'px';
+ $messages.css({'font-size': savedConfig.fontsize});
+ setCookie('fontsize', savedConfig.fontsize, 365);
+ internalOutput('Font size set to '+savedConfig.fontsize+'', 'internal');
});
$('#increaseFont').click(function(e) {
- var fontSize = parseInt($messages.css('font-size'));
- fontSize = fontSize + 1 + 'px';
- $messages.css({'font-size': fontSize});
- setCookie('fontsize', fontSize, 365);
- internalOutput('Font size set to '+fontSize+'', 'internal');
+ savedConfig.fontsize = (parseInt(savedConfig.fontsize || 13) + 1) + 'px';
+ $messages.css({'font-size': savedConfig.fontsize});
+ setCookie('fontsize', savedConfig.fontsize, 365);
+ internalOutput('Font size set to '+savedConfig.fontsize+'', 'internal');
});
$('#decreaseLineHeight').click(function(e) {
- var Heightline = parseFloat($("body").css('line-height'));
- var Sizefont = parseFloat($("body").css('font-size'));
- var lineheightvar = Heightline / Sizefont
- lineheightvar -= 0.1;
- lineheightvar = lineheightvar.toFixed(1)
- $("body").css({'line-height': lineheightvar});
- setCookie('lineheight', lineheightvar, 365);
- internalOutput('Line height set to '+lineheightvar+'', 'internal');
+ savedConfig.lineheight = Math.max(parseFloat(savedConfig.lineheight || 1.2) - 0.1, 0.1).toFixed(1);
+ $("body").css({'line-height': savedConfig.lineheight});
+ setCookie('lineheight', savedConfig.lineheight, 365);
+ internalOutput('Line height set to '+savedConfig.lineheight+'', 'internal');
});
$('#increaseLineHeight').click(function(e) {
- var Heightline = parseFloat($("body").css('line-height'));
- var Sizefont = parseFloat($("body").css('font-size'));
- var lineheightvar = Heightline / Sizefont
- lineheightvar += 0.1;
- lineheightvar = lineheightvar.toFixed(1)
- $("body").css({'line-height': lineheightvar});
- setCookie('lineheight', lineheightvar, 365);
- internalOutput('Line height set to '+lineheightvar+'', 'internal');
+ savedConfig.lineheight = (parseFloat(savedConfig.lineheight || 1.2) + 0.1).toFixed(1);
+ $("body").css({'line-height': savedConfig.lineheight});
+ setCookie('lineheight', savedConfig.lineheight, 365);
+ internalOutput('Line height set to '+savedConfig.lineheight+'', 'internal');
});
$('#togglePing').click(function(e) {
@@ -908,13 +975,13 @@ $(function() {
// Requires IE 10+ to issue download commands. Just opening a popup
// window will cause Ctrl+S to save a blank page, ignoring innerHTML.
if (!window.Blob) {
- output('This function is only supported on IE 10+. Upgrade if possible.', 'internal');
+ output('This function is only supported on IE 10 and up. Upgrade if possible.', 'internal');
return;
}
$.ajax({
type: 'GET',
- url: 'browserOutput.css',
+ url: 'browserOutput.css', // browserOutput_white.css
success: function(styleData) {
var blob = new Blob(['Chat Log', $messages.html(), '']);
@@ -958,20 +1025,12 @@ $(function() {
$('body').on('submit', '#highlightTermForm', function(e) {
e.preventDefault();
- var count = 0;
- while (count < opts.highlightLimit) {
+ opts.highlightTerms = [];
+ for (var count = 0; count < opts.highlightLimit; count++) {
var term = $('#highlightTermInput'+count).val();
- if (term) {
- term = term.trim();
- if (term === '') {
- opts.highlightTerms[count] = null;
- } else {
- opts.highlightTerms[count] = term.toLowerCase();
- }
- } else {
- opts.highlightTerms[count] = null;
+ if (term !== null && /\S/.test(term)) {
+ opts.highlightTerms.push(term.trim().toLowerCase());
}
- count++;
}
var color = $('#highlightColor').val();
@@ -992,8 +1051,8 @@ $(function() {
$messages.empty();
opts.messageCount = 0;
});
-
- $('#changeColorPreset').click(function() {
+
+ $('#changeColorPreset').click(function() { //CIT SPECIFIC
opts.colorPreset = (opts.colorPreset+1) % colorPresets.length;
updateColorPreset();
setCookie('colorpreset', opts.colorPreset, 365);
@@ -1026,9 +1085,9 @@ $(function() {
});
$('img.icon').error(iconError);
-
-
-
+
+
+
/*****************************************
*
diff --git a/code/modules/holiday/halloween/bartholomew.dm b/code/modules/holiday/halloween/bartholomew.dm
index 82ac374525..c9a4a946a3 100644
--- a/code/modules/holiday/halloween/bartholomew.dm
+++ b/code/modules/holiday/halloween/bartholomew.dm
@@ -31,7 +31,7 @@
return
say("It doesn't seem like that's magical enough!")
-/obj/item/barthpot/attack_hand(mob/user)
+/obj/item/barthpot/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(!active)
say("Meow!")
return
diff --git a/code/modules/holiday/halloween/jacqueen.dm b/code/modules/holiday/halloween/jacqueen.dm
index 107282b642..4561e0ae3e 100644
--- a/code/modules/holiday/halloween/jacqueen.dm
+++ b/code/modules/holiday/halloween/jacqueen.dm
@@ -56,8 +56,9 @@
cached_z = z
poof()
-/mob/living/simple_animal/jacq/Life()
- ..()
+/mob/living/simple_animal/jacq/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
if(!ckey)
if((last_poof+3 MINUTES) < world.realtime)
poof()
@@ -75,7 +76,7 @@
health = 25
poof()
-/mob/living/simple_animal/jacq/attack_hand(mob/living/carbon/human/M)
+/mob/living/simple_animal/jacq/on_attack_hand(mob/living/carbon/human/M)
if(!active)
say("Hello there [gender_check(M)]!")
return ..()
@@ -405,14 +406,14 @@
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, GLUED_ITEM_TRAIT)
-/obj/item/clothing/suit/ghost_sheet/sticky/attack_hand(mob/user)
+/obj/item/clothing/suit/ghost_sheet/sticky/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(iscarbon(user))
to_chat(user, "Boooooo~!")
return
else
..()
-/obj/item/clothing/suit/ghost_sheet/sticky/attack_hand(mob/user)
+/obj/item/clothing/suit/ghost_sheet/sticky/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(iscarbon(user))
to_chat(user, "Boooooo~!")
return
diff --git a/code/modules/holodeck/computer.dm b/code/modules/holodeck/computer.dm
index 65c69b995f..d72e1b1fc8 100644
--- a/code/modules/holodeck/computer.dm
+++ b/code/modules/holodeck/computer.dm
@@ -83,7 +83,7 @@
/obj/machinery/computer/holodeck/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
- ui = new(user, src, ui_key, "holodeck", name, 400, 500, master_ui, state)
+ ui = new(user, src, ui_key, "Holodeck", name, 400, 500, master_ui, state)
ui.open()
/obj/machinery/computer/holodeck/ui_data(mob/user)
diff --git a/code/modules/holodeck/items.dm b/code/modules/holodeck/items.dm
index c68c5de804..e4564ecb7e 100644
--- a/code/modules/holodeck/items.dm
+++ b/code/modules/holodeck/items.dm
@@ -105,10 +105,7 @@
if(user.transferItemToLoc(W, drop_location()))
visible_message(" [user] dunks [W] into \the [src]!")
-/obj/structure/holohoop/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/structure/holohoop/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(user.pulling && user.a_intent == INTENT_GRAB && isliving(user.pulling))
var/mob/living/L = user.pulling
if(user.grab_state < GRAB_AGGRESSIVE)
@@ -164,7 +161,7 @@
/obj/machinery/readybutton/attackby(obj/item/W as obj, mob/user as mob, params)
to_chat(user, "The device is a solid button, there's nothing you can do with it!")
-/obj/machinery/readybutton/attack_hand(mob/user as mob)
+/obj/machinery/readybutton/on_attack_hand(mob/user as mob)
. = ..()
if(.)
return
@@ -219,7 +216,7 @@
/obj/item/paper/fluff/holodeck/trek_diploma
name = "paper - Starfleet Academy Diploma"
- info = {"
Starfleet Academy
Official Diploma
"}
+ info = {"__Starfleet Academy__\nOfficial Diploma"}
/obj/item/paper/fluff/holodeck/disclaimer
name = "Holodeck Disclaimer"
diff --git a/code/modules/holodeck/turfs.dm b/code/modules/holodeck/turfs.dm
index 7b5b0586d1..169c9061d3 100644
--- a/code/modules/holodeck/turfs.dm
+++ b/code/modules/holodeck/turfs.dm
@@ -134,7 +134,7 @@
tiled_dirt = FALSE
baseturfs = /turf/open/floor/holofloor/snow
-/turf/open/floor/holofloor/snow/attack_hand(mob/living/user)
+/turf/open/floor/holofloor/snow/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
diff --git a/code/modules/hydroponics/fermenting_barrel.dm b/code/modules/hydroponics/fermenting_barrel.dm
index 11bb44ce97..76e36a1725 100644
--- a/code/modules/hydroponics/fermenting_barrel.dm
+++ b/code/modules/hydroponics/fermenting_barrel.dm
@@ -56,7 +56,7 @@
else
return ..()
-/obj/structure/fermenting_barrel/attack_hand(mob/user)
+/obj/structure/fermenting_barrel/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
open = !open
if(open)
DISABLE_BITFIELD(reagents.reagents_holder_flags, DRAINABLE)
diff --git a/code/modules/hydroponics/grown/chili.dm b/code/modules/hydroponics/grown/chili.dm
index 0522b5fd45..1f60afe655 100644
--- a/code/modules/hydroponics/grown/chili.dm
+++ b/code/modules/hydroponics/grown/chili.dm
@@ -80,10 +80,7 @@
foodtype = FRUIT
wine_power = 50
-/obj/item/reagent_containers/food/snacks/grown/ghost_chili/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/item/reagent_containers/food/snacks/grown/ghost_chili/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if( ismob(loc) )
held_mob = loc
START_PROCESSING(SSobj, src)
diff --git a/code/modules/hydroponics/grown/citrus.dm b/code/modules/hydroponics/grown/citrus.dm
index 851753da46..6ac7bbcfcb 100644
--- a/code/modules/hydroponics/grown/citrus.dm
+++ b/code/modules/hydroponics/grown/citrus.dm
@@ -107,8 +107,8 @@
icon_state = "orang"
filling_color = "#FFA500"
juice_results = list(/datum/reagent/consumable/orangejuice = 0)
- distill_reagent = /datum/reagent/consumable/ethanol/triple_sec
- tastes = list("polygons" = 1, "oranges" = 1)
+ distill_reagent = /datum/reagent/toxin/mindbreaker
+ tastes = list("polygons" = 1, "bluespace" = 1, "the true nature of reality" = 1)
/obj/item/reagent_containers/food/snacks/grown/citrus/orange_3d/pickup(mob/user)
. = ..()
@@ -195,7 +195,7 @@
/obj/item/reagent_containers/food/snacks/grown/firelemon/ex_act(severity)
qdel(src) //Ensuring that it's deleted by its own explosion
-/obj/item/reagent_containers/food/snacks/grown/firelemon/proc/prime()
+/obj/item/reagent_containers/food/snacks/grown/firelemon/proc/prime(mob/living/lanced_by)
switch(seed.potency) //Combustible lemons are alot like IEDs, lots of flame, very little bang.
if(0 to 30)
update_mob()
diff --git a/code/modules/hydroponics/grown/corn.dm b/code/modules/hydroponics/grown/corn.dm
index 6c852c426d..ad09751e44 100644
--- a/code/modules/hydroponics/grown/corn.dm
+++ b/code/modules/hydroponics/grown/corn.dm
@@ -38,6 +38,7 @@
throwforce = 0
throw_speed = 3
throw_range = 7
+ grind_results = list(/datum/reagent/cellulose = 10)
/obj/item/grown/corncob/attackby(obj/item/grown/W, mob/user, params)
if(W.get_sharpness())
diff --git a/code/modules/hydroponics/grown/flowers.dm b/code/modules/hydroponics/grown/flowers.dm
index 8b0dcdaae1..abd06775af 100644
--- a/code/modules/hydroponics/grown/flowers.dm
+++ b/code/modules/hydroponics/grown/flowers.dm
@@ -277,7 +277,7 @@
growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi'
icon_grow = "bee_balm-grow"
icon_dead = "bee_balm-dead"
- mutatelist = list(/obj/item/seeds/poppy/geranium, /obj/item/seeds/bee_balm/honey) //Lower odds of becoming honey
+ mutatelist = list(/obj/item/seeds/poppy/geranium, /obj/item/seeds/bee_balm/honey_balm) //Lower odds of becoming honey
reagents_add = list(/datum/reagent/medicine/spaceacillin = 0.1, /datum/reagent/space_cleaner/sterilizine = 0.05)
/obj/item/reagent_containers/food/snacks/grown/bee_balm
@@ -291,11 +291,11 @@
foodtype = GROSS
// Beebalm
-/obj/item/seeds/bee_balm/honey
+/obj/item/seeds/bee_balm/honey_balm
name = "pack of Honey Balm seeds"
desc = "These seeds grow into Honey Balms."
- icon_state = "seed-bee_balmalt"
- species = "seed-bee_balm_alt"
+ icon_state = "seed-honey_balm"
+ species = "honey_balm"
plantname = "Honey Balm Pods"
product = /obj/item/reagent_containers/food/snacks/grown/bee_balm/honey
endurance = 1
@@ -304,16 +304,16 @@
potency = 1
growthstages = 3
growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi'
- icon_grow = "bee_balmalt-grow"
- icon_dead = "bee_balmalt-dead"
+ icon_grow = "honey_balm-grow"
+ icon_dead = "honey_balm-dead"
reagents_add = list(/datum/reagent/consumable/honey = 0.1, /datum/reagent/lye = 0.3) //To make wax
rarity = 30
/obj/item/reagent_containers/food/snacks/grown/bee_balm/honey
- seed = /obj/item/seeds/bee_balm/honey
+ seed = /obj/item/seeds/bee_balm/honey_balm
name = "honey balm"
desc = "A large honey filled pod of a flower."
- icon_state = "bee_balmalt"
+ icon_state = "honey_balm"
filling_color = "#FF6347"
bitesize_mod = 8
tastes = list("wax" = 1)
diff --git a/code/modules/hydroponics/grown/misc.dm b/code/modules/hydroponics/grown/misc.dm
index f356ed7b68..fe60e9f397 100644
--- a/code/modules/hydroponics/grown/misc.dm
+++ b/code/modules/hydroponics/grown/misc.dm
@@ -57,8 +57,8 @@
return
var/datum/gas_mixture/stank = new
- stank.gases[/datum/gas/miasma] = (yield + 6)*7*0.02 // this process is only being called about 2/7 as much as corpses so this is 12-32 times a corpses
- stank.temperature = T20C // without this the room would eventually freeze and miasma mining would be easier
+ stank.adjust_moles(/datum/gas/miasma,(yield + 6)*7*0.02) // this process is only being called about 2/7 as much as corpses so this is 12-32 times a corpses
+ stank.set_temperature(T20C) // without this the room would eventually freeze and miasma mining would be easier
T.assume_air(stank)
T.air_update_turf()
@@ -223,7 +223,7 @@
/obj/item/reagent_containers/food/snacks/grown/cherry_bomb/ex_act(severity)
qdel(src) //Ensuring that it's deleted by its own explosion. Also prevents mass chain reaction with piles of cherry bombs
-/obj/item/reagent_containers/food/snacks/grown/cherry_bomb/proc/prime()
+/obj/item/reagent_containers/food/snacks/grown/cherry_bomb/proc/prime(mob/living/lanced_by)
icon_state = "cherry_bomb_lit"
playsound(src, 'sound/effects/fuse.ogg', seed.potency, 0)
addtimer(CALLBACK(src, /obj/item/reagent_containers/food/snacks/grown/cherry_bomb/proc/detonate), rand(50, 100))
@@ -504,3 +504,34 @@
prime()
if(!QDELETED(src))
qdel(src)
+
+/obj/item/seeds/aloe
+ name = "pack of aloe seeds"
+ desc = "These seeds grow into aloe."
+ icon_state = "seed-aloe"
+ species = "aloe"
+ plantname = "Aloe"
+ product = /obj/item/reagent_containers/food/snacks/grown/aloe
+ lifespan = 60
+ endurance = 25
+ maturation = 4
+ production = 4
+ yield = 6
+ growthstages = 5
+ growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi'
+ reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.05, /datum/reagent/consumable/nutriment = 0.05)
+
+/obj/item/reagent_containers/food/snacks/grown/aloe
+ seed = /obj/item/seeds/aloe
+ name = "aloe"
+ desc = "Cut leaves from the aloe plant."
+ icon_state = "aloe"
+ filling_color = "#90EE90"
+ bitesize_mod = 5
+ foodtype = VEGETABLES
+ juice_results = list(/datum/reagent/consumable/aloejuice = 0)
+ distill_reagent = /datum/reagent/consumable/ethanol/tequila
+
+/obj/item/reagent_containers/food/snacks/grown/aloe/microwave_act(obj/machinery/microwave/M)
+ new /obj/item/stack/medical/aloe(drop_location(), 2)
+ qdel(src)
\ No newline at end of file
diff --git a/code/modules/hydroponics/grown/nettle.dm b/code/modules/hydroponics/grown/nettle.dm
index 0979ea483f..cee7748c59 100644
--- a/code/modules/hydroponics/grown/nettle.dm
+++ b/code/modules/hydroponics/grown/nettle.dm
@@ -90,6 +90,7 @@
icon_state = "deathnettle"
force = 30
throwforce = 15
+ wound_bonus = CANT_WOUND
/obj/item/reagent_containers/food/snacks/grown/nettle/death/add_juice()
..()
diff --git a/code/modules/hydroponics/grown/peas.dm b/code/modules/hydroponics/grown/peas.dm
index 6229d98b2c..79d506cf56 100644
--- a/code/modules/hydroponics/grown/peas.dm
+++ b/code/modules/hydroponics/grown/peas.dm
@@ -61,6 +61,7 @@
filling_color = "#ee7bee"
bitesize_mod = 2
foodtype = VEGETABLES
+ juice_results = list (/datum/reagent/consumable/laughsyrup = 0)
tastes = list ("a prancing rabbit" = 1) //Vib Ribbon sends her regards.. wherever she is.
wine_power = 90
wine_flavor = "a vector-graphic rabbit dancing on your tongue"
diff --git a/code/modules/hydroponics/grown/replicapod.dm b/code/modules/hydroponics/grown/replicapod.dm
index aeddf771b8..328b4c391c 100644
--- a/code/modules/hydroponics/grown/replicapod.dm
+++ b/code/modules/hydroponics/grown/replicapod.dm
@@ -29,6 +29,28 @@
create_reagents(volume, INJECTABLE | DRAWABLE)
+/obj/item/seeds/replicapod/pre_attack(obj/machinery/hydroponics/I)
+ if(istype(I, /obj/machinery/hydroponics))
+ if(!I.myseed)
+ START_PROCESSING(SSobj, src)
+ return ..()
+
+/obj/item/seeds/replicapod/proc/check_mind_orbiting(atom/A)
+ for(var/mob/M in A.orbiters?.orbiters)
+ if(mind && M.mind && ckey(M.mind.key) == ckey(mind.key) && M.ckey && M.client && M.stat == DEAD && !M.suiciding && isobserver(M))
+ return TRUE
+ return FALSE
+
+/obj/item/seeds/replicapod/process()
+ var/obj/machinery/hydroponics/parent = loc
+ if(parent.harvest != 1)
+ return
+ if (check_mind_orbiting(parent))
+ icon_harvest = "replicapod-orbit"
+ else
+ icon_harvest = "replicapod-harvest"
+ parent.update_icon_plant()
+
/obj/item/seeds/replicapod/on_reagent_change(changetype)
if(changetype == ADD_REAGENT)
var/datum/reagent/blood/B = reagents.has_reagent(/datum/reagent/blood)
@@ -59,8 +81,11 @@
/obj/item/seeds/replicapod/get_analyzer_text()
var/text = ..()
+ var/obj/machinery/hydroponics/parent = loc
if(contains_sample)
text += "\n It contains a blood sample!"
+ if (parent && istype(parent) && check_mind_orbiting(parent))
+ text += "\n The soul is ready to enter the body."
return text
diff --git a/code/modules/hydroponics/grown/tea_coffee.dm b/code/modules/hydroponics/grown/tea_coffee.dm
index 48990d88c9..de27d1eed7 100644
--- a/code/modules/hydroponics/grown/tea_coffee.dm
+++ b/code/modules/hydroponics/grown/tea_coffee.dm
@@ -48,7 +48,7 @@
/obj/item/seeds/tea/catnip
name = "pack of catnip seeds"
icon_state = "seed-catnip"
- desc = "Long stocks with flowering tips that has a chemical to make feline attracted to it."
+ desc = "Long stocks with flowering tips that contain a chemical to make felines attracted to it."
species = "catnip"
plantname = "Catnip Plant"
growthstages = 3
diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm
index a18dbe165d..ecbfa7584b 100644
--- a/code/modules/hydroponics/grown/towercap.dm
+++ b/code/modules/hydroponics/grown/towercap.dm
@@ -16,6 +16,7 @@
icon_dead = "towercap-dead"
genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism)
mutatelist = list(/obj/item/seeds/tower/steel)
+ reagents_add = list(/datum/reagent/cellulose = 0.05)
/obj/item/seeds/tower/steel
name = "pack of steel-cap mycelium"
@@ -25,6 +26,7 @@
plantname = "Steel Caps"
product = /obj/item/grown/log/steel
mutatelist = list()
+ reagents_add = list(/datum/reagent/cellulose = 0.05, /datum/reagent/iron = 0.05)
rarity = 20
/obj/item/grown/log
@@ -205,10 +207,7 @@
return ..()
-/obj/structure/bonfire/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/structure/bonfire/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(burning)
to_chat(user, "You need to extinguish [src] before removing the logs!")
return
@@ -226,8 +225,8 @@
if(isopenturf(loc))
var/turf/open/O = loc
if(O.air)
- var/loc_gases = O.air.gases
- if(loc_gases[/datum/gas/oxygen] > 13)
+ var/datum/gas_mixture/loc_air = O.air
+ if(loc_air.get_moles(/datum/gas/oxygen) > 13)
return TRUE
return FALSE
diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm
index b7665d7b5d..06179d1087 100644
--- a/code/modules/hydroponics/hydroponics.dm
+++ b/code/modules/hydroponics/hydroponics.dm
@@ -888,10 +888,7 @@
return ..()
-/obj/machinery/hydroponics/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/machinery/hydroponics/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(issilicon(user)) //How does AI know what plant is?
return
if(harvest)
diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm
index b18f4396d6..887ea0417c 100644
--- a/code/modules/hydroponics/plant_genes.dm
+++ b/code/modules/hydroponics/plant_genes.dm
@@ -157,12 +157,12 @@
/datum/plant_gene/reagent/polypyr
name = "Polypyrylium Oligomers"
- reagent_id = "polypyr"
+ reagent_id = /datum/reagent/medicine/polypyr
rate = 0.15
/datum/plant_gene/reagent/liquidelectricity
name = "Liquid Electricity"
- reagent_id = "liquidelectricity"
+ reagent_id = /datum/reagent/consumable/liquidelectricity
rate = 0.1
// Various traits affecting the product. Each must be somehow useful.
@@ -392,7 +392,7 @@
/datum/plant_gene/trait/battery/on_attackby(obj/item/reagent_containers/food/snacks/grown/G, obj/item/I, mob/user)
if(istype(I, /obj/item/stack/cable_coil))
- if(I.use_tool(src, user, 0, 5, max_level = JOB_SKILL_EXPERT))
+ if(I.use_tool(src, user, 0, 5, skill_gain_mult = TRIVIAL_USE_TOOL_MULT))
to_chat(user, "You add some cable to [G] and slide it inside the battery encasing.")
var/obj/item/stock_parts/cell/potato/pocell = new /obj/item/stock_parts/cell/potato(user.loc)
pocell.icon_state = G.icon_state
diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm
index 384991e976..7c9f811c34 100644
--- a/code/modules/integrated_electronics/core/assemblies.dm
+++ b/code/modules/integrated_electronics/core/assemblies.dm
@@ -519,6 +519,7 @@
/obj/item/electronic_assembly/attack_self(mob/user)
+ set waitfor = FALSE
if(!check_interactivity(user))
return
if(opened)
@@ -611,7 +612,7 @@
return
..()
-/obj/item/electronic_assembly/attack_hand(mob/user)
+/obj/item/electronic_assembly/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(anchored)
attack_self(user)
return
diff --git a/code/modules/integrated_electronics/subtypes/arithmetic.dm b/code/modules/integrated_electronics/subtypes/arithmetic.dm
index 6a6ee27ae1..e207f57ddb 100644
--- a/code/modules/integrated_electronics/subtypes/arithmetic.dm
+++ b/code/modules/integrated_electronics/subtypes/arithmetic.dm
@@ -283,10 +283,8 @@
/obj/item/integrated_circuit/arithmetic/square_root/do_work()
var/result = 0
- for(var/k in 2 to inputs.len)
- var/I = get_pin_data(IC_INPUT, k)
- if(isnum(I))
- result += sqrt(I)
+ var/I = get_pin_data(IC_INPUT, 1)
+ result = sqrt(I)
set_pin_data(IC_OUTPUT, 1, result)
push_data()
diff --git a/code/modules/integrated_electronics/subtypes/atmospherics.dm b/code/modules/integrated_electronics/subtypes/atmospherics.dm
index 219e30c57f..d9a18bc509 100644
--- a/code/modules/integrated_electronics/subtypes/atmospherics.dm
+++ b/code/modules/integrated_electronics/subtypes/atmospherics.dm
@@ -125,12 +125,12 @@
return
// Negative Kelvin temperatures should never happen and if they do, normalize them
- if(source_air.temperature < TCMB)
- source_air.temperature = TCMB
+ if(source_air.return_temperature() < TCMB)
+ source_air.set_temperature(TCMB)
var/pressure_delta = target_pressure - target_air.return_pressure()
if(pressure_delta > 0.1)
- var/transfer_moles = (pressure_delta*target_air.volume/(source_air.temperature * R_IDEAL_GAS_EQUATION))*PUMP_EFFICIENCY
+ var/transfer_moles = (pressure_delta*target_air.return_volume()/(source_air.return_temperature() * R_IDEAL_GAS_EQUATION))*PUMP_EFFICIENCY
var/datum/gas_mixture/removed = source_air.remove(transfer_moles)
target_air.merge(removed)
@@ -171,14 +171,14 @@
return
// Negative Kelvin temperatures should never happen and if they do, normalize them
- if(source_air.temperature < TCMB)
- source_air.temperature = TCMB
+ if(source_air.return_temperature() < TCMB)
+ source_air.set_temperature(TCMB)
if((source_air.return_pressure() < 0.01) || (target_air.return_pressure() >= PUMP_MAX_PRESSURE))
return
//The second part of the min caps the pressure built by the volume pumps to the max pump pressure
- var/transfer_ratio = min(transfer_rate,target_air.volume*PUMP_MAX_PRESSURE/source_air.return_pressure())/source_air.volume
+ var/transfer_ratio = min(transfer_rate,target_air.return_volume()*PUMP_MAX_PRESSURE/source_air.return_pressure())/source_air.return_volume()
var/datum/gas_mixture/removed = source_air.remove_ratio(transfer_ratio * PUMP_EFFICIENCY)
@@ -351,10 +351,10 @@ obj/item/integrated_circuit/atmospherics/connector/portableConnectorReturnAir()
var/transfer_moles
//Negative Kelvins are an anomaly and should be normalized if encountered
- if(source_air.temperature < TCMB)
- source_air.temperature = TCMB
+ if(source_air.return_temperature(TCMB))
+ source_air.set_temperature(TCMB)
- transfer_moles = (pressure_delta*contaminated_air.volume/(source_air.temperature * R_IDEAL_GAS_EQUATION))*PUMP_EFFICIENCY
+ transfer_moles = (pressure_delta*contaminated_air.return_volume()/(source_air.return_temperature() * R_IDEAL_GAS_EQUATION))*PUMP_EFFICIENCY
//If there is nothing to transfer, just return
if(transfer_moles <= 0)
@@ -368,16 +368,15 @@ obj/item/integrated_circuit/atmospherics/connector/portableConnectorReturnAir()
//This is the gas that will be moved from source to filtered
var/datum/gas_mixture/filtered_out = new
- for(var/filtered_gas in removed.gases)
+ for(var/filtered_gas in removed.get_gases())
//Get the name of the gas and see if it is in the list
if(GLOB.meta_gas_names[filtered_gas] in wanted)
//The gas that is put in all the filtered out gases
- filtered_out.temperature = removed.temperature
- filtered_out.gases[filtered_gas] = removed.gases[filtered_gas]
+ filtered_out.set_temperature(removed.return_temperature())
+ filtered_out.set_moles(filtered_gas, removed.get_moles(filtered_gas))
//The filtered out gas is entirely removed from the currently filtered gases
- removed.gases[filtered_gas] = 0
- GAS_GARBAGE_COLLECT(removed.gases)
+ removed.set_moles(filtered_gas, 0)
//Check if the pressure is high enough to put stuff in filtered, or else just put it back in the source
var/datum/gas_mixture/target = (filtered_air.return_pressure() < target_pressure ? filtered_air : source_air)
@@ -444,7 +443,7 @@ obj/item/integrated_circuit/atmospherics/connector/portableConnectorReturnAir()
var/gas_percentage = round(max(min(get_pin_data(IC_INPUT, 4),100),0) / 100)
//Basically: number of moles = percentage of pressure filled up * efficiency coefficient * (pressure from both gases * volume of output) / (R * Temperature)
- var/transfer_moles = (get_pin_data(IC_INPUT, 5) / max(1,output_gases.return_pressure())) * PUMP_EFFICIENCY * (source_1_gases.return_pressure() * gas_percentage + source_2_gases.return_pressure() * (1 - gas_percentage)) * output_gases.volume/ (R_IDEAL_GAS_EQUATION * max(output_gases.temperature,TCMB))
+ var/transfer_moles = (get_pin_data(IC_INPUT, 5) / max(1,output_gases.return_pressure())) * PUMP_EFFICIENCY * (source_1_gases.return_pressure() * gas_percentage + source_2_gases.return_pressure() * (1 - gas_percentage)) * output_gases.return_volume()/ (R_IDEAL_GAS_EQUATION * max(output_gases.return_temperature(),TCMB))
if(transfer_moles <= 0)
@@ -544,10 +543,10 @@ obj/item/integrated_circuit/atmospherics/connector/portableConnectorReturnAir()
push_data()
//Cool the tank if the power is on and the temp is above
- if(!power_draw_idle || air_contents.temperature < temperature)
+ if(!power_draw_idle || air_contents.return_temperature() < temperature)
return
- air_contents.temperature = max(73.15,air_contents.temperature - (air_contents.temperature - temperature) * heater_coefficient)
+ air_contents.set_temperature(max(73.15,air_contents.return_temperature() - (air_contents.return_temperature() - temperature) * heater_coefficient))
// - heater tank - // **works**
@@ -574,10 +573,10 @@ obj/item/integrated_circuit/atmospherics/connector/portableConnectorReturnAir()
push_data()
//Heat the tank if the power is on or its temperature is below what is set
- if(!power_draw_idle || air_contents.temperature > temperature)
+ if(!power_draw_idle || air_contents.return_temperature() > temperature)
return
- air_contents.temperature = min(573.15,air_contents.temperature + (temperature - air_contents.temperature) * heater_coefficient)
+ air_contents.set_temperature(min(573.15,air_contents.return_temperature() + (temperature - air_contents.return_temperature()) * heater_coefficient))
// - atmospheric cooler - // **works**
@@ -621,11 +620,11 @@ obj/item/integrated_circuit/atmospherics/connector/portableConnectorReturnAir()
return
var/datum/gas_mixture/turf_air = current_turf.return_air()
- if(!power_draw_idle || turf_air.temperature < temperature)
+ if(!power_draw_idle || turf_air.return_temperature() < temperature)
return
//Cool the gas
- turf_air.temperature = max(243.15,turf_air.temperature - (turf_air.temperature - temperature) * heater_coefficient)
+ turf_air.set_temperature(max(243.15,turf_air.return_temperature() - (turf_air.return_temperature() - temperature) * heater_coefficient))
// - atmospheric heater - // **works**
@@ -650,11 +649,11 @@ obj/item/integrated_circuit/atmospherics/connector/portableConnectorReturnAir()
return
var/datum/gas_mixture/turf_air = current_turf.return_air()
- if(!power_draw_idle || turf_air.temperature > temperature)
+ if(!power_draw_idle || turf_air.return_temperature() > temperature)
return
//Heat the gas
- turf_air.temperature = min(323.15,turf_air.temperature + (temperature - turf_air.temperature) * heater_coefficient)
+ turf_air.set_temperature(min(323.15,turf_air.return_temperature() + (temperature - turf_air.return_temperature()) * heater_coefficient))
// - tank slot - // **works**
diff --git a/code/modules/integrated_electronics/subtypes/input.dm b/code/modules/integrated_electronics/subtypes/input.dm
index a0608bb5ed..e8981ed685 100644
--- a/code/modules/integrated_electronics/subtypes/input.dm
+++ b/code/modules/integrated_electronics/subtypes/input.dm
@@ -1162,12 +1162,11 @@
activate_pin(3)
return
- var/list/gases = air_contents.gases
var/list/gas_names = list()
var/list/gas_amounts = list()
- for(var/id in gases)
+ for(var/id in air_contents.get_gases())
var/name = GLOB.meta_gas_names[id]
- var/amt = round(gases[id], 0.001)
+ var/amt = round(air_contents.get_moles(id), 0.001)
gas_names.Add(name)
gas_amounts.Add(amt)
@@ -1175,7 +1174,7 @@
set_pin_data(IC_OUTPUT, 2, gas_amounts)
set_pin_data(IC_OUTPUT, 3, round(air_contents.total_moles(), 0.001))
set_pin_data(IC_OUTPUT, 4, round(air_contents.return_pressure(), 0.001))
- set_pin_data(IC_OUTPUT, 5, round(air_contents.temperature, 0.001))
+ set_pin_data(IC_OUTPUT, 5, round(air_contents.return_temperature(), 0.001))
set_pin_data(IC_OUTPUT, 6, round(air_contents.return_volume(), 0.001))
push_data()
activate_pin(2)
diff --git a/code/modules/integrated_electronics/subtypes/manipulation.dm b/code/modules/integrated_electronics/subtypes/manipulation.dm
index fd4e6abfc5..eac16d2950 100644
--- a/code/modules/integrated_electronics/subtypes/manipulation.dm
+++ b/code/modules/integrated_electronics/subtypes/manipulation.dm
@@ -78,7 +78,7 @@
for(var/i in 1 to length(harvest_output))
harvest_output[i] = WEAKREF(harvest_output[i])
- if(harvest_output.len)
+ if(length(harvest_output))
set_pin_data(IC_OUTPUT, 1, harvest_output)
push_data()
if(1)
@@ -162,7 +162,7 @@
/obj/item/integrated_circuit/manipulation/grabber/do_work()
var/obj/item/AM = get_pin_data_as_type(IC_INPUT, 1, /obj/item)
- if(!QDELETED(AM) && !istype(AM, /obj/item/electronic_assembly) && !istype(AM, /obj/item/transfer_valve) && !istype(AM, /obj/item/twohanded) && !istype(assembly.loc, /obj/item/implant/storage))
+ if(!QDELETED(AM) && !istype(AM, /obj/item/electronic_assembly) && !istype(AM, /obj/item/transfer_valve) && !istype(assembly.loc, /obj/item/implant/storage) && !AM.GetComponent(/datum/component/two_handed))
var/mode = get_pin_data(IC_INPUT, 2)
switch(mode)
if(1)
@@ -300,7 +300,7 @@
var/target_y_rel = round(get_pin_data(IC_INPUT, 2))
var/obj/item/A = get_pin_data_as_type(IC_INPUT, 3, /obj/item)
- if(!A || A.anchored || A.throwing || A == assembly || istype(A, /obj/item/twohanded) || istype(A, /obj/item/transfer_valve))
+ if(!A || A.anchored || A.throwing || A == assembly || istype(A, /obj/item/transfer_valve) || A.GetComponent(/datum/component/two_handed))
return
if (istype(assembly.loc, /obj/item/implant/storage)) //Prevents the more abusive form of chestgun.
diff --git a/code/modules/integrated_electronics/subtypes/output.dm b/code/modules/integrated_electronics/subtypes/output.dm
index 47b6e151cb..efd98c4d50 100644
--- a/code/modules/integrated_electronics/subtypes/output.dm
+++ b/code/modules/integrated_electronics/subtypes/output.dm
@@ -35,7 +35,7 @@
stuff_to_display = replacetext("[I.data]", eol , " ")
/obj/item/integrated_circuit/output/screen/large
- name = "large screen"
+ name = "medium screen"
desc = "Takes any data type as an input and displays it to anybody near the device when pulsed. \
It can also be examined to see the last thing it displayed."
icon_state = "screen_medium"
@@ -51,15 +51,29 @@
else
if(!isturf(assembly.loc))
return
+
+ var/atom/host = assembly || src
+ var/list/mobs = list()
+ for(var/mob/M in range(0, get_turf(src)))
+ mobs += M
+ to_chat(mobs, "[icon2html(host.icon, world, host.icon_state)] flashes a message: [stuff_to_display]")
+ host.investigate_log("displayed \"[html_encode(stuff_to_display)]\" as [type].", INVESTIGATE_CIRCUIT)
- var/list/nearby_things = range(0, get_turf(src))
- for(var/mob/M in nearby_things)
- var/obj/O = assembly ? assembly : src
- to_chat(M, "[icon2html(O.icon, world, O.icon_state)] [stuff_to_display]")
- if(assembly)
- assembly.investigate_log("displayed \"[html_encode(stuff_to_display)]\" with [type].", INVESTIGATE_CIRCUIT)
- else
- investigate_log("displayed \"[html_encode(stuff_to_display)]\" as [type].", INVESTIGATE_CIRCUIT)
+/obj/item/integrated_circuit/output/screen/extralarge // the subtype is called "extralarge" because tg brought back medium screens and they named the subtype /screen/large
+ name = "large screen"
+ desc = "Takes any data type as an input and displays it to the user upon examining, and to all nearby beings when pulsed."
+ icon_state = "screen_large"
+ power_draw_per_use = 40
+ cooldown_per_use = 10
+
+/obj/item/integrated_circuit/output/screen/extralarge/do_work()
+ ..()
+ var/atom/host = assembly || src
+ var/list/mobs = list()
+ for(var/mob/M in viewers(7, get_turf(src)))
+ mobs += M
+ to_chat(mobs, "[icon2html(host.icon, world, host.icon_state)] flashes a message: [stuff_to_display]")
+ host.investigate_log("displayed \"[html_encode(stuff_to_display)]\" as [type].", INVESTIGATE_CIRCUIT)
/obj/item/integrated_circuit/output/light
name = "light"
@@ -389,25 +403,4 @@
//Hippie Ported Code--------------------------------------------------------------------------------------------------------
-
-
/obj/item/radio/headset/integrated
-
-/obj/item/integrated_circuit/output/screen/large
- name = "medium screen"
-
-/obj/item/integrated_circuit/output/screen/extralarge // the subtype is called "extralarge" because tg brought back medium screens and they named the subtype /screen/large
- name = "large screen"
- desc = "Takes any data type as an input and displays it to the user upon examining, and to all nearby beings when pulsed."
- icon_state = "screen_large"
- power_draw_per_use = 40
- cooldown_per_use = 10
-
-/obj/item/integrated_circuit/output/screen/extralarge/do_work()
- ..()
- var/obj/O = assembly ? get_turf(assembly) : loc
- O.visible_message("[icon2html(O.icon, world, O.icon_state)] [stuff_to_display]")
- if(assembly)
- assembly.investigate_log("displayed \"[html_encode(stuff_to_display)]\" with [type].", INVESTIGATE_CIRCUIT)
- else
- investigate_log("displayed \"[html_encode(stuff_to_display)]\" as [type].", INVESTIGATE_CIRCUIT)
diff --git a/code/modules/integrated_electronics/subtypes/reagents.dm b/code/modules/integrated_electronics/subtypes/reagents.dm
index 663ba9fe16..991c806f43 100644
--- a/code/modules/integrated_electronics/subtypes/reagents.dm
+++ b/code/modules/integrated_electronics/subtypes/reagents.dm
@@ -514,6 +514,8 @@
outputs = list("volume used" = IC_PINTYPE_NUMBER,"self reference" = IC_PINTYPE_SELFREF,"temperature" = IC_PINTYPE_NUMBER)
spawn_flags = IC_SPAWN_RESEARCH
var/heater_coefficient = 0.1
+ var/max_temp = 1000
+ var/min_temp = 2.7
/obj/item/integrated_circuit/reagent/storage/heater/on_data_written()
if(get_pin_data(IC_INPUT, 2))
@@ -531,7 +533,7 @@
/obj/item/integrated_circuit/reagent/storage/heater/process()
if(power_draw_idle)
- var/target_temperature = get_pin_data(IC_INPUT, 1)
+ var/target_temperature = clamp(get_pin_data(IC_INPUT, 1), min_temp, max_temp)
if(reagents.chem_temp > target_temperature)
reagents.chem_temp += min(-1, (target_temperature - reagents.chem_temp) * heater_coefficient)
if(reagents.chem_temp < target_temperature)
@@ -795,4 +797,4 @@
..()
if(istype(loc,/obj/item/integrated_circuit/input/beaker_connector))
var/obj/item/integrated_circuit/input/beaker_connector/current_circuit = loc
- current_circuit.push_vol()
\ No newline at end of file
+ current_circuit.push_vol()
diff --git a/code/modules/integrated_electronics/subtypes/weaponized.dm b/code/modules/integrated_electronics/subtypes/weaponized.dm
index 3123eeabbe..96a732d08f 100644
--- a/code/modules/integrated_electronics/subtypes/weaponized.dm
+++ b/code/modules/integrated_electronics/subtypes/weaponized.dm
@@ -45,6 +45,9 @@
/obj/item/integrated_circuit/weaponized/weapon_firing/attackby(var/obj/O, var/mob/user)
if(istype(O, /obj/item/gun/energy))
var/obj/item/gun/gun = O
+ if(!gun.can_circuit)
+ to_chat(user, "[gun] does not fit into circuits.")
+ return
if(installed_gun)
to_chat(user, "There's already a weapon installed.")
return
@@ -81,7 +84,7 @@
to_chat(user, "There's no weapon to remove from the mechanism.")
/obj/item/integrated_circuit/weaponized/weapon_firing/do_work()
- if(!assembly || !installed_gun)
+ if(!assembly || !installed_gun || !installed_gun.can_shoot())
return
if(isliving(assembly.loc))
var/mob/living/L = assembly.loc
@@ -246,7 +249,7 @@
var/obj/item/A = get_pin_data_as_type(IC_INPUT, 3, /obj/item)
var/obj/item/integrated_circuit/atmospherics/AT = get_pin_data_as_type(IC_INPUT, 4, /obj/item/integrated_circuit/atmospherics)
- if(!A || A.anchored || A.throwing || A == assembly || istype(A, /obj/item/twohanded) || istype(A, /obj/item/transfer_valve))
+ if(!A || A.anchored || A.throwing || A == assembly || istype(A, /obj/item/transfer_valve) || A.GetComponent(/datum/component/two_handed))
return
var/obj/item/I = get_object()
diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm
index c700d668c5..bd36218211 100644
--- a/code/modules/jobs/job_types/_job.dm
+++ b/code/modules/jobs/job_types/_job.dm
@@ -203,21 +203,24 @@
var/pda_slot = SLOT_BELT
/datum/outfit/job/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
- switch(preference_source?.prefs.backbag)
- if(GBACKPACK)
- back = /obj/item/storage/backpack //Grey backpack
- if(GSATCHEL)
- back = /obj/item/storage/backpack/satchel //Grey satchel
- if(GDUFFELBAG)
- back = /obj/item/storage/backpack/duffelbag //Grey Duffel bag
- if(LSATCHEL)
- back = /obj/item/storage/backpack/satchel/leather //Leather Satchel
- if(DSATCHEL)
- back = satchel //Department satchel
- if(DDUFFELBAG)
- back = duffelbag //Department duffel bag
- else
- back = backpack //Department backpack
+ var/preference_backpack = preference_source?.prefs.backbag
+
+ if(preference_backpack)
+ switch(preference_backpack)
+ if(DBACKPACK)
+ back = backpack //Department backpack
+ if(DSATCHEL)
+ back = satchel //Department satchel
+ if(DDUFFELBAG)
+ back = duffelbag //Department duffel bag
+ else
+ var/find_preference_backpack = GLOB.backbaglist[preference_backpack] //attempt to find non-department backpack
+ if(find_preference_backpack)
+ back = find_preference_backpack
+ else //tried loading in a backpack that we don't allow as a loadout one
+ back = backpack
+ else //somehow doesn't have a preference set, should never reach this point but just-in-case
+ back = backpack
//converts the uniform string into the path we'll wear, whether it's the skirt or regular variant
var/holder
diff --git a/code/modules/jobs/job_types/chief_medical_officer.dm b/code/modules/jobs/job_types/chief_medical_officer.dm
index adee2856fa..9cbc15ca28 100644
--- a/code/modules/jobs/job_types/chief_medical_officer.dm
+++ b/code/modules/jobs/job_types/chief_medical_officer.dm
@@ -45,7 +45,7 @@
shoes = /obj/item/clothing/shoes/sneakers/brown
suit = /obj/item/clothing/suit/toggle/labcoat/cmo
l_hand = /obj/item/storage/firstaid/regular
- suit_store = /obj/item/flashlight/pen
+ suit_store = /obj/item/flashlight/pen/paramedic
backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1)
backpack = /obj/item/storage/backpack/medic
diff --git a/code/modules/jobs/job_types/paramedic.dm b/code/modules/jobs/job_types/paramedic.dm
index 9bdfdfe279..c8188cae8a 100644
--- a/code/modules/jobs/job_types/paramedic.dm
+++ b/code/modules/jobs/job_types/paramedic.dm
@@ -36,7 +36,7 @@
suit = /obj/item/clothing/suit/toggle/labcoat/paramedic
belt = /obj/item/storage/belt/medical
l_hand = /obj/item/storage/firstaid/regular
- suit_store = /obj/item/flashlight/pen
+ suit_store = /obj/item/flashlight/pen/paramedic
id = /obj/item/card/id
r_pocket = /obj/item/pinpointer/crew
l_pocket = /obj/item/pda/medical
diff --git a/code/modules/jobs/job_types/shaft_miner.dm b/code/modules/jobs/job_types/shaft_miner.dm
index a09c4376fb..ebf7ba0f1f 100644
--- a/code/modules/jobs/job_types/shaft_miner.dm
+++ b/code/modules/jobs/job_types/shaft_miner.dm
@@ -16,7 +16,7 @@
access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_MINING,
ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MAILSORTING, ACCESS_MINERAL_STOREROOM)
- paycheck = PAYCHECK_HARD
+ paycheck = PAYCHECK_EASY ///Not necessarily easy itself, but it can be trivial to make lot of cash on this job.
paycheck_department = ACCOUNT_CAR
display_order = JOB_DISPLAY_ORDER_SHAFT_MINER
diff --git a/code/modules/keybindings/bindings_client.dm b/code/modules/keybindings/bindings_client.dm
index b4940e0085..3a47cd2315 100644
--- a/code/modules/keybindings/bindings_client.dm
+++ b/code/modules/keybindings/bindings_client.dm
@@ -91,6 +91,11 @@
if(!(next_move_dir_add & movement))
next_move_dir_sub |= movement
+ if(prefs.modless_key_bindings[_key])
+ var/datum/keybinding/kb = GLOB.keybindings_by_name[prefs.modless_key_bindings[_key]]
+ if(kb.can_use(src))
+ kb.up(src)
+
// We don't do full key for release, because for mod keys you
// can hold different keys and releasing any should be handled by the key binding specifically
for (var/kb_name in prefs.key_bindings[_key])
diff --git a/code/modules/keybindings/keybind/combat.dm b/code/modules/keybindings/keybind/combat.dm
index 457fbb0cb2..c4b44b5283 100644
--- a/code/modules/keybindings/keybind/combat.dm
+++ b/code/modules/keybindings/keybind/combat.dm
@@ -25,6 +25,18 @@
var/mob/living/L = user.mob
L.keybind_stop_active_blocking()
+/datum/keybinding/living/active_block_toggle
+ hotkey_keys = list("Unbound")
+ name = "active_block_toggle"
+ full_name = "Block (Toggle)"
+ category = CATEGORY_COMBAT
+ description = "Toggles active blocking system using currenet in hand object, or any found object if applicable."
+
+/datum/keybinding/living/active_block_toggle/down(client/user)
+ var/mob/living/L = user.mob
+ L.keybind_toggle_active_blocking()
+ return TRUE
+
/datum/keybinding/living/active_parry
hotkey_keys = list("Insert", "G")
name = "active_parry"
diff --git a/code/modules/language/language_menu.dm b/code/modules/language/language_menu.dm
index a7ce211a18..0df7c01fca 100644
--- a/code/modules/language/language_menu.dm
+++ b/code/modules/language/language_menu.dm
@@ -11,7 +11,7 @@
/datum/language_menu/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.language_menu_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
- ui = new(user, src, ui_key, "language_menu", "Language Menu", 700, 600, master_ui, state)
+ ui = new(user, src, ui_key, "LanguageMenu", "Language Menu", 700, 600, master_ui, state)
ui.open()
/datum/language_menu/ui_data(mob/user)
diff --git a/code/modules/library/lib_codex_gigas.dm b/code/modules/library/lib_codex_gigas.dm
index 57bf37d528..146c4221f8 100644
--- a/code/modules/library/lib_codex_gigas.dm
+++ b/code/modules/library/lib_codex_gigas.dm
@@ -99,7 +99,7 @@
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, "codex_gigas", name, 450, 450, master_ui, state)
+ ui = new(user, src, ui_key, "CodexGigas", name, 450, 450, master_ui, state)
ui.open()
/obj/item/book/codex_gigas/ui_data(mob/user)
diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm
index ed9fc6d67f..a4d88158e2 100644
--- a/code/modules/library/lib_items.dm
+++ b/code/modules/library/lib_items.dm
@@ -112,7 +112,7 @@
else
return ..()
-/obj/structure/bookcase/attack_hand(mob/living/user)
+/obj/structure/bookcase/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(. || !istype(user))
return
diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm
index 144037b3a7..f777246453 100644
--- a/code/modules/library/lib_machines.dm
+++ b/code/modules/library/lib_machines.dm
@@ -523,10 +523,7 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums
else
return ..()
-/obj/machinery/libraryscanner/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/machinery/libraryscanner/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
usr.set_machine(src)
var/dat = "" //
if(cache)
diff --git a/code/modules/library/soapstone.dm b/code/modules/library/soapstone.dm
index 272e39957e..50f984c44d 100644
--- a/code/modules/library/soapstone.dm
+++ b/code/modules/library/soapstone.dm
@@ -209,7 +209,7 @@
/obj/structure/chisel_message/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.always_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
- ui = new(user, src, ui_key, "engraved_message", name, 600, 300, master_ui, state)
+ ui = new(user, src, ui_key, "EngravedMessage", name, 600, 300, master_ui, state)
ui.open()
/obj/structure/chisel_message/ui_data(mob/user)
diff --git a/code/modules/lighting/lighting_area.dm b/code/modules/lighting/lighting_area.dm
index 58e9a4337a..7e54456483 100644
--- a/code/modules/lighting/lighting_area.dm
+++ b/code/modules/lighting/lighting_area.dm
@@ -24,7 +24,7 @@
/area/vv_edit_var(var_name, var_value)
switch(var_name)
- if("dynamic_lighting")
+ if(NAMEOF(src, dynamic_lighting))
set_dynamic_lighting(var_value)
return TRUE
- return ..()
\ No newline at end of file
+ return ..()
diff --git a/code/modules/lighting/lighting_atom.dm b/code/modules/lighting/lighting_atom.dm
index 779dd9c3ea..71702bef12 100644
--- a/code/modules/lighting/lighting_atom.dm
+++ b/code/modules/lighting/lighting_atom.dm
@@ -89,17 +89,17 @@
/atom/vv_edit_var(var_name, var_value)
switch (var_name)
- if ("light_range")
+ if (NAMEOF(src, light_range))
set_light(l_range=var_value)
datum_flags |= DF_VAR_EDITED
return TRUE
- if ("light_power")
+ if (NAMEOF(src, light_power))
set_light(l_power=var_value)
datum_flags |= DF_VAR_EDITED
return TRUE
- if ("light_color")
+ if (NAMEOF(src, light_color))
set_light(l_color=var_value)
datum_flags |= DF_VAR_EDITED
return TRUE
diff --git a/code/modules/mapping/minimaps.dm b/code/modules/mapping/minimaps.dm
index 29a9fca9b7..7a62e9ab44 100644
--- a/code/modules/mapping/minimaps.dm
+++ b/code/modules/mapping/minimaps.dm
@@ -1,21 +1,27 @@
/datum/minimap
- var/name
+ var/name = "minimap"
+ var/icon/overlay_icon
+ // The map icons
var/icon/map_icon
var/icon/meta_icon
- var/icon/overlay_icon
+
var/list/color_area_names = list()
+
var/minx
var/maxx
var/miny
var/maxy
- var/z_level
- var/id = 0
- var/static/next_id = 0
-/datum/minimap/New(z, x1 = 1, y1 = 1, x2 = world.maxx, y2 = world.maxy, name)
+ var/z_level
+ var/id = ""
+
+/datum/minimap/New(z, x1 = 1, y1 = 1, x2 = world.maxx, y2 = world.maxy, name = "minimap")
+ if(!z)
+ CRASH("ERROR: new minimap requested without z level") //CRASH to halt the operatio
+
src.name = name
- id = ++next_id
z_level = z
+ id = "[md5("[z_level]" + src.name + REF(src))]" //use it's own md5 as a special identifier
var/crop_x1 = x2
var/crop_x2 = x1
@@ -25,10 +31,11 @@
// do the generating
map_icon = new('html/blank.png')
meta_icon = new('html/blank.png')
- map_icon.Scale(x2-x1+1, y2-y1+1) // arrays start at 1
- meta_icon.Scale(x2-x1+1, y2-y1+1)
+ map_icon.Scale(x2 - x1 + 1, y2 - y1 + 1) // arrays start at 1
+ meta_icon.Scale(x2 - x1 + 1, y2 - y1 + 1)
+
var/list/area_to_color = list()
- for(var/turf/T in block(locate(x1,y1,z),locate(x2,y2,z)))
+ for(var/turf/T in block(locate(x1, y1, z_level), locate(x2, y2, z_level)))
var/area/A = T.loc
var/img_x = T.x - x1 + 1 // arrays start at 1
var/img_y = T.y - y1 + 1
@@ -37,21 +44,26 @@
crop_x2 = max(crop_x2, T.x)
crop_y1 = min(crop_y1, T.y)
crop_y2 = max(crop_y2, T.y)
+
var/meta_color = area_to_color[A]
if(!meta_color)
- meta_color = rgb(rand(0,255),rand(0,255),rand(0,255)) // technically conflicts could happen but it's like very unlikely and it's not that big of a deal if one happens
+ meta_color = rgb(rand(0, 255), rand(0, 255), rand(0, 255)) // technically conflicts could happen but it's like very unlikely and it's not that big of a deal if one happens
area_to_color[A] = meta_color
color_area_names[meta_color] = A.name
meta_icon.DrawBox(meta_color, img_x, img_y)
+
if(istype(T, /turf/closed/wall))
map_icon.DrawBox("#000000", img_x, img_y)
+
else if(!istype(A, /area/space))
var/color = A.minimap_color || "#FF00FF"
if(locate(/obj/machinery/power/solar) in T)
color = "#02026a"
+
if((locate(/obj/effect/spawner/structure/window) in T) || (locate(/obj/structure/grille) in T))
color = BlendRGB(color, "#000000", 0.5)
map_icon.DrawBox(color, img_x, img_y)
+
map_icon.Crop(crop_x1, crop_y1, crop_x2, crop_y2)
meta_icon.Crop(crop_x1, crop_y1, crop_x2, crop_y2)
minx = crop_x1
@@ -60,14 +72,17 @@
maxy = crop_y2
overlay_icon = new(map_icon)
overlay_icon.Scale(16, 16)
-
-/datum/minimap/proc/send(mob/user)
+ //we're done baking, now we ship it.
register_asset("minimap-[id].png", map_icon)
register_asset("minimap-[id]-meta.png", meta_icon)
- send_asset_list(user, list("minimap-[id].png" = map_icon, "minimap-[id]-meta.png" = meta_icon), verify=FALSE)
+
+/datum/minimap/proc/send(mob/user)
+ if(!id)
+ CRASH("ERROR: send called, but the minimap id is null/missing. ID: [id]")
+ send_asset_list(user, list("minimap-[id].png" = map_icon, "minimap-[id]-meta.png" = meta_icon))
/datum/minimap_group
- var/list/minimaps
+ var/list/minimaps = list()
var/static/next_id = 0
var/id
var/name
@@ -75,46 +90,62 @@
/datum/minimap_group/New(list/maps, name)
id = ++next_id
src.name = name
- minimaps = maps || list()
+ if(maps)
+ minimaps = maps
/datum/minimap_group/proc/show(mob/user)
if(!length(minimaps))
to_chat(user, "ERROR: Attempted to access an empty datum/minimap_group. This should probably not happen.")
return
+
var/list/datas = list()
var/list/info = list()
- var/datum/minimap/first_map = minimaps[1]
- for(var/i in 1 to length(minimaps))
+
+ for(var/i in 1 to length(minimaps))// OLD: for(var/i in 1 to length(minimaps))
var/datum/minimap/M = minimaps[i]
M.send(user)
- info += ""
+ info += {"
+
+
+
+
+
+
+
+ "}
datas += json_encode(M.color_area_names);
- info = info.Join()
- var/html = {"
-
-
-
-
-
-
-
-[name]
-
-[info]
-"}
+
+
+ "}
- user << browse(html, "window=minimap_[id];size=768x[round(768 / first_map.map_icon.Width() * first_map.map_icon.Height() + 50)]")
+ var/datum/browser/popup = new(user, "minimap_[id]", name, 500, 700)
+ popup.add_head_content(headerJS) //set the head
+ popup.set_content(info)
+ var/datum/minimap/MICO = minimaps[1]
+ popup.set_title_image(MICO.overlay_icon)
+ popup.open(FALSE)
diff --git a/code/modules/mapping/reader.dm b/code/modules/mapping/reader.dm
index a792ee280f..11bcc0ffcf 100644
--- a/code/modules/mapping/reader.dm
+++ b/code/modules/mapping/reader.dm
@@ -213,6 +213,7 @@
var/list/modelCache = build_cache(no_changeturf)
var/space_key = modelCache[SPACE_KEY]
var/list/bounds
+ var/did_expand = FALSE
src.bounds = bounds = list(1.#INF, 1.#INF, 1.#INF, -1.#INF, -1.#INF, -1.#INF)
var/datum/map_orientation_pattern/mode = forced_pattern || GLOB.map_orientation_patterns["[orientation]"] || GLOB.map_orientation_patterns["[SOUTH]"]
var/invert_y = mode.invert_y
@@ -235,6 +236,7 @@
else
while(parsed_z > world.maxz)
world.incrementMaxZ()
+ did_expand = TRUE
if(!no_changeturf)
WARNING("Z-level expansion occurred without no_changeturf set, this may cause problems when /turf/AfterChange is called")
//these values are the same until a new gridset is reached.
@@ -256,11 +258,13 @@
continue
else
world.maxx = placement_x
+ did_expand = TRUE
if(placement_y > world.maxy)
if(cropMap)
break
else
world.maxy = placement_y
+ did_expand = TRUE
if(placement_x < 1)
actual_x += xi
continue
@@ -301,6 +305,9 @@
testing("Skipped loading [turfsSkipped] default turfs")
#endif
+ if(did_expand)
+ world.refresh_atmos_grid()
+
return TRUE
/datum/parsed_map/proc/build_cache(no_changeturf, bad_paths=null)
diff --git a/code/modules/mapping/space_management/multiz_helpers.dm b/code/modules/mapping/space_management/multiz_helpers.dm
index f6db12420a..81c78cec8c 100644
--- a/code/modules/mapping/space_management/multiz_helpers.dm
+++ b/code/modules/mapping/space_management/multiz_helpers.dm
@@ -7,6 +7,20 @@
return get_step(SSmapping.get_turf_below(get_turf(ref)), dir)
return get_step(ref, dir)
+/proc/get_multiz_accessible_levels(center_z)
+ . = list(center_z)
+ var/other_z = center_z
+ var/offset
+ while((offset = SSmapping.level_trait(other_z, ZTRAIT_DOWN)))
+ other_z += offset
+ . += other_z
+ other_z = center_z
+ while((offset = SSmapping.level_trait(other_z, ZTRAIT_UP)))
+ other_z += offset
+ . += other_z
+ return .
+
+
/proc/get_dir_multiz(turf/us, turf/them)
us = get_turf(us)
them = get_turf(them)
@@ -32,16 +46,4 @@
/turf/proc/below()
return get_step_multiz(src, DOWN)
-
-/proc/dir_inverse_multiz(dir)
- var/holder = dir & (UP|DOWN)
- if((holder == NONE) || (holder == (UP|DOWN)))
- return turn(dir, 180)
- dir &= ~(UP|DOWN)
- dir = turn(dir, 180)
- if(holder == UP)
- holder = DOWN
- else
- holder = UP
- dir |= holder
- return dir
\ No newline at end of file
+
\ No newline at end of file
diff --git a/code/modules/mining/abandoned_crates.dm b/code/modules/mining/abandoned_crates.dm
index 94f5be65bf..8c9b0b53e1 100644
--- a/code/modules/mining/abandoned_crates.dm
+++ b/code/modules/mining/abandoned_crates.dm
@@ -149,8 +149,7 @@
if(100)
new /obj/item/clothing/head/bearpelt(src)
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/structure/closet/crate/secure/loot/attack_hand(mob/user)
+/obj/structure/closet/crate/secure/loot/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(locked)
to_chat(user, "The crate is locked with a Deca-code lock.")
var/input = input(usr, "Enter [codelen] digits. All digits must be unique.", "Deca-Code Lock", "") as text
diff --git a/code/modules/mining/aux_base.dm b/code/modules/mining/aux_base.dm
index 6ec205bf7c..006065d048 100644
--- a/code/modules/mining/aux_base.dm
+++ b/code/modules/mining/aux_base.dm
@@ -92,13 +92,13 @@ interface with the mining shuttle at the landing site if a mobile beacon is also
say("Launch sequence activated! Prepare for drop!!")
playsound(loc, 'sound/machines/warning-buzzer.ogg', 70, 0)
launch_warning = FALSE
+ log_shuttle("[key_name(usr)] has launched the auxillary base.")
else if(!shuttle_error)
say("Shuttle request uploaded. Please stand away from the doors.")
else
say("Shuttle interface failed.")
if(href_list["random"] && !possible_destinations)
- usr.changeNext_move(CLICK_CD_RAPID) //Anti-spam
var/list/all_mining_turfs = list()
for (var/z_level in SSmapping.levels_by_trait(ZTRAIT_MINING))
all_mining_turfs += Z_TURFS(z_level)
@@ -274,10 +274,7 @@ interface with the mining shuttle at the landing site if a mobile beacon is also
var/anti_spam_cd = 0 //The linking process might be a bit intensive, so this here to prevent over use.
var/console_range = 15 //Wifi range of the beacon to find the aux base console
-/obj/structure/mining_shuttle_beacon/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/structure/mining_shuttle_beacon/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(anchored)
to_chat(user, "Landing zone already set.")
return
diff --git a/code/modules/mining/aux_base_camera.dm b/code/modules/mining/aux_base_camera.dm
index d461523744..be0a41427f 100644
--- a/code/modules/mining/aux_base_camera.dm
+++ b/code/modules/mining/aux_base_camera.dm
@@ -187,7 +187,7 @@
if(LAZYLEN(S.rcd_vals(owner,B.RCD)))
rcd_target = S //If we don't break out of this loop we'll get the last placed thing
- owner.changeNext_move(CLICK_CD_RANGE)
+ owner.DelayNextAction(CLICK_CD_RANGE)
B.RCD.afterattack(rcd_target, owner, TRUE) //Activate the RCD and force it to work remotely!
playsound(target_turf, 'sound/items/deconstruct.ogg', 60, 1)
diff --git a/code/modules/mining/equipment/explorer_gear.dm b/code/modules/mining/equipment/explorer_gear.dm
index 39f8e296af..cda38033c2 100644
--- a/code/modules/mining/equipment/explorer_gear.dm
+++ b/code/modules/mining/equipment/explorer_gear.dm
@@ -5,10 +5,8 @@
icon_state = "explorer"
item_state = "explorer"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
- min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
cold_protection = CHEST|GROIN|LEGS|ARMS
- max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
- heat_protection = CHEST|GROIN|LEGS|ARMS
+ min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
hoodtype = /obj/item/clothing/head/hooded/explorer
armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50)
flags_inv = HIDEJUMPSUIT|HIDETAUR
@@ -24,9 +22,7 @@
flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS
min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
cold_protection = HEAD
- max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT
- heat_protection = HEAD
- armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50)
+ armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50, "wound" = 10)
resistance_flags = FIRE_PROOF
/obj/item/clothing/suit/hooded/explorer/standard
@@ -50,7 +46,7 @@
visor_flags_inv = HIDEFACIALHAIR
visor_flags_cover = MASKCOVERSMOUTH
actions_types = list(/datum/action/item_action/adjust)
- armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 5, "bio" = 50, "rad" = 0, "fire" = 20, "acid" = 40)
+ armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 5, "bio" = 50, "rad" = 0, "fire" = 20, "acid" = 40, "wound" = 5)
resistance_flags = FIRE_PROOF
/obj/item/clothing/mask/gas/explorer/attack_self(mob/user)
diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm
index dcd8e1a4ae..745c46b131 100644
--- a/code/modules/mining/equipment/kinetic_crusher.dm
+++ b/code/modules/mining/equipment/kinetic_crusher.dm
@@ -1,5 +1,5 @@
/*********************Mining Hammer****************/
-/obj/item/twohanded/kinetic_crusher
+/obj/item/kinetic_crusher
icon = 'icons/obj/mining.dmi'
icon_state = "crusher"
item_state = "crusher0"
@@ -11,8 +11,6 @@
force = 0 //You can't hit stuff unless wielded
w_class = WEIGHT_CLASS_BULKY
slot_flags = ITEM_SLOT_BACK
- force_unwielded = 0
- force_wielded = 20
throwforce = 5
throw_speed = 4
armour_penetration = 10
@@ -28,33 +26,45 @@
var/backstab_bonus = 30
var/light_on = FALSE
var/brightness_on = 7
+ var/wielded = FALSE // track wielded status on item
-/obj/item/twohanded/kinetic_crusher/cyborg //probably give this a unique sprite later
+/obj/item/kinetic_crusher/cyborg //probably give this a unique sprite later
desc = "An integrated version of the standard kinetic crusher with a grinded down axe head to dissuade mis-use against crewmen. Deals damage equal to the standard crusher against creatures, however."
force = 10 //wouldn't want to give a borg a 20 brute melee weapon unemagged now would we
detonation_damage = 60
wielded = 1
-/obj/item/twohanded/kinetic_crusher/cyborg/unwield()
- return
+/obj/item/kinetic_crusher/Initialize()
+ . = ..()
+ RegisterSignal(src, COMSIG_TWOHANDED_WIELD, .proc/on_wield)
+ RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, .proc/on_unwield)
-/obj/item/twohanded/kinetic_crusher/Initialize()
+/obj/item/kinetic_crusher/ComponentInitialize()
. = ..()
AddComponent(/datum/component/butchering, 60, 110) //technically it's huge and bulky, but this provides an incentive to use it
+ AddComponent(/datum/component/two_handed, force_unwielded=0, force_wielded=20)
-/obj/item/twohanded/kinetic_crusher/Destroy()
+/obj/item/kinetic_crusher/Destroy()
QDEL_LIST(trophies)
return ..()
-/obj/item/twohanded/kinetic_crusher/examine(mob/living/user)
+/// triggered on wield of two handed item
+/obj/item/kinetic_crusher/proc/on_wield(obj/item/source, mob/user)
+ wielded = TRUE
+
+/// triggered on unwield of two handed item
+/obj/item/kinetic_crusher/proc/on_unwield(obj/item/source, mob/user)
+ wielded = FALSE
+
+/obj/item/kinetic_crusher/examine(mob/living/user)
. = ..()
- . += "Mark a large creature with the destabilizing force, then hit them in melee to do [force_wielded + detonation_damage] damage."
- . += "Does [force_wielded + detonation_damage + backstab_bonus] damage if the target is backstabbed, instead of [force_wielded + detonation_damage]."
+ . += "Mark a large creature with the destabilizing force, then hit them in melee to do [force + detonation_damage] damage."
+ . += "Does [force + detonation_damage + backstab_bonus] damage if the target is backstabbed, instead of [force + detonation_damage]."
for(var/t in trophies)
var/obj/item/crusher_trophy/T = t
. += "It has \a [T] attached, which causes [T.effect_desc()]."
-/obj/item/twohanded/kinetic_crusher/attackby(obj/item/I, mob/living/user)
+/obj/item/kinetic_crusher/attackby(obj/item/I, mob/living/user)
if(istype(I, /obj/item/crowbar))
if(LAZYLEN(trophies))
to_chat(user, "You remove [src]'s trophies.")
@@ -70,7 +80,7 @@
else
return ..()
-/obj/item/twohanded/kinetic_crusher/attack(mob/living/target, mob/living/carbon/user)
+/obj/item/kinetic_crusher/attack(mob/living/target, mob/living/carbon/user)
if(!wielded)
to_chat(user, "[src] is too heavy to use with one hand.")
return
@@ -84,7 +94,7 @@
if(!QDELETED(C) && !QDELETED(target))
C.total_damage += target_health - target.health //we did some damage, but let's not assume how much we did
-/obj/item/twohanded/kinetic_crusher/afterattack(atom/target, mob/living/user, proximity_flag, clickparams)
+/obj/item/kinetic_crusher/afterattack(atom/target, mob/living/user, proximity_flag, clickparams)
. = ..()
if(istype(target, /obj/item/crusher_trophy))
var/obj/item/crusher_trophy/T = target
@@ -137,28 +147,28 @@
if(user && lavaland_equipment_pressure_check(get_turf(user))) //CIT CHANGE - makes sure below only happens in low pressure environments
user.adjustStaminaLoss(-30)//CIT CHANGE - makes crushers heal stamina
-/obj/item/twohanded/kinetic_crusher/proc/Recharge()
+/obj/item/kinetic_crusher/proc/Recharge()
if(!charged)
charged = TRUE
update_icon()
playsound(src.loc, 'sound/weapons/kenetic_reload.ogg', 60, 1)
-/obj/item/twohanded/kinetic_crusher/ui_action_click(mob/user, actiontype)
+/obj/item/kinetic_crusher/ui_action_click(mob/user, actiontype)
light_on = !light_on
playsound(user, 'sound/weapons/empty.ogg', 100, TRUE)
update_brightness(user)
update_icon()
-/obj/item/twohanded/kinetic_crusher/proc/update_brightness(mob/user = null)
+/obj/item/kinetic_crusher/proc/update_brightness(mob/user = null)
if(light_on)
set_light(brightness_on)
else
set_light(0)
-/obj/item/twohanded/kinetic_crusher/update_icon_state()
- item_state = "crusher[wielded]"
+/obj/item/kinetic_crusher/update_icon_state()
+ item_state = "crusher[wielded]" // this is not icon_state and not supported by 2hcomponent
-/obj/item/twohanded/kinetic_crusher/update_overlays()
+/obj/item/kinetic_crusher/update_overlays()
. = ..()
if(!charged)
. += "[icon_state]_uncharged"
@@ -175,7 +185,7 @@
flag = "bomb"
range = 6
log_override = TRUE
- var/obj/item/twohanded/kinetic_crusher/hammer_synced
+ var/obj/item/kinetic_crusher/hammer_synced
/obj/item/projectile/destabilizer/Destroy()
hammer_synced = null
@@ -214,12 +224,12 @@
return "errors"
/obj/item/crusher_trophy/attackby(obj/item/A, mob/living/user)
- if(istype(A, /obj/item/twohanded/kinetic_crusher))
+ if(istype(A, /obj/item/kinetic_crusher))
add_to(A, user)
else
..()
-/obj/item/crusher_trophy/proc/add_to(obj/item/twohanded/kinetic_crusher/H, mob/living/user)
+/obj/item/crusher_trophy/proc/add_to(obj/item/kinetic_crusher/H, mob/living/user)
for(var/t in H.trophies)
var/obj/item/crusher_trophy/T = t
if(istype(T, denied_type) || istype(src, T.denied_type))
@@ -231,7 +241,7 @@
to_chat(user, "You attach [src] to [H].")
return TRUE
-/obj/item/crusher_trophy/proc/remove_from(obj/item/twohanded/kinetic_crusher/H, mob/living/user)
+/obj/item/crusher_trophy/proc/remove_from(obj/item/kinetic_crusher/H, mob/living/user)
forceMove(get_turf(H))
H.trophies -= src
return TRUE
@@ -318,12 +328,12 @@
/obj/item/crusher_trophy/legion_skull/effect_desc()
return "a kinetic crusher to recharge [bonus_value*0.1] second\s faster"
-/obj/item/crusher_trophy/legion_skull/add_to(obj/item/twohanded/kinetic_crusher/H, mob/living/user)
+/obj/item/crusher_trophy/legion_skull/add_to(obj/item/kinetic_crusher/H, mob/living/user)
. = ..()
if(.)
H.charge_time -= bonus_value
-/obj/item/crusher_trophy/legion_skull/remove_from(obj/item/twohanded/kinetic_crusher/H, mob/living/user)
+/obj/item/crusher_trophy/legion_skull/remove_from(obj/item/kinetic_crusher/H, mob/living/user)
. = ..()
if(.)
H.charge_time += bonus_value
@@ -376,21 +386,19 @@
/obj/item/crusher_trophy/demon_claws/effect_desc()
return "melee hits to do [bonus_value * 0.2] more damage and heal you for [bonus_value * 0.1], with 5X effect on mark detonation"
-/obj/item/crusher_trophy/demon_claws/add_to(obj/item/twohanded/kinetic_crusher/H, mob/living/user)
+/obj/item/crusher_trophy/demon_claws/add_to(obj/item/kinetic_crusher/H, mob/living/user)
. = ..()
if(.)
H.force += bonus_value * 0.2
- H.force_unwielded += bonus_value * 0.2
- H.force_wielded += bonus_value * 0.2
H.detonation_damage += bonus_value * 0.8
+ AddComponent(/datum/component/two_handed, force_wielded=(20 + bonus_value * 0.2))
-/obj/item/crusher_trophy/demon_claws/remove_from(obj/item/twohanded/kinetic_crusher/H, mob/living/user)
+/obj/item/crusher_trophy/demon_claws/remove_from(obj/item/kinetic_crusher/H, mob/living/user)
. = ..()
if(.)
H.force -= bonus_value * 0.2
- H.force_unwielded -= bonus_value * 0.2
- H.force_wielded -= bonus_value * 0.2
H.detonation_damage -= bonus_value * 0.8
+ AddComponent(/datum/component/two_handed, force_wielded=20)
/obj/item/crusher_trophy/demon_claws/on_melee_hit(mob/living/target, mob/living/user)
user.heal_ordered_damage(bonus_value * 0.1, damage_heal_order)
diff --git a/code/modules/mining/equipment/marker_beacons.dm b/code/modules/mining/equipment/marker_beacons.dm
index 8853a56911..296513af8d 100644
--- a/code/modules/mining/equipment/marker_beacons.dm
+++ b/code/modules/mining/equipment/marker_beacons.dm
@@ -103,7 +103,7 @@ GLOBAL_LIST_INIT(marker_beacon_colors, list(
icon_state = "[initial(icon_state)][lowertext(picked_color)]-on"
set_light(light_range, light_power, GLOB.marker_beacon_colors[picked_color])
-/obj/structure/marker_beacon/attack_hand(mob/living/user)
+/obj/structure/marker_beacon/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
diff --git a/code/modules/mining/equipment/regenerative_core.dm b/code/modules/mining/equipment/regenerative_core.dm
index 439929b9c1..1de3a86702 100644
--- a/code/modules/mining/equipment/regenerative_core.dm
+++ b/code/modules/mining/equipment/regenerative_core.dm
@@ -111,9 +111,6 @@
go_inert()
return ..()
-/obj/item/organ/regenerative_core/prepare_eat()
- return null
-
/*************************Legion core********************/
/obj/item/organ/regenerative_core/legion
desc = "A strange rock that crackles with power. It can be used to heal completely, but it will rapidly decay into uselessness."
diff --git a/code/modules/mining/equipment/resonator.dm b/code/modules/mining/equipment/resonator.dm
index 133cb41c33..16dd893c3a 100644
--- a/code/modules/mining/equipment/resonator.dm
+++ b/code/modules/mining/equipment/resonator.dm
@@ -41,7 +41,7 @@
return
if(LAZYLEN(fields) < fieldlimit)
new /obj/effect/temp_visual/resonance(T, user, src, burst_time)
- user.changeNext_move(CLICK_CD_MELEE)
+ user.DelayNextAction(CLICK_CD_MELEE)
/obj/item/resonator/pre_attack(atom/target, mob/user, params)
if(check_allowed_items(target, 1))
diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm
index ab0356aa66..c69e990033 100644
--- a/code/modules/mining/equipment/survival_pod.dm
+++ b/code/modules/mining/equipment/survival_pod.dm
@@ -167,10 +167,7 @@
qdel(src)
return TRUE
-/obj/item/gps/computer/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/item/gps/computer/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
attack_self(user)
//Bed
@@ -204,7 +201,7 @@
var/obj/item/reagent_containers/food/snacks/donkpocket/warm/W = new(src)
load(W)
if(prob(50))
- var/obj/item/storage/pill_bottle/dice/D = new(src)
+ var/obj/item/storage/box/dice/D = new(src)
load(D)
else
var/obj/item/instrument/guitar/G = new(src)
@@ -318,4 +315,4 @@
icon = initial(I.icon)
desc = initial(I.desc)
icon_state = initial(I.icon_state)
- item_state = initial(I.item_state)
\ No newline at end of file
+ item_state = initial(I.item_state)
diff --git a/code/modules/mining/laborcamp/laborstacker.dm b/code/modules/mining/laborcamp/laborstacker.dm
index 14a277a66c..4d0b7dff21 100644
--- a/code/modules/mining/laborcamp/laborstacker.dm
+++ b/code/modules/mining/laborcamp/laborstacker.dm
@@ -8,6 +8,9 @@ GLOBAL_LIST(labor_sheet_values)
icon = 'icons/obj/machines/mining_machines.dmi'
icon_state = "console"
density = FALSE
+ ui_x = 315
+ ui_y = 430
+
var/obj/machinery/mineral/stacking_machine/laborstacker/stacking_machine = null
var/machinedir = SOUTH
var/obj/machinery/door/airlock/release_door
@@ -36,7 +39,7 @@ GLOBAL_LIST(labor_sheet_values)
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, "labor_claim_console", name, 315, 430, master_ui, state)
+ ui = new(user, src, ui_key, "LaborClaimConsole", name, ui_x, ui_y, master_ui, state)
ui.open()
/obj/machinery/mineral/labor_claim_console/ui_data(mob/user)
@@ -100,7 +103,6 @@ GLOBAL_LIST(labor_sheet_values)
Radio.talk_into(src, "A prisoner has returned to the station. Minerals and Prisoner ID card ready for retrieval.", FREQ_SECURITY)
to_chat(usr, "Shuttle received message and will be sent shortly.")
. = TRUE
-
/obj/machinery/mineral/labor_claim_console/proc/locate_stacking_machine()
stacking_machine = locate(/obj/machinery/mineral/stacking_machine, get_step(src, machinedir))
@@ -110,12 +112,9 @@ GLOBAL_LIST(labor_sheet_values)
qdel(src)
/obj/machinery/mineral/labor_claim_console/emag_act(mob/user)
- . = ..()
- if(obj_flags & EMAGGED)
- return
- obj_flags |= EMAGGED
- to_chat(user, "PZZTTPFFFT")
- return TRUE
+ if(!(obj_flags & EMAGGED))
+ obj_flags |= EMAGGED
+ to_chat(user, "PZZTTPFFFT")
/**********************Prisoner Collection Unit**************************/
@@ -142,10 +141,7 @@ GLOBAL_LIST(labor_sheet_values)
icon_state = "console"
density = FALSE
-/obj/machinery/mineral/labor_points_checker/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/machinery/mineral/labor_points_checker/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
user.examinate(src)
/obj/machinery/mineral/labor_points_checker/attackby(obj/item/I, mob/user, params)
diff --git a/code/modules/mining/lavaland/ash_flora.dm b/code/modules/mining/lavaland/ash_flora.dm
index 38830fd824..9710773309 100644
--- a/code/modules/mining/lavaland/ash_flora.dm
+++ b/code/modules/mining/lavaland/ash_flora.dm
@@ -62,10 +62,7 @@
else
return ..()
-/obj/structure/flora/ash/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/structure/flora/ash/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(!harvested && !needs_sharp_harvest)
user.visible_message("[user] starts to harvest from [src].","You begin to harvest from [src].")
if(do_after(user, harvest_time, target = src))
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index 3226008ecf..4041108777 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -616,7 +616,7 @@
setDir(user.dir)
user.forceMove(src)
- user.notransform = TRUE
+ user.mob_transforming = TRUE
user.status_flags |= GODMODE
can_destroy = FALSE
@@ -625,7 +625,7 @@
/obj/effect/immortality_talisman/proc/unvanish(mob/user)
user.status_flags &= ~GODMODE
- user.notransform = FALSE
+ user.mob_transforming = FALSE
user.forceMove(get_turf(src))
user.visible_message("[user] pops back into reality!")
@@ -791,6 +791,8 @@
var/bleed_stacks_per_hit = 3
total_mass = 2.75
total_mass_on = 5
+ attack_speed = 0
+ attack_unwieldlyness = CLICK_CD_MELEE * 0.5
/obj/item/melee/transforming/cleaving_saw/examine(mob/user)
. = ..()
@@ -809,8 +811,12 @@
return FALSE
. = ..()
if(.)
+ if(active)
+ attack_unwieldlyness = CLICK_CD_MELEE
+ else
+ attack_unwieldlyness = CLICK_CD_MELEE * 0.5
transform_cooldown = world.time + (CLICK_CD_MELEE * 0.5)
- user.changeNext_move(CLICK_CD_MELEE * 0.25)
+ user.SetNextAction(CLICK_CD_MELEE * 0.25, considered_action = FALSE, flush = TRUE)
/obj/item/melee/transforming/cleaving_saw/transform_messages(mob/living/user, supress_message_text)
if(!supress_message_text)
@@ -825,11 +831,6 @@
to_chat(user, "You accidentally cut yourself with [src], like a doofus!")
user.take_bodypart_damage(10)
-/obj/item/melee/transforming/cleaving_saw/melee_attack_chain(mob/user, atom/target, params)
- ..()
- if(!active)
- user.changeNext_move(CLICK_CD_MELEE * 0.5) //when closed, it attacks very rapidly
-
/obj/item/melee/transforming/cleaving_saw/nemesis_effects(mob/living/user, mob/living/target)
var/datum/status_effect/stacking/saw_bleed/B = target.has_status_effect(STATUS_EFFECT_SAWBLEED)
if(!B)
@@ -1229,7 +1230,7 @@
var/blast_range = 13 //how long the cardinal blast's walls are
var/obj/effect/hierophant/beacon //the associated beacon we teleport to
var/teleporting = FALSE //if we ARE teleporting
- var/friendly_fire_check = FALSE //if the blasts we make will consider our faction against the faction of hit targets
+ var/friendly_fire_check = TRUE //if the blasts we make will consider our faction against the faction of hit targets
/obj/item/hierophant_club/ComponentInitialize()
. = ..()
diff --git a/code/modules/mining/lavaland/ruins/gym.dm b/code/modules/mining/lavaland/ruins/gym.dm
index 1c535fd9ab..c26631be74 100644
--- a/code/modules/mining/lavaland/ruins/gym.dm
+++ b/code/modules/mining/lavaland/ruins/gym.dm
@@ -8,7 +8,7 @@
var/list/hit_sounds = list('sound/weapons/genhit1.ogg', 'sound/weapons/genhit2.ogg', 'sound/weapons/genhit3.ogg',\
'sound/weapons/punch1.ogg', 'sound/weapons/punch2.ogg', 'sound/weapons/punch3.ogg', 'sound/weapons/punch4.ogg')
-/obj/structure/punching_bag/attack_hand(mob/user as mob)
+/obj/structure/punching_bag/on_attack_hand(mob/user as mob)
. = ..()
if(.)
return
@@ -29,7 +29,7 @@
/obj/structure/weightmachine/proc/AnimateMachine(mob/living/user)
return
-/obj/structure/weightmachine/attack_hand(mob/living/user)
+/obj/structure/weightmachine/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
@@ -92,4 +92,4 @@
sleep(3)
animate(user, pixel_y = 2, time = 3)
sleep(3)
- cut_overlay(swole_overlay)
\ No newline at end of file
+ cut_overlay(swole_overlay)
diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm
index 512fa8f3e4..851d78004b 100644
--- a/code/modules/mining/machine_processing.dm
+++ b/code/modules/mining/machine_processing.dm
@@ -3,9 +3,54 @@
/**********************Mineral processing unit console**************************/
/obj/machinery/mineral
+ speed_process = TRUE
+ init_process = FALSE
+ /// The current direction of `input_turf`, in relation to the machine.
var/input_dir = NORTH
+ /// The current direction, in relation to the machine, that items will be output to.
var/output_dir = SOUTH
+ /// The turf the machines listens to for items to pick up. Calls the `pickup_item()` proc.
+ var/turf/input_turf = null
+ /// Determines if this machine needs to pick up items. Used to avoid registering signals to `/mineral` machines that don't pickup items.
+ var/needs_item_input = FALSE
+/obj/machinery/mineral/Initialize(mapload)
+ . = ..()
+ if(needs_item_input && anchored)
+ register_input_turf()
+
+/// Gets the turf in the `input_dir` direction adjacent to the machine, and registers signals for ATOM_ENTERED and ATOM_CREATED. Calls the `pickup_item()` proc when it receives these signals.
+/obj/machinery/mineral/proc/register_input_turf()
+ input_turf = get_step(src, input_dir)
+ if(input_turf) // make sure there is actually a turf
+ RegisterSignal(input_turf, list(COMSIG_ATOM_CREATED, COMSIG_ATOM_ENTERED), .proc/pickup_item)
+
+/// Unregisters signals that are registered the machine's input turf, if it has one.
+/obj/machinery/mineral/proc/unregister_input_turf()
+ if(input_turf)
+ UnregisterSignal(input_turf, list(COMSIG_ATOM_ENTERED, COMSIG_ATOM_CREATED))
+
+/obj/machinery/mineral/Moved()
+ . = ..()
+ if(!needs_item_input || !anchored)
+ return
+ unregister_input_turf()
+ register_input_turf()
+
+/**
+ Base proc for all `/mineral` subtype machines to use. Place your item pickup behavior in this proc when you override it for your specific machine.
+
+ Called when the COMSIG_ATOM_ENTERED and COMSIG_ATOM_CREATED signals are sent.
+
+ Arguments:
+ * source - the turf that is listening for the signals.
+ * target - the atom that just moved onto the `source` turf.
+ * oldLoc - the old location that `target` was at before moving onto `source`.
+*/
+/obj/machinery/mineral/proc/pickup_item(datum/source, atom/movable/target, atom/oldLoc)
+ return
+
+/// Generic unloading proc. Takes an atom as an argument and forceMove's it to the turf adjacent to this machine in the `output_dir` direction.
/obj/machinery/mineral/proc/unload_mineral(atom/movable/S)
S.forceMove(drop_location())
var/turf/T = get_step(src,output_dir)
@@ -19,7 +64,6 @@
density = TRUE
var/obj/machinery/mineral/processing_unit/machine = null
var/machinedir = EAST
- speed_process = TRUE
/obj/machinery/mineral/processing_unit_console/Initialize()
. = ..()
@@ -58,6 +102,7 @@
if(href_list["set_on"])
machine.on = (href_list["set_on"] == "on")
+ START_PROCESSING(SSmachines, machine)
updateUsrDialog()
return
@@ -75,6 +120,7 @@
icon = 'icons/obj/machines/mining_machines.dmi'
icon_state = "furnace"
density = TRUE
+ needs_item_input = TRUE
var/obj/machinery/mineral/CONSOLE = null
var/on = FALSE
var/datum/material/selected_material = null
@@ -93,11 +139,10 @@
QDEL_NULL(stored_research)
return ..()
-/obj/machinery/mineral/processing_unit/HasProximity(atom/movable/AM)
- if(istype(AM, /obj/item/stack/ore) && AM.loc == get_step(src, input_dir))
- process_ore(AM)
/obj/machinery/mineral/processing_unit/proc/process_ore(obj/item/stack/ore/O)
+ if(QDELETED(O))
+ return
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
var/material_amount = materials.get_item_material_amount(O)
if(!materials.has_space(material_amount))
@@ -142,8 +187,14 @@
return dat
+/obj/machinery/mineral/processing_unit/pickup_item(datum/source, atom/movable/target, atom/oldLoc)
+ if(QDELETED(target))
+ return
+ if(istype(target, /obj/item/stack/ore))
+ process_ore(target)
+
/obj/machinery/mineral/processing_unit/process()
- if (on)
+ if(on)
if(selected_material)
smelt_ore()
@@ -153,6 +204,8 @@
if(CONSOLE)
CONSOLE.updateUsrDialog()
+ else
+ STOP_PROCESSING(SSmachines, src)
/obj/machinery/mineral/processing_unit/proc/smelt_ore()
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
diff --git a/code/modules/mining/machine_redemption.dm b/code/modules/mining/machine_redemption.dm
index a7b7a84b27..bae0e94032 100644
--- a/code/modules/mining/machine_redemption.dm
+++ b/code/modules/mining/machine_redemption.dm
@@ -57,6 +57,8 @@
. += "The status display reads: Smelting [ore_multiplier] sheet(s) per piece of ore. Reward point generation at [point_upgrade*100]%. Ore pickup speed at [ore_pickup_rate]."
/obj/machinery/mineral/ore_redemption/proc/smelt_ore(obj/item/stack/ore/O)
+ if(QDELETED(O))
+ return
var/datum/component/material_container/mat_container = materials.mat_container
if (!mat_container)
return
@@ -196,7 +198,7 @@
/obj/machinery/mineral/ore_redemption/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
- ui = new(user, src, ui_key, "ore_redemption_machine", "Ore Redemption Machine", 440, 550, master_ui, state)
+ ui = new(user, src, ui_key, "OreRedemptionMachine", "Ore Redemption Machine", 440, 550, master_ui, state)
ui.open()
/obj/machinery/mineral/ore_redemption/ui_data(mob/user)
diff --git a/code/modules/mining/machine_stacking.dm b/code/modules/mining/machine_stacking.dm
index 5a83955bce..a5ff27e75e 100644
--- a/code/modules/mining/machine_stacking.dm
+++ b/code/modules/mining/machine_stacking.dm
@@ -92,6 +92,8 @@
return ..()
/obj/machinery/mineral/stacking_machine/HasProximity(atom/movable/AM)
+ if(QDELETED(AM))
+ return
if(istype(AM, /obj/item/stack/sheet) && AM.loc == get_step(src, input_dir))
process_sheet(AM)
@@ -104,6 +106,8 @@
return TRUE
/obj/machinery/mineral/stacking_machine/proc/process_sheet(obj/item/stack/sheet/inp)
+ if(QDELETED(inp))
+ return
var/key = inp.merge_type
var/obj/item/stack/sheet/storage = stack_list[key]
if(!storage) //It's the first of this sheet added
diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm
index ed6d9e31db..b00e291685 100644
--- a/code/modules/mining/machine_vending.dm
+++ b/code/modules/mining/machine_vending.dm
@@ -7,6 +7,8 @@
icon_state = "mining"
density = TRUE
circuit = /obj/item/circuitboard/machine/mining_equipment_vendor
+ ui_x = 425
+ ui_y = 600
var/icon_deny = "mining-deny"
var/obj/item/card/id/inserted_id
var/list/prize_list = list( //if you add something to this, please, for the love of god, sort it by price/type. use tabs and not spaces.
@@ -30,7 +32,7 @@
new /datum/data/mining_equipment("500 Point Transfer Card", /obj/item/card/mining_point_card/mp500, 500),
new /datum/data/mining_equipment("Tracking Implant Kit", /obj/item/storage/box/minertracker, 600),
new /datum/data/mining_equipment("Jaunter", /obj/item/wormhole_jaunter, 750),
- new /datum/data/mining_equipment("Kinetic Crusher", /obj/item/twohanded/kinetic_crusher, 750),
+ new /datum/data/mining_equipment("Kinetic Crusher", /obj/item/kinetic_crusher, 750),
new /datum/data/mining_equipment("Kinetic Accelerator", /obj/item/gun/energy/kinetic_accelerator, 750),
new /datum/data/mining_equipment("Survival Medipen", /obj/item/reagent_containers/hypospray/medipen/survival, 750),
new /datum/data/mining_equipment("Brute First-Aid Kit", /obj/item/storage/firstaid/brute, 800),
@@ -84,9 +86,14 @@
src.equipment_path = path
src.cost = cost
-/obj/machinery/mineral/equipment_vendor/power_change()
- ..()
- update_icon()
+/obj/machinery/mineral/equipment_vendor/Initialize()
+ . = ..()
+ build_inventory()
+
+/obj/machinery/mineral/equipment_vendor/proc/build_inventory()
+ for(var/p in prize_list)
+ var/datum/data/mining_equipment/M = p
+ GLOB.vending_products[M.equipment_path] = 1
/obj/machinery/mineral/equipment_vendor/update_icon_state()
if(powered())
@@ -94,44 +101,82 @@
else
icon_state = "[initial(icon_state)]-off"
-/obj/machinery/mineral/equipment_vendor/ui_interact(mob/user)
- . = ..()
- var/list/dat = list()
- dat += " Equipment point cost list:
Will produce [coinsToProduce] [lowertext(M.name)] coins if enough materials are available. "
- dat += "-10 "
- dat += "-5 "
- dat += "-1 "
- dat += "+1 "
- dat += "+5 "
- dat += "+10 "
-
- dat += "
In total this machine produced [newCoins] coins."
- dat += " Make coins"
- user << browse(dat, "window=mint")
-
-/obj/machinery/mineral/mint/Topic(href, href_list)
- if(..())
- return
- usr.set_machine(src)
- src.add_fingerprint(usr)
- if(processing==1)
- to_chat(usr, "The machine is processing.")
- return
- var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
- if(href_list["choose"])
- var/datum/material/new_material = locate(href_list["choose"])
- if(istype(new_material))
- chosen = new_material
- if(href_list["chooseAmt"])
- coinsToProduce = clamp(coinsToProduce + text2num(href_list["chooseAmt"]), 0, 1000)
- updateUsrDialog()
- if(href_list["makeCoins"])
- var/temp_coins = coinsToProduce
+ if(action == "startpress")
+ if (!processing)
+ produced_coins = 0
processing = TRUE
- icon_state = "coinpress1"
- var/coin_mat = MINERAL_MATERIAL_AMOUNT * 0.2
- var/datum/material/M = chosen
- if(!M)
- updateUsrDialog()
- return
-
- while(coinsToProduce > 0 && materials.use_amount_mat(coin_mat, chosen))
- create_coins()
- coinsToProduce--
- newCoins++
- src.updateUsrDialog()
- sleep(5)
-
- icon_state = "coinpress0"
+ START_PROCESSING(SSmachines, src)
+ return TRUE
+ if (action == "stoppress")
processing = FALSE
- coinsToProduce = temp_coins
- src.updateUsrDialog()
- return
+ STOP_PROCESSING(SSmachines, src)
+ return TRUE
+ if (action == "changematerial")
+ var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
+ for(var/datum/material/mat in materials.materials)
+ if (params["material_name"] == mat.name)
+ chosen = mat
+ return TRUE
/obj/machinery/mineral/mint/proc/create_coins()
var/turf/T = get_step(src,output_dir)
@@ -118,9 +137,10 @@
temp_list[chosen] = 400
if(T)
var/obj/item/O = new /obj/item/coin(src)
- var/obj/item/storage/bag/money/B = locate(/obj/item/storage/bag/money, T)
O.set_custom_materials(temp_list)
- if(!B)
- B = new /obj/item/storage/bag/money(src)
- unload_mineral(B)
- O.forceMove(B)
+ if(QDELETED(bag_to_use) || (bag_to_use.loc != T) || !SEND_SIGNAL(bag_to_use, COMSIG_TRY_STORAGE_INSERT, O, null, TRUE)) //important to send the signal so we don't overfill the bag.
+ bag_to_use = new(src) //make a new bag if we can't find or use the old one.
+ unload_mineral(bag_to_use) //just forcemove memes.
+ O.forceMove(bag_to_use) //don't bother sending the signal, the new bag is empty and all that.
+
+ SSblackbox.record_feedback("amount", "coins_minted", 1)
diff --git a/code/modules/mining/money_bag.dm b/code/modules/mining/money_bag.dm
index 66f99ec40c..7dd13a6fc1 100644
--- a/code/modules/mining/money_bag.dm
+++ b/code/modules/mining/money_bag.dm
@@ -24,4 +24,8 @@
new /obj/item/coin/silver(src)
new /obj/item/coin/gold(src)
new /obj/item/coin/gold(src)
- new /obj/item/coin/adamantine(src)
\ No newline at end of file
+ new /obj/item/coin/adamantine(src)
+
+/obj/item/storage/bag/money/c5000/PopulateContents()
+ for(var/i = 0, i < 5, i++)
+ new /obj/item/stack/spacecash/c1000(src)
\ No newline at end of file
diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm
index f6b7110803..8bc9cc4512 100644
--- a/code/modules/mining/ores_coins.dm
+++ b/code/modules/mining/ores_coins.dm
@@ -17,7 +17,6 @@
var/points = 0 //How many points this ore gets you from the ore redemption machine
var/refined_type = null //What this ore defaults to being refined into
novariants = TRUE // Ore stacks handle their icon updates themselves to keep the illusion that there's more going
- mats_per_stack = MINERAL_MATERIAL_AMOUNT
var/list/stack_overlays
/obj/item/stack/ore/update_overlays()
@@ -211,7 +210,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\
item_state = "slag"
singular_name = "slag chunk"
-/obj/item/twohanded/required/gibtonite
+/obj/item/gibtonite
name = "gibtonite ore"
desc = "Extremely explosive if struck with mining equipment, Gibtonite is often used by miners to speed up their work by using it as a mining charge. This material is illegal to possess by unauthorized personnel under space law."
icon = 'icons/obj/mining.dmi'
@@ -225,12 +224,16 @@ GLOBAL_LIST_INIT(sand_recipes, list(\
var/attacher = "UNKNOWN"
var/det_timer
-/obj/item/twohanded/required/gibtonite/Destroy()
+/obj/item/gibtonite/ComponentInitialize()
+ . = ..()
+ AddComponent(/datum/component/two_handed, require_twohands=TRUE)
+
+/obj/item/gibtonite/Destroy()
qdel(wires)
wires = null
return ..()
-/obj/item/twohanded/required/gibtonite/attackby(obj/item/I, mob/user, params)
+/obj/item/gibtonite/attackby(obj/item/I, mob/user, params)
if(!wires && istype(I, /obj/item/assembly/igniter))
user.visible_message("[user] attaches [I] to [src].", "You attach [I] to [src].")
wires = new /datum/wires/explosive/gibtonite(src)
@@ -258,22 +261,22 @@ GLOBAL_LIST_INIT(sand_recipes, list(\
return
..()
-/obj/item/twohanded/required/gibtonite/attack_self(user)
+/obj/item/gibtonite/attack_self(user)
if(wires)
wires.interact(user)
else
..()
-/obj/item/twohanded/required/gibtonite/bullet_act(obj/item/projectile/P)
+/obj/item/gibtonite/bullet_act(obj/item/projectile/P)
GibtoniteReaction(P.firer)
return ..()
-/obj/item/twohanded/required/gibtonite/ex_act()
+/obj/item/gibtonite/ex_act()
GibtoniteReaction(null, 1)
-/obj/item/twohanded/required/gibtonite/proc/GibtoniteReaction(mob/user, triggered_by = 0)
+/obj/item/gibtonite/proc/GibtoniteReaction(mob/user, triggered_by = 0)
if(!primed)
primed = TRUE
playsound(src,'sound/effects/hit_on_shattered_glass.ogg',50,1)
@@ -299,7 +302,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\
log_game("[key_name(user)] has primed a [name] for detonation at [AREACOORD(bombturf)]")
det_timer = addtimer(CALLBACK(src, .proc/detonate, notify_admins), det_time, TIMER_STOPPABLE)
-/obj/item/twohanded/required/gibtonite/proc/detonate(notify_admins)
+/obj/item/gibtonite/proc/detonate(notify_admins)
if(primed)
switch(quality)
if(GIBTONITE_QUALITY_HIGH)
@@ -335,7 +338,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\
throwforce = 2
w_class = WEIGHT_CLASS_TINY
custom_materials = list(/datum/material/iron = 400)
- material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS | MATERIAL_EFFECTS
+ material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS
var/string_attached
var/list/sideslist = list("heads","tails")
var/cooldown = 0
@@ -387,7 +390,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\
to_chat(user, "There already is a string attached to this coin!")
return
- if (W.use_tool(src, user, 0, 1, max_level = JOB_SKILL_BASIC))
+ if (W.use_tool(src, user, 0, 1, skill_gain_mult = BARE_USE_TOOL_MULT))
add_overlay("coin_string_overlay")
string_attached = 1
to_chat(user, "You attach a string to the coin.")
diff --git a/code/modules/mining/satchel_ore_boxdm.dm b/code/modules/mining/satchel_ore_boxdm.dm
index 1d803371be..ae42ca4745 100644
--- a/code/modules/mining/satchel_ore_boxdm.dm
+++ b/code/modules/mining/satchel_ore_boxdm.dm
@@ -9,6 +9,9 @@
density = TRUE
pressure_resistance = 5*ONE_ATMOSPHERE
+ var/ui_x = 335
+ var/ui_y = 415
+
/obj/structure/ore_box/attackby(obj/item/W, mob/user, params)
if (istype(W, /obj/item/stack/ore))
user.transferItemToLoc(W, src)
@@ -24,21 +27,18 @@
/obj/structure/ore_box/crowbar_act(mob/living/user, obj/item/I)
if(I.use_tool(src, user, 50, volume=50))
- user.visible_message("[user] pries \the [src] apart.",
+ user.visible_message("[user] pries \the [src] apart.",
"You pry apart \the [src].",
- "You hear splitting wood.")
+ "You hear splitting wood.")
deconstruct(TRUE, user)
return TRUE
/obj/structure/ore_box/examine(mob/living/user)
if(Adjacent(user) && istype(user))
ui_interact(user)
- return ..()
-
-/obj/structure/ore_box/attack_hand(mob/user)
. = ..()
- if(.)
- return
+
+/obj/structure/ore_box/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(Adjacent(user))
ui_interact(user)
@@ -62,7 +62,7 @@
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_box", name, 335, 415, master_ui, state)
+ ui = new(user, src, ui_key, "OreBox", name, ui_x, ui_y, master_ui, state)
ui.open()
/obj/structure/ore_box/ui_data()
diff --git a/code/modules/mob/clickdelay.dm b/code/modules/mob/clickdelay.dm
new file mode 100644
index 0000000000..b1df87303e
--- /dev/null
+++ b/code/modules/mob/clickdelay.dm
@@ -0,0 +1,200 @@
+/**
+ * CLICKDELAY HANDLING SYSTEM
+ * How this works is mobs can never do actions until their next_action is at or below world.time, but things can specify extra cooldown
+ * to check for either from the time of last_action or from the end of next_action.
+ *
+ * Clickdelay should always be checked via [CheckActionCooldown()], never manually!
+ */
+
+/mob
+ // CLICKDELAY AND RELATED
+ // Generic clickdelay - Hybrid time-since-last-attack and time-to-next-attack system.
+ // next_action is a hard cooldown, as Click()s will not pass unless it is passed.
+ // last_action is not a hard cooldown and different items can check for different delays.
+ /// Generic clickdelay variable. Marks down the last world.time we did something that should cause or impact generic clickdelay. This should be directly set or set using [DelayNextAction()]. This should only be checked using [CheckActionCooldown()].
+ var/last_action = 0
+ /**
+ * The difference between the above and this is this is set immediately before even the pre-attack begins to ensure clickdelay is respected.
+ * Then, it is flushed or discarded using [FlushLastAttack()] or [DiscardLastAttack()] respectively.
+ */
+
+ var/last_action_immediate = 0
+ /// Generic clickdelay variable. Next world.time we should be able to do something that respects generic clickdelay. This should be set using [DelayNextAction()] This should only be checked using [CheckActionCooldown()].
+ var/next_action = 0
+ /// Ditto
+ var/next_action_immediate = 0
+ /// Default clickdelay for an UnarmedAttack() that successfully passes. Respects action_cooldown_mod.
+ var/unarmed_attack_speed = CLICK_CD_MELEE
+ /// Simple modification variable multiplied to next action modifier on adjust and on checking time since last action using [CheckActionCooldown()].
+ /// This should only be manually modified using multipliers.
+ var/action_cooldown_mod = 1
+ /// Simple modification variable added to amount on adjust and on checking time since last action using [CheckActionCooldown()].
+ /// This should only be manually modified via addition.
+ var/action_cooldown_adjust = 0
+
+ // Resisting - While resisting will give generic clickdelay, it is also on its own resist delay system. However, resisting does not check generic movedelay.
+ // Resist cooldown should only be set at the start of a resist chain - whether this is clicking an alert button, pressing or hotkeying the resist button, or moving to resist out of a locker.
+ /*
+ * Special clickdelay variable for resisting. Last time we did a special action like resisting. This should only be set using [MarkResistTime()].
+ * Use [CheckResistCooldown()] to check cooldowns, this should only be used for the resist action bar visual.
+ */
+ var/last_resist = 0
+ /// How long we should wait before allowing another resist. This should only be manually modified using multipliers.
+ var/resist_cooldown = CLICK_CD_RESIST
+ /// Minimum world time for another resist. This should only be checked using [CheckResistCooldown()].
+ var/next_resist = 0
+
+/**
+ * Applies a delay to next_action before we can do our next action.
+ *
+ * @params
+ * * amount - Amount to delay by
+ * * ignore_mod - ignores next action adjust and mult
+ * * considered_action - Defaults to TRUE - If TRUE, sets last_action to world.time.
+ * * immediate - defaults to TRUE - if TRUE, writes to cached/last_attack_immediate instead of last_attack. This ensures it can't collide with any delay checks in the actual attack.
+ * * flush - defaults to FALSE - Use this while using this proc outside of clickcode to ensure everything is set properly. This should never be set to TRUE if this is called from clickcode.
+ */
+/mob/proc/DelayNextAction(amount = 0, ignore_mod = FALSE, considered_action = TRUE, immediate = TRUE, flush = FALSE)
+ if(immediate)
+ if(considered_action)
+ last_action_immediate = world.time
+ next_action_immediate = max(next_action, world.time + (ignore_mod? amount : (amount * GetActionCooldownMod() + GetActionCooldownAdjust())))
+ else
+ if(considered_action)
+ last_action = world.time
+ next_action = max(next_action, world.time + (ignore_mod? amount : (amount * GetActionCooldownMod() + GetActionCooldownAdjust())))
+ if(flush)
+ FlushCurrentAction()
+ else
+ hud_used?.clickdelay?.mark_dirty()
+
+/**
+ * Get estimated time of next attack.
+ */
+/mob/proc/EstimatedNextActionTime()
+ var/attack_speed = unarmed_attack_speed * GetActionCooldownMod() + GetActionCooldownAdjust()
+ var/obj/item/I = get_active_held_item()
+ if(I)
+ attack_speed = I.GetEstimatedAttackSpeed()
+ if(!I.clickdelay_mod_bypass)
+ attack_speed = attack_speed * GetActionCooldownMod() + GetActionCooldownAdjust()
+ return max(next_action, next_action_immediate, max(last_action, last_action_immediate) + attack_speed)
+
+/**
+ * Sets our next action to. The difference is DelayNextAction cannot reduce next_action under any circumstances while this can.
+ */
+/mob/proc/SetNextAction(amount = 0, ignore_mod = FALSE, considered_action = TRUE, immediate = TRUE, flush = FALSE)
+ if(immediate)
+ if(considered_action)
+ last_action_immediate = world.time
+ next_action_immediate = world.time + (ignore_mod? amount : (amount * GetActionCooldownMod() + GetActionCooldownAdjust()))
+ else
+ if(considered_action)
+ last_action = world.time
+ next_action = world.time + (ignore_mod? amount : (amount * GetActionCooldownMod() + GetActionCooldownAdjust()))
+ if(flush)
+ FlushCurrentAction()
+ else
+ hud_used?.clickdelay?.mark_dirty()
+
+/**
+ * Checks if we can do another action.
+ * Returns TRUE if we can and FALSE if we cannot.
+ *
+ * @params
+ * * cooldown - Time required since last action. Defaults to 0.5
+ * * from_next_action - Defaults to FALSE. Should we check from the tail end of next_action instead of last_action?
+ * * ignore_mod - Defaults to FALSE. Ignore all adjusts and multipliers. Do not use this unless you know what you are doing and have a good reason.
+ * * ignore_next_action - Defaults to FALSE. Ignore next_action and only care about cooldown param and everything else. Generally unused.
+ * * immediate - Defaults to FALSE. Checks last action using immediate, used on the head end of an attack. This is to prevent colliding attacks in case of sleep. Not that you should sleep() in an attack but.. y'know.
+ */
+/mob/proc/CheckActionCooldown(cooldown = 0.5, from_next_action = FALSE, ignore_mod = FALSE, ignore_next_action = FALSE, immediate = FALSE)
+ return (ignore_next_action || (world.time >= (immediate? next_action_immediate : next_action))) && \
+ (world.time >= ((from_next_action? (immediate? next_action_immediate : next_action) : (immediate? last_action_immediate : last_action)) + max(0, ignore_mod? cooldown : (cooldown * GetActionCooldownMod() + GetActionCooldownAdjust()))))
+
+/**
+ * Gets action_cooldown_mod.
+ */
+/mob/proc/GetActionCooldownMod()
+ return action_cooldown_mod
+
+/**
+ * Gets action_cooldown_adjust
+ */
+/mob/proc/GetActionCooldownAdjust()
+ return action_cooldown_adjust
+
+/**
+ * Flushes last_action and next_action
+ */
+/mob/proc/FlushCurrentAction()
+ last_action = last_action_immediate
+ next_action = next_action_immediate
+ hud_used?.clickdelay?.mark_dirty()
+
+/**
+ * Discards last_action and next_action
+ */
+/mob/proc/DiscardCurrentAction()
+ last_action_immediate = last_action
+ next_action_immediate = next_action
+ hud_used?.clickdelay?.mark_dirty()
+
+/**
+ * Checks if we can resist again.
+ */
+/mob/proc/CheckResistCooldown()
+ return (world.time >= next_resist)
+
+/**
+ * Mark the last resist as now.
+ *
+ * @params
+ * * extra_cooldown - Extra cooldown to apply to next_resist. Defaults to this mob's resist_cooldown.
+ * * override - Defaults to FALSE - if TRUE, extra_cooldown will replace the old next_resist even if the old is longer.
+ */
+/mob/proc/MarkResistTime(extra_cooldown = resist_cooldown, override = FALSE)
+ last_resist = world.time
+ next_resist = override? (world.time + extra_cooldown) : max(next_resist, world.time + extra_cooldown)
+ hud_used?.resistdelay?.mark_dirty()
+
+/atom
+ // Standard clickdelay variables
+ // These 3 are all handled at base of atom/attack_hand so uh.. yeah. Make sure that's called.
+ /// Amount of time to check for from a mob's last attack to allow an attack_hand().
+ var/attack_hand_speed = CLICK_CD_MELEE
+ /// Amount of time to hard stagger (no clicking at all) the mob post attack_hand(). Lower = better
+ var/attack_hand_unwieldlyness = 0
+ /// Should we set last action for attack hand? This implies that attack_hands to this atom should flush to clickdelay buffers instead of discarding.
+ var/attack_hand_is_action = FALSE
+
+/obj/item
+ // Standard clickdelay variables
+ /// Amount of time to check for from a mob's last attack, checked before an attack happens. Lower = faster attacks
+ var/attack_speed = CLICK_CD_MELEE
+ /// Amount of time to hard-stagger (no clicking at all) the mob when attacking. Lower = better
+ var/attack_unwieldlyness = 0
+ /// This item bypasses any click delay mods
+ var/clickdelay_mod_bypass = FALSE
+ /// This item checks clickdelay from a user's delayed next action variable rather than the last time they attacked.
+ var/clickdelay_from_next_action = FALSE
+ /// This item ignores next action delays.
+ var/clickdelay_ignores_next_action = FALSE
+
+/**
+ * Checks if a user's clickdelay is met for a standard attack, this is called before an attack happens.
+ */
+/obj/item/proc/CheckAttackCooldown(mob/user, atom/target)
+ return user.CheckActionCooldown(attack_speed, clickdelay_from_next_action, clickdelay_mod_bypass, clickdelay_ignores_next_action)
+
+/**
+ * Called after a successful attack to set a mob's clickdelay.
+ */
+/obj/item/proc/ApplyAttackCooldown(mob/user, atom/target, attackchain_flags)
+ user.DelayNextAction(attack_unwieldlyness, clickdelay_mod_bypass, !(attackchain_flags & ATTACK_IGNORE_ACTION))
+
+/**
+ * Get estimated time that a user has to not attack for to use us
+ */
+/obj/item/proc/GetEstimatedAttackSpeed()
+ return attack_speed
diff --git a/code/modules/mob/dead/dead.dm b/code/modules/mob/dead/dead.dm
index 0c50cb0468..bd3a3d304a 100644
--- a/code/modules/mob/dead/dead.dm
+++ b/code/modules/mob/dead/dead.dm
@@ -68,7 +68,7 @@ INITIALIZE_IMMEDIATE(/mob/dead)
set category = "OOC"
set name = "Server Hop!"
set desc= "Jump to the other server"
- if(notransform)
+ if(mob_transforming)
return
var/list/csa = CONFIG_GET(keyed_list/cross_server)
var/pick
@@ -93,9 +93,9 @@ INITIALIZE_IMMEDIATE(/mob/dead)
to_chat(C, "Sending you to [pick].")
new /obj/screen/splash(C)
- notransform = TRUE
+ mob_transforming = TRUE
sleep(29) //let the animation play
- notransform = FALSE
+ mob_transforming = FALSE
if(!C)
return
diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm
index 36babd9b95..49a3bffd42 100644
--- a/code/modules/mob/dead/new_player/new_player.dm
+++ b/code/modules/mob/dead/new_player/new_player.dm
@@ -398,7 +398,7 @@
humanc = character //Let's retypecast the var to be human,
if(humanc) //These procs all expect humans
- GLOB.data_core.manifest_inject(humanc)
+ GLOB.data_core.manifest_inject(humanc, humanc.client, humanc.client.prefs)
if(SSshuttle.arrivals)
SSshuttle.arrivals.QueueAnnounce(humanc, rank)
else
@@ -412,6 +412,8 @@
give_guns(humanc)
if(GLOB.summon_magic_triggered)
give_magic(humanc)
+ if(GLOB.curse_of_madness_triggered)
+ give_madness(humanc, GLOB.curse_of_madness_triggered)
GLOB.joined_player_list += character.ckey
GLOB.latejoiners += character
@@ -556,12 +558,25 @@
client.prefs.random_character()
client.prefs.real_name = client.prefs.pref_species.random_name(gender,1)
client.prefs.copy_to(H)
+ var/cur_scar_index = client.prefs.scars_index
+ if(client.prefs.persistent_scars && client.prefs.scars_list["[cur_scar_index]"])
+ var/scar_string = client.prefs.scars_list["[cur_scar_index]"]
+ var/valid_scars = ""
+ for(var/scar_line in splittext(scar_string, ";"))
+ if(H.load_scar(scar_line))
+ valid_scars += "[scar_line];"
+
+ client.prefs.scars_list["[cur_scar_index]"] = valid_scars
+ client.prefs.save_character()
+
+ client.prefs.copy_to(H)
H.dna.update_dna_identity()
if(mind)
if(transfer_after)
mind.late_joiner = TRUE
mind.active = 0 //we wish to transfer the key manually
mind.transfer_to(H) //won't transfer key since the mind is not active
+ mind.original_character = H
H.name = real_name
diff --git a/code/modules/mob/dead/observer/notificationprefs.dm b/code/modules/mob/dead/observer/notificationprefs.dm
index 6c1d76eaf3..160abd57e1 100644
--- a/code/modules/mob/dead/observer/notificationprefs.dm
+++ b/code/modules/mob/dead/observer/notificationprefs.dm
@@ -24,7 +24,7 @@
/datum/notificationpanel/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.observer_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
- ui = new(user, src, ui_key, "notificationpanel", "Notification Preferences", 270, 360, master_ui, state)
+ ui = new(user, src, ui_key, "NotificationPreferences", "Notification Preferences", 270, 360, master_ui, state)
ui.open()
/datum/notificationpanel/ui_data(mob/user)
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 397af1b9d0..bb39639ec1 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -54,6 +54,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
// Used for displaying in ghost chat, without changing the actual name
// of the mob
var/deadchat_name
+ var/datum/orbit_menu/orbit_menu
var/datum/spawners_menu/spawners_menu
/mob/dead/observer/Initialize(mapload, mob/body)
@@ -161,6 +162,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
updateallghostimages()
+ QDEL_NULL(orbit_menu)
QDEL_NULL(spawners_menu)
return ..()
@@ -490,10 +492,10 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
set name = "Orbit" // "Haunt"
set desc = "Follow and orbit a mob."
- var/list/mobs = getpois(skip_mindless=1)
- var/input = input("Please, select a mob!", "Haunt", null, null) as null|anything in mobs
- var/mob/target = mobs[input]
- ManualFollow(target)
+ if(!orbit_menu)
+ orbit_menu = new(src)
+
+ orbit_menu.ui_interact(src)
// This is the ghost's follow verb with an argument
/mob/dead/observer/proc/ManualFollow(atom/movable/target)
@@ -837,13 +839,13 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
/mob/dead/observer/vv_edit_var(var_name, var_value)
. = ..()
switch(var_name)
- if("icon")
+ if(NAMEOF(src, icon))
ghostimage_default.icon = icon
ghostimage_simple.icon = icon
- if("icon_state")
+ if(NAMEOF(src, icon_state))
ghostimage_default.icon_state = icon_state
ghostimage_simple.icon_state = icon_state
- if("fun_verbs")
+ if(NAMEOF(src, fun_verbs))
if(fun_verbs)
verbs += /mob/dead/observer/verb/boo
verbs += /mob/dead/observer/verb/possess
@@ -925,7 +927,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
/mob/dead/observer/vv_edit_var(var_name, var_value)
. = ..()
- if(var_name == "invisibility")
+ if(var_name == NAMEOF(src, invisibility))
set_invisibility(invisibility) // updates light
/proc/set_observer_default_invisibility(amount, message=null)
diff --git a/code/modules/mob/dead/observer/orbit.dm b/code/modules/mob/dead/observer/orbit.dm
new file mode 100644
index 0000000000..eb23a5fb67
--- /dev/null
+++ b/code/modules/mob/dead/observer/orbit.dm
@@ -0,0 +1,78 @@
+/datum/orbit_menu
+ var/mob/dead/observer/owner
+
+/datum/orbit_menu/New(mob/dead/observer/new_owner)
+ if(!istype(new_owner))
+ qdel(src)
+ owner = new_owner
+
+/datum/orbit_menu/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.observer_state)
+ if (!ui)
+ ui = new(user, src, ui_key, "Orbit", "Orbit", 350, 700, master_ui, state)
+ ui.open()
+
+/datum/orbit_menu/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
+ if (..())
+ return
+
+ if (action == "orbit")
+ var/list/pois = getpois(skip_mindless = 1)
+ var/atom/movable/poi = pois[params["name"]]
+ if (poi != null)
+ owner.ManualFollow(poi)
+ ui.close()
+
+/datum/orbit_menu/ui_data(mob/user)
+ var/list/data = list()
+
+ var/list/alive = list()
+ var/list/antagonists = list()
+ var/list/dead = list()
+ var/list/ghosts = list()
+ var/list/misc = list()
+ var/list/npcs = list()
+
+ var/list/pois = getpois(skip_mindless = 1)
+ for (var/name in pois)
+ var/list/serialized = list()
+ serialized["name"] = name
+
+ var/poi = pois[name]
+
+ var/mob/M = poi
+ if (istype(M))
+ if (isobserver(M))
+ ghosts += list(serialized)
+ else if (M.stat == DEAD)
+ dead += list(serialized)
+ else if (M.mind == null)
+ npcs += list(serialized)
+ else
+ var/number_of_orbiters = M.orbiters?.orbiters?.len
+ if (number_of_orbiters)
+ serialized["orbiters"] = number_of_orbiters
+
+ var/datum/mind/mind = M.mind
+ var/was_antagonist = FALSE
+
+ for (var/_A in mind.antag_datums)
+ var/datum/antagonist/A = _A
+ if (A.show_to_ghosts)
+ was_antagonist = TRUE
+ serialized["antag"] = A.name
+ antagonists += list(serialized)
+ break
+
+ if (!was_antagonist)
+ alive += list(serialized)
+ else
+ misc += list(serialized)
+
+ data["alive"] = alive
+ data["antagonists"] = antagonists
+ data["dead"] = dead
+ data["ghosts"] = ghosts
+ data["misc"] = misc
+ data["npcs"] = npcs
+
+ return data
diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm
index 74775203b1..caebb9cf10 100644
--- a/code/modules/mob/inventory.dm
+++ b/code/modules/mob/inventory.dm
@@ -5,13 +5,11 @@
/mob/proc/get_active_held_item()
return get_item_for_held_index(active_hand_index)
-
//Finds the opposite limb for the active one (eg: upper left arm will find the item in upper right arm)
//So we're treating each "pair" of limbs as a team, so "both" refers to them
/mob/proc/get_inactive_held_item()
return get_item_for_held_index(get_inactive_hand_index())
-
//Finds the opposite index for the active one (eg: upper left arm will find the item in upper right arm)
//So we're treating each "pair" of limbs as a team, so "both" refers to them
/mob/proc/get_inactive_hand_index()
@@ -24,12 +22,9 @@
other_hand = 0
return other_hand
-
/mob/proc/get_item_for_held_index(i)
if(i > 0 && i <= held_items.len)
return held_items[i]
- return FALSE
-
//Odd = left. Even = right
/mob/proc/held_index_to_dir(i)
@@ -37,17 +32,14 @@
return "r"
return "l"
-
//Check we have an organ for this hand slot (Dismemberment), Only relevant for humans
/mob/proc/has_hand_for_held_index(i)
return TRUE
-
//Check we have an organ for our active hand slot (Dismemberment),Only relevant for humans
/mob/proc/has_active_hand()
return has_hand_for_held_index(active_hand_index)
-
//Finds the first available (null) index OR all available (null) indexes in held_items based on a side.
//Lefts: 1, 3, 5, 7...
//Rights:2, 4, 6, 8...
@@ -158,7 +150,7 @@
//Returns if a certain item can be equipped to a certain slot.
// Currently invalid for two-handed items - call obj/item/mob_can_equip() instead.
-/mob/proc/can_equip(obj/item/I, slot, disable_warning = FALSE, bypass_equip_delay_self = FALSE)
+/mob/proc/can_equip(obj/item/I, slot, disable_warning = FALSE, bypass_equip_delay_self = FALSE, clothing_check = FALSE, list/return_warning)
return FALSE
/mob/proc/can_put_in_hand(I, hand_index)
@@ -338,50 +330,63 @@
return FALSE
return TRUE
+//This is a SAFE proc. Use this instead of equip_to_slot()!
+//set qdel_on_fail to have it delete W if it fails to equip
+//set disable_warning to disable the 'you are unable to equip that' warning.
+//unset redraw_mob to prevent the mob from being redrawn at the end.
+/mob/proc/equip_to_slot_if_possible(obj/item/W, slot, qdel_on_fail = FALSE, disable_warning = FALSE, redraw_mob = TRUE, bypass_equip_delay_self = FALSE, clothing_check = FALSE)
+ if(!istype(W))
+ return FALSE
+ var/list/warning = list("You are unable to equip that!")
+ if(!W.mob_can_equip(src, null, slot, disable_warning, bypass_equip_delay_self, clothing_check, warning))
+ if(qdel_on_fail)
+ qdel(W)
+ else if(!disable_warning)
+ to_chat(src, warning[1])
+ return FALSE
+ equip_to_slot(W, slot, redraw_mob) //This proc should not ever fail.
+ return TRUE
+
+//This is an UNSAFE proc. It merely handles the actual job of equipping. All the checks on whether you can or can't equip need to be done before! Use mob_can_equip() for that task.
+//In most cases you will want to use equip_to_slot_if_possible()
+/mob/proc/equip_to_slot(obj/item/W, slot)
+ return
+
+//This is just a commonly used configuration for the equip_to_slot_if_possible() proc, used to equip people when the round starts and when events happen and such.
+//Also bypasses equip delay checks, since the mob isn't actually putting it on.
+/mob/proc/equip_to_slot_or_del(obj/item/W, slot)
+ return equip_to_slot_if_possible(W, slot, TRUE, TRUE, FALSE, TRUE)
+
+//puts the item "W" into an appropriate slot in a human's inventory
+//returns 0 if it cannot, 1 if successful
+/mob/proc/equip_to_appropriate_slot(obj/item/W, clothing_check = FALSE)
+ if(!istype(W))
+ return 0
+ var/slot_priority = W.slot_equipment_priority
+
+ if(!slot_priority)
+ slot_priority = list( \
+ SLOT_BACK, SLOT_WEAR_ID,\
+ SLOT_W_UNIFORM, SLOT_WEAR_SUIT,\
+ SLOT_WEAR_MASK, SLOT_HEAD, SLOT_NECK,\
+ SLOT_SHOES, SLOT_GLOVES,\
+ SLOT_EARS, SLOT_GLASSES,\
+ SLOT_BELT, SLOT_S_STORE,\
+ SLOT_L_STORE, SLOT_R_STORE,\
+ SLOT_GENERC_DEXTROUS_STORAGE\
+ )
+
+ for(var/slot in slot_priority)
+ if(equip_to_slot_if_possible(W, slot, FALSE, TRUE, TRUE, FALSE, clothing_check)) //qdel_on_fail = 0; disable_warning = 1; redraw_mob = 1
+ return 1
+
+ return 0
+
//Outdated but still in use apparently. This should at least be a human proc.
//Daily reminder to murder this - Remie.
/mob/living/proc/get_equipped_items(include_pockets = FALSE)
return
-/mob/living/carbon/get_equipped_items(include_pockets = FALSE)
- var/list/items = list()
- if(back)
- items += back
- if(head)
- items += head
- if(wear_mask)
- items += wear_mask
- if(wear_neck)
- items += wear_neck
- return items
-
-/mob/living/carbon/human/get_equipped_items(include_pockets = FALSE)
- var/list/items = ..()
- if(belt)
- items += belt
- if(ears)
- items += ears
- if(glasses)
- items += glasses
- if(gloves)
- items += gloves
- if(shoes)
- items += shoes
- if(wear_id)
- items += wear_id
- if(wear_suit)
- items += wear_suit
- if(w_uniform)
- items += w_uniform
- if(include_pockets)
- if(l_store)
- items += l_store
- if(r_store)
- items += r_store
- if(s_store)
- items += s_store
- return items
-
/mob/living/proc/unequip_everything()
var/list/items = list()
items |= get_equipped_items(TRUE)
@@ -394,7 +399,7 @@
to_chat(M, "You are not holding anything to equip!")
return FALSE
- if(M.equip_to_appropriate_slot(src))
+ if(M.equip_to_appropriate_slot(src, TRUE))
M.update_inv_hands()
return TRUE
else
diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm
index a5275f677d..36a6f6296b 100644
--- a/code/modules/mob/living/blood.dm
+++ b/code/modules/mob/living/blood.dm
@@ -5,44 +5,43 @@
#define EXOTIC_BLEED_MULTIPLIER 4 //Multiplies the actually bled amount by this number for the purposes of turf reaction calculations.
-/mob/living/carbon/human/proc/suppress_bloodloss(amount)
- if(bleedsuppress)
+/mob/living/carbon/monkey/handle_blood()
+ if(bodytemperature <= TCRYO || (HAS_TRAIT(src, TRAIT_HUSK))) //cryosleep or husked people do not pump the blood.
return
- else
- bleedsuppress = TRUE
- addtimer(CALLBACK(src, .proc/resume_bleeding), amount)
+
+ var/temp_bleed = 0
+ for(var/X in bodyparts)
+ var/obj/item/bodypart/BP = X
+ temp_bleed += BP.get_bleed_rate()
+ BP.generic_bleedstacks = max(0, BP.generic_bleedstacks - 1)
+ if(temp_bleed)
+ bleed(temp_bleed)
+
+ //Blood regeneration if there is some space
+ if(blood_volume < BLOOD_VOLUME_NORMAL)
+ blood_volume += 0.1 // regenerate blood VERY slowly
+ if(blood_volume < BLOOD_VOLUME_OKAY)
+ adjustOxyLoss(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.02, 1))
/mob/living/carbon/human/proc/resume_bleeding()
bleedsuppress = 0
- if(stat != DEAD && bleed_rate)
+ if(stat != DEAD && is_bleeding())
to_chat(src, "The blood soaks through your bandage.")
-/mob/living/carbon/monkey/handle_blood()
- if(bodytemperature >= TCRYO && !(HAS_TRAIT(src, TRAIT_NOCLONE))) //cryosleep or husked people do not pump the blood.
- //Blood regeneration if there is some space
- if(blood_volume < (BLOOD_VOLUME_NORMAL * blood_ratio))
- blood_volume += 0.1 // regenerate blood VERY slowly
- if(blood_volume < (BLOOD_VOLUME_OKAY * blood_ratio))
- adjustOxyLoss(round(((BLOOD_VOLUME_NORMAL * blood_ratio) - blood_volume) * 0.02, 1))
-
// Takes care blood loss and regeneration
/mob/living/carbon/human/handle_blood()
- if(NOBLOOD in dna.species.species_traits)
- bleed_rate = 0
+ if(NOBLOOD in dna.species.species_traits || bleedsuppress || (HAS_TRAIT(src, TRAIT_FAKEDEATH)))
return
- if(bleed_rate < 0)
- bleed_rate = 0
-
if(HAS_TRAIT(src, TRAIT_NOMARROW)) //Bloodsuckers don't need to be here.
return
- if(bodytemperature >= TCRYO && !(HAS_TRAIT(src, TRAIT_NOCLONE))) //cryosleep or husked people do not pump the blood.
+ if(bodytemperature >= TCRYO && !(HAS_TRAIT(src, TRAIT_HUSK))) //cryosleep or husked people do not pump the blood.
//Blood regeneration if there is some space
- if(blood_volume < (BLOOD_VOLUME_NORMAL * blood_ratio) && !HAS_TRAIT(src, TRAIT_NOHUNGER))
+ if(blood_volume < BLOOD_VOLUME_NORMAL && !HAS_TRAIT(src, TRAIT_NOHUNGER))
var/nutrition_ratio = 0
switch(nutrition)
if(0 to NUTRITION_LEVEL_STARVING)
@@ -55,22 +54,27 @@
nutrition_ratio = 0.8
else
nutrition_ratio = 1
- if(HAS_TRAIT(src, TRAIT_HIGH_BLOOD))
- nutrition_ratio *= 1.2
if(satiety > 80)
nutrition_ratio *= 1.25
adjust_nutrition(-nutrition_ratio * HUNGER_FACTOR)
- blood_volume = min((BLOOD_VOLUME_NORMAL * blood_ratio), blood_volume + 0.5 * nutrition_ratio)
+ blood_volume = min(BLOOD_VOLUME_NORMAL, blood_volume + 0.5 * nutrition_ratio)
//Effects of bloodloss
var/word = pick("dizzy","woozy","faint")
- switch(blood_volume * INVERSE(blood_ratio))
+ switch(blood_volume)
+ if(BLOOD_VOLUME_EXCESS to BLOOD_VOLUME_MAX_LETHAL)
+ if(prob(15))
+ to_chat(src, "Blood starts to tear your skin apart. You're going to burst!")
+ gib()
+ if(BLOOD_VOLUME_MAXIMUM to BLOOD_VOLUME_EXCESS)
+ if(prob(10))
+ to_chat(src, "You feel terribly bloated.")
if(BLOOD_VOLUME_OKAY to BLOOD_VOLUME_SAFE)
if(prob(5))
to_chat(src, "You feel [word].")
- adjustOxyLoss(round(((BLOOD_VOLUME_NORMAL * blood_ratio) - blood_volume) * 0.01, 1))
+ adjustOxyLoss(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.01, 1))
if(BLOOD_VOLUME_BAD to BLOOD_VOLUME_OKAY)
- adjustOxyLoss(round(((BLOOD_VOLUME_NORMAL * blood_ratio) - blood_volume) * 0.02, 1))
+ adjustOxyLoss(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.02, 1))
if(prob(5))
blur_eyes(6)
to_chat(src, "You feel very [word].")
@@ -87,22 +91,11 @@
//Bleeding out
for(var/X in bodyparts)
var/obj/item/bodypart/BP = X
- var/brutedamage = BP.brute_dam
+ temp_bleed += BP.get_bleed_rate()
+ BP.generic_bleedstacks = max(0, BP.generic_bleedstacks - 1)
- if(BP.status == BODYPART_ROBOTIC) //for the moment, synth limbs won't bleed, but soon, my pretty.
- continue
-
- //We want an accurate reading of .len
- listclearnulls(BP.embedded_objects)
- temp_bleed += 0.5 * BP.embedded_objects.len
-
- if(brutedamage >= 20)
- temp_bleed += (brutedamage * 0.013)
-
- bleed_rate = max(bleed_rate - 0.5, temp_bleed)//if no wounds, other bleed effects (heparin) naturally decreases
-
- if(bleed_rate && !bleedsuppress && !(HAS_TRAIT(src, TRAIT_FAKEDEATH)))
- bleed(bleed_rate)
+ if(temp_bleed)
+ bleed(temp_bleed)
//Makes a blood drop, leaking amt units of blood from the mob
/mob/living/carbon/proc/bleed(amt)
@@ -126,9 +119,11 @@
/mob/living/proc/restore_blood()
blood_volume = initial(blood_volume)
-/mob/living/carbon/human/restore_blood()
+/mob/living/carbon/restore_blood()
blood_volume = (BLOOD_VOLUME_NORMAL * blood_ratio)
- bleed_rate = 0
+ for(var/i in bodyparts)
+ var/obj/item/bodypart/BP = i
+ BP.generic_bleedstacks = 0
/****************************************************
BLOOD TRANSFERS
@@ -186,7 +181,7 @@
blood_data["viruses"] += D.Copy()
blood_data["blood_DNA"] = dna.unique_enzymes
- blood_data["bloodcolor"] = bloodtype_to_color(dna.blood_type)
+ blood_data["bloodcolor"] = dna.species.exotic_blood_color
if(disease_resistances && disease_resistances.len)
blood_data["resistances"] = disease_resistances.Copy()
var/list/temp_chem = list()
diff --git a/code/modules/mob/living/bloodcrawl.dm b/code/modules/mob/living/bloodcrawl.dm
index 3547d5f846..d3dbfac8c8 100644
--- a/code/modules/mob/living/bloodcrawl.dm
+++ b/code/modules/mob/living/bloodcrawl.dm
@@ -37,10 +37,10 @@
C.put_in_hands(B1)
C.put_in_hands(B2)
C.regenerate_icons()
- src.notransform = TRUE
+ src.mob_transforming = TRUE
spawn(0)
bloodpool_sink(B)
- src.notransform = FALSE
+ src.mob_transforming = FALSE
return 1
/mob/living/proc/bloodpool_sink(obj/effect/decal/cleanable/B)
@@ -155,7 +155,7 @@
addtimer(CALLBACK(src, /atom/.proc/remove_atom_colour, TEMPORARY_COLOUR_PRIORITY, newcolor), 6 SECONDS)
/mob/living/proc/phasein(obj/effect/decal/cleanable/B)
- if(src.notransform)
+ if(src.mob_transforming)
to_chat(src, "Finish eating first!")
return 0
B.visible_message("[B] starts to bubble...")
diff --git a/code/modules/mob/living/brain/MMI.dm b/code/modules/mob/living/brain/MMI.dm
index d1258ce6e4..891243496a 100644
--- a/code/modules/mob/living/brain/MMI.dm
+++ b/code/modules/mob/living/brain/MMI.dm
@@ -39,7 +39,9 @@
laws.set_laws_config()
/obj/item/mmi/attackby(obj/item/O, mob/user, params)
- user.changeNext_move(CLICK_CD_MELEE)
+ if(!user.CheckActionCooldown(CLICK_CD_MELEE))
+ return
+ user.DelayNextAction()
if(istype(O, /obj/item/organ/brain)) //Time to stick a brain in it --NEO
var/obj/item/organ/brain/newbrain = O
if(brain)
diff --git a/code/modules/mob/living/brain/brain.dm b/code/modules/mob/living/brain/brain.dm
index 08d415fc3c..be03827695 100644
--- a/code/modules/mob/living/brain/brain.dm
+++ b/code/modules/mob/living/brain/brain.dm
@@ -100,3 +100,9 @@
client.mouse_pointer_icon = M.mouse_pointer
if (client && ranged_ability && ranged_ability.ranged_mousepointer)
client.mouse_pointer_icon = ranged_ability.ranged_mousepointer
+
+/mob/living/brain/proc/get_traumas()
+ . = list()
+ if(istype(loc, /obj/item/organ/brain))
+ var/obj/item/organ/brain/B = loc
+ . = B.traumas
diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm
index 687442c1f8..a853416e6f 100644
--- a/code/modules/mob/living/brain/brain_item.dm
+++ b/code/modules/mob/living/brain/brain_item.dm
@@ -76,9 +76,6 @@
REMOVE_SKILL_MODIFIER_BODY(/datum/skill_modifier/heavy_brain_damage, null, C)
C.update_hair()
-/obj/item/organ/brain/prepare_eat()
- return // Too important to eat.
-
/obj/item/organ/brain/proc/transfer_identity(mob/living/L)
name = "[L.name]'s brain"
if(brainmob)
@@ -105,7 +102,7 @@
to_chat(brainmob, "You feel slightly disoriented. That's normal when you're just a brain.")
/obj/item/organ/brain/attackby(obj/item/O, mob/user, params)
- user.changeNext_move(CLICK_CD_MELEE)
+ user.DelayNextAction(CLICK_CD_MELEE)
if(brainmob)
O.attack(brainmob, user) //Oh noooeeeee
@@ -334,6 +331,8 @@
max_traumas = TRAUMA_LIMIT_BASIC
if(TRAUMA_RESILIENCE_SURGERY)
max_traumas = TRAUMA_LIMIT_SURGERY
+ if(TRAUMA_RESILIENCE_WOUND)
+ max_traumas = TRAUMA_LIMIT_WOUND
if(TRAUMA_RESILIENCE_LOBOTOMY)
max_traumas = TRAUMA_LIMIT_LOBOTOMY
if(TRAUMA_RESILIENCE_MAGIC)
@@ -392,7 +391,7 @@
return
var/trauma_type = pick(possible_traumas)
- gain_trauma(trauma_type, resilience)
+ return gain_trauma(trauma_type, resilience)
//Cure a random trauma of a certain resilience level
/obj/item/organ/brain/proc/cure_trauma_type(brain_trauma_type = /datum/brain_trauma, resilience = TRAUMA_RESILIENCE_BASIC)
diff --git a/code/modules/mob/living/brain/life.dm b/code/modules/mob/living/brain/life.dm
index 51be1f6971..6d06da41ae 100644
--- a/code/modules/mob/living/brain/life.dm
+++ b/code/modules/mob/living/brain/life.dm
@@ -1,11 +1,7 @@
-/mob/living/brain/Life()
- set invisibility = 0
- if (notransform)
+/mob/living/brain/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
return
- if(!loc)
- return
- . = ..()
handle_emp_damage()
/mob/living/brain/update_stat()
diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm
index 442bcf8027..951185ee92 100644
--- a/code/modules/mob/living/carbon/alien/alien.dm
+++ b/code/modules/mob/living/carbon/alien/alien.dm
@@ -25,7 +25,7 @@
status_flags = CANUNCONSCIOUS|CANPUSH
- var/heat_protection = 0.5
+ heat_protection = 0.5
var/leaping = 0
gib_type = /obj/effect/decal/cleanable/blood/gibs/xeno
unique_name = 1
diff --git a/code/modules/mob/living/carbon/alien/alien_defense.dm b/code/modules/mob/living/carbon/alien/alien_defense.dm
index 00ce3a320a..5081fd8a14 100644
--- a/code/modules/mob/living/carbon/alien/alien_defense.dm
+++ b/code/modules/mob/living/carbon/alien/alien_defense.dm
@@ -8,9 +8,6 @@
/mob/living/carbon/alien/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum)
return ..(AM, skipcatch = TRUE, hitpush = FALSE)
-/mob/living/carbon/alien/can_embed(obj/item/I)
- return FALSE
-
/*Code for aliens attacking aliens. Because aliens act on a hivemind, I don't see them as very aggressive with each other.
As such, they can either help or harm other aliens. Help works like the human help command while harm is a simple nibble.
In all, this is a lot like the monkey code. /N
@@ -48,12 +45,14 @@ In all, this is a lot like the monkey code. /N
return attack_alien(L)
-/mob/living/carbon/alien/attack_hand(mob/living/carbon/human/M)
+/mob/living/carbon/alien/on_attack_hand(mob/living/carbon/human/M)
. = ..()
if(.) //To allow surgery to return properly.
return
switch(M.a_intent)
if(INTENT_HELP)
+ if(M == src && check_self_for_injuries())
+ return
help_shake_act(M)
if(INTENT_GRAB)
grabbedby(M)
@@ -75,7 +74,6 @@ In all, this is a lot like the monkey code. /N
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected))
apply_damage(rand(1, 3), BRUTE, affecting)
-
/mob/living/carbon/alien/attack_animal(mob/living/simple_animal/M)
. = ..()
if(.)
diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
index 727a22f844..d0addbab21 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
@@ -57,8 +57,17 @@
/mob/living/carbon/alien/humanoid/Topic(href, href_list)
..()
- //strip panel
+ //strip panel & embeds
if(usr.canUseTopic(src, BE_CLOSE, NO_DEXTERY))
+ if(href_list["embedded_object"])
+ var/obj/item/bodypart/L = locate(href_list["embedded_limb"]) in bodyparts
+ if(!L)
+ return
+ var/obj/item/I = locate(href_list["embedded_object"]) in L.embedded_objects
+ if(!I || I.loc != src) //no item, no limb, or item is not in limb or in the alien anymore
+ return
+ SEND_SIGNAL(src, COMSIG_CARBON_EMBED_RIP, I, L)
+ return
if(href_list["pouches"])
visible_message("[usr] tries to empty [src]'s pouches.", \
"[usr] tries to empty [src]'s pouches.")
diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm
index 5ebf6210d0..8177360d4a 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm
@@ -21,7 +21,7 @@
"[user] has [hitverb] [src]!", null, COMBAT_MESSAGE_RANGE)
return 1
-/mob/living/carbon/alien/humanoid/attack_hand(mob/living/carbon/human/M)
+/mob/living/carbon/alien/humanoid/on_attack_hand(mob/living/carbon/human/M)
. = ..()
if(.) //To allow surgery to return properly.
return
diff --git a/code/modules/mob/living/carbon/alien/humanoid/inventory.dm b/code/modules/mob/living/carbon/alien/humanoid/inventory.dm
deleted file mode 100644
index e2537f0f4f..0000000000
--- a/code/modules/mob/living/carbon/alien/humanoid/inventory.dm
+++ /dev/null
@@ -1,5 +0,0 @@
-/mob/living/carbon/alien/humanoid/doUnEquip(obj/item/I)
- . = ..()
- if(!. || !I)
- return
-
diff --git a/code/modules/mob/living/carbon/alien/larva/larva_defense.dm b/code/modules/mob/living/carbon/alien/larva/larva_defense.dm
index 7dabcf5abf..5832996a2c 100644
--- a/code/modules/mob/living/carbon/alien/larva/larva_defense.dm
+++ b/code/modules/mob/living/carbon/alien/larva/larva_defense.dm
@@ -1,6 +1,6 @@
-/mob/living/carbon/alien/larva/attack_hand(mob/living/carbon/human/M)
+/mob/living/carbon/alien/larva/on_attack_hand(mob/living/carbon/human/M)
. = ..()
if(. || M.a_intent == INTENT_HELP || M.a_intent == INTENT_GRAB)
return
diff --git a/code/modules/mob/living/carbon/alien/larva/life.dm b/code/modules/mob/living/carbon/alien/larva/life.dm
index a4da38c4da..f0004b5ed9 100644
--- a/code/modules/mob/living/carbon/alien/larva/life.dm
+++ b/code/modules/mob/living/carbon/alien/larva/life.dm
@@ -1,14 +1,10 @@
-
-
-/mob/living/carbon/alien/larva/Life()
- set invisibility = 0
- if (notransform)
+/mob/living/carbon/alien/larva/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
return
- if(..()) //not dead
- // GROW!
- if(amount_grown < max_grown)
- amount_grown++
- update_icons()
+ // GROW!
+ if(amount_grown < max_grown)
+ amount_grown++
+ update_icons()
/mob/living/carbon/alien/larva/update_stat()
diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm
index 75aadd69c9..d63686691d 100644
--- a/code/modules/mob/living/carbon/alien/life.dm
+++ b/code/modules/mob/living/carbon/alien/life.dm
@@ -1,6 +1,7 @@
-/mob/living/carbon/alien/Life()
+/mob/living/carbon/alien/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
findQueen()
- return..()
/mob/living/carbon/alien/check_breath(datum/gas_mixture/breath)
if(status_flags & GODMODE)
@@ -12,26 +13,23 @@
var/toxins_used = 0
var/tox_detect_threshold = 0.02
- var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME
- var/list/breath_gases = breath.gases
+ var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.return_temperature())/BREATH_VOLUME
//Partial pressure of the toxins in our breath
- var/Toxins_pp = (breath_gases[/datum/gas/plasma]/breath.total_moles())*breath_pressure
+ var/Toxins_pp = (breath.get_moles(/datum/gas/plasma)/breath.total_moles())*breath_pressure
if(Toxins_pp > tox_detect_threshold) // Detect toxins in air
- adjustPlasma(breath_gases[/datum/gas/plasma]*250)
+ adjustPlasma(breath.get_moles(/datum/gas/plasma)*250)
throw_alert("alien_tox", /obj/screen/alert/alien_tox)
- toxins_used = breath_gases[/datum/gas/plasma]
+ toxins_used = breath.get_moles(/datum/gas/plasma)
else
clear_alert("alien_tox")
//Breathe in toxins and out oxygen
- breath_gases[/datum/gas/plasma] -= toxins_used
- breath_gases[/datum/gas/oxygen] += toxins_used
-
- GAS_GARBAGE_COLLECT(breath.gases)
+ breath.adjust_moles(/datum/gas/plasma, -toxins_used)
+ breath.adjust_moles(/datum/gas/oxygen, toxins_used)
//BREATH TEMPERATURE
handle_breath_temperature(breath)
diff --git a/code/modules/mob/living/carbon/alien/organs.dm b/code/modules/mob/living/carbon/alien/organs.dm
index 8485fece85..8e3966eb03 100644
--- a/code/modules/mob/living/carbon/alien/organs.dm
+++ b/code/modules/mob/living/carbon/alien/organs.dm
@@ -1,7 +1,8 @@
/obj/item/organ/alien
icon_state = "xgibmid2"
+ food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/toxin/acid = 10)
var/list/alien_powers = list()
- organ_flags = ORGAN_NO_SPOIL
+ organ_flags = ORGAN_NO_SPOIL|ORGAN_EDIBLE
/obj/item/organ/alien/Initialize()
. = ..()
@@ -26,12 +27,6 @@
owner.RemoveAbility(P)
..()
-/obj/item/organ/alien/prepare_eat()
- var/obj/S = ..()
- S.reagents.add_reagent(/datum/reagent/toxin/acid, 10)
- return S
-
-
/obj/item/organ/alien/plasmavessel
name = "plasma vessel"
icon_state = "plasma"
@@ -39,17 +34,13 @@
zone = BODY_ZONE_CHEST
slot = "plasmavessel"
alien_powers = list(/obj/effect/proc_holder/alien/plant, /obj/effect/proc_holder/alien/transfer)
+ food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/toxin/plasma = 10)
var/storedPlasma = 100
var/max_plasma = 250
var/heal_rate = 5
var/plasma_rate = 10
-/obj/item/organ/alien/plasmavessel/prepare_eat()
- var/obj/S = ..()
- S.reagents.add_reagent(/datum/reagent/toxin/plasma, storedPlasma/10)
- return S
-
/obj/item/organ/alien/plasmavessel/large
name = "large plasma vessel"
icon_state = "plasma_large"
diff --git a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm
index 0e8764a372..bb92eb79bd 100644
--- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm
+++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm
@@ -4,6 +4,7 @@
name = "alien embryo"
icon = 'icons/mob/alien.dmi'
icon_state = "larva0_dead"
+ food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/toxin/acid = 10)
var/stage = 0
var/bursting = FALSE
@@ -16,11 +17,6 @@
if(prob(10))
AttemptGrow(0)
-/obj/item/organ/body_egg/alien_embryo/prepare_eat()
- var/obj/S = ..()
- S.reagents.add_reagent(/datum/reagent/toxin/acid, 10)
- return S
-
/obj/item/organ/body_egg/alien_embryo/on_life()
. = ..()
if(!owner)
@@ -92,7 +88,7 @@
ghost.transfer_ckey(new_xeno, FALSE)
SEND_SOUND(new_xeno, sound('sound/voice/hiss5.ogg',0,0,0,100)) //To get the player's attention
new_xeno.Paralyze(6)
- new_xeno.notransform = TRUE
+ new_xeno.mob_transforming = TRUE
new_xeno.invisibility = INVISIBILITY_MAXIMUM
sleep(6)
@@ -102,7 +98,7 @@
if(new_xeno)
new_xeno.SetParalyzed(0)
- new_xeno.notransform = FALSE
+ new_xeno.mob_transforming = FALSE
new_xeno.invisibility = 0
var/mob/living/carbon/old_owner = owner
diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm
index eb1b38b9ff..ad8828572c 100644
--- a/code/modules/mob/living/carbon/alien/special/facehugger.dm
+++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm
@@ -58,8 +58,7 @@
/obj/item/clothing/mask/facehugger/attack_alien(mob/user) //can be picked up by aliens
return attack_hand(user)
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/item/clothing/mask/facehugger/attack_hand(mob/user)
+/obj/item/clothing/mask/facehugger/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if((stat == CONSCIOUS && !sterile) && !isalien(user))
if(Leap(user))
return
@@ -88,6 +87,7 @@
Die()
/obj/item/clothing/mask/facehugger/equipped(mob/M)
+ . = ..()
Attach(M)
/obj/item/clothing/mask/facehugger/Crossed(atom/target)
@@ -254,7 +254,7 @@
return FALSE
if(AmBloodsucker(M))
return FALSE
-
+
if(ismonkey(M))
return 1
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index e4ec902654..1e31655278 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -47,16 +47,13 @@
/mob/living/carbon/swap_hand(held_index)
+ . = ..()
+ if(!.)
+ var/obj/item/held_item = get_active_held_item()
+ to_chat(usr, "Your other hand is too busy holding [held_item].")
+ return
if(!held_index)
held_index = (active_hand_index % held_items.len)+1
-
- var/obj/item/item_in_hand = src.get_active_held_item()
- if(item_in_hand) //this segment checks if the item in your hand is twohanded.
- var/obj/item/twohanded/TH = item_in_hand
- if(istype(TH))
- if(TH.wielded == 1)
- to_chat(usr, "Your other hand is too busy holding [TH]")
- return
var/oindex = active_hand_index
active_hand_index = held_index
if(hud_used)
@@ -91,11 +88,32 @@
for(var/datum/surgery/S in surgeries)
if(S.next_step(user,user.a_intent))
return 1
+
+ if(!all_wounds || !(user.a_intent == INTENT_HELP || user == src))
+ return ..()
+
+ // The following priority/nonpriority searching is so that if we have two wounds on a limb that use the same item for treatment (gauze can bandage cuts AND splint broken bones),
+ // we prefer whichever wound is not already treated (ignore the splinted broken bone for the open cut). If there's no priority wounds that this can treat, go through the
+ // non-priority ones randomly.
+ var/list/nonpriority_wounds = list()
+ for(var/datum/wound/W in shuffle(all_wounds))
+ if(!W.treat_priority)
+ nonpriority_wounds += W
+ else if(W.treat_priority && W.try_treating(I, user))
+ return 1
+
+ for(var/datum/wound/W in shuffle(nonpriority_wounds))
+ if(W.try_treating(I, user))
+ return 1
+
return ..()
/mob/living/carbon/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
. = ..()
var/hurt = TRUE
+ var/extra_speed = 0
+ if(throwingdatum.thrower != src)
+ extra_speed = min(max(0, throwingdatum.speed - initial(throw_speed)), 3)
if(GetComponent(/datum/component/tackler))
return
if(throwingdatum?.thrower && iscyborg(throwingdatum.thrower))
@@ -105,18 +123,18 @@
if(hit_atom.density && isturf(hit_atom))
if(hurt)
DefaultCombatKnockdown(20)
- take_bodypart_damage(10)
+ take_bodypart_damage(10 + 5 * extra_speed, check_armor = TRUE, wound_bonus = extra_speed * 5)
if(iscarbon(hit_atom) && hit_atom != src)
var/mob/living/carbon/victim = hit_atom
if(victim.movement_type & FLYING)
return
if(hurt)
- victim.take_bodypart_damage(10)
- take_bodypart_damage(10)
+ victim.take_bodypart_damage(10 + 5 * extra_speed, check_armor = TRUE, wound_bonus = extra_speed * 5)
+ take_bodypart_damage(10 + 5 * extra_speed, check_armor = TRUE, wound_bonus = extra_speed * 5)
victim.DefaultCombatKnockdown(20)
DefaultCombatKnockdown(20)
- visible_message("[src] crashes into [victim], knocking them both over!",\
- "You violently crash into [victim]!")
+ visible_message("[src] crashes into [victim] [extra_speed ? "really hard" : ""], knocking them both over!",\
+ "You violently crash into [victim] [extra_speed ? "extra hard" : ""]!")
playsound(src,'sound/weapons/punch1.ogg',50,1)
@@ -156,6 +174,7 @@
if(IS_STAMCRIT(src))
to_chat(src, "You're too exhausted.")
return
+
var/random_turn = a_intent == INTENT_HARM
//END OF CIT CHANGES
@@ -182,7 +201,7 @@
to_chat(src, "You gently let go of [throwable_mob].")
return
- adjustStaminaLossBuffered(25)//CIT CHANGE - throwing an entire person shall be very tiring
+ adjustStaminaLossBuffered(STAM_COST_THROW_MOB * ((throwable_mob.mob_size+1)**2))// throwing an entire person shall be very tiring
var/turf/start_T = get_turf(loc) //Get the start and target tile for the descriptors
var/turf/end_T = get_turf(target)
if(start_T && end_T)
@@ -199,12 +218,18 @@
adjustStaminaLossBuffered(I.getweight(src, STAM_COST_THROW_MULT, SKILL_THROW_STAM_COST))
if(thrown_thing)
- visible_message("[src] has thrown [thrown_thing].")
- log_message("has thrown [thrown_thing]", LOG_ATTACK)
+ var/power_throw = 0
+ if(HAS_TRAIT(src, TRAIT_HULK))
+ power_throw++
+ if(pulling && grab_state >= GRAB_NECK)
+ power_throw++
+ visible_message("[src] throws [thrown_thing][power_throw ? " really hard!" : "."]", \
+ "You throw [thrown_thing][power_throw ? " really hard!" : "."]")
+ log_message("has thrown [thrown_thing] [power_throw ? "really hard" : ""]", LOG_ATTACK)
do_attack_animation(target, no_effect = 1)
playsound(loc, 'sound/weapons/punchmiss.ogg', 50, 1, -1)
newtonian_move(get_dir(target, src))
- thrown_thing.safe_throw_at(target, thrown_thing.throw_range, thrown_thing.throw_speed, src, null, null, null, move_force, random_turn)
+ thrown_thing.safe_throw_at(target, thrown_thing.throw_range, thrown_thing.throw_speed + power_throw, src, null, null, null, move_force, random_turn)
/mob/living/carbon/restrained(ignore_grab)
. = (handcuffed || (!ignore_grab && pulledby && pulledby.grab_state >= GRAB_AGGRESSIVE))
@@ -247,7 +272,7 @@
/mob/living/carbon/Topic(href, href_list)
..()
//strip panel
- if(usr.canUseTopic(src, BE_CLOSE, NO_DEXTERY))
+ if(usr.canUseTopic(src, BE_CLOSE))
if(href_list["internal"] && !HAS_TRAIT(src, TRAIT_NO_INTERNALS))
var/slot = text2num(href_list["internal"])
var/obj/item/ITEM = get_item_by_slot(slot)
@@ -267,7 +292,15 @@
visible_message("[usr] [internal ? "opens" : "closes"] the valve on [src]'s [ITEM.name].", \
"[usr] [internal ? "opens" : "closes"] the valve on your [ITEM.name].", \
target = usr, target_message = "You [internal ? "opens" : "closes"] the valve on [src]'s [ITEM.name].")
-
+ if(href_list["embedded_object"] && usr.canUseTopic(src, BE_CLOSE))
+ var/obj/item/bodypart/L = locate(href_list["embedded_limb"]) in bodyparts
+ if(!L)
+ return
+ var/obj/item/I = locate(href_list["embedded_object"]) in L.embedded_objects
+ if(!I || I.loc != src) //no item, no limb, or item is not in limb or in the person anymore
+ return
+ SEND_SIGNAL(src, COMSIG_CARBON_EMBED_RIP, I, L)
+ return
/mob/living/carbon/fall(forced)
loc.handle_fall(src, forced)//it's loc so it doesn't call the mob's handle_fall which does nothing
@@ -287,14 +320,11 @@
return
if(restrained())
// too soon.
- if(last_special > world.time)
- return
var/buckle_cd = 600
if(handcuffed)
var/obj/item/restraints/O = src.get_item_by_slot(SLOT_HANDCUFFED)
buckle_cd = O.breakouttime
- changeNext_move(min(CLICK_CD_BREAKOUT, buckle_cd))
- last_special = world.time + min(CLICK_CD_BREAKOUT, buckle_cd)
+ MarkResistTime()
visible_message("[src] attempts to unbuckle [p_them()]self!", \
"You attempt to unbuckle yourself... (This will take around [round(buckle_cd/600,1)] minute\s, and you need to stay still.)")
if(do_after(src, buckle_cd, 0, target = src, required_mobility_flags = MOBILITY_RESIST))
@@ -308,39 +338,26 @@
buckled.user_unbuckle_mob(src,src)
/mob/living/carbon/resist_fire()
- if(last_special > world.time)
- return
fire_stacks -= 5
DefaultCombatKnockdown(60, TRUE, TRUE)
spin(32,2)
visible_message("[src] rolls on the floor, trying to put [p_them()]self out!", \
"You stop, drop, and roll!")
- last_special = world.time + 30
+ MarkResistTime(30)
sleep(30)
if(fire_stacks <= 0)
visible_message("[src] has successfully extinguished [p_them()]self!", \
"You extinguish yourself.")
ExtinguishMob()
-/mob/living/carbon/resist_restraints(ignore_delay = FALSE)
+/mob/living/carbon/resist_restraints()
var/obj/item/I = null
- var/type = 0
- if(!ignore_delay && (last_special > world.time))
- to_chat(src, "You don't have the energy to resist your restraints that fast!")
- return
if(handcuffed)
I = handcuffed
- type = 1
else if(legcuffed)
I = legcuffed
- type = 2
if(I)
- if(type == 1)
- changeNext_move(min(CLICK_CD_BREAKOUT, I.breakouttime))
- last_special = world.time + CLICK_CD_BREAKOUT
- if(type == 2)
- changeNext_move(min(CLICK_CD_RANGE, I.breakouttime))
- last_special = world.time + CLICK_CD_RANGE
+ MarkResistTime()
cuff_resist(I)
/mob/living/carbon/proc/cuff_resist(obj/item/I, breakouttime = 600, cuff_break = 0)
@@ -385,7 +402,7 @@
if (W)
W.layer = initial(W.layer)
W.plane = initial(W.plane)
- changeNext_move(0)
+ SetNextAction(0)
if (legcuffed)
var/obj/item/W = legcuffed
legcuffed = null
@@ -398,7 +415,7 @@
if (W)
W.layer = initial(W.layer)
W.plane = initial(W.plane)
- changeNext_move(0)
+ SetNextAction(0)
update_equipment_speed_mods() // In case cuffs ever change speed
/mob/living/carbon/proc/clear_cuffs(obj/item/I, cuff_break)
@@ -887,6 +904,9 @@
var/datum/disease/D = thing
if(D.severity != DISEASE_SEVERITY_POSITIVE)
D.cure(FALSE)
+ for(var/thing in all_wounds)
+ var/datum/wound/W = thing
+ W.remove_wound()
if(admin_revive)
regenerate_limbs()
regenerate_organs()
@@ -977,6 +997,10 @@
if(SANITY_NEUTRAL to SANITY_GREAT)
. *= 0.90
+ for(var/i in status_effects)
+ var/datum/status_effect/S = i
+ . *= S.interact_speed_modifier()
+
/mob/living/carbon/proc/create_internal_organs()
for(var/X in internal_organs)
@@ -1152,3 +1176,60 @@
dna.features["body_model"] = MALE
if(update_icon)
update_body()
+
+/mob/living/carbon/check_obscured_slots()
+ if(head)
+ if(head.flags_inv & HIDEMASK)
+ LAZYOR(., SLOT_WEAR_MASK)
+ if(head.flags_inv & HIDEEYES)
+ LAZYOR(., SLOT_GLASSES)
+ if(head.flags_inv & HIDEEARS)
+ LAZYOR(., SLOT_EARS)
+
+ if(wear_mask)
+ if(wear_mask.flags_inv & HIDEEYES)
+ LAZYOR(., SLOT_GLASSES)
+
+// if any of our bodyparts are bleeding
+/mob/living/carbon/proc/is_bleeding()
+ for(var/i in bodyparts)
+ var/obj/item/bodypart/BP = i
+ if(BP.get_bleed_rate())
+ return TRUE
+
+// get our total bleedrate
+/mob/living/carbon/proc/get_total_bleed_rate()
+ var/total_bleed_rate = 0
+ for(var/i in bodyparts)
+ var/obj/item/bodypart/BP = i
+ total_bleed_rate += BP.get_bleed_rate()
+
+ return total_bleed_rate
+
+/**
+ * generate_fake_scars()- for when you want to scar someone, but you don't want to hurt them first. These scars don't count for temporal scarring (hence, fake)
+ *
+ * If you want a specific wound scar, pass that wound type as the second arg, otherwise you can pass a list like WOUND_LIST_CUT to generate a random cut scar.
+ *
+ * Arguments:
+ * * num_scars- A number for how many scars you want to add
+ * * forced_type- Which wound or category of wounds you want to choose from, WOUND_LIST_BONE, WOUND_LIST_CUT, or WOUND_LIST_BURN (or some combination). If passed a list, picks randomly from the listed wounds. Defaults to all 3 types
+ */
+/mob/living/carbon/proc/generate_fake_scars(num_scars, forced_type)
+ for(var/i in 1 to num_scars)
+ var/datum/scar/S = new
+ var/obj/item/bodypart/BP = pick(bodyparts)
+
+ var/wound_type
+ if(forced_type)
+ if(islist(forced_type))
+ wound_type = pick(forced_type)
+ else
+ wound_type = forced_type
+ else
+ wound_type = pick(WOUND_LIST_BONE + WOUND_LIST_CUT + WOUND_LIST_BURN)
+
+ var/datum/wound/W = new wound_type
+ S.generate(BP, W)
+ S.fake = TRUE
+ QDEL_NULL(W)
diff --git a/code/modules/mob/living/carbon/carbon_active_parry.dm b/code/modules/mob/living/carbon/carbon_active_parry.dm
new file mode 100644
index 0000000000..2683b6db6b
--- /dev/null
+++ b/code/modules/mob/living/carbon/carbon_active_parry.dm
@@ -0,0 +1,2 @@
+/mob/living/carbon/check_unarmed_parry_activation_special()
+ return ..() && length(get_empty_held_indexes())
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index f9d38828e3..9a2ed34f17 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -65,32 +65,21 @@
throw_mode_off()
return TRUE
-/mob/living/carbon/embed_item(obj/item/I)
- throw_alert("embeddedobject", /obj/screen/alert/embeddedobject)
- var/obj/item/bodypart/L = pick(bodyparts)
- L.embedded_objects |= I
- I.add_mob_blood(src)//it embedded itself in you, of course it's bloody!
- I.forceMove(src)
- I.embedded()
- L.receive_damage(I.w_class*I.embedding.embedded_impact_pain_multiplier)
- visible_message("[I] embeds itself in [src]'s [L.name]!","[I] embeds itself in your [L.name]!")
- SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "embedded", /datum/mood_event/embedded)
-
/mob/living/carbon/attacked_by(obj/item/I, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1)
var/totitemdamage = pre_attacked_by(I, user) * damage_multiplier
var/impacting_zone = (user == src)? check_zone(user.zone_selected) : ran_zone(user.zone_selected)
var/list/block_return = list()
- if((user != src) && (mob_run_block(I, totitemdamage, "the [I]", ((attackchain_flags & ATTACKCHAIN_PARRY_COUNTERATTACK)? ATTACK_TYPE_PARRY_COUNTERATTACK : NONE) | ATTACK_TYPE_MELEE, I.armour_penetration, user, impacting_zone, block_return) & BLOCK_SUCCESS))
+ if((user != src) && (mob_run_block(I, totitemdamage, "the [I]", ((attackchain_flags & ATTACK_IS_PARRY_COUNTERATTACK)? ATTACK_TYPE_PARRY_COUNTERATTACK : NONE) | ATTACK_TYPE_MELEE, I.armour_penetration, user, impacting_zone, block_return) & BLOCK_SUCCESS))
return FALSE
totitemdamage = block_calculate_resultant_damage(totitemdamage, block_return)
var/obj/item/bodypart/affecting = get_bodypart(impacting_zone)
if(!affecting) //missing limb? we select the first bodypart (you can never have zero, because of chest)
affecting = bodyparts[1]
SEND_SIGNAL(I, COMSIG_ITEM_ATTACK_ZONE, src, user, affecting)
- send_item_attack_message(I, user, affecting.name)
+ send_item_attack_message(I, user, affecting.name, totitemdamage)
I.do_stagger_action(src, user, totitemdamage)
if(I.force)
- apply_damage(totitemdamage, I.damtype, affecting) //CIT CHANGE - replaces I.force with totitemdamage
+ apply_damage(totitemdamage, I.damtype, affecting, wound_bonus = I.wound_bonus, bare_wound_bonus = I.bare_wound_bonus, sharpness = I.get_sharpness()) //CIT CHANGE - replaces I.force with totitemdamage
if(I.damtype == BRUTE && affecting.status == BODYPART_ORGANIC)
var/basebloodychance = affecting.brute_dam + totitemdamage
if(prob(basebloodychance))
@@ -122,8 +111,7 @@
/mob/living/carbon/attack_drone(mob/living/simple_animal/drone/user)
return //so we don't call the carbon's attack_hand().
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/mob/living/carbon/attack_hand(mob/living/carbon/human/user)
+/mob/living/carbon/on_attack_hand(mob/living/carbon/human/user, act_intent, unarmed_attack_flags)
. = ..()
if(.) //was the attack blocked?
return
@@ -138,11 +126,14 @@
ContactContractDisease(D)
if(lying && surgeries.len)
- if(user.a_intent == INTENT_HELP || user.a_intent == INTENT_DISARM)
+ if(act_intent == INTENT_HELP || act_intent == INTENT_DISARM)
for(var/datum/surgery/S in surgeries)
- if(S.next_step(user, user.a_intent))
+ if(S.next_step(user, act_intent))
return TRUE
+ for(var/datum/wound/W in all_wounds)
+ if(W.try_handling(user))
+ return 1
/mob/living/carbon/attack_paw(mob/living/carbon/monkey/M)
@@ -159,15 +150,13 @@
if(M.a_intent == INTENT_HELP)
help_shake_act(M)
- return 0
+ return TRUE
. = ..()
if(.) //successful monkey bite.
for(var/thing in M.diseases)
var/datum/disease/D = thing
ForceContractDisease(D)
- return 1
-
/mob/living/carbon/attack_slime(mob/living/simple_animal/slime/M)
. = ..()
@@ -274,6 +263,9 @@
to_chat(M, "You can't put [p_them()] out with just your bare hands!")
return
+ if(M == src && check_self_for_injuries())
+ return
+
if(health >= 0 && !(HAS_TRAIT(src, TRAIT_FAKEDEATH)))
var/friendly_check = FALSE
if(mob_run_block(M, 0, M.name, ATTACK_TYPE_UNARMED, 0, null, null, null))
@@ -303,12 +295,12 @@
target_message = "[M] gives you a pat on the head to make you feel better!")
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "headpat", /datum/mood_event/headpat)
friendly_check = TRUE
- if(S?.can_wag_tail(src) && !dna.species.is_wagging_tail())
- var/static/list/many_tails = list("tail_human", "tail_lizard", "mam_tail")
- for(var/T in many_tails)
- if(S.mutant_bodyparts[T] && dna.features[T] != "None")
- emote("wag")
- break
+ if(!(client?.prefs.cit_toggles & NO_AUTO_WAG))
+ if(S?.can_wag_tail(src) && !dna.species.is_wagging_tail())
+ var/static/list/many_tails = list("tail_human", "tail_lizard", "mam_tail")
+ for(var/T in many_tails)
+ if(S.mutant_bodyparts[T] && dna.features[T] != "None")
+ emote("wag")
else if(check_zone(M.zone_selected) == BODY_ZONE_R_ARM || check_zone(M.zone_selected) == BODY_ZONE_L_ARM)
M.visible_message( \
@@ -341,6 +333,26 @@
update_mobility()
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
+/// Check ourselves to see if we've got any shrapnel, return true if we do. This is a much simpler version of what humans do, we only indicate we're checking ourselves if there's actually shrapnel
+/mob/living/carbon/proc/check_self_for_injuries()
+ if(stat == DEAD || stat == UNCONSCIOUS)
+ return
+
+ var/embeds = FALSE
+ for(var/X in bodyparts)
+ var/obj/item/bodypart/LB = X
+ for(var/obj/item/I in LB.embedded_objects)
+ if(!embeds)
+ embeds = TRUE
+ // this way, we only visibly try to examine ourselves if we have something embedded, otherwise we'll still hug ourselves :)
+ visible_message("[src] examines [p_them()]self.", \
+ "You check yourself for shrapnel.")
+ if(I.isEmbedHarmless())
+ to_chat(src, "\t There is \a [I] stuck to your [LB.name]!")
+ else
+ to_chat(src, "\t There is \a [I] embedded in your [LB.name]!")
+
+ return embeds
/mob/living/carbon/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0)
. = ..()
@@ -455,3 +467,8 @@
if (BP.status < 2)
amount += BP.burn_dam
return amount
+
+/mob/living/carbon/proc/get_interaction_efficiency(zone)
+ var/obj/item/bodypart/limb = get_bodypart(zone)
+ if(!limb)
+ return
diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm
index 15413f76d4..2ce59fb790 100644
--- a/code/modules/mob/living/carbon/carbon_defines.dm
+++ b/code/modules/mob/living/carbon/carbon_defines.dm
@@ -24,7 +24,7 @@
var/obj/item/head = null
var/obj/item/gloves = null //only used by humans
- var/obj/item/shoes = null //only used by humans.
+ var/obj/item/clothing/shoes/shoes = null //only used by humans.
var/obj/item/clothing/glasses/glasses = null //only used by humans.
var/obj/item/ears = null //only used by humans.
@@ -64,3 +64,17 @@
var/drunkenness = 0 //Overall drunkenness - check handle_alcohol() in life.dm for effects
var/tackling = FALSE //Whether or not we are tackling, this will prevent the knock into effects for carbons
+
+ /// All of the wounds a carbon has afflicted throughout their limbs
+ var/list/all_wounds
+ /// All of the scars a carbon has afflicted throughout their limbs
+ var/list/all_scars
+
+ /// Protection (insulation) from the heat, Value 0-1 corresponding to the percentage of protection
+ var/heat_protection = 0 // No heat protection
+ /// Protection (insulation) from the cold, Value 0-1 corresponding to the percentage of protection
+ var/cold_protection = 0 // No cold protection
+
+ /// Timer id of any transformation
+ var/transformation_timer
+
diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm
index 5528669afa..ddf1019f2a 100644
--- a/code/modules/mob/living/carbon/damage_procs.dm
+++ b/code/modules/mob/living/carbon/damage_procs.dm
@@ -1,32 +1,33 @@
-/mob/living/carbon/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE)
+/mob/living/carbon/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = FALSE)
SEND_SIGNAL(src, COMSIG_MOB_APPLY_DAMGE, damage, damagetype, def_zone)
var/hit_percent = (100-blocked)/100
if(!forced && hit_percent <= 0)
return 0
var/obj/item/bodypart/BP = null
- if(isbodypart(def_zone)) //we specified a bodypart object
- BP = def_zone
- else
- if(!def_zone)
- def_zone = ran_zone(def_zone)
- BP = get_bodypart(check_zone(def_zone))
- if(!BP)
- BP = bodyparts[1]
+ if(!spread_damage)
+ if(isbodypart(def_zone)) //we specified a bodypart object
+ BP = def_zone
+ else
+ if(!def_zone)
+ def_zone = ran_zone(def_zone)
+ BP = get_bodypart(check_zone(def_zone))
+ if(!BP)
+ BP = bodyparts[1]
var/damage_amount = forced ? damage : damage * hit_percent
switch(damagetype)
if(BRUTE)
if(BP)
- if(damage > 0 ? BP.receive_damage(damage_amount) : BP.heal_damage(abs(damage_amount), 0))
+ if(BP.receive_damage(damage_amount, 0, wound_bonus = wound_bonus, bare_wound_bonus = bare_wound_bonus, sharpness = sharpness))
update_damage_overlays()
else //no bodypart, we deal damage with a more general method.
adjustBruteLoss(damage_amount, forced = forced)
if(BURN)
if(BP)
- if(damage > 0 ? BP.receive_damage(0, damage_amount) : BP.heal_damage(0, abs(damage_amount)))
+ if(BP.receive_damage(0, damage_amount, wound_bonus = wound_bonus, bare_wound_bonus = bare_wound_bonus, sharpness = sharpness))
update_damage_overlays()
else
adjustFireLoss(damage_amount, forced = forced)
@@ -201,12 +202,12 @@
//Damages ONE bodypart randomly selected from damagable ones.
//It automatically updates damage overlays if necessary
//It automatically updates health status
-/mob/living/carbon/take_bodypart_damage(brute = 0, burn = 0, stamina = 0)
+/mob/living/carbon/take_bodypart_damage(brute = 0, burn = 0, stamina = 0, updating_health = TRUE, required_status, check_armor = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = FALSE)
var/list/obj/item/bodypart/parts = get_damageable_bodyparts()
if(!parts.len)
return
var/obj/item/bodypart/picked = pick(parts)
- if(picked.receive_damage(brute, burn, stamina))
+ if(picked.receive_damage(brute, burn, stamina,check_armor ? run_armor_check(picked, (brute ? "melee" : burn ? "fire" : stamina ? "bullet" : null)) : FALSE, wound_bonus = wound_bonus, bare_wound_bonus = bare_wound_bonus, sharpness = sharpness))
update_damage_overlays()
//Heal MANY bodyparts, in random order
@@ -234,12 +235,12 @@
update_damage_overlays()
update_stamina() //CIT CHANGE - makes sure update_stamina() always gets called after a health update
-// damage MANY bodyparts, in random order
-/mob/living/carbon/take_overall_damage(brute = 0, burn = 0, stamina = 0, updating_health = TRUE)
+/// damage MANY bodyparts, in random order
+/mob/living/carbon/take_overall_damage(brute = 0, burn = 0, stamina = 0, updating_health = TRUE, required_status)
if(status_flags & GODMODE)
return //godmode
- var/list/obj/item/bodypart/parts = get_damageable_bodyparts()
+ var/list/obj/item/bodypart/parts = get_damageable_bodyparts(required_status)
var/update = 0
while(parts.len && (brute > 0 || burn > 0 || stamina > 0))
var/obj/item/bodypart/picked = pick(parts)
@@ -252,7 +253,7 @@
var/stamina_was = picked.stamina_dam
- update |= picked.receive_damage(brute_per_part, burn_per_part, stamina_per_part, FALSE)
+ update |= picked.receive_damage(brute_per_part, burn_per_part, stamina_per_part, FALSE, required_status, wound_bonus = CANT_WOUND) // disabling wounds from these for now cuz your entire body snapping cause your heart stopped would suck
brute = round(brute - (picked.brute_dam - brute_was), DAMAGE_PRECISION)
burn = round(burn - (picked.burn_dam - burn_was), DAMAGE_PRECISION)
@@ -265,45 +266,11 @@
update_damage_overlays()
update_stamina()
-/* TO_REMOVE
-/mob/living/carbon/getOrganLoss(ORGAN_SLOT_BRAIN)
- . = 0
- var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN)
- if(B)
- . = B.get_brain_damage()
-
-//Some sources of brain damage shouldn't be deadly
-/mob/living/carbon/adjustOrganLoss(ORGAN_SLOT_BRAIN, amount, maximum = BRAIN_DAMAGE_DEATH)
- if(status_flags & GODMODE)
- return FALSE
- var/prev_brainloss = getOrganLoss(ORGAN_SLOT_BRAIN)
- var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN)
- if(!B)
- return
- B.adjust_brain_damage(amount, maximum)
- if(amount <= 0) //cut this early
- return
- var/brainloss = getOrganLoss(ORGAN_SLOT_BRAIN)
- if(brainloss > BRAIN_DAMAGE_MILD)
- if(prob(amount * ((2 * (100 + brainloss - BRAIN_DAMAGE_MILD)) / 100))) //Base chance is the hit damage; for every point of damage past the threshold the chance is increased by 2%
- gain_trauma_type(BRAIN_TRAUMA_MILD)
- if(brainloss > BRAIN_DAMAGE_SEVERE)
- if(prob(amount * ((2 * (100 + brainloss - BRAIN_DAMAGE_SEVERE)) / 100))) //Base chance is the hit damage; for every point of damage past the threshold the chance is increased by 2%
- if(prob(20))
- gain_trauma_type(BRAIN_TRAUMA_SPECIAL)
- else
- gain_trauma_type(BRAIN_TRAUMA_SEVERE)
-
- if(prev_brainloss < BRAIN_DAMAGE_MILD && brainloss >= BRAIN_DAMAGE_MILD)
- to_chat(src, "You feel lightheaded.")
- else if(prev_brainloss < BRAIN_DAMAGE_SEVERE && brainloss >= BRAIN_DAMAGE_SEVERE)
- to_chat(src, "You feel less in control of your thoughts.")
- else if(prev_brainloss < (BRAIN_DAMAGE_DEATH - 20) && brainloss >= (BRAIN_DAMAGE_DEATH - 20))
- to_chat(src, "You can feel your mind flickering on and off...")
-
-/mob/living/carbon/setBrainLoss(amount)
- var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN)
- if(B)
- var/adjusted_amount = amount - B.get_brain_damage()
- B.adjust_brain_damage(adjusted_amount, null)
-*/
+///Returns a list of bodyparts with wounds (in case someone has a wound on an otherwise fully healed limb)
+/mob/living/carbon/proc/get_wounded_bodyparts(brute = FALSE, burn = FALSE, stamina = FALSE, status)
+ var/list/obj/item/bodypart/parts = list()
+ for(var/X in bodyparts)
+ var/obj/item/bodypart/BP = X
+ if(LAZYLEN(BP.wounds))
+ parts += BP
+ return parts
diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm
index 8dbfba47b1..be046a3713 100644
--- a/code/modules/mob/living/carbon/examine.dm
+++ b/code/modules/mob/living/carbon/examine.dm
@@ -31,14 +31,37 @@
else if(get_bodypart(BODY_ZONE_HEAD))
. += "It appears that [t_his] brain is missing..."
- var/list/missing = get_missing_limbs()
+ var/list/msg = list("")
+ var/list/missing = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG)
+ var/list/disabled = list()
+ for(var/X in bodyparts)
+ var/obj/item/bodypart/BP = X
+ if(BP.disabled)
+ disabled += BP
+ missing -= BP.body_zone
+ for(var/obj/item/I in BP.embedded_objects)
+ if(I.isEmbedHarmless())
+ msg += "[t_He] [t_has] \a [icon2html(I, user)] [I] stuck to [t_his] [BP.name]!\n"
+ else
+ msg += "[t_He] [t_has] \a [icon2html(I, user)] [I] embedded in [t_his] [BP.name]!\n"
+ for(var/datum/wound/W in BP.wounds)
+ msg += "[W.get_examine_description(user)]\n"
+
+ for(var/X in disabled)
+ var/obj/item/bodypart/BP = X
+ var/damage_text
+ if(!(BP.get_damage(include_stamina = FALSE) >= BP.max_damage)) //Stamina is disabling the limb
+ damage_text = "limp and lifeless"
+ else
+ damage_text = (BP.brute_dam >= BP.burn_dam) ? BP.heavy_brute_msg : BP.heavy_burn_msg
+ msg += "[capitalize(t_his)] [BP.name] is [damage_text]!\n"
+
for(var/t in missing)
if(t==BODY_ZONE_HEAD)
- . += "[t_His] [parse_zone(t)] is missing!"
+ msg += "[t_His] [parse_zone(t)] is missing!\n"
continue
- . += "[t_His] [parse_zone(t)] is missing!"
+ msg += "[t_His] [parse_zone(t)] is missing!\n"
- var/list/msg = list()
var/temp = getBruteLoss()
if(!(user == src && src.hal_screwyhud == SCREWYHUD_HEALTHY)) //fake healthy
if(temp)
@@ -78,6 +101,22 @@
if(pulledby && pulledby.grab_state)
msg += "[t_He] [t_is] restrained by [pulledby]'s grip.\n"
+ var/scar_severity = 0
+ for(var/i in all_scars)
+ var/datum/scar/S = i
+ if(S.is_visible(user))
+ scar_severity += S.severity
+
+ switch(scar_severity)
+ if(1 to 2)
+ msg += "[t_He] [t_has] visible scarring, you can look again to take a closer look...\n"
+ if(3 to 4)
+ msg += "[t_He] [t_has] several bad scars, you can look again to take a closer look...\n"
+ if(5 to 6)
+ msg += "[t_He] [t_has] significantly disfiguring scarring, you can look again to take a closer look...\n"
+ if(7 to INFINITY)
+ msg += "[t_He] [t_is] just absolutely fucked up, you can look again to take a closer look...\n"
+
if(msg.len)
. += "[msg.Join("")]"
@@ -114,3 +153,25 @@
. += "[t_He] look[p_s()] ecstatic."
SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user, .)
. += "*---------*"
+
+/mob/living/carbon/examine_more(mob/user)
+ if(!all_scars)
+ return ..()
+
+ var/list/visible_scars
+ for(var/i in all_scars)
+ var/datum/scar/S = i
+ if(S.is_visible(user))
+ LAZYADD(visible_scars, S)
+
+ if(!visible_scars)
+ return ..()
+
+ var/msg = list("You examine [src] closer, and note the following...")
+ for(var/i in visible_scars)
+ var/datum/scar/S = i
+ var/scar_text = S.get_examine_description(user)
+ if(scar_text)
+ msg += "[scar_text]"
+
+ return msg
diff --git a/code/modules/mob/living/carbon/human/damage_procs.dm b/code/modules/mob/living/carbon/human/damage_procs.dm
index 9f6a572fc8..5cd00b7e6a 100644
--- a/code/modules/mob/living/carbon/human/damage_procs.dm
+++ b/code/modules/mob/living/carbon/human/damage_procs.dm
@@ -1,5 +1,5 @@
+// depending on the species, it will run the corresponding apply_damage code there
+/mob/living/carbon/human/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = FALSE)
+ return dna.species.apply_damage(damage, damagetype, def_zone, blocked, src, forced, spread_damage, wound_bonus, bare_wound_bonus, sharpness)
-/mob/living/carbon/human/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE)
- // depending on the species, it will run the corresponding apply_damage code there
- return dna.species.apply_damage(damage, damagetype, def_zone, blocked, src, forced)
diff --git a/code/modules/mob/living/carbon/human/dummy.dm b/code/modules/mob/living/carbon/human/dummy.dm
index 24eb5d7234..96517d5ea2 100644
--- a/code/modules/mob/living/carbon/human/dummy.dm
+++ b/code/modules/mob/living/carbon/human/dummy.dm
@@ -4,6 +4,10 @@
status_flags = GODMODE|CANPUSH
mouse_drag_pointer = MOUSE_INACTIVE_POINTER
var/in_use = FALSE
+ vore_flags = NO_VORE
+
+/mob/living/carbon/human/vore
+ vore_flags = DEVOURABLE | DIGESTABLE | FEEDING
INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy)
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index cb21534d25..cbea9293f5 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -159,17 +159,22 @@
disabled += BP
missing -= BP.body_zone
for(var/obj/item/I in BP.embedded_objects)
- msg += "[t_He] [t_has] \a [icon2html(I, user)] [I] embedded in [t_his] [BP.name]!\n"
+ if(I.isEmbedHarmless())
+ msg += "[t_He] [t_has] \a [icon2html(I, user)] [I] stuck to [t_his] [BP.name]!\n"
+ else
+ msg += "[t_He] [t_has] \a [icon2html(I, user)] [I] embedded in [t_his] [BP.name]!\n"
+ for(var/datum/wound/W in BP.wounds)
+ msg += "[W.get_examine_description(user)]\n"
for(var/X in disabled)
var/obj/item/bodypart/BP = X
var/damage_text
- if(!(BP.get_damage(include_stamina = FALSE) >= BP.max_damage)) //Stamina is disabling the limb
- damage_text = "limp and lifeless"
- else
- damage_text = (BP.brute_dam >= BP.burn_dam) ? BP.heavy_brute_msg : BP.heavy_burn_msg
- msg += "[capitalize(t_his)] [BP.name] is [damage_text]!\n"
-
+ if(BP.is_disabled() != BODYPART_DISABLED_WOUND) // skip if it's disabled by a wound (cuz we'll be able to see the bone sticking out!)
+ if(!(BP.get_damage(include_stamina = FALSE) >= BP.max_damage)) //we don't care if it's stamcritted
+ damage_text = "limp and lifeless"
+ else
+ damage_text = (BP.brute_dam >= BP.burn_dam) ? BP.heavy_brute_msg : BP.heavy_burn_msg
+ msg += "[capitalize(t_his)] [BP.name] is [damage_text]!\n"
//stores missing limbs
var/l_limbs_missing = 0
var/r_limbs_missing = 0
@@ -243,16 +248,40 @@
if(DISGUST_LEVEL_DISGUSTED to INFINITY)
msg += "[t_He] look[p_s()] extremely disgusted.\n"
- if(ShowAsPaleExamine())
- msg += "[t_He] [t_has] pale skin.\n"
+ var/apparent_blood_volume = blood_volume
+ if(dna.species.use_skintones && skin_tone == "albino")
+ apparent_blood_volume -= 150 // enough to knock you down one tier
+ switch(apparent_blood_volume)
+ if(BLOOD_VOLUME_OKAY to BLOOD_VOLUME_SAFE)
+ msg += "[t_He] [t_has] pale skin.\n"
+ if(BLOOD_VOLUME_BAD to BLOOD_VOLUME_OKAY)
+ msg += "[t_He] look[p_s()] like pale death.\n"
+ if(-INFINITY to BLOOD_VOLUME_BAD)
+ msg += "[t_He] resemble[p_s()] a crushed, empty juice pouch.\n"
if(bleedsuppress)
- msg += "[t_He] [t_is] bandaged with something.\n"
- else if(bleed_rate)
- if(bleed_rate >= 8) //8 is the rate at which heparin causes you to bleed
- msg += "[t_He] [t_is] bleeding uncontrollably!\n"
- else
- msg += "[t_He] [t_is] bleeding!\n"
+ msg += "[t_He] [t_is] embued with a power that defies bleeding.\n" // only statues and highlander sword can cause this so whatever
+ else if(is_bleeding())
+ var/list/obj/item/bodypart/bleeding_limbs = list()
+
+ for(var/i in bodyparts)
+ var/obj/item/bodypart/BP = i
+ if(BP.get_bleed_rate())
+ bleeding_limbs += BP
+
+ var/num_bleeds = LAZYLEN(bleeding_limbs)
+ var/bleed_text = "[t_He] [t_is] bleeding from [t_his]"
+ switch(num_bleeds)
+ if(1 to 2)
+ bleed_text += " [bleeding_limbs[1].name][num_bleeds == 2 ? " and [bleeding_limbs[2].name]" : ""]"
+ if(3 to INFINITY)
+ for(var/i in 1 to (num_bleeds - 1))
+ var/obj/item/bodypart/BP = bleeding_limbs[i]
+ bleed_text += " [BP.name],"
+ bleed_text += " and [bleeding_limbs[num_bleeds].name]"
+
+ bleed_text += "!\n"
+ msg += bleed_text
if(reagents.has_reagent(/datum/reagent/teslium))
msg += "[t_He] [t_is] emitting a gentle blue glow!\n"
@@ -328,6 +357,21 @@
if(digitalcamo)
msg += "[t_He] [t_is] moving [t_his] body in an unnatural and blatantly inhuman manner.\n"
+ var/scar_severity = 0
+ for(var/i in all_scars)
+ var/datum/scar/S = i
+ if(S.is_visible(user))
+ scar_severity += S.severity
+
+ switch(scar_severity)
+ if(1 to 2)
+ msg += "[t_He] [t_has] visible scarring, you can look again to take a closer look...\n"
+ if(3 to 4)
+ msg += "[t_He] [t_has] several bad scars, you can look again to take a closer look...\n"
+ if(5 to 6)
+ msg += "[t_He] [t_has] significantly disfiguring scarring, you can look again to take a closer look...\n"
+ if(7 to INFINITY)
+ msg += "[t_He] [t_is] just absolutely fucked up, you can look again to take a closer look...\n"
if (length(msg))
. += "[msg.Join("")]"
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index de703b8ad4..b402260611 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -33,6 +33,7 @@
enable_intentional_sprint_mode()
RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, /atom.proc/clean_blood)
+ GLOB.human_list += src
/mob/living/carbon/human/ComponentInitialize()
@@ -47,6 +48,7 @@
/mob/living/carbon/human/Destroy()
QDEL_NULL(physiology)
QDEL_NULL_LIST(vore_organs) // CITADEL EDIT belly stuff
+ GLOB.human_list -= src
return ..()
/mob/living/carbon/human/prepare_data_huds()
@@ -152,8 +154,12 @@
dat += "
")
- t = replacetext(t, "\[br\]", " ")
- t = replacetext(t, "\n", " ")
- t = replacetext(t, "\[b\]", "")
- t = replacetext(t, "\[/b\]", "")
- t = replacetext(t, "\[i\]", "")
- t = replacetext(t, "\[/i\]", "")
- t = replacetext(t, "\[u\]", "")
- t = replacetext(t, "\[/u\]", "")
- t = replacetext(t, "\[time\]", "[STATION_TIME_TIMESTAMP("hh:mm:ss", world.time)]")
- t = replacetext(t, "\[date\]", "[time2text(world.realtime, "MMM DD")] [GLOB.year_integer]")
- t = replacetext(t, "\[large\]", "")
- t = replacetext(t, "\[/large\]", "")
- t = replacetext(t, "\[h1\]", "
")
- t = replacetext(t, "\[/h1\]", "
")
- t = replacetext(t, "\[h2\]", "
")
- t = replacetext(t, "\[/h2\]", "
")
- t = replacetext(t, "\[h3\]", "
")
- t = replacetext(t, "\[/h3\]", "
")
- t = replacetext(t, "\[*\]", "
")
- t = replacetext(t, "\[hr\]", "")
- t = replacetext(t, "\[small\]", "")
- t = replacetext(t, "\[/small\]", "")
- t = replacetext(t, "\[list\]", "
")
- t = replacetext(t, "\[/list\]", "
")
- t = replacetext(t, "\[table\]", "
")
- t = replacetext(t, "\[/table\]", "
")
- t = replacetext(t, "\[grid\]", "
")
- t = replacetext(t, "\[/grid\]", "
")
- t = replacetext(t, "\[row\]", "
")
- t = replacetext(t, "\[tr\]", "
")
- t = replacetext(t, "\[td\]", "
")
- t = replacetext(t, "\[cell\]", "
")
- t = replacetext(t, "\[tab\]", " ")
-
- t = parsemarkdown_basic(t)
-
- return t
-
-/datum/computer_file/program/filemanager/proc/prepare_printjob(t) // Additional stuff to parse if we want to print it and make a happy Head of Personnel. Forms FTW.
- t = replacetext(t, "\[field\]", "")
- t = replacetext(t, "\[sign\]", "")
-
- t = parse_tags(t)
-
- t = replacetext(t, regex("(?:%s(?:ign)|%f(?:ield))(?=\\s|$)", "ig"), "")
-
- return t
+ return TRUE
/datum/computer_file/program/filemanager/ui_data(mob/user)
var/list/data = get_header_data()
@@ -192,41 +73,28 @@
var/obj/item/computer_hardware/hard_drive/portable/RHDD = computer.all_components[MC_SDD]
if(error)
data["error"] = error
- if(open_file)
- var/datum/computer_file/data/file
-
- if(!computer || !HDD)
- data["error"] = "I/O ERROR: Unable to access hard drive."
- else
- file = HDD.find_file_by_name(open_file)
- if(!istype(file))
- data["error"] = "I/O ERROR: Unable to open file."
- else
- data["filedata"] = parse_tags(file.stored_data)
- data["filename"] = "[file.filename].[file.filetype]"
+ if(!computer || !HDD)
+ data["error"] = "I/O ERROR: Unable to access hard drive."
else
- if(!computer || !HDD)
- data["error"] = "I/O ERROR: Unable to access hard drive."
- else
- var/list/files[0]
- for(var/datum/computer_file/F in HDD.stored_files)
- files.Add(list(list(
+ var/list/files = list()
+ for(var/datum/computer_file/F in HDD.stored_files)
+ files += list(list(
+ "name" = F.filename,
+ "type" = F.filetype,
+ "size" = F.size,
+ "undeletable" = F.undeletable
+ ))
+ data["files"] = files
+ if(RHDD)
+ data["usbconnected"] = TRUE
+ var/list/usbfiles = list()
+ for(var/datum/computer_file/F in RHDD.stored_files)
+ usbfiles += list(list(
"name" = F.filename,
"type" = F.filetype,
"size" = F.size,
"undeletable" = F.undeletable
- )))
- data["files"] = files
- if(RHDD)
- data["usbconnected"] = 1
- var/list/usbfiles[0]
- for(var/datum/computer_file/F in RHDD.stored_files)
- usbfiles.Add(list(list(
- "name" = F.filename,
- "type" = F.filetype,
- "size" = F.size,
- "undeletable" = F.undeletable
- )))
- data["usbfiles"] = usbfiles
+ ))
+ data["usbfiles"] = usbfiles
return data
diff --git a/code/modules/modular_computers/file_system/programs/jobmanagement.dm b/code/modules/modular_computers/file_system/programs/jobmanagement.dm
new file mode 100644
index 0000000000..7b847c123e
--- /dev/null
+++ b/code/modules/modular_computers/file_system/programs/jobmanagement.dm
@@ -0,0 +1,141 @@
+/datum/computer_file/program/job_management
+ filename = "job_manage"
+ filedesc = "Job Manager"
+ program_icon_state = "id"
+ extended_desc = "Program for viewing and changing job slot avalibility."
+ transfer_access = ACCESS_HEADS
+ requires_ntnet = 0
+ size = 4
+ tgui_id = "NtosJobManager"
+ ui_x = 400
+ ui_y = 620
+
+ var/change_position_cooldown = 30
+ //Jobs you cannot open new positions for
+ var/list/blacklisted = list(
+ "AI",
+ "Assistant",
+ "Cyborg",
+ "Captain",
+ "Head of Personnel",
+ "Head of Security",
+ "Chief Engineer",
+ "Research Director",
+ "Chief Medical Officer")
+
+ //The scaling factor of max total positions in relation to the total amount of people on board the station in %
+ var/max_relative_positions = 30 //30%: Seems reasonable, limit of 6 @ 20 players
+
+ //This is used to keep track of opened positions for jobs to allow instant closing
+ //Assoc array: "JobName" = (int)
+ var/list/opened_positions = list()
+
+/datum/computer_file/program/job_management/New()
+ ..()
+ change_position_cooldown = CONFIG_GET(number/id_console_jobslot_delay)
+
+/datum/computer_file/program/job_management/proc/can_open_job(datum/job/job)
+ if(!(job?.title in blacklisted))
+ if((job.total_positions <= length(GLOB.player_list) * (max_relative_positions / 100)))
+ var/delta = (world.time / 10) - GLOB.time_last_changed_position
+ if((change_position_cooldown < delta) || (opened_positions[job.title] < 0))
+ return TRUE
+ return FALSE
+
+/datum/computer_file/program/job_management/proc/can_close_job(datum/job/job)
+ if(!(job?.title in blacklisted))
+ if(job.total_positions > length(GLOB.player_list) * (max_relative_positions / 100))
+ var/delta = (world.time / 10) - GLOB.time_last_changed_position
+ if((change_position_cooldown < delta) || (opened_positions[job.title] > 0))
+ return TRUE
+ return FALSE
+
+/datum/computer_file/program/job_management/ui_act(action, params, datum/tgui/ui)
+ if(..())
+ return
+
+ var/authed = FALSE
+ var/mob/user = usr
+ var/obj/item/card/id/user_id = user.get_idcard()
+ if(user_id)
+ if(ACCESS_CHANGE_IDS in user_id.access)
+ authed = TRUE
+
+ if(!authed)
+ return
+
+ switch(action)
+ if("PRG_open_job")
+ var/edit_job_target = params["target"]
+ var/datum/job/j = SSjob.GetJob(edit_job_target)
+ if(!j || !can_open_job(j))
+ return
+ if(opened_positions[edit_job_target] >= 0)
+ GLOB.time_last_changed_position = world.time / 10
+ j.total_positions++
+ opened_positions[edit_job_target]++
+ playsound(computer, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE)
+ return TRUE
+ if("PRG_close_job")
+ var/edit_job_target = params["target"]
+ var/datum/job/j = SSjob.GetJob(edit_job_target)
+ if(!j || !can_close_job(j))
+ return
+ //Allow instant closing without cooldown if a position has been opened before
+ if(opened_positions[edit_job_target] <= 0)
+ GLOB.time_last_changed_position = world.time / 10
+ j.total_positions--
+ opened_positions[edit_job_target]--
+ playsound(computer, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE)
+ return TRUE
+ if("PRG_priority")
+ if(length(SSjob.prioritized_jobs) >= 5)
+ return
+ var/priority_target = params["target"]
+ var/datum/job/j = SSjob.GetJob(priority_target)
+ if(!j)
+ return
+ if(j.total_positions <= j.current_positions)
+ return
+ if(j in SSjob.prioritized_jobs)
+ SSjob.prioritized_jobs -= j
+ else
+ SSjob.prioritized_jobs += j
+ playsound(computer, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE)
+ return TRUE
+
+
+/datum/computer_file/program/job_management/ui_data(mob/user)
+ var/list/data = get_header_data()
+
+ var/authed = FALSE
+ var/obj/item/card/id/user_id = user.get_idcard(FALSE)
+ if(user_id)
+ if(ACCESS_CHANGE_IDS in user_id.access)
+ authed = TRUE
+
+ data["authed"] = authed
+
+ var/list/pos = list()
+ for(var/j in SSjob.occupations)
+ var/datum/job/job = j
+ if(job.title in blacklisted)
+ continue
+
+ pos += list(list(
+ "title" = job.title,
+ "current" = job.current_positions,
+ "total" = job.total_positions,
+ "status_open" = authed ? can_open_job(job) : FALSE,
+ "status_close" = authed ? can_close_job(job) : FALSE,
+ ))
+ data["slots"] = pos
+ var/delta = round(change_position_cooldown - ((world.time / 10) - GLOB.time_last_changed_position), 1)
+ data["cooldown"] = delta < 0 ? 0 : delta
+ var/list/priority = list()
+ for(var/j in SSjob.prioritized_jobs)
+ var/datum/job/job = j
+ priority += job.title
+ data["prioritized"] = priority
+ return data
+
diff --git a/code/modules/modular_computers/file_system/programs/ntdownloader.dm b/code/modules/modular_computers/file_system/programs/ntdownloader.dm
index 92e1453dc6..352f13f305 100644
--- a/code/modules/modular_computers/file_system/programs/ntdownloader.dm
+++ b/code/modules/modular_computers/file_system/programs/ntdownloader.dm
@@ -10,7 +10,9 @@
requires_ntnet_feature = NTNET_SOFTWAREDOWNLOAD
available_on_ntnet = 0
ui_header = "downloader_finished.gif"
- tgui_id = "ntos_net_downloader"
+ tgui_id = "NtosNetDownloader"
+ ui_x = 480
+ ui_y = 735
var/datum/computer_file/program/downloaded_file = null
var/hacked_download = 0
@@ -113,49 +115,50 @@
var/list/data = get_header_data()
- // This IF cuts on data transferred to client, so i guess it's worth it.
- if(downloaderror) // Download errored. Wait until user resets the program.
- data["error"] = downloaderror
- else if(downloaded_file) // Download running. Wait please..
+ data["downloading"] = !!downloaded_file
+ data["error"] = downloaderror || FALSE
+
+ // Download running. Wait please..
+ if(downloaded_file)
data["downloadname"] = downloaded_file.filename
data["downloaddesc"] = downloaded_file.filedesc
data["downloadsize"] = downloaded_file.size
data["downloadspeed"] = download_netspeed
data["downloadcompletion"] = round(download_completion, 0.1)
- else // No download running, pick file.
- var/obj/item/computer_hardware/hard_drive/hard_drive = my_computer.all_components[MC_HDD]
- data["disk_size"] = hard_drive.max_capacity
- data["disk_used"] = hard_drive.used_capacity
- var/list/all_entries[0]
- for(var/A in SSnetworks.station_network.available_station_software)
- var/datum/computer_file/program/P = A
- // Only those programs our user can run will show in the list
- if(!P.can_run(user,transfer = 1) || hard_drive.find_file_by_name(P.filename))
- continue
- all_entries.Add(list(list(
+
+ var/obj/item/computer_hardware/hard_drive/hard_drive = my_computer.all_components[MC_HDD]
+ data["disk_size"] = hard_drive.max_capacity
+ data["disk_used"] = hard_drive.used_capacity
+ var/list/all_entries[0]
+ for(var/A in SSnetworks.station_network.available_station_software)
+ var/datum/computer_file/program/P = A
+ // Only those programs our user can run will show in the list
+ if(!P.can_run(user,transfer = 1) || hard_drive.find_file_by_name(P.filename))
+ continue
+ all_entries.Add(list(list(
"filename" = P.filename,
"filedesc" = P.filedesc,
"fileinfo" = P.extended_desc,
"compatibility" = check_compatibility(P),
- "size" = P.size
- )))
- data["hackedavailable"] = 0
- if(computer.obj_flags & EMAGGED) // If we are running on emagged computer we have access to some "bonus" software
- var/list/hacked_programs[0]
- for(var/S in SSnetworks.station_network.available_antag_software)
- var/datum/computer_file/program/P = S
- if(hard_drive.find_file_by_name(P.filename))
- continue
- data["hackedavailable"] = 1
- hacked_programs.Add(list(list(
+ "size" = P.size,
+ )))
+ data["hackedavailable"] = FALSE
+ if(computer.obj_flags & EMAGGED) // If we are running on emagged computer we have access to some "bonus" software
+ var/list/hacked_programs[0]
+ for(var/S in SSnetworks.station_network.available_antag_software)
+ var/datum/computer_file/program/P = S
+ if(hard_drive.find_file_by_name(P.filename))
+ continue
+ data["hackedavailable"] = TRUE
+ hacked_programs.Add(list(list(
"filename" = P.filename,
"filedesc" = P.filedesc,
"fileinfo" = P.extended_desc,
- "size" = P.size
- )))
- data["hacked_programs"] = hacked_programs
+ "size" = P.size,
+ )))
+ data["hacked_programs"] = hacked_programs
- data["downloadable_programs"] = all_entries
+ data["downloadable_programs"] = all_entries
return data
@@ -168,4 +171,4 @@
/datum/computer_file/program/ntnetdownload/kill_program(forced)
abort_file_download()
- return ..(forced)
\ No newline at end of file
+ return ..(forced)
diff --git a/code/modules/modular_computers/file_system/programs/ntmonitor.dm b/code/modules/modular_computers/file_system/programs/ntmonitor.dm
index 2312db7b11..7d6d89f32c 100644
--- a/code/modules/modular_computers/file_system/programs/ntmonitor.dm
+++ b/code/modules/modular_computers/file_system/programs/ntmonitor.dm
@@ -4,58 +4,48 @@
program_icon_state = "comm_monitor"
extended_desc = "This program monitors stationwide NTNet network, provides access to logging systems, and allows for configuration changes"
size = 12
- requires_ntnet = 1
+ requires_ntnet = TRUE
required_access = ACCESS_NETWORK //NETWORK CONTROL IS A MORE SECURE PROGRAM.
- available_on_ntnet = 1
- tgui_id = "ntos_net_monitor"
+ available_on_ntnet = TRUE
+ tgui_id = "NtosNetMonitor"
/datum/computer_file/program/ntnetmonitor/ui_act(action, params)
if(..())
- return 1
+ return
switch(action)
if("resetIDS")
- . = 1
if(SSnetworks.station_network)
SSnetworks.station_network.resetIDS()
- return 1
+ return TRUE
if("toggleIDS")
- . = 1
if(SSnetworks.station_network)
SSnetworks.station_network.toggleIDS()
- return 1
+ return TRUE
if("toggleWireless")
- . = 1
if(!SSnetworks.station_network)
- return 1
+ return
// NTNet is disabled. Enabling can be done without user prompt
if(SSnetworks.station_network.setting_disabled)
- SSnetworks.station_network.setting_disabled = 0
- return 1
+ SSnetworks.station_network.setting_disabled = FALSE
+ return TRUE
- // NTNet is enabled and user is about to shut it down. Let's ask them if they really want to do it, as wirelessly connected computers won't connect without NTNet being enabled (which may prevent people from turning it back on)
- var/mob/user = usr
- if(!user)
- return 1
- var/response = alert(user, "Really disable NTNet wireless? If your computer is connected wirelessly you won't be able to turn it back on! This will affect all connected wireless devices.", "NTNet shutdown", "Yes", "No")
- if(response == "Yes")
- SSnetworks.station_network.setting_disabled = 1
- return 1
+ SSnetworks.station_network.setting_disabled = TRUE
+ return TRUE
if("purgelogs")
- . = 1
if(SSnetworks.station_network)
SSnetworks.station_network.purge_logs()
+ return TRUE
if("updatemaxlogs")
- . = 1
- var/mob/user = usr
- var/logcount = text2num(input(user,"Enter amount of logs to keep in memory ([MIN_NTNET_LOGS]-[MAX_NTNET_LOGS]):"))
+ var/logcount = params["new_number"]
if(SSnetworks.station_network)
SSnetworks.station_network.update_max_log_count(logcount)
+ return TRUE
if("toggle_function")
- . = 1
if(!SSnetworks.station_network)
- return 1
+ return
SSnetworks.station_network.toggle_function(text2num(params["id"]))
+ return TRUE
/datum/computer_file/program/ntnetmonitor/ui_data(mob/user)
if(!SSnetworks.station_network)
@@ -73,9 +63,11 @@
data["config_systemcontrol"] = SSnetworks.station_network.setting_systemcontrol
data["ntnetlogs"] = list()
+ data["minlogs"] = MIN_NTNET_LOGS
+ data["maxlogs"] = MAX_NTNET_LOGS
for(var/i in SSnetworks.station_network.logs)
data["ntnetlogs"] += list(list("entry" = i))
data["ntnetmaxlogs"] = SSnetworks.station_network.setting_maxlogcount
- return data
\ No newline at end of file
+ return data
diff --git a/code/modules/modular_computers/file_system/programs/ntnrc_client.dm b/code/modules/modular_computers/file_system/programs/ntnrc_client.dm
index d8b3f96f42..4ae5bd326b 100644
--- a/code/modules/modular_computers/file_system/programs/ntnrc_client.dm
+++ b/code/modules/modular_computers/file_system/programs/ntnrc_client.dm
@@ -9,7 +9,7 @@
network_destination = "NTNRC server"
ui_header = "ntnrc_idle.gif"
available_on_ntnet = 1
- tgui_id = "ntos_net_chat"
+ tgui_id = "NtosNetChat"
ui_x = 900
ui_y = 675
diff --git a/code/modules/modular_computers/file_system/programs/powermonitor.dm b/code/modules/modular_computers/file_system/programs/powermonitor.dm
index f7c734667b..d2d57b1447 100644
--- a/code/modules/modular_computers/file_system/programs/powermonitor.dm
+++ b/code/modules/modular_computers/file_system/programs/powermonitor.dm
@@ -11,8 +11,7 @@
requires_ntnet = 0
network_destination = "power monitoring system"
size = 9
- tgui_id = "ntos_power_monitor"
- ui_style = "ntos"
+ tgui_id = "NtosPowerMonitor"
ui_x = 550
ui_y = 700
diff --git a/code/modules/modular_computers/file_system/programs/radar.dm b/code/modules/modular_computers/file_system/programs/radar.dm
new file mode 100644
index 0000000000..7a6e80267c
--- /dev/null
+++ b/code/modules/modular_computers/file_system/programs/radar.dm
@@ -0,0 +1,249 @@
+/datum/computer_file/program/radar //generic parent that handles most of the process
+ filename = "genericfinder"
+ filedesc = "debug_finder"
+ ui_header = "borg_mon.gif" //DEBUG -- new icon before PR
+ program_icon_state = "generic"
+ extended_desc = "generic"
+ requires_ntnet = TRUE
+ transfer_access = null
+ available_on_ntnet = FALSE
+ network_destination = "tracking program"
+ size = 5
+ tgui_id = "NtosRadar"
+ ui_x = 800
+ ui_y = 600
+ special_assets = list(
+ /datum/asset/simple/radar_assets,
+ )
+ ///List of trackable entities. Updated by the scan() proc.
+ var/list/objects
+ ///Ref of the last trackable object selected by the user in the tgui window. Updated in the ui_act() proc.
+ var/atom/selected
+ ///Used to store when the next scan is available. Updated by the scan() proc.
+ var/next_scan = 0
+
+/datum/computer_file/program/radar/kill_program(forced = FALSE)
+ objects = list()
+ selected = null
+ return ..()
+
+/datum/computer_file/program/radar/ui_data(mob/user)
+ var/list/data = get_header_data()
+ data["selected"] = selected
+ data["objects"] = list()
+ data["scanning"] = (world.time < next_scan)
+ for(var/list/i in objects)
+ var/list/objectdata = list(
+ ref = i["ref"],
+ name = i["name"],
+ )
+ data["object"] += list(objectdata)
+
+ data["target"] = list()
+ var/list/trackinfo = track()
+ if(trackinfo)
+ data["target"] = trackinfo
+ return data
+
+/datum/computer_file/program/radar/ui_act(action, params)
+ if(..())
+ return
+
+ switch(action)
+ if("selecttarget")
+ selected = params["ref"]
+ if("scan")
+ scan()
+
+/**
+ *Updates tracking information of the selected target.
+ *
+ *The track() proc updates the entire set of information about the location
+ *of the target, including whether the Ntos window should use a pinpointer
+ *crosshair over the up/down arrows, or none in favor of a rotating arrow
+ *for far away targets. This information is returned in the form of a list.
+ *
+*/
+/datum/computer_file/program/radar/proc/track()
+ return
+
+/**
+ *
+ *Checks the trackability of the selected target.
+ *
+ *If the target is on the computer's Z level, or both are on station Z
+ *levels, and the target isn't untrackable, return TRUE.
+ *Arguments:
+ **arg1 is the atom being evaluated.
+*/
+/datum/computer_file/program/radar/proc/trackable(atom/movable/signal)
+ if(!signal)
+ return FALSE
+ var/turf/here = get_turf(computer)
+ var/turf/there = get_turf(signal)
+ return (there.z == here.z) || (is_station_level(here.z) && is_station_level(there.z))
+
+/**
+ *
+ *Runs a scan of all the trackable atoms.
+ *
+ *Checks each entry in the GLOB of the specific trackable atoms against
+ *the track() proc, and fill the objects list with lists containing the
+ *atoms' names and REFs. The objects list is handed to the tgui screen
+ *for displaying to, and being selected by, the user. A two second
+ *sleep is used to delay the scan, both for thematical reasons as well
+ *as to limit the load players may place on the server using these
+ *somewhat costly loops.
+*/
+/datum/computer_file/program/radar/proc/scan()
+ return
+
+///////////////////
+//Suit Sensor App//
+///////////////////
+
+///A program that tracks crew members via suit sensors
+/datum/computer_file/program/radar/lifeline
+ filename = "Lifeline"
+ filedesc = "Lifeline"
+ program_icon_state = "generic"
+ extended_desc = "This program allows for tracking of crew members via their suit sensors."
+ requires_ntnet = TRUE
+ transfer_access = ACCESS_MEDICAL
+ available_on_ntnet = TRUE
+
+/datum/computer_file/program/radar/lifeline/track()
+ var/mob/living/carbon/human/humanoid = locate(selected) in GLOB.human_list
+ if(!istype(humanoid) || !trackable(humanoid))
+ return
+
+ var/turf/here_turf = (get_turf(computer))
+ var/turf/target_turf = (get_turf(humanoid))
+ var/userot = FALSE
+ var/rot = 0
+ var/pointer="crosshairs"
+ var/locx = (target_turf.x - here_turf.x)
+ var/locy = (here_turf.y - target_turf.y)
+ if(get_dist_euclidian(here_turf, target_turf) > 24) //If they're too far away, we need the angle for the arrow along the edge of the radar display
+ userot = TRUE
+ rot = round(Get_Angle(here_turf, target_turf))
+ else
+ locx = locx + 24
+ locy = locy + 24
+ if(target_turf.z > here_turf.z)
+ pointer="caret-up"
+ else if(target_turf.z < here_turf.z)
+ pointer="caret-down"
+ var/list/trackinfo = list(
+ locx = locx,
+ locy = locy,
+ userot = userot,
+ rot = rot,
+ arrowstyle = "ntosradarpointer.png", //For the rotation arrow, it's stupid I know
+ color = "green",
+ pointer = pointer,
+ )
+ return trackinfo
+
+/datum/computer_file/program/radar/lifeline/scan()
+ if(world.time < next_scan)
+ return
+ next_scan = world.time + (2 SECONDS)
+ objects = list()
+ for(var/i in GLOB.human_list)
+ var/mob/living/carbon/human/humanoid = i
+ if(!trackable(humanoid))
+ continue
+ var/crewmember_name = "Unknown"
+ if(humanoid.wear_id)
+ var/obj/item/card/id/ID = humanoid.wear_id.GetID()
+ if(ID && ID.registered_name)
+ crewmember_name = ID.registered_name
+ var/list/crewinfo = list(
+ ref = REF(humanoid),
+ name = crewmember_name,
+ )
+ objects += list(crewinfo)
+
+/datum/computer_file/program/radar/lifeline/trackable(mob/living/carbon/human/humanoid)
+ if(!humanoid || !istype(humanoid))
+ return FALSE
+ if(..() && istype(humanoid.w_uniform, /obj/item/clothing/under))
+
+ var/obj/item/clothing/under/uniform = humanoid.w_uniform
+ if(!uniform.has_sensor || (uniform.sensor_mode < SENSOR_COORDS)) // Suit sensors must be on maximum.
+ return FALSE
+
+ return TRUE
+
+////////////////////////
+//Nuke Disk Finder App//
+////////////////////////
+
+///A program that tracks crew members via suit sensors
+/datum/computer_file/program/radar/fission360
+ filename = "Fission360"
+ filedesc = "Fission360"
+ program_icon_state = "generic"
+ extended_desc = "This program allows for tracking of nuclear authorization disks and warheads."
+ requires_ntnet = FALSE
+ transfer_access = null
+ available_on_ntnet = FALSE
+ available_on_syndinet = TRUE
+ tgui_id = "NtosRadarSyndicate"
+
+/datum/computer_file/program/radar/fission360/track()
+ var/obj/nuke = locate(selected) in GLOB.poi_list
+ if(!trackable(nuke))
+ return
+
+ var/turf/here_turf = (get_turf(computer))
+ var/turf/target_turf = (get_turf(nuke))
+ var/userot = FALSE
+ var/rot = 0
+ var/pointer="crosshairs"
+ var/locx = (target_turf.x - here_turf.x)
+ var/locy = (here_turf.y - target_turf.y)
+ if(get_dist_euclidian(here_turf, target_turf) > 24) //If they're too far away, we need the angle for the arrow along the edge of the radar display
+ userot = TRUE
+ rot = round(Get_Angle(here_turf, target_turf))
+ else
+ locx = locx + 24
+ locy = locy + 24
+ if(target_turf.z > here_turf.z)
+ pointer="caret-up"
+ else if(target_turf.z < here_turf.z)
+ pointer="caret-down"
+ var/list/trackinfo = list(
+ locx = locx,
+ locy = locy,
+ userot = userot,
+ rot = rot,
+ arrowstyle = "ntosradarpointerS.png",
+ color = "red",
+ pointer = pointer,
+ )
+ return trackinfo
+
+/datum/computer_file/program/radar/fission360/scan()
+ if(world.time < next_scan)
+ return
+ next_scan = world.time + (2 SECONDS)
+ objects = list()
+ for(var/i in GLOB.nuke_list)
+ var/obj/machinery/nuclearbomb/nuke = i
+ if(!trackable(nuke))
+ continue
+
+ var/list/nukeinfo = list(
+ ref = REF(nuke),
+ name = nuke.name,
+ )
+ objects += list(nukeinfo)
+ var/obj/item/disk/nuclear/disk = locate() in GLOB.poi_list
+ if(trackable(disk))
+ var/list/nukeinfo = list(
+ ref = REF(disk),
+ name = disk.name,
+ )
+ objects += list(nukeinfo)
diff --git a/code/modules/modular_computers/file_system/programs/robocontrol.dm b/code/modules/modular_computers/file_system/programs/robocontrol.dm
new file mode 100644
index 0000000000..910f923327
--- /dev/null
+++ b/code/modules/modular_computers/file_system/programs/robocontrol.dm
@@ -0,0 +1,86 @@
+
+/datum/computer_file/program/robocontrol
+ filename = "robocontrol"
+ filedesc = "Bot Remote Controller"
+ program_icon_state = "robot"
+ extended_desc = "A remote controller used for giving basic commands to non-sentient robots."
+ transfer_access = ACCESS_ROBOTICS
+ requires_ntnet = TRUE
+ network_destination = "robotics control network"
+ size = 12
+ tgui_id = "NtosRoboControl"
+ ui_x = 550
+ ui_y = 550
+ ///Number of simple robots on-station.
+ var/botcount = 0
+ ///Used to find the location of the user for the purposes of summoning robots.
+ var/mob/current_user
+ ///Access granted by the used to summon robots.
+ var/list/current_access = list()
+
+/datum/computer_file/program/robocontrol/ui_data(mob/user)
+ var/list/data = get_header_data()
+ var/turf/current_turf = get_turf(ui_host())
+ var/zlevel = current_turf.z
+ var/list/botlist = list()
+ var/list/mulelist = list()
+
+ var/obj/item/computer_hardware/card_slot/card_slot = computer ? computer.all_components[MC_CARD] : null
+ data["have_id_slot"] = !!card_slot
+ if(computer)
+ var/obj/item/card/id/id_card = card_slot ? card_slot.stored_card : null
+ data["has_id"] = !!id_card
+ data["id_owner"] = id_card ? id_card.registered_name : "No Card Inserted."
+ data["access_on_card"] = id_card ? id_card.access : null
+
+ botcount = 0
+ current_user = user
+
+ for(var/B in GLOB.bots_list)
+ var/mob/living/simple_animal/bot/Bot = B
+ if(!Bot.on || Bot.z != zlevel || Bot.remote_disabled) //Only non-emagged bots on the same Z-level are detected!
+ continue //Also, the PDA must have access to the bot type.
+ var/list/newbot = list("name" = Bot.name, "mode" = Bot.get_mode_ui(), "model" = Bot.model, "locat" = get_area(Bot), "bot_ref" = REF(Bot), "mule_check" = FALSE)
+ if(Bot.bot_type == MULE_BOT)
+ var/mob/living/simple_animal/bot/mulebot/MULE = Bot
+ mulelist += list(list("name" = MULE.name, "dest" = MULE.destination, "power" = MULE.cell ? MULE.cell.percent() : 0, "home" = MULE.home_destination, "autoReturn" = MULE.auto_return, "autoPickup" = MULE.auto_pickup, "reportDelivery" = MULE.report_delivery, "mule_ref" = REF(MULE)))
+ if(MULE.load)
+ data["load"] = MULE.load.name
+ newbot["mule_check"] = TRUE
+ botlist += list(newbot)
+
+ data["bots"] = botlist
+ data["mules"] = mulelist
+ data["botcount"] = botlist.len
+
+ return data
+
+/datum/computer_file/program/robocontrol/ui_act(action, list/params)
+ if(..())
+ return TRUE
+ var/obj/item/computer_hardware/card_slot/card_slot
+ var/obj/item/card/id/id_card
+ if(computer)
+ card_slot = computer.all_components[MC_CARD]
+ if(card_slot)
+ id_card = card_slot.stored_card
+
+ var/list/standard_actions = list("patroloff", "patrolon", "ejectpai")
+ var/list/MULE_actions = list("stop", "go", "home", "destination", "setid", "sethome", "unload", "autoret", "autopick", "report", "ejectpai")
+ var/mob/living/simple_animal/bot/Bot = locate(params["robot"]) in GLOB.bots_list
+ if (action in standard_actions)
+ Bot.bot_control(action, current_user, current_access)
+ if (action in MULE_actions)
+ Bot.bot_control(action, current_user, current_access, TRUE)
+ switch(action)
+ if("summon")
+ Bot.bot_control(action, current_user, id_card ? id_card.access : current_access)
+ if("ejectcard")
+ if(!computer || !card_slot)
+ return
+ if(id_card)
+ GLOB.data_core.manifest_modify(id_card.registered_name, id_card.assignment)
+ card_slot.try_eject(TRUE, current_user)
+ else
+ playsound(get_turf(ui_host()) , 'sound/machines/buzz-sigh.ogg', 25, FALSE)
+ return
diff --git a/code/modules/modular_computers/file_system/programs/sm_monitor.dm b/code/modules/modular_computers/file_system/programs/sm_monitor.dm
index dbee59bb3e..0a675a7abc 100644
--- a/code/modules/modular_computers/file_system/programs/sm_monitor.dm
+++ b/code/modules/modular_computers/file_system/programs/sm_monitor.dm
@@ -8,8 +8,7 @@
transfer_access = ACCESS_CONSTRUCTION
network_destination = "supermatter monitoring system"
size = 5
- tgui_id = "ntos_supermatter_monitor"
- ui_style = "ntos"
+ tgui_id = "NtosSupermatterMonitor"
ui_x = 600
ui_y = 350
var/last_status = SUPERMATTER_INACTIVE
@@ -73,20 +72,22 @@
data["active"] = TRUE
data["SM_integrity"] = active.get_integrity()
data["SM_power"] = active.power
- data["SM_ambienttemp"] = air.temperature
+ data["SM_ambienttemp"] = air.return_temperature()
data["SM_ambientpressure"] = air.return_pressure()
//data["SM_EPR"] = round((air.total_moles / air.group_multiplier) / 23.1, 0.01)
var/list/gasdata = list()
if(air.total_moles())
- for(var/gasid in air.gases)
- gasdata.Add(list(list(
- "name"= GLOB.meta_gas_names[gasid],
- "amount" = round(100*air.gases[gasid]/air.total_moles(),0.01))))
+ for(var/gasid in air.get_gases())
+ var/amount = air.get_moles(gasid)
+ if(amount)
+ gasdata.Add(list(list(
+ "name"= GLOB.meta_gas_names[gasid],
+ "amount" = round(100*amount/air.total_moles(),0.01))))
else
- for(var/gasid in air.gases)
+ for(var/gasid in air.get_gases())
gasdata.Add(list(list(
"name"= GLOB.meta_gas_names[gasid],
"amount" = 0)))
@@ -124,4 +125,4 @@
for(var/obj/machinery/power/supermatter_crystal/S in supermatters)
if(S.uid == newuid)
active = S
- return TRUE
\ No newline at end of file
+ return TRUE
diff --git a/code/modules/modular_computers/hardware/printer.dm b/code/modules/modular_computers/hardware/printer.dm
index 44383822cc..36c666e5d6 100644
--- a/code/modules/modular_computers/hardware/printer.dm
+++ b/code/modules/modular_computers/hardware/printer.dm
@@ -27,13 +27,11 @@
// Damaged printer causes the resulting paper to be somewhat harder to read.
if(damage > damage_malfunction)
- P.info = stars(text_to_print, 100-malfunction_probability)
+ P.setText(stars(text_to_print, 100-malfunction_probability))
else
- P.info = text_to_print
+ P.setText(text_to_print)
if(paper_title)
P.name = paper_title
- P.update_icon()
- P.reload_fields()
stored_paper--
P = null
return TRUE
@@ -59,4 +57,4 @@
icon_state = "printer_mini"
w_class = WEIGHT_CLASS_TINY
stored_paper = 5
- max_paper = 15
\ No newline at end of file
+ max_paper = 15
diff --git a/code/modules/modular_computers/laptop_vendor.dm b/code/modules/modular_computers/laptop_vendor.dm
index 9e0e1c8014..ee9def4191 100644
--- a/code/modules/modular_computers/laptop_vendor.dm
+++ b/code/modules/modular_computers/laptop_vendor.dm
@@ -232,7 +232,7 @@
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if (!ui)
- ui = new(user, src, ui_key, "computer_fabricator", "Personal Computer Vendor", ui_x, ui_y, state = state)
+ ui = new(user, src, ui_key, "ComputerFabricator", "Personal Computer Vendor", ui_x, ui_y, state = state)
ui.open()
/obj/machinery/lapvend/attackby(obj/item/I, mob/user)
diff --git a/code/modules/movespeed/_movespeed_modifier.dm b/code/modules/movespeed/_movespeed_modifier.dm
index 0976f4d067..3bc4463531 100644
--- a/code/modules/movespeed/_movespeed_modifier.dm
+++ b/code/modules/movespeed/_movespeed_modifier.dm
@@ -144,6 +144,10 @@ GLOBAL_LIST_EMPTY(movespeed_modification_cache)
/// Handles the special case of editing the movement var
/mob/vv_edit_var(var_name, var_value)
+ if(var_name == NAMEOF(src, control_object))
+ var/obj/O = var_name
+ if(!istype(O) || (O.obj_flags & DANGEROUS_POSSESSION))
+ return FALSE
var/slowdown_edit = (var_name == NAMEOF(src, cached_multiplicative_slowdown))
var/diff
if(slowdown_edit && isnum(cached_multiplicative_slowdown) && isnum(var_value))
@@ -195,7 +199,13 @@ GLOBAL_LIST_EMPTY(movespeed_modification_cache)
else
continue
. += amt
+ var/old = cached_multiplicative_slowdown // CITAEDL EDIT - To make things a bit less jarring, when in situations where
+ // your delay decreases, "give" the delay back to the client
cached_multiplicative_slowdown = .
+ var/diff = old - cached_multiplicative_slowdown
+ if((diff > 0) && client)
+ if(client.move_delay > world.time + 1.5)
+ client.move_delay -= diff
/// Get the move speed modifiers list of the mob
/mob/proc/get_movespeed_modifiers()
diff --git a/code/modules/movespeed/modifiers/mobs.dm b/code/modules/movespeed/modifiers/mobs.dm
index a2176ca95e..d17767bb1f 100644
--- a/code/modules/movespeed/modifiers/mobs.dm
+++ b/code/modules/movespeed/modifiers/mobs.dm
@@ -78,9 +78,6 @@
blacklisted_movetypes = FLOATING
variable = TRUE
-/datum/movespeed_modifier/shove
- multiplicative_slowdown = SHOVE_SLOWDOWN_STRENGTH
-
/datum/movespeed_modifier/human_carry
variable = TRUE
diff --git a/code/modules/ninja/suit/gloves.dm b/code/modules/ninja/suit/gloves.dm
index dbe4c80579..a06b753402 100644
--- a/code/modules/ninja/suit/gloves.dm
+++ b/code/modules/ninja/suit/gloves.dm
@@ -67,6 +67,7 @@
to_chat(H, "Gained [DisplayEnergy(.)] of energy from [A].")
else
to_chat(H, "\The [A] has run dry of energy, you must find another source!")
+ . = INTERRUPT_UNARMED_ATTACK
else
. = FALSE //as to not cancel attack_hand()
diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_stars.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_stars.dm
index 31ac62d9fc..508722ecf2 100644
--- a/code/modules/ninja/suit/n_suit_verbs/ninja_stars.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/ninja_stars.dm
@@ -15,4 +15,4 @@
/obj/item/throwing_star/ninja
name = "ninja throwing star"
throwforce = 30
- embedding = list("embedded_pain_multiplier" = 6, "embed_chance" = 100, "embedded_fall_chance" = 0)
+ embedding = list("pain_mult" = 6, "embed_chance" = 100, "fall_chance" = 0, "embed_chance_turf_mod" = 15)
diff --git a/code/modules/oracle_ui/README.md b/code/modules/oracle_ui/README.md
deleted file mode 100644
index bc96eb1f51..0000000000
--- a/code/modules/oracle_ui/README.md
+++ /dev/null
@@ -1,233 +0,0 @@
-# `/datum/oracle_ui`
-
-This datum is a replacement for tgui which does not use any Node.js dependencies, and works entirely through raw HTML, JS and CSS. It's designed to be reasonably easy to port something from tgui to oracle_ui.
-
-### How to create a UI
-
-For this example, we're going to port the disposals bin from tgui to oracle_ui.
-
-#### Step 1
-
-In order to create a UI, you will first need to create an instance of `/datum/oracle_ui` or one of its subclasses, in this case `/datum/oracle_ui/themed/nano`.
-
-You need to pass in `src`, the width of the window, the height of the window, and the template to render from. You can optionally set some flags to disallow window resizing and whether to automatically refresh the UI.
-
-`code/modules/recycling/disposal-unit.dm`
-```dm
-/obj/machinery/disposal/bin/Initialize(mapload, obj/structure/disposalconstruct/make_from)
- . = ..()
- ui = new /datum/oracle_ui/themed/nano(src, 330, 190, "disposal_bin")
- ui.auto_refresh = TRUE
- ui.can_resize = FALSE
-```
-
-#### Step 2
-
-You will now need to make a template in `html/oracle_ui/content/{template_name}`.
-
-Values defined as `@{value}` will get replaced at runtime by oracle_ui.
-
-`html/oracle_ui/content/disposal_bin/index.html`
-```html
-
-
- State:
-
@{full_pressure}
-
-
- Pressure:
-
-
-
-
@{per}
-
-
-
-
- Handle:
-
@{flush}
-
-
- Eject:
-
@{contents}
-
-
- Compressor:
-
@{pressure_charging}
-
-
-```
-
-#### Step 3
-
-Now you need to implement the methods that provide data to oracle_ui. `oui_data` can be adapted from the `ui_data` proc that tgui uses.
-
-The `act` proc generates a hyperlink that will result in `oui_act` getting called on your object when clicked. The `class` argument defines a css class to be added to the hyperlink, and disabled determines whether the hyperlink will be disabled or not.
-
-Calling `soft_update_fields` will result in the UI being updated on all clients, which is useful when the object changes state.
-
-`code/modules/recycling/disposal-unit.dm`
-```dm
-/obj/machinery/disposal/bin/oui_data(mob/user)
- var/list/data = list()
- data["flush"] = flush ? ui.act("Disengage", user, "handle-0", class="active") : ui.act("Engage", user, "handle-1")
- data["full_pressure"] = full_pressure ? "Ready" : (pressure_charging ? "Pressurizing" : "Off")
- data["pressure_charging"] = pressure_charging ? ui.act("Turn Off", user, "pump-0", class="active", disabled=full_pressure) : ui.act("Turn On", user, "pump-1", disabled=full_pressure)
- var/per = full_pressure ? 100 : Clamp(100* air_contents.return_pressure() / (SEND_PRESSURE), 0, 99)
- data["per"] = "[round(per, 1)]%"
- data["contents"] = ui.act("Eject Contents", user, "eject", disabled=contents.len < 1)
- data["isai"] = isAI(user)
- return data
-/obj/machinery/disposal/bin/oui_act(mob/user, action, list/params)
- if(..())
- return
- switch(action)
- if("handle-0")
- flush = FALSE
- update_icon()
- . = TRUE
- if("handle-1")
- if(!panel_open)
- flush = TRUE
- update_icon()
- . = TRUE
- if("pump-0")
- if(pressure_charging)
- pressure_charging = FALSE
- update_icon()
- . = TRUE
- if("pump-1")
- if(!pressure_charging)
- pressure_charging = TRUE
- update_icon()
- . = TRUE
- if("eject")
- eject()
- . = TRUE
- ui.soft_update_fields()
-```
-
-#### Step 4
-
-You now need to hook in and ensure oracle_ui is invoked upon clicking. `render` should be used to open the UI for a user, typically on click.
-
-`code/modules/recycling/disposal-unit.dm`
-```dm
-/obj/machinery/disposal/bin/ui_interact(mob/user, state)
- if(stat & BROKEN)
- return
- if(user.loc == src)
- to_chat(user, "You cannot reach the controls from inside!")
- return
- ui.render(user)
-```
-
-#### Done
-
-
-
-You should have a functional UI at this point. Some additional odds and ends can be discovered throughout `code/modules/recycling/disposal-unit.dm`. For a full diff of the changes made to it, refer to [the original pull request on GitHub](https://github.com/OracleStation/OracleStation/pull/702/files#diff-4b6c20ec7d37222630e7524d9577e230).
-
-### API Reference
-
-#### `/datum/oracle_ui`
-
-The main datum which handles the UI.
-
-##### `get_content(mob/target)`
-Returns the HTML that should be displayed for a specified target mob. Calls `oui_getcontent` on the datasource to get the return value. *This proc is not used in the themed subclass.*
-
-##### `can_view(mob/target)`
-Returns whether the specified target mob can view the UI. Calls `oui_canview` on the datasource to get the return value.
-
-##### `test_viewer(mob/target, updating)`
-Tests whether the client is valid and can view the UI. If updating is TRUE, checks to see if they still have the UI window open.
-
-##### `render(mob/target, updating = FALSE)`
-Opens the UI for a target mob, sending HTML. If updating is TRUE, will only do it to clients which still have the window open.
-
-##### `render_all()`
-Does the above, but for all viewers and with updating set to TRUE.
-
-##### `close(mob/target)`
-Closes the UI for the specified target mob.
-
-##### `close_all()`
-Does the above, but for all viewers.
-
-##### `check_view(mob/target)`
-Checks if the specified target mob can view the UI, and if they can't closes their UI
-
-##### `check_view_all()`
-Does the above, but for all viewers.
-
-##### `call_js(mob/target, js_func, list/parameters = list())`
-Invokes `js_func` in the UI of the specified target mob with the specified parameters.
-
-##### `call_js_all(js_func, list/parameters = list()))`
-Does the above, but for all viewers.
-
-##### `steal_focus(mob/target)`
-Causes the UI to steal focus for the specified target mob.
-
-##### `steal_focus_all()`
-Does the above, but for all viewers.
-
-##### `flash(mob/target, times = -1)`
-Causes the UI to flash for the specified target mob the specified number of times, the default keeps the element flashing until focused.
-
-##### `flash_all()`
-Does the above, but for all viewers.
-
-##### `href(mob/user, action, list/parameters = list())`
-Generates a href for the specified user which will invoke `oui_act` on the datasource with the specified action and parameters.
-
-#### `/datum/oracle_ui/themed`
-
-A subclass which supports templating and theming.
-
-##### `get_file(path)`
-Loads a file from disk and returns the contents. Caches files loaded from disk for you.
-
-##### `get_content_file(filename)`
-Loads a file from the current content folder and returns the contents.
-
-##### `get_themed_file(filename)`
-Loads a file from the current theme folder and returns the contents.
-
-##### `process_template(template, variables)`
-Processes a template and populates it with the provided variables.
-
-##### `get_inner_content(mob/target)`
-Returns the templated content to be inserted into the main template for the specified target mob.
-
-##### `soft_update_fields()`
-For all viewers, updates the fields in the template via the `updateFields` javaScript function.
-
-##### `soft_update_all()`
-For all viewers, updates the content body in the template via the `replaceContent` javaScript function.
-
-##### `change_page(var/newpage)`
-Changes the template to use to draw the page and forces an update to all viewers
-
-##### `act(label, mob/user, action, list/parameters = list(), class = "", disabled = FALSE`
-Returns a fully formatted hyperlink for the specified user. `label` will be the hyperlink label, `action` and `parameters` are what will be passed to `oui_act`, `class` is any CSS classes to apply to the hyperlink and `disabled` will disable the hyperlink.
-
-#### `/datum`
-
-Functions built into all objects to support oracle_ui. There are default implementations for most major superclasses.
-
-##### `oui_canview(mob/user)`
-Returns whether the specified user view the UI at this time.
-
-##### `oui_getcontent(mob/user)`
-Returns the raw HTML to be sent to the specified user. *This proc is not used in the themed subclass of oracle_ui.*
-
-##### `oui_data(mob/user)`
-Returns templating data for the specified user. *This proc is only used in the themed subclass of oracle_ui.*
-
-##### `oui_data_debug(mob/user)`
-Returns the above, but JSON-encoded and escaped, for copy pasting into the web IDE. *This proc is only used for debugging purposes.*
-
-##### `oui_act(mob/user, action, list/params)`
-Called when a hyperlink is clicked in the UI.
diff --git a/code/modules/oracle_ui/assets.dm b/code/modules/oracle_ui/assets.dm
deleted file mode 100644
index 5d26d80a81..0000000000
--- a/code/modules/oracle_ui/assets.dm
+++ /dev/null
@@ -1,8 +0,0 @@
-/datum/asset/simple/oui_theme_nano
- assets = list(
- // JavaScript
- "sui-nano-common.js" = 'html/oracle_ui/themes/nano/sui-nano-common.js',
- "sui-nano-jquery.min.js" = 'html/oracle_ui/themes/nano/sui-nano-jquery.min.js',
- // Stylesheets
- "sui-nano-common.css" = 'html/oracle_ui/themes/nano/sui-nano-common.css',
- )
diff --git a/code/modules/oracle_ui/hookup_procs.dm b/code/modules/oracle_ui/hookup_procs.dm
deleted file mode 100644
index 30db9d92b9..0000000000
--- a/code/modules/oracle_ui/hookup_procs.dm
+++ /dev/null
@@ -1,46 +0,0 @@
-/datum/proc/oui_canview(mob/user)
- return TRUE
-
-/datum/proc/oui_getcontent(mob/user)
- return "Default Implementation"
-
-/datum/proc/oui_canuse(mob/user)
- if(isobserver(user) && !user.silicon_privileges)
- return FALSE
- return oui_canview(user)
-
-/datum/proc/oui_data(mob/user)
- return list()
-
-/datum/proc/oui_data_debug(mob/user)
- return html_encode(json_encode(oui_data(user)))
-
-/datum/proc/oui_act(mob/user, action, list/params)
- // No Implementation
-
-/atom/oui_canview(mob/user)
- if(isobserver(user))
- return TRUE
- if(user.incapacitated())
- return FALSE
- if(isobj(src.loc) && get_dist(src, user) < 2)
- return TRUE
- if(isturf(src.loc) && Adjacent(user))
- return TRUE
- return FALSE
-
-/obj/item/oui_canview(mob/user)
- if(src.loc == user)
- return src in user.held_items
- return ..()
-
-/obj/machinery/oui_canview(mob/user)
- if(hasSiliconAccessInArea(user, ALL))
- return TRUE
- if(!can_interact(user))
- return FALSE
- if(iscyborg(user))
- return can_see(user, src, 7)
- if(isAI(user))
- return GLOB.cameranet.checkTurfVis(get_turf_pixel(src))
- return ..()
diff --git a/code/modules/oracle_ui/oracle_ui.dm b/code/modules/oracle_ui/oracle_ui.dm
deleted file mode 100644
index 5e8d6b9c7b..0000000000
--- a/code/modules/oracle_ui/oracle_ui.dm
+++ /dev/null
@@ -1,134 +0,0 @@
-/datum/oracle_ui
- var/width = 512
- var/height = 512
- var/can_close = TRUE
- var/can_minimize = FALSE
- var/can_resize = TRUE
- var/titlebar = TRUE
- var/window_id = null
- var/viewers[0]
- var/auto_check_view = TRUE
- var/auto_refresh = FALSE
- var/atom/datasource = null
- var/datum/asset/assets = null
-
-/datum/oracle_ui/New(atom/n_datasource, n_width = 512, n_height = 512, n_assets = null)
- datasource = n_datasource
- window_id = REF(src)
- width = n_width
- height = n_height
-
-/datum/oracle_ui/Destroy()
- close_all()
- if(src.datum_flags & DF_ISPROCESSING)
- STOP_PROCESSING(SSobj, src)
- return ..()
-
-/datum/oracle_ui/process()
- if(auto_check_view)
- check_view_all()
- if(auto_refresh)
- render_all()
-
-/datum/oracle_ui/proc/get_content(mob/target)
- return call(datasource, "oui_getcontent")(target)
-
-/datum/oracle_ui/proc/can_view(mob/target)
- return call(datasource, "oui_canview")(target)
-
-/datum/oracle_ui/proc/test_viewer(mob/target, updating)
- //If the target is null or does not have a client, remove from viewers and return
- if(!target | !target.client | !can_view(target))
- viewers -= target
- if(viewers.len < 1 && (src.datum_flags & DF_ISPROCESSING))
- STOP_PROCESSING(SSobj, src) //No more viewers, stop polling
- close(target)
- return FALSE
- //If this is an update, and they have closed the window, remove from viewers and return
- if(updating && winget(target, window_id, "is-visible") != "true")
- viewers -= target
- if(viewers.len < 1 && (src.datum_flags & DF_ISPROCESSING))
- STOP_PROCESSING(SSobj, src) //No more viewers, stop polling
- return FALSE
- return TRUE
-
-/datum/oracle_ui/proc/render(mob/target, updating = FALSE)
- set waitfor = FALSE //Makes this an async call
- if(!can_view(target))
- return
- //Check to see if they have the window open still if updating
- if(updating && !test_viewer(target, updating))
- return
- //Send assets
- if(!updating && assets)
- assets.send(target)
- //Add them to the viewers if they aren't there already
- viewers |= target
- if(!(src.datum_flags & DF_ISPROCESSING) && (auto_refresh | auto_check_view))
- START_PROCESSING(SSobj, src) //Start processing to poll for viewability
- //Send the content
- if(updating)
- target << output(get_content(target), "[window_id].browser")
- else
- target << browse(get_content(target), "window=[window_id];size=[width]x[height];can_close=[can_close];can_minimize=[can_minimize];can_resize=[can_resize];titlebar=[titlebar];focus=false;")
- steal_focus(target)
-
-/datum/oracle_ui/proc/render_all()
- for(var/viewer in viewers)
- render(viewer, TRUE)
-
-/datum/oracle_ui/proc/close(mob/target)
- if(target && target.client)
- target << browse(null, "window=[window_id]")
-
-/datum/oracle_ui/proc/close_all()
- for(var/viewer in viewers)
- close(viewer)
- viewers = list()
-
-/datum/oracle_ui/proc/check_view_all()
- for(var/viewer in viewers)
- check_view(viewer)
-
-/datum/oracle_ui/proc/check_view(mob/target)
- set waitfor = FALSE //Makes this an async call
- if(!test_viewer(target, TRUE))
- close(target)
-
-/datum/oracle_ui/proc/call_js(mob/target, js_func, list/parameters = list())
- set waitfor = FALSE //Makes this an async call
- if(!test_viewer(target, TRUE))
- return
- target << output(list2params(parameters),"[window_id].browser:[js_func]")
-
-/datum/oracle_ui/proc/call_js_all(js_func, list/parameters = list())
- for(var/viewer in viewers)
- call_js(viewer, js_func, parameters)
-
-/datum/oracle_ui/proc/steal_focus(mob/target)
- set waitfor = FALSE //Makes this an async call
- winset(target, "[window_id]","focus=true")
-
-/datum/oracle_ui/proc/steal_focus_all()
- for(var/viewer in viewers)
- steal_focus(viewer)
-
-/datum/oracle_ui/proc/flash(mob/target, times = -1)
- set waitfor = FALSE //Makes this an async call
- winset(target, "[window_id]","flash=[times]")
-
-/datum/oracle_ui/proc/flash_all(times = -1)
- for(var/viewer in viewers)
- flash(viewer, times)
-
-/datum/oracle_ui/proc/href(mob/user, action, list/parameters = list())
- var/params_string = replacetext(list2params(parameters),"&",";")
- return "?src=[REF(src)];sui_action=[action];sui_user=[REF(user)];[params_string]"
-
-/datum/oracle_ui/Topic(href, parameters)
- var/action = parameters["sui_action"]
- var/mob/current_user = locate(parameters["sui_user"])
- if(!call(datasource, "oui_canuse")(current_user))
- return
- if(datasource)
- call(datasource, "oui_act")(current_user, action, parameters);
diff --git a/code/modules/oracle_ui/themed.dm b/code/modules/oracle_ui/themed.dm
deleted file mode 100644
index 56b82c2647..0000000000
--- a/code/modules/oracle_ui/themed.dm
+++ /dev/null
@@ -1,82 +0,0 @@
-/datum/oracle_ui/themed
- var/theme = ""
- var/content_root = ""
- var/current_page = "index.html"
- var/root_template = ""
-
-/datum/oracle_ui/themed/New(atom/n_datasource, n_width = 512, n_height = 512, n_content_root = "")
- root_template = get_themed_file("index.html")
- content_root = n_content_root
- return ..(n_datasource, n_width, n_height, get_asset_datum(/datum/asset/simple/oui_theme_nano))
-
-/datum/oracle_ui/themed/process()
- if(auto_check_view)
- check_view_all()
- if(auto_refresh)
- soft_update_fields()
-
-GLOBAL_LIST_EMPTY(oui_template_variables)
-GLOBAL_LIST_EMPTY(oui_file_cache)
-
-/datum/oracle_ui/themed/proc/get_file(path)
- if(GLOB.oui_file_cache[path])
- return GLOB.oui_file_cache[path]
- else if(fexists(path))
- var/data = file2text(path)
- GLOB.oui_file_cache[path] = data
- return data
- else
- var/errormsg = "MISSING PATH '[path]'"
-#ifndef UNIT_TESTS
- log_world(errormsg) //Because Travis absolutely hates these procs
-#endif
- return errormsg
-
-/datum/oracle_ui/themed/proc/get_content_file(filename)
- return get_file("./html/oracle_ui/content/[content_root]/[filename]")
-
-/datum/oracle_ui/themed/proc/get_themed_file(filename)
- return get_file("./html/oracle_ui/themes/[theme]/[filename]")
-
-/datum/oracle_ui/themed/proc/process_template(template, variables)
- var/regex/pattern = regex("\\@\\{(\\w+)\\}","gi")
- GLOB.oui_template_variables = variables
- var/replaced = pattern.Replace(template, /proc/oui_process_template_replace)
- GLOB.oui_template_variables = null
- return replaced
-
-/proc/oui_process_template_replace(match, group1)
- var/value = GLOB.oui_template_variables[group1]
- return "[value]"
-
-/datum/oracle_ui/themed/proc/get_inner_content(mob/target)
- var/list/data = call(datasource, "oui_data")(target)
- return process_template(get_content_file(current_page), data)
-
-/datum/oracle_ui/themed/get_content(mob/target)
- var/list/template_data = list("title" = datasource.name, "body" = get_inner_content(target))
- return process_template(root_template, template_data)
-
-/datum/oracle_ui/themed/proc/soft_update_fields()
- for(var/viewer in viewers)
- var/json = json_encode(call(datasource, "oui_data")(viewer))
- call_js(viewer, "updateFields", list(json))
-
-/datum/oracle_ui/themed/proc/soft_update_all()
- for(var/viewer in viewers)
- call_js(viewer, "replaceContent", list(get_inner_content(viewer)))
-
-/datum/oracle_ui/themed/proc/change_page(newpage)
- if(newpage == current_page)
- return
- current_page = newpage
- render_all()
-
-/datum/oracle_ui/themed/proc/act(label, mob/user, action, list/parameters = list(), class = "", disabled = FALSE)
- if(disabled)
- return "[label]"
- else
- return "[label]"
-
-/datum/oracle_ui/themed/nano
- theme = "nano"
diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm
index 5e882eb8d0..b8f2c95762 100644
--- a/code/modules/paperwork/filingcabinet.dm
+++ b/code/modules/paperwork/filingcabinet.dm
@@ -137,7 +137,7 @@
virgin = 0 //tabbing here is correct- it's possible for people to try and use it
//before the records have been generated, so we do this inside the loop.
-/obj/structure/filingcabinet/security/attack_hand()
+/obj/structure/filingcabinet/security/on_attack_hand()
populate()
. = ..()
@@ -170,8 +170,7 @@
virgin = 0 //tabbing here is correct- it's possible for people to try and use it
//before the records have been generated, so we do this inside the loop.
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/structure/filingcabinet/medical/attack_hand()
+/obj/structure/filingcabinet/medical/on_attack_hand()
populate()
. = ..()
@@ -186,9 +185,8 @@
GLOBAL_LIST_EMPTY(employmentCabinets)
/obj/structure/filingcabinet/employment
- var/cooldown = 0
icon_state = "employmentcabinet"
- var/virgin = 1
+ var/virgin = TRUE
/obj/structure/filingcabinet/employment/Initialize()
. = ..()
@@ -213,13 +211,12 @@ GLOBAL_LIST_EMPTY(employmentCabinets)
new /obj/item/paper/contract/employment(src, employee)
/obj/structure/filingcabinet/employment/interact(mob/user)
- if(!cooldown)
- if(virgin)
- fillCurrent()
- virgin = 0
- cooldown = 1
- sleep(100) // prevents the devil from just instantly emptying the cabinet, ensuring an easy win.
- cooldown = 0
- else
+ if(TIMER_COOLDOWN_CHECK(src, COOLDOWN_EMPLOYMENT_CABINET))
to_chat(user, "[src] is jammed, give it a few seconds.")
- ..()
+ return ..()
+
+ TIMER_COOLDOWN_START(src, COOLDOWN_EMPLOYMENT_CABINET, 10 SECONDS) // prevents the devil from just instantly emptying the cabinet, ensuring an easy win.
+ if(virgin)
+ fillCurrent()
+ virgin = FALSE
+ return ..()
diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm
index a599ec9deb..c32afab342 100644
--- a/code/modules/paperwork/folders.dm
+++ b/code/modules/paperwork/folders.dm
@@ -50,6 +50,14 @@
name = "folder - '[inputvalue]'"
+/obj/item/folder/Destroy()
+ for(var/obj/important_thing in contents)
+ if(!(important_thing.resistance_flags & INDESTRUCTIBLE))
+ continue
+ important_thing.forceMove(drop_location()) //don't destroy round critical content such as objective documents.
+ return ..()
+
+
/obj/item/folder/attack_self(mob/user)
var/dat = "[name]"
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index aed3ff5848..01c25b57f1 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -4,7 +4,57 @@
*
* lipstick wiping is in code/game/objects/items/weapons/cosmetics.dm!
*/
+#define MAX_PAPER_LENGTH 5000
+#define MAX_PAPER_STAMPS 30 // Too low?
+#define MAX_PAPER_STAMPS_OVERLAYS 4
+#define MODE_READING 0
+#define MODE_WRITING 1
+#define MODE_STAMPING 2
+
+/**
+ ** This is a custom ui state. All it really does is keep track of pen
+ ** being used and if they are editing it or not. This way we can keep
+ ** the data with the ui rather than on the paper
+ **/
+/datum/ui_state/default/paper_state
+ /// What edit mode we are in and who is
+ /// writing on it right now
+ var/edit_mode = MODE_READING
+ /// Setup for writing to a sheet
+ var/pen_color = "black"
+ var/pen_font = ""
+ var/is_crayon = FALSE
+ /// Setup for stamping a sheet
+ // Why not the stamp obj? I have no idea
+ // what happens to states out of scope so
+ // don't want to put instances in this
+ var/stamp_icon_state = ""
+ var/stamp_name = ""
+ var/stamp_class = ""
+
+
+/datum/ui_state/default/paper_state/proc/copy_from(datum/ui_state/default/paper_state/from)
+ switch(from.edit_mode)
+ if(MODE_READING)
+ edit_mode = MODE_READING
+ if(MODE_WRITING)
+ edit_mode = MODE_WRITING
+ pen_color = from.pen_color
+ pen_font = from.pen_font
+ is_crayon = from.is_crayon
+ if(MODE_STAMPING)
+ edit_mode = MODE_STAMPING
+ stamp_icon_state = from.stamp_icon_state
+ stamp_class = from.stamp_class
+ stamp_name = from.stamp_name
+
+
+/**
+ ** Paper is now using markdown (like in github pull notes) for ALL rendering
+ ** so we do loose a bit of functionality but we gain in easy of use of
+ ** paper and getting rid of that crashing bug
+ **/
/obj/item/paper
name = "paper"
gender = NEUTER
@@ -21,19 +71,77 @@
resistance_flags = FLAMMABLE
max_integrity = 50
dog_fashion = /datum/dog_fashion/head
+ grind_results = list(/datum/reagent/cellulose = 3)
+ color = "white"
+ /// What's actually written on the paper.
+ var/info = ""
+ var/show_written_words = TRUE
- var/info //What's actually written on the paper.
- var/info_links //A different version of the paper which includes html links at fields and EOF
- var/stamps //The (text for the) stamps on the paper.
- var/fields = 0 //Amount of user created fields
- var/list/stamped
+ /// The (text for the) stamps on the paper.
+ var/list/stamps /// Positioning for the stamp in tgui
+ var/list/stamped /// Overlay info
+
+ /// This REALLY should be a componenet. Basicly used during, april fools
+ /// to honk at you
var/rigged = 0
var/spam_flag = 0
+
var/contact_poison // Reagent ID to transfer on contact
var/contact_poison_volume = 0
- var/datum/oracle_ui/ui = null
- var/force_stars = FALSE // If we should force the text to get obfuscated with asterisks
+ // ui stuff
+ var/ui_x = 600
+ var/ui_y = 800
+ // Ok, so WHY are we caching the ui's?
+ // Since we are not using autoupdate we
+ // need some way to update the ui's of
+ // other people looking at it and if
+ // its been updated. Yes yes, lame
+ // but canot be helped. However by
+ // doing it this way, we can see
+ // live updates and have multipule
+ // people look at it
+ var/list/viewing_ui = list()
+
+
+ /// When the sheet can be "filled out"
+ /// This is an associated list
+ var/list/form_fields = list()
+ var/field_counter = 1
+
+/obj/item/paper/Destroy()
+ close_all_ui()
+ stamps = null
+ stamped = null
+ . = ..()
+
+/**
+ ** This proc copies this sheet of paper to a new
+ ** sheet, Makes it nice and easy for carbon and
+ ** the copyer machine
+ **/
+/obj/item/paper/proc/copy()
+ var/obj/item/paper/N = new(arglist(args))
+ N.info = info
+ N.color = color
+ N.update_icon_state()
+ N.stamps = stamps
+ N.stamped = stamped.Copy()
+ N.form_fields = form_fields.Copy()
+ N.field_counter = field_counter
+ copy_overlays(N, TRUE)
+ return N
+
+/**
+ ** This proc sets the text of the paper and updates the
+ ** icons. You can modify the pen_color after if need
+ ** be.
+ **/
+/obj/item/paper/proc/setText(text)
+ info = text
+ form_fields = null
+ field_counter = 0
+ update_icon_state()
/obj/item/paper/pickup(user)
if(contact_poison && ishuman(user))
@@ -42,59 +150,28 @@
if(!istype(G) || G.transfer_prints)
H.reagents.add_reagent(contact_poison,contact_poison_volume)
contact_poison = null
- ui.check_view_all()
- ..()
-
-/obj/item/paper/dropped(mob/user)
- ui.check_view(user)
- return ..()
+ . = ..()
/obj/item/paper/Initialize()
. = ..()
pixel_y = rand(-8, 8)
pixel_x = rand(-9, 9)
- ui = new /datum/oracle_ui(src, 420, 600, get_asset_datum(/datum/asset/spritesheet/simple/paper))
- ui.can_resize = FALSE
update_icon()
- updateinfolinks()
-/obj/item/paper/oui_getcontent(mob/target)
- if(!target.is_literate() || force_stars)
- force_stars = FALSE
- return "[name][stars(info)][stamps]"
- else if(istype(target.get_active_held_item(), /obj/item/pen) | istype(target.get_active_held_item(), /obj/item/toy/crayon))
- return "[name][info_links][stamps]
"
- else
- return "[name][info][stamps]"
-
-/obj/item/paper/oui_canview(mob/target)
- if(check_rights_for(target.client, R_FUN)) //Allows admins to view faxes
- return TRUE
- if(isAI(target))
- force_stars = TRUE
- return TRUE
- if(iscyborg(target))
- return get_dist(src, target) < 2
- return ..()
/obj/item/paper/update_icon_state()
- if(resistance_flags & ON_FIRE)
- icon_state = "paper_onfire"
- return
- if(info)
- icon_state = "paper_words"
- return
- icon_state = "paper"
+ if(info && show_written_words)
+ icon_state = "[initial(icon_state)]_words"
+
+/obj/item/paper/ui_base_html(html)
+ /// This might change in a future PR
+ var/datum/asset/spritesheet/assets = get_asset_datum(/datum/asset/spritesheet/simple/paper)
+ . = replacetext(html, "", assets.css_tag())
-/obj/item/paper/examine(mob/user)
- . = ..()
- . += "Alt-click to fold it."
- if(oui_canview(user))
- ui.render(user)
- else
- . += "You're too far away to read it!"
+/obj/item/paper/examine_more(mob/user)
+ ui_interact(user)
/obj/item/paper/proc/show_content(mob/user)
user.examinate(src)
@@ -117,243 +194,257 @@
if((loc == usr && usr.stat == CONSCIOUS))
name = "paper[(n_name ? text("- '[n_name]'") : null)]"
add_fingerprint(usr)
- ui.render_all()
+
/obj/item/paper/suicide_act(mob/user)
user.visible_message("[user] scratches a grid on [user.p_their()] wrist with the paper! It looks like [user.p_theyre()] trying to commit sudoku...")
return (BRUTELOSS)
+
+/// ONLY USED FOR APRIL FOOLS
/obj/item/paper/proc/reset_spamflag()
spam_flag = FALSE
+
/obj/item/paper/attack_self(mob/user)
- show_content(user)
if(rigged && (SSevents.holidays && SSevents.holidays[APRIL_FOOLS]))
if(!spam_flag)
spam_flag = TRUE
- playsound(loc, 'sound/items/bikehorn.ogg', 50, 1)
+ playsound(loc, 'sound/items/bikehorn.ogg', 50, TRUE)
addtimer(CALLBACK(src, .proc/reset_spamflag), 20)
-
-/obj/item/paper/attack_ai(mob/living/silicon/ai/user)
- show_content(user)
-
-/obj/item/paper/proc/addtofield(id, text, links = 0)
- var/locid = 0
- var/laststart = 1
- var/textindex = 1
- while(locid < 15) //hey whoever decided a while(1) was a good idea here, i hate you
- var/istart = 0
- if(links)
- istart = findtext(info_links, "", laststart)
- else
- istart = findtext(info, "", laststart)
-
- if(istart == 0)
- return //No field found with matching id
-
- if(links)
- laststart = istart + length(info_links[istart])
- else
- laststart = istart + length(info[istart])
- locid++
- if(locid == id)
- var/iend = 1
- if(links)
- iend = findtext(info_links, "", istart)
- else
- iend = findtext(info, "", istart)
-
- //textindex = istart+26
- textindex = iend
- break
-
- if(links)
- var/before = copytext(info_links, 1, textindex)
- var/after = copytext(info_links, textindex)
- info_links = before + text + after
- else
- var/before = copytext(info, 1, textindex)
- var/after = copytext(info, textindex)
- info = before + text + after
- updateinfolinks()
-
-
-/obj/item/paper/proc/updateinfolinks()
- info_links = info
- for(var/i in 1 to min(fields, 15))
- addtofield(i, "write", 1)
- info_links = info_links + "write"
- ui.render_all()
+ . = ..()
/obj/item/paper/proc/clearpaper()
- info = null
+ info = ""
stamps = null
LAZYCLEARLIST(stamped)
cut_overlays()
- updateinfolinks()
- update_icon()
+ update_icon_state()
-/obj/item/paper/proc/parsepencode(t, obj/item/pen/P, mob/user, iscrayon = 0)
- if(length(t) < 1) //No input means nothing needs to be parsed
+/obj/item/paper/examine(mob/user)
+ ui_interact(user)
+
+
+/obj/item/paper/can_interact(mob/user)
+ if(!..())
+ return FALSE
+ if(resistance_flags & ON_FIRE) // Are we on fire? Hard ot read if so
+ return FALSE
+ if(user.is_blind()) // Even harder to read if your blind...braile? humm
+ return FALSE
+ return user.can_read(src) // checks if the user can read.
+
+
+/**
+ ** This creates the ui, since we are using a custom state but not much else
+ ** just makes it easyer to make it. Also we make a custom ui_key as I am
+ ** not sure how tgui handles many producers?
+**/
+/obj/item/paper/proc/create_ui(mob/user, datum/ui_state/default/paper_state/state)
+ ui_interact(user, "main", null, FALSE, null, state)
+
+
+/obj/item/proc/burn_paper_product_attackby_check(obj/item/I, mob/living/user, bypass_clumsy)
+ var/ignition_message = I.ignition_effect(src, user)
+ if(!ignition_message)
+ return
+ . = TRUE
+ if(!bypass_clumsy && HAS_TRAIT(user, TRAIT_CLUMSY) && prob(10) && Adjacent(user))
+ user.visible_message("[user] accidentally ignites [user.p_them()]self!", \
+ "You miss [src] and accidentally light yourself on fire!")
+ if(user.is_holding(I)) //checking if they're holding it in case TK is involved
+ user.dropItemToGround(I)
+ user.adjust_fire_stacks(1)
+ user.IgniteMob()
return
- t = parsemarkdown(t, user, iscrayon)
+ if(user.is_holding(src)) //no TK shit here.
+ user.dropItemToGround(src)
+ user.visible_message(ignition_message)
+ add_fingerprint(user)
+ fire_act(I.get_temperature())
- if(!iscrayon)
- t = "[t]"
- else
- var/obj/item/toy/crayon/C = P
- t = "[t]"
-
- // Count the fields
- var/laststart = 1
- while(fields < 15)
- var/i = findtext(t, "", laststart)
- if(i == 0)
- break
- laststart = i+1
- fields++
-
- return t
-
-/obj/item/paper/proc/reload_fields() // Useful if you made the paper programicly and want to include fields. Also runs updateinfolinks() for you.
- fields = 0
- var/laststart = 1
- while(fields < 15)
- var/i = findtext(info, "", laststart)
- if(i == 0)
- break
- laststart = i+1
- fields++
- updateinfolinks()
-
-
-/obj/item/paper/proc/openhelp(mob/user)
- user << browse({"Paper Help
-
- You can use backslash (\\) to escape special characters.
-
-
Crayon&Pen commands
-
- # text : Defines a header.
- |text| : Centers the text.
- **text** : Makes the text bold.
- *text* : Makes the text italic.
- ^text^ : Increases the size of the text.
- %s : Inserts a signature of your name in a foolproof way.
- %f : Inserts an invisible field which lets you start type from there. Useful for forms.
-
-
Pen exclusive commands
- ((text)) : Decreases the size of the text.
- * item : An unordered list item.
- * item: An unordered list child item.
- --- : Adds a horizontal rule.
- "}, "window=paper_help")
-
-
-/obj/item/paper/Topic(href, href_list)
- ..()
- var/literate = usr.is_literate()
- if(!usr.canUseTopic(src, BE_CLOSE, literate))
- return
-
- if(href_list["help"])
- openhelp(usr)
- return
- if(href_list["write"])
- var/id = href_list["write"]
- var/t = stripped_multiline_input("Enter what you want to write:", "Write", no_trim=TRUE)
- if(!t || !usr.canUseTopic(src, BE_CLOSE, literate))
- return
- var/obj/item/i = usr.get_active_held_item() //Check to see if he still got that darn pen, also check if he's using a crayon or pen.
- var/iscrayon = 0
- if(!istype(i, /obj/item/pen))
- if(!istype(i, /obj/item/toy/crayon))
- return
- iscrayon = 1
-
- if(!in_range(src, usr) && loc != usr && !istype(loc, /obj/item/clipboard) && loc.loc != usr && usr.get_active_held_item() != i) //Some check to see if he's allowed to write
- return
-
- t = parsepencode(t, i, usr, iscrayon) // Encode everything from pencode to html
-
- if(t != null) //No input from the user means nothing needs to be added
- if(id!="end")
- addtofield(text2num(id), t) // He wants to edit a field, let him.
- else
- info += t // Oh, he wants to edit to the end of the file, let him.
- updateinfolinks()
- show_content(usr)
- update_icon()
-
-
-/obj/item/paper/attackby(obj/item/P, mob/living/carbon/human/user, params)
- ..()
-
- if(resistance_flags & ON_FIRE)
- return
-
- if(is_blind(user))
+/obj/item/paper/attackby(obj/item/P, mob/living/user, params)
+ if(burn_paper_product_attackby_check(P, user))
+ close_all_ui()
return
if(istype(P, /obj/item/pen) || istype(P, /obj/item/toy/crayon))
- if(user.is_literate())
- show_content(user)
- return
- else
- to_chat(user, "You don't know how to read or write.")
+ if(length(info) >= MAX_PAPER_LENGTH) // Sheet must have less than 1000 charaters
+ to_chat(user, "This sheet of paper is full!")
return
+ var/datum/ui_state/default/paper_state/state = new
+ state.edit_mode = MODE_WRITING
+ // should a crayon be in the same subtype as a pen? How about a brush or charcoal?
+ // TODO: Convert all writing stuff to one type, /obj/item/art_tool maybe?
+ state.is_crayon = istype(P, /obj/item/toy/crayon);
+ if(state.is_crayon)
+ var/obj/item/toy/crayon/PEN = P
+ state.pen_font = CRAYON_FONT
+ state.pen_color = PEN.paint_color
+ else
+ var/obj/item/pen/PEN = P
+ state.pen_font = PEN.font
+ state.pen_color = PEN.colour
+
+ create_ui(user, state)
+ return
else if(istype(P, /obj/item/stamp))
- if(!in_range(src, user))
- return
+ var/datum/ui_state/default/paper_state/state = new
+ state.edit_mode = MODE_STAMPING // we are read only becausse the sheet is full
+ state.stamp_icon_state = P.icon_state
+ state.stamp_name = P.name
var/datum/asset/spritesheet/sheet = get_asset_datum(/datum/asset/spritesheet/simple/paper)
- if (isnull(stamps))
- stamps = sheet.css_tag()
- stamps += sheet.icon_tag(P.icon_state)
- var/mutable_appearance/stampoverlay = mutable_appearance('icons/obj/bureaucracy.dmi', "paper_[P.icon_state]")
- stampoverlay.pixel_x = rand(-2, 2)
- stampoverlay.pixel_y = rand(-3, 2)
+ state.stamp_class = sheet.icon_class_name(P.icon_state)
- LAZYADD(stamped, P.icon_state)
- add_overlay(stampoverlay)
+ to_chat(user, "You ready your stamp over the paper! ")
- to_chat(user, "You stamp the paper with your rubber stamp.")
- ui.render_all()
+ create_ui(user, state)
+ return /// Normaly you just stamp, you don't need to read the thing
+ else
+ // cut paper? the sky is the limit!
+ var/datum/ui_state/default/paper_state/state = new
+ state.edit_mode = MODE_READING
+ create_ui(user, state) // The other ui will be created with just read mode outside of this
- if(P.get_temperature())
- if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(10))
- user.visible_message("[user] accidentally ignites [user.p_them()]self!", \
- "You miss the paper and accidentally light yourself on fire!")
- user.dropItemToGround(P)
- user.adjust_fire_stacks(1)
- user.IgniteMob()
- return
+ return ..()
- if(!(in_range(user, src))) //to prevent issues as a result of telepathically lighting a paper
- return
-
- user.dropItemToGround(src)
- user.visible_message("[user] lights [src] ablaze with [P]!", "You light [src] on fire!")
- fire_act()
-
-
- add_fingerprint(user)
/obj/item/paper/fire_act(exposed_temperature, exposed_volume)
- ..()
- if(!(resistance_flags & FIRE_PROOF))
- icon_state = "paper_onfire"
+ . = ..()
+ if(.)
info = "[stars(info)]"
+/obj/item/paper/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/default/paper_state/state = new)
+ ui_key = "main-[REF(user)]"
+ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ var/datum/asset/assets = get_asset_datum(/datum/asset/spritesheet/simple/paper)
+ assets.send(user)
+ // The x size is because we double the width for the editor
+ ui = new(user, src, ui_key, "PaperSheet", name, ui_x, ui_y, master_ui, state)
+ ui.set_autoupdate(FALSE)
+ viewing_ui[user] = ui
+ ui.open()
+ else
+ var/datum/ui_state/default/paper_state/last_state = ui.state
+ if(last_state)
+ last_state.copy_from(state)
+ else
+ ui.state = state
+
+
+/obj/item/paper/ui_close(mob/user)
+ /// close the editing window and change the mode
+ viewing_ui[user] = null
+ . = ..()
+
+// Again, we have to do this as autoupdate is off
+/obj/item/paper/proc/update_all_ui()
+ for(var/datum/tgui/ui in viewing_ui)
+ ui.update()
+
+// Again, we have to do this as autoupdate is off
+/obj/item/paper/proc/close_all_ui()
+ for(var/datum/tgui/ui in viewing_ui)
+ ui.close()
+ viewing_ui = list()
+
+/obj/item/paper/ui_data(mob/user)
+ var/list/data = list()
+
+ var/datum/tgui/ui = viewing_ui[user]
+ var/datum/ui_state/default/paper_state/state = ui.state
+
+ // Should all this go in static data and just do a forced update?
+ data["text"] = info
+ data["max_length"] = MAX_PAPER_LENGTH
+ data["paper_state"] = icon_state /// TODO: show the sheet will bloodied or crinkling?
+ data["paper_color"] = !color || color == "white" ? "#FFFFFF" : color // color might not be set
+ data["stamps"] = stamps
+
+ data["edit_mode"] = state.edit_mode
+ data["edit_usr"] = "[ui.user]";
+
+ // pen info for editing
+ data["is_crayon"] = state.is_crayon
+ data["pen_font"] = state.pen_font
+ data["pen_color"] = state.pen_color
+ // stamping info for..stamping
+ data["stamp_class"] = state.stamp_class
+
+ data["field_counter"] = field_counter
+ data["form_fields"] = form_fields
+
+ return data
+
+
+/obj/item/paper/ui_act(action, params, datum/tgui/ui, datum/ui_state/default/paper_state/state)
+ if(..())
+ return
+ switch(action)
+ if("stamp")
+ var/stamp_x = text2num(params["x"])
+ var/stamp_y = text2num(params["y"])
+ var/stamp_r = text2num(params["r"]) // rotation in degrees
+
+ if (isnull(stamps))
+ stamps = new/list()
+ if(stamps.len < MAX_PAPER_STAMPS)
+ // I hate byond when dealing with freaking lists
+ stamps += list(list(state.stamp_class, stamp_x, stamp_y,stamp_r)) /// WHHHHY
+
+ /// This does the overlay stuff
+ if (isnull(stamped))
+ stamped = new/list()
+ if(stamped.len < MAX_PAPER_STAMPS_OVERLAYS)
+ var/mutable_appearance/stampoverlay = mutable_appearance('icons/obj/bureaucracy.dmi', "paper_[state.stamp_icon_state]")
+ stampoverlay.pixel_x = rand(-2, 2)
+ stampoverlay.pixel_y = rand(-3, 2)
+ add_overlay(stampoverlay)
+ LAZYADD(stamped, state.stamp_icon_state)
+
+ ui.user.visible_message("[ui.user] stamps [src] with [state.stamp_name]!", "You stamp [src] with [state.stamp_name]!")
+ else
+ to_chat(usr, pick("You try to stamp but you miss!", "There is no where else you can stamp!"))
+
+ update_all_ui()
+ . = TRUE
+
+ if("save")
+ var/in_paper = params["text"]
+ var/paper_len = length(in_paper)
+ var/list/fields = params["form_fields"]
+ field_counter = params["field_counter"] ? text2num(params["field_counter"]) : field_counter
+
+ if(paper_len > MAX_PAPER_LENGTH)
+ // Side note, the only way we should get here is if
+ // the javascript was modified, somehow, outside of
+ // byond. but right now we are logging it as
+ // the generated html might get beyond this limit
+ log_paper("[key_name(ui.user)] writing to paper [name], and overwrote it by [paper_len-MAX_PAPER_LENGTH]")
+ if(paper_len == 0)
+ to_chat(ui.user, pick("Writing block strikes again!", "You forgot to write anthing!"))
+ else
+ log_paper("[key_name(ui.user)] writing to paper [name]")
+ if(info != in_paper)
+ to_chat(ui.user, "You have added to your paper masterpiece!");
+ info = in_paper
+
+ for(var/key in fields)
+ form_fields[key] = fields[key];
+
+
+ update_all_ui()
+ update_icon()
+
+ . = TRUE
-/obj/item/paper/extinguish()
- ..()
- update_icon()
/*
* Construction paper
@@ -377,13 +468,20 @@
name = "paper scrap"
icon_state = "scrap"
slot_flags = null
+ show_written_words = FALSE
-/obj/item/paper/crumpled/ComponentInitialize()
- . = ..()
- AddElement(/datum/element/update_icon_blocker)
+/obj/item/paper/crumpled/update_icon_state()
+ return
/obj/item/paper/crumpled/bloody
icon_state = "scrap_bloodied"
/obj/item/paper/crumpled/muddy
icon_state = "scrap_mud"
+
+#undef MAX_PAPER_LENGTH
+#undef MAX_PAPER_STAMPS
+#undef MAX_PAPER_STAMPS_OVERLAYS
+#undef MODE_READING
+#undef MODE_WRITING
+#undef MODE_STAMPING
diff --git a/code/modules/paperwork/paper_cutter.dm b/code/modules/paperwork/paper_cutter.dm
index 0a7bf011a7..3937720f74 100644
--- a/code/modules/paperwork/paper_cutter.dm
+++ b/code/modules/paperwork/paper_cutter.dm
@@ -66,10 +66,7 @@
return
..()
-/obj/item/papercutter/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/item/papercutter/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
add_fingerprint(user)
if(!storedcutter)
to_chat(user, "The cutting blade is gone! You can't use [src] now.")
diff --git a/code/modules/paperwork/paper_premade.dm b/code/modules/paperwork/paper_premade.dm
index 23c8d47323..414026924a 100644
--- a/code/modules/paperwork/paper_premade.dm
+++ b/code/modules/paperwork/paper_premade.dm
@@ -4,7 +4,49 @@
/obj/item/paper/fluff/sop
name = "paper- 'Standard Operating Procedure'"
- info = "Alert Levels: \nBlue- Emergency \n\t1. Caused by fire \n\t2. Caused by manual interaction \n\tAction: \n\t\tClose all fire doors. These can only be opened by resetting the alarm \nRed- Ejection/Self Destruct \n\t1. Caused by module operating computer. \n\tAction: \n\t\tAfter the specified time the module will eject completely. \n \nEngine Maintenance Instructions: \n\tShut off ignition systems: \n\tActivate internal power \n\tActivate orbital balance matrix \n\tRemove volatile liquids from area \n\tWear a fire suit \n \n\tAfter \n\t\tDecontaminate \n\t\tVisit medical examiner \n \nToxin Laboratory Procedure: \n\tWear a gas mask regardless \n\tGet an oxygen tank. \n\tActivate internal atmosphere \n \n\tAfter \n\t\tDecontaminate \n\t\tVisit medical examiner \n \nDisaster Procedure: \n\tFire: \n\t\tActivate sector fire alarm. \n\t\tMove to a safe area. \n\t\tGet a fire suit \n\t\tAfter: \n\t\t\tAssess Damage \n\t\t\tRepair damages \n\t\t\tIf needed, Evacuate \n\tMeteor Shower: \n\t\tActivate fire alarm \n\t\tMove to the back of ship \n\t\tAfter \n\t\t\tRepair damage \n\t\t\tIf needed, Evacuate \n\tAccidental Reentry: \n\t\tActivate fire alarms in front of ship. \n\t\tMove volatile matter to a fire proof area! \n\t\tGet a fire suit. \n\t\tStay secure until an emergency ship arrives. \n \n\t\tIf ship does not arrive- \n\t\t\tEvacuate to a nearby safe area!"
+ info = {"
+Alert Levels:
+* Blue - Emergency
+ * Caused by fire
+ * Caused by manual interaction
+ * Action: Close all fire doors. These can only be opened by resetting the alarm
+* Red- Ejection/Self Destruct
+ * Caused by module operating computer.
+ * Action: After the specified time the module will eject completely.
+Engine Maintenance Instructions:
+1. Shut off ignition systems:
+2. Activate internal power
+3. Activate orbital balance matrix
+4. Remove volatile liquids from area
+5. Wear a fire suit
+6. After Decontaminate Visit medical examiner
+Toxin Laboratory Procedure:
+1. Wear a gas mask regardless
+2. Get an oxygen tank.
+3. Activate internal atmosphere
+4. After Decontaminate Visit medical examiner
+Disaster Procedure:
+Fire:
+1. Activate sector fire alarm.
+2. Move to a safe area.
+3. Get a fire suit
+* After:
+ 1. Assess Damage
+ 2. Repair damages
+ 3. If needed, Evacuate
+Meteor Shower:
+1. Activate fire alarm
+2. Move to the back of ship
+* After
+ 1. Repair damage
+ 2. If needed, Evacuate
+Accidental Reentry:
+1. Activate fire alarms in front of ship.
+2. Move volatile matter to a fire proof area!
+3. Get a fire suit.
+4. Stay secure until an emergency ship arrives.
+5. If ship does not arrive-Evacuate to a nearby safe area!
+"};
/obj/item/paper/fluff/shuttles/daniel
info = "i love daniel daniel is my best friend
you are tearing me apart elise"
@@ -150,7 +192,7 @@
/obj/item/paper/fluff/cogstation/mime
name = "Au futur Mime"
- info = "Toutes mes excuses pour toute mauvaise grammaire, je ne suis pas un haut-parleur naturel Français et a dû utiliser NanoTranslate. Bien que vous puissiez être mécontent de l’emplacement de votre bureau, s’il vous plaît comprendre que c’était le seul endroit où nous pourrions le mettre sans problèmes de sécurité et/ou CentClown se plaindre à ce sujet. Nous nous excusons également pour l’absence d’une zone de performance dédiée, mais nous espérons que vous accorder un accès à l’entretien compensera. \n \n-C. Donnelly \n \nAnalyste Architectural"
+ info = "Toutes mes excuses pour toute mauvaise grammaire, je ne suis pas un haut-parleur naturel Fran�ais et a d� utiliser NanoTranslate. Bien que vous puissiez �tre m�content de l�emplacement de votre bureau, s�il vous pla�t comprendre que c��tait le seul endroit o� nous pourrions le mettre sans probl�mes de s�curit� et/ou CentClown se plaindre � ce sujet. Nous nous excusons �galement pour l�absence d�une zone de performance d�di�e, mais nous esp�rons que vous accorder un acc�s � l�entretien compensera. \n \n-C. Donnelly \n \nAnalyste Architectural"
/obj/item/paper/fluff/cogstation/bsrb
name = "Message from the NTBSRB"
diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm
index b8bcbedbbe..28cb5ffae9 100644
--- a/code/modules/paperwork/paperbin.dm
+++ b/code/modules/paperwork/paperbin.dm
@@ -11,6 +11,8 @@
throw_speed = 3
throw_range = 7
pressure_resistance = 8
+ attack_hand_speed = CLICK_CD_RAPID
+ attack_hand_is_action = TRUE
var/papertype = /obj/item/paper
var/total_paper = 30
var/list/papers = list()
@@ -60,11 +62,9 @@
/obj/item/paper_bin/attack_paw(mob/user)
return attack_hand(user)
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/item/paper_bin/attack_hand(mob/user)
+/obj/item/paper_bin/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(user.lying)
return
- user.changeNext_move(CLICK_CD_MELEE)
if(bin_pen)
var/obj/item/pen/P = bin_pen
P.add_fingerprint(user)
@@ -85,9 +85,8 @@
P = new papertype(src)
if(SSevents.holidays && SSevents.holidays[APRIL_FOOLS])
if(prob(30))
- P.info = "HONK HONK HONK HONK HONK HONK HONK HOOOOOOOOOOOOOOOOOOOOOONK APRIL FOOLS"
+ P.info = "*HONK HONK HONK HONK HONK HONK HONK HOOOOOOOOOOOOOOOOOOOOOONK*\n*APRIL FOOLS*\n"
P.rigged = 1
- P.updateinfolinks()
P.add_fingerprint(user)
P.forceMove(user.loc)
@@ -149,7 +148,7 @@
papertype = /obj/item/paper/natural
resistance_flags = FLAMMABLE
-/obj/item/paper_bin/bundlenatural/attack_hand(mob/user)
+/obj/item/paper_bin/bundlenatural/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
..()
if(total_paper < 1)
qdel(src)
diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm
index a9baf60c0c..c6a1ee1389 100644
--- a/code/modules/paperwork/paperplane.dm
+++ b/code/modules/paperwork/paperplane.dm
@@ -123,6 +123,7 @@
H.DefaultCombatKnockdown(40)
H.emote("scream")
+
/obj/item/paper/examine(mob/user)
. = ..()
. += "Alt-click [src] to fold it into a paper plane."
diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm
index 1c14a30a8a..08252d4e05 100644
--- a/code/modules/paperwork/pen.dm
+++ b/code/modules/paperwork/pen.dm
@@ -27,6 +27,7 @@
var/colour = "black" //what colour the ink is!
var/degrees = 0
var/font = PEN_FONT
+ embedding = list()
/obj/item/pen/suicide_act(mob/user)
user.visible_message("[user] is scribbling numbers all over [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to commit sudoku...")
@@ -41,6 +42,7 @@
desc = "It's a normal red ink pen."
icon_state = "pen_red"
colour = "red"
+ throw_speed = 4 // red ones go faster (in this case, fast enough to embed!)
/obj/item/pen/invisible
desc = "It's an invisible pen marker."
@@ -56,8 +58,10 @@
switch(colour)
if("black")
colour = "red"
+ throw_speed++
if("red")
colour = "green"
+ throw_speed = initial(throw_speed)
if("green")
colour = "blue"
else
@@ -178,6 +182,7 @@
attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") //these wont show up if the pen is off
sharpness = IS_SHARP
var/on = FALSE
+ embedding = list(embed_chance = EMBED_CHANCE)
/obj/item/pen/edagger/ComponentInitialize()
. = ..()
@@ -198,16 +203,18 @@
throwforce = initial(throwforce)
playsound(user, 'sound/weapons/saberoff.ogg', 5, 1)
to_chat(user, "[src] can now be concealed.")
+ updateEmbedding()
else
on = TRUE
force = 18
w_class = WEIGHT_CLASS_NORMAL
name = "energy dagger"
hitsound = 'sound/weapons/blade1.ogg'
- embedding = getEmbeddingBehavior(embed_chance = 100, embedded_fall_chance = 0) //rule of cool
+ embedding = list(embed_chance = 100, fall_chance = 0) //rule of cool
throwforce = 35
playsound(user, 'sound/weapons/saberon.ogg', 5, 1)
to_chat(user, "[src] is now active.")
+ updateEmbedding()
update_icon()
/obj/item/pen/edagger/update_icon_state()
diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm
index 3c4aebdba3..0b1f3bb01d 100644
--- a/code/modules/paperwork/photocopier.dm
+++ b/code/modules/paperwork/photocopier.dm
@@ -31,7 +31,7 @@
/obj/machinery/photocopier/ui_interact(mob/user)
. = ..()
- var/dat = "Photocopier
"
+ var/list/dat = list("Photocopier
")
if(copy || photocopy || doccopy || (ass && (ass.loc == src.loc)))
dat += "Remove Paper "
if(toner)
@@ -48,7 +48,7 @@
dat += "Current toner level: [toner]"
if(!toner)
dat +=" Please insert a new toner cartridge!"
- user << browse(dat, "window=copier")
+ user << browse(dat.Join(""), "window=copier")
onclose(user, "copier")
/obj/machinery/photocopier/Topic(href, href_list)
@@ -77,17 +77,14 @@
c.info += copied
c.info += ""
c.name = copy.name
- c.fields = copy.fields
c.update_icon()
- c.updateinfolinks()
c.stamps = copy.stamps
if(copy.stamped)
c.stamped = copy.stamped.Copy()
c.copy_overlays(copy, TRUE)
toner--
busy = TRUE
- sleep(15)
- busy = FALSE
+ addtimer(CALLBACK(src, .proc/reset_busy), 1.5 SECONDS)
else
break
updateUsrDialog()
@@ -96,8 +93,7 @@
if(toner >= 5 && !busy && photocopy) //Was set to = 0, but if there was say 3 toner left and this ran, you would get -2 which would be weird for ink
new /obj/item/photo (loc, photocopy.picture.Copy(greytoggle == "Greyscale"? TRUE : FALSE))
busy = TRUE
- sleep(15)
- busy = FALSE
+ addtimer(CALLBACK(src, .proc/reset_busy), 1.5 SECONDS)
else
break
else if(doccopy)
@@ -106,40 +102,35 @@
new /obj/item/documents/photocopy(loc, doccopy)
toner-= 6 // the sprite shows 6 papers, yes I checked
busy = TRUE
- sleep(15)
- busy = FALSE
+ addtimer(CALLBACK(src, .proc/reset_busy), 1.5 SECONDS)
else
break
updateUsrDialog()
else if(ass) //ASS COPY. By Miauw
for(var/i = 0, i < copies, i++)
var/icon/temp_img
- if(ishuman(ass) && (ass.get_item_by_slot(SLOT_W_UNIFORM) || ass.get_item_by_slot(SLOT_WEAR_SUIT)))
+ if(ishuman(ass) && (ass.get_item_by_slot(ITEM_SLOT_ICLOTHING) || ass.get_item_by_slot(ITEM_SLOT_OCLOTHING)))
to_chat(usr, "You feel kind of silly, copying [ass == usr ? "your" : ass][ass == usr ? "" : "\'s"] ass with [ass == usr ? "your" : "[ass.p_their()]"] clothes on." )
break
else if(toner >= 5 && !busy && check_ass()) //You have to be sitting on the copier and either be a xeno or a human without clothes on.
if(isalienadult(ass) || istype(ass, /mob/living/simple_animal/hostile/alien)) //Xenos have their own asses, thanks to Pybro.
temp_img = icon('icons/ass/assalien.png')
else if(ishuman(ass)) //Suit checks are in check_ass
- var/mob/living/carbon/human/H = ass
- if(H.dna.features["body_model"] == FEMALE)
- temp_img = icon('icons/ass/assfemale.png')
- else
- temp_img = icon('icons/ass/assmale.png')
+ temp_img = icon(ass.gender == FEMALE ? 'icons/ass/assfemale.png' : 'icons/ass/assmale.png')
else if(isdrone(ass)) //Drones are hot
temp_img = icon('icons/ass/assdrone.png')
else
break
- var/obj/item/photo/p = new /obj/item/photo (loc)
- p.pixel_x = rand(-10, 10)
- p.pixel_y = rand(-10, 10)
- p.picture = new(null, "You see [ass]'s ass on the photo.", temp_img)
- p.picture.psize_x = 128
- p.picture.psize_y = 128
- p.update_icon()
- toner -= 5
busy = TRUE
sleep(15)
+ var/obj/item/photo/p = new /obj/item/photo (loc)
+ var/datum/picture/toEmbed = new(name = "[ass]'s Ass", desc = "You see [ass]'s ass on the photo.", image = temp_img)
+ p.pixel_x = rand(-10, 10)
+ p.pixel_y = rand(-10, 10)
+ toEmbed.psize_x = 128
+ toEmbed.psize_y = 128
+ p.set_picture(toEmbed, TRUE, TRUE)
+ toner -= 5
busy = FALSE
else
break
@@ -179,8 +170,7 @@
photo.pixel_y = rand(-10, 10)
toner -= 5 //AI prints color pictures only, thus they can do it more efficiently
busy = TRUE
- sleep(15)
- busy = FALSE
+ addtimer(CALLBACK(src, .proc/reset_busy), 1.5 SECONDS)
updateUsrDialog()
else if(href_list["colortoggle"])
if(greytoggle == "Greyscale")
@@ -189,9 +179,13 @@
greytoggle = "Greyscale"
updateUsrDialog()
+/obj/machinery/photocopier/proc/reset_busy()
+ busy = FALSE
+ updateUsrDialog()
+
/obj/machinery/photocopier/proc/do_insertion(obj/item/O, mob/user)
O.forceMove(src)
- to_chat(user, "You insert [O] into [src].")
+ to_chat(user, "You insert [O] into [src].")
flick("photocopier1", src)
updateUsrDialog()
@@ -256,10 +250,10 @@
return ..()
/obj/machinery/photocopier/obj_break(damage_flag)
- if(!(flags_1 & NODECONSTRUCT_1))
- if(toner > 0)
- new /obj/effect/decal/cleanable/oil(get_turf(src))
- toner = 0
+ . = ..()
+ if(. && toner > 0)
+ new /obj/effect/decal/cleanable/oil(get_turf(src))
+ toner = 0
/obj/machinery/photocopier/MouseDrop_T(mob/target, mob/user)
check_ass() //Just to make sure that you can re-drag somebody onto it after they moved off.
@@ -267,7 +261,7 @@
return
src.add_fingerprint(user)
if(target == user)
- user.visible_message("[user] starts climbing onto the photocopier!", "You start climbing onto the photocopier...")
+ user.visible_message("[user] starts climbing onto the photocopier!", "You start climbing onto the photocopier...")
else
user.visible_message("[user] starts putting [target] onto the photocopier!", "You start putting [target] onto the photocopier...")
@@ -276,7 +270,7 @@
return
if(target == user)
- user.visible_message("[user] climbs onto the photocopier!", "You climb onto the photocopier.")
+ user.visible_message("[user] climbs onto the photocopier!", "You climb onto the photocopier.")
else
user.visible_message("[user] puts [target] onto the photocopier!", "You put [target] onto the photocopier.")
@@ -302,7 +296,7 @@
updateUsrDialog()
return 0
else if(ishuman(ass))
- if(!ass.get_item_by_slot(SLOT_W_UNIFORM) && !ass.get_item_by_slot(SLOT_WEAR_SUIT))
+ if(!ass.get_item_by_slot(ITEM_SLOT_ICLOTHING) && !ass.get_item_by_slot(ITEM_SLOT_OCLOTHING))
return 1
else
return 0
diff --git a/code/modules/photography/camera/camera.dm b/code/modules/photography/camera/camera.dm
index 3e76fc874a..b925c67940 100644
--- a/code/modules/photography/camera/camera.dm
+++ b/code/modules/photography/camera/camera.dm
@@ -221,4 +221,4 @@
p.set_picture(picture, TRUE, TRUE)
if(CONFIG_GET(flag/picture_logging_camera))
- picture.log_to_file()
\ No newline at end of file
+ picture.log_to_file()
diff --git a/code/modules/photography/photos/frame.dm b/code/modules/photography/photos/frame.dm
index 9e6f827629..d306c46815 100644
--- a/code/modules/photography/photos/frame.dm
+++ b/code/modules/photography/photos/frame.dm
@@ -21,8 +21,7 @@
to_chat(user, "\The [src] already contains a photo.")
..()
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/item/wallframe/picture/attack_hand(mob/user)
+/obj/item/wallframe/picture/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(user.get_inactive_held_item() != src)
..()
return
@@ -141,10 +140,7 @@
..()
-/obj/structure/sign/picture_frame/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/structure/sign/picture_frame/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(framed)
framed.show(user)
diff --git a/code/modules/photography/photos/photo.dm b/code/modules/photography/photos/photo.dm
index 07f765c123..5c78709e9b 100644
--- a/code/modules/photography/photos/photo.dm
+++ b/code/modules/photography/photos/photo.dm
@@ -51,6 +51,8 @@
user.examinate(src)
/obj/item/photo/attackby(obj/item/P, mob/user, params)
+ if(try_burn(P, user))
+ return
if(istype(P, /obj/item/pen) || istype(P, /obj/item/toy/crayon))
if(!user.is_literate())
to_chat(user, "You scribble illegibly on [src]!")
@@ -60,6 +62,26 @@
scribble = txt
..()
+/obj/item/photo/proc/try_burn(obj/item/I, mob/living/user)
+ var/ignition_message = I.ignition_effect(src, user)
+ if(!ignition_message)
+ return
+ . = TRUE
+ if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(10) && Adjacent(user))
+ user.visible_message("[user] accidentally ignites [user.p_them()]self!", \
+ "You miss [src] and accidentally light yourself on fire!")
+ if(user.is_holding(I)) //checking if they're holding it in case TK is involved
+ user.dropItemToGround(I)
+ user.adjust_fire_stacks(1)
+ user.IgniteMob()
+ return
+
+ if(user.is_holding(src)) //no TK shit here.
+ user.dropItemToGround(src)
+ user.visible_message(ignition_message)
+ add_fingerprint(user)
+ fire_act(I.get_temperature())
+
/obj/item/photo/examine(mob/user)
. = ..()
if(in_range(src, user))
diff --git a/code/modules/pool/pool_drain.dm b/code/modules/pool/pool_drain.dm
index 940f7cd219..527c25b9f0 100644
--- a/code/modules/pool/pool_drain.dm
+++ b/code/modules/pool/pool_drain.dm
@@ -154,7 +154,7 @@
else
new /mob/living/simple_animal/hostile/shark/laser(loc)
-/obj/machinery/pool/filter/attack_hand(mob/user)
+/obj/machinery/pool/filter/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
to_chat(user, "You search the filter.")
for(var/obj/O in contents)
O.forceMove(loc)
diff --git a/code/modules/pool/pool_main.dm b/code/modules/pool/pool_main.dm
index b45c0f36a2..98189cc8a4 100644
--- a/code/modules/pool/pool_main.dm
+++ b/code/modules/pool/pool_main.dm
@@ -177,7 +177,7 @@
else
return ..()
-/turf/open/pool/attack_hand(mob/living/user)
+/turf/open/pool/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
diff --git a/code/modules/pool/pool_structures.dm b/code/modules/pool/pool_structures.dm
index 4cea485237..ec5d455958 100644
--- a/code/modules/pool/pool_structures.dm
+++ b/code/modules/pool/pool_structures.dm
@@ -11,7 +11,7 @@
layer = ABOVE_MOB_LAYER
dir = EAST
-/obj/structure/pool/ladder/attack_hand(mob/living/user)
+/obj/structure/pool/ladder/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
@@ -52,7 +52,7 @@
user.pixel_x = initial_px
user.pixel_y = initial_py
-/obj/structure/pool/Lboard/attack_hand(mob/living/user)
+/obj/structure/pool/Lboard/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
if(iscarbon(user))
var/mob/living/carbon/jumper = user
if(jumping)
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 6772fe3cf1..ba51eb3bef 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -38,6 +38,8 @@
#define APC_CHARGING 1
#define APC_FULLY_CHARGED 2
+#define MAXIMUM_COG_REGAIN 100 //How much charge drained by an integration cog can be priority-recharged in one processing-tick
+
// the Area Power Controller (APC), formerly Power Distribution Unit (PDU)
// one per area, needs wire connection to power network through a terminal
@@ -94,6 +96,7 @@
var/mob/living/silicon/ai/occupier = null
var/transfer_in_progress = FALSE //Is there an AI being transferred out of us?
var/obj/item/clockwork/integration_cog/integration_cog //Is there a cog siphoning power?
+ var/cog_drained = 0 //How much of the cell's charge was drained by an integration cog, recovering this amount takes priority over the normal APC cell recharge calculations, but comes after powering Essentials.
var/longtermpower = 10
var/auto_name = 0
var/failure_timer = 0
@@ -499,6 +502,7 @@
cell.forceMove(T)
cell.update_icon()
cell = null
+ cog_drained = 0 //No more cell means no more averting celldrain
charging = APC_NOT_CHARGING
update_icon()
return
@@ -701,7 +705,7 @@
START_PROCESSING(SSfastprocess, W)
playsound(src, 'sound/machines/clockcult/steam_whoosh.ogg', 50, FALSE)
opened = APC_COVER_CLOSED
- locked = FALSE
+ locked = TRUE //Clockies get full APC access on cogged APCs, but they can't lock or unlock em unless they steal some ID to give all of them APC access, soo this is pretty much just QoL for them and makes cogs a tiny bit more stealthy
update_icon()
return
else if(panel_open && !opened && is_wire_tool(W))
@@ -833,10 +837,7 @@
// attack with hand - remove cell (if cover open) or interact with the APC
-/obj/machinery/power/apc/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/machinery/power/apc/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(opened && (!issilicon(user)))
if(cell)
user.visible_message("[user] removes \the [cell] from [src]!","You remove \the [cell].")
@@ -849,17 +850,12 @@
if((stat & MAINT) && !opened) //no board; no interface
return
-/obj/machinery/power/apc/oui_canview(mob/user)
- if(area.hasSiliconAccessInArea(user)) //some APCs are mapped outside their assigned area, so this is required.
- return TRUE
- return ..()
-
/obj/machinery/power/apc/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
- ui = new(user, src, ui_key, "apc", name, 450, 460, master_ui, state)
+ ui = new(user, src, ui_key, "Apc", name, 480, 460, master_ui, state)
ui.open()
/obj/machinery/power/apc/ui_data(mob/user)
@@ -868,7 +864,7 @@
if (H && !H.stealthmode && H.toggled)
abilitiesavail = TRUE
var/list/data = list(
- "locked" = locked && !(integration_cog && is_servant_of_ratvar(user)) && !area.hasSiliconAccessInArea(user, PRIVILEDGES_SILICON|PRIVILEDGES_DRONE),
+ "locked" = locked,
"lock_nightshift" = nightshift_requires_auth,
"failTime" = failure_timer,
"isOperating" = operating,
@@ -940,6 +936,9 @@
return "[area.name] : [equipment]/[lighting]/[environ] ([lastused_equip+lastused_light+lastused_environ]) : [cell? cell.percent() : "N/C"] ([charging])"
/obj/machinery/power/apc/proc/update()
+ var/old_light = area.power_light
+ var/old_equip = area.power_equip
+ var/old_environ = area.power_environ
if(operating && !shorted && !failure_timer)
area.power_light = (lighting > 1)
area.power_equip = (equipment > 1)
@@ -948,7 +947,8 @@
area.power_light = FALSE
area.power_equip = FALSE
area.power_environ = FALSE
- area.power_change()
+ if(old_light != area.power_light || old_equip != area.power_equip || old_environ != area.power_environ)
+ area.power_change()
/obj/machinery/power/apc/proc/can_use(mob/user, loud = 0) //used by attack_hand() and Topic()
if(IsAdminGhost(user))
@@ -986,7 +986,7 @@
failure_timer = 0
update_icon()
update()
- if (action == "hijack" && can_use(usr, 1)) //don't need auth for hijack button
+ if(action == "hijack" && can_use(usr, 1)) //don't need auth for hijack button
hijack(usr)
return
var/authorized = (!locked || area.hasSiliconAccessInArea(usr, PRIVILEDGES_SILICON|PRIVILEDGES_DRONE) || (integration_cog && (is_servant_of_ratvar(usr))))
@@ -1141,6 +1141,7 @@
return
if(!is_station_level(z))
return
+ malf.ShutOffDoomsdayDevice()
occupier = new /mob/living/silicon/ai(src, malf.laws, malf) //DEAR GOD WHY? //IKR????
occupier.adjustOxyLoss(malf.getOxyLoss())
if(!findtext(occupier.name, "APC Copy"))
@@ -1314,6 +1315,11 @@
cur_used -= lastused_light
lighting_satisfied = TRUE
+ //If drained by an integration cog: Forcefully avert as much of the powerdrain as possible, though a maximum of MAXIMUM_COG_REGAIN
+ if(cur_excess && cog_drained && cell)
+ var/cog_regain = cell.give(min(min(cog_drained, cur_excess), MAXIMUM_COG_REGAIN))
+ cur_excess -= cog_regain
+ cog_drained = max(0, cog_drained - cog_regain)
// next: take from or charge to the cell, depending on how much is left
if(cell && !shorted)
@@ -1576,6 +1582,8 @@
#undef APC_UPOVERLAY_LOCKED
#undef APC_UPOVERLAY_OPERATING
+#undef MAXIMUM_COG_REGAIN
+
/*Power module, used for APC construction*/
/obj/item/electronics/apc
name = "power control module"
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index eb456a3f44..6dcb08512c 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -171,8 +171,8 @@ By design, d1 is the smallest direction and d2 is the highest
return
coil.cable_join(src, user)
- else if(istype(W, /obj/item/twohanded/rcl))
- var/obj/item/twohanded/rcl/R = W
+ else if(istype(W, /obj/item/rcl))
+ var/obj/item/rcl/R = W
if(R.loaded)
R.loaded.cable_join(src, user)
R.is_empty(user)
@@ -564,10 +564,7 @@ By design, d1 is the smallest direction and d2 is the highest
icon_state = "[initial(item_state)][amount < 3 ? amount : ""]"
name = "cable [amount < 3 ? "piece" : "coil"]"
-/obj/item/stack/cable_coil/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/item/stack/cable_coil/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
var/obj/item/stack/cable_coil/new_cable = ..()
if(istype(new_cable))
new_cable.color = color
diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm
index c788b9b033..ba6311a94d 100644
--- a/code/modules/power/cell.dm
+++ b/code/modules/power/cell.dm
@@ -45,7 +45,7 @@
/obj/item/stock_parts/cell/vv_edit_var(var_name, var_value)
switch(var_name)
- if("self_recharge")
+ if(NAMEOF(src, self_recharge))
if(var_value)
START_PROCESSING(SSobj, src)
else
diff --git a/code/modules/power/floodlight.dm b/code/modules/power/floodlight.dm
index e0b3f5f316..466030b83c 100644
--- a/code/modules/power/floodlight.dm
+++ b/code/modules/power/floodlight.dm
@@ -92,10 +92,7 @@
else
. = ..()
-/obj/machinery/power/floodlight/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/machinery/power/floodlight/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
var/current = setting
if(current == 1)
current = light_setting_list.len
@@ -113,4 +110,4 @@
qdel(src)
/obj/machinery/power/floodlight/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
- playsound(src, 'sound/effects/glasshit.ogg', 75, 1)
\ No newline at end of file
+ playsound(src, 'sound/effects/glasshit.ogg', 75, 1)
diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm
index 6d63a57c88..78a20e5b62 100644
--- a/code/modules/power/generator.dm
+++ b/code/modules/power/generator.dm
@@ -57,7 +57,7 @@
var/cold_air_heat_capacity = cold_air.heat_capacity()
var/hot_air_heat_capacity = hot_air.heat_capacity()
- var/delta_temperature = hot_air.temperature - cold_air.temperature
+ var/delta_temperature = hot_air.return_temperature() - cold_air.return_temperature()
if(delta_temperature > 0 && cold_air_heat_capacity > 0 && hot_air_heat_capacity > 0)
@@ -68,8 +68,8 @@
var/heat = energy_transfer*(1-efficiency)
lastgen += energy_transfer*efficiency
- hot_air.temperature = hot_air.temperature - energy_transfer/hot_air_heat_capacity
- cold_air.temperature = cold_air.temperature + heat/cold_air_heat_capacity
+ hot_air.set_temperature(hot_air.return_temperature() - energy_transfer/hot_air_heat_capacity)
+ cold_air.set_temperature(cold_air.return_temperature() + heat/cold_air_heat_capacity)
//add_avail(lastgen) This is done in process now
// update icon overlays only if displayed level has changed
@@ -116,11 +116,11 @@
t += " "
t += "Cold loop "
- t += "Temperature Inlet: [round(cold_circ_air2.temperature, 0.1)] K / Outlet: [round(cold_circ_air1.temperature, 0.1)] K "
+ t += "Temperature Inlet: [round(cold_circ_air2.return_temperature(), 0.1)] K / Outlet: [round(cold_circ_air1.return_temperature(), 0.1)] K "
t += "Pressure Inlet: [round(cold_circ_air2.return_pressure(), 0.1)] kPa / Outlet: [round(cold_circ_air1.return_pressure(), 0.1)] kPa "
t += "Hot loop "
- t += "Temperature Inlet: [round(hot_circ_air2.temperature, 0.1)] K / Outlet: [round(hot_circ_air1.temperature, 0.1)] K "
+ t += "Temperature Inlet: [round(hot_circ_air2.return_temperature(), 0.1)] K / Outlet: [round(hot_circ_air1.return_temperature(), 0.1)] K "
t += "Pressure Inlet: [round(hot_circ_air2.return_pressure(), 0.1)] kPa / Outlet: [round(hot_circ_air1.return_pressure(), 0.1)] kPa "
t += ""
diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm
index 1644673ece..30a7aa152b 100644
--- a/code/modules/power/gravitygenerator.dm
+++ b/code/modules/power/gravitygenerator.dm
@@ -28,7 +28,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
var/sprite_number = 0
-/obj/machinery/gravity_generator/safe_throw_at()
+/obj/machinery/gravity_generator/safe_throw_at(atom/target, range, speed, mob/thrower, spin = TRUE, diagonals_first = FALSE, datum/callback/callback, force = MOVE_FORCE_STRONG, gentle = FALSE)
return FALSE
/obj/machinery/gravity_generator/ex_act(severity, target)
@@ -56,7 +56,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne
qdel(src)
/obj/machinery/gravity_generator/proc/set_broken()
- stat |= BROKEN
+ obj_break()
/obj/machinery/gravity_generator/proc/set_fix()
stat &= ~BROKEN
@@ -80,7 +80,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne
/obj/machinery/gravity_generator/part/get_status()
return main_part?.get_status()
-/obj/machinery/gravity_generator/part/attack_hand(mob/user)
+/obj/machinery/gravity_generator/part/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
return main_part.attack_hand(user)
/obj/machinery/gravity_generator/part/set_broken()
@@ -116,6 +116,8 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne
sprite_number = 8
use_power = IDLE_POWER_USE
interaction_flags_machine = INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OFFLINE
+ ui_x = 400
+ ui_y = 165
var/on = TRUE
var/breaker = TRUE
var/list/parts = list()
@@ -187,14 +189,14 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne
/obj/machinery/gravity_generator/main/attackby(obj/item/I, mob/user, params)
switch(broken_state)
if(GRAV_NEEDS_SCREWDRIVER)
- if(istype(I, /obj/item/screwdriver))
+ if(I.tool_behaviour == TOOL_SCREWDRIVER)
to_chat(user, "You secure the screws of the framework.")
I.play_tool_sound(src)
broken_state++
update_icon()
return
if(GRAV_NEEDS_WELDING)
- if(istype(I, /obj/item/weldingtool))
+ if(I.tool_behaviour == TOOL_WELDER)
if(I.use_tool(src, user, 0, volume=50, amount=1))
to_chat(user, "You mend the damaged framework.")
broken_state++
@@ -206,14 +208,14 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne
if(PS.get_amount() >= 10)
PS.use(10)
to_chat(user, "You add the plating to the framework.")
- playsound(src.loc, 'sound/machines/click.ogg', 75, 1)
+ playsound(src.loc, 'sound/machines/click.ogg', 75, TRUE)
broken_state++
update_icon()
else
to_chat(user, "You need 10 sheets of plasteel!")
return
if(GRAV_NEEDS_WRENCH)
- if(istype(I, /obj/item/wrench))
+ if(I.tool_behaviour == TOOL_WRENCH)
to_chat(user, "You secure the plating to the framework.")
I.play_tool_sound(src)
set_fix()
@@ -224,7 +226,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne
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, "gravity_generator", name, 400, 200, master_ui, state)
+ ui = new(user, src, ui_key, "GravityGenerator", name, ui_x, ui_y, master_ui, state)
ui.open()
/obj/machinery/gravity_generator/main/ui_data(mob/user)
@@ -241,16 +243,18 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne
/obj/machinery/gravity_generator/main/ui_act(action, params)
if(..())
return
+
switch(action)
if("gentoggle")
breaker = !breaker
investigate_log("was toggled [breaker ? "ON" : "OFF"] by [key_name(usr)].", INVESTIGATE_GRAVITY)
set_power()
+ . = TRUE
// Power and Icon States
/obj/machinery/gravity_generator/main/power_change()
- ..()
+ . = ..()
investigate_log("has [stat & NOPOWER ? "lost" : "regained"] power.", INVESTIGATE_GRAVITY)
set_power()
@@ -313,7 +317,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne
charge_count -= 2
if(charge_count % 4 == 0 && prob(75)) // Let them know it is charging/discharging.
- playsound(src.loc, 'sound/effects/empulse.ogg', 100, 1)
+ playsound(src.loc, 'sound/effects/empulse.ogg', 100, TRUE)
updateDialog()
if(prob(25)) // To help stop "Your clothes feel warm." spam.
@@ -390,16 +394,13 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne
// Misc
/obj/item/paper/guides/jobs/engi/gravity_gen
- name = "paper- 'Generate your own gravity!'"
- info = {"
Gravity Generator Instructions For Dummies
-
Surprisingly, gravity isn't that hard to make! All you have to do is inject deadly radioactive minerals into a ball of
- energy and you have yourself gravity! You can turn the machine on or off when required but you must remember that the generator
- will EMIT RADIATION when charging or discharging, you can tell it is charging or discharging by the noise it makes, so please WEAR PROTECTIVE CLOTHING.
-
-
It blew up!
-
Don't panic! The gravity generator was designed to be easily repaired. If, somehow, the sturdy framework did not survive then
- please proceed to panic; otherwise follow these steps.
-
Secure the screws of the framework with a screwdriver.
-
Mend the damaged framework with a welding tool.
-
Add additional plasteel plating.
-
Secure the additional plating with a wrench.
"}
+ info = {"
+# Gravity Generator Instructions For Dummies
+Surprisingly, gravity isn't that hard to make! All you have to do is inject deadly radioactive minerals into a ball of energy and you have yourself gravity! You can turn the machine on or off when required but you must remember that the generator will EMIT RADIATION when charging or discharging, you can tell it is charging or discharging by the noise it makes, so please WEAR PROTECTIVE CLOTHING.
+### It blew up!
+Don't panic! The gravity generator was designed to be easily repaired. If, somehow, the sturdy framework did not survive then please proceed to panic; otherwise follow these steps.
+1. Secure the screws of the framework with a screwdriver.
+2. Mend the damaged framework with a welding tool.
+3. Add additional plasteel plating.
+4. Secure the additional plating with a wrench.
+"}
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index c18eebbb55..20f7ce099a 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -118,7 +118,7 @@
return
if(istype(W, /obj/item/stack/cable_coil))
- if(W.use_tool(src, user, 0, 1, max_level = JOB_SKILL_TRAINED))
+ if(W.use_tool(src, user, 0, 1, skill_gain_mult = TRIVIAL_USE_TOOL_MULT))
icon_state = "[fixture_type]-construct-stage2"
stage = 2
user.visible_message("[user.name] adds wires to [src].", \
@@ -595,11 +595,9 @@
// attack with hand - remove tube/bulb
// if hands aren't protected and the light is on, burn the player
-/obj/machinery/light/attack_hand(mob/living/carbon/human/user)
+/obj/machinery/light/on_attack_hand(mob/living/carbon/human/user)
. = ..()
- if(.)
- return
- user.changeNext_move(CLICK_CD_MELEE)
+ user.DelayNextAction(CLICK_CD_MELEE)
add_fingerprint(user)
if(status == LIGHT_EMPTY)
@@ -812,11 +810,11 @@
return
/obj/item/light/attack(mob/living/M, mob/living/user, def_zone)
- ..()
+ . = ..()
shatter()
/obj/item/light/attack_obj(obj/O, mob/living/user)
- ..()
+ . = ..()
shatter()
/obj/item/light/proc/shatter()
diff --git a/code/modules/power/monitor.dm b/code/modules/power/monitor.dm
index f4ee102ccc..974fb1b9e2 100644
--- a/code/modules/power/monitor.dm
+++ b/code/modules/power/monitor.dm
@@ -10,6 +10,9 @@
idle_power_usage = 20
active_power_usage = 100
circuit = /obj/item/circuitboard/computer/powermonitor
+ tgui_id = "PowerMonitor"
+ ui_x = 550
+ ui_y = 700
var/obj/structure/cable/attached_wire
var/obj/machinery/power/apc/local_apc
@@ -19,8 +22,6 @@
var/record_interval = 50
var/next_record = 0
var/is_secret_monitor = FALSE
- tgui_id = "power_monitor"
- ui_style = "ntos"
/obj/machinery/computer/monitor/secret //Hides the power monitor (such as ones on ruins & CentCom) from PDA's to prevent metagaming.
name = "outdated power monitoring console"
@@ -87,7 +88,7 @@
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, tgui_id, name, 550, 700, master_ui, state)
+ ui = new(user, src, ui_key, "PowerMonitor", name, ui_x, ui_y, master_ui, state)
ui.open()
/obj/machinery/computer/monitor/ui_data()
diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm
index 3c20f2f69c..d4e0df8359 100644
--- a/code/modules/power/port_gen.dm
+++ b/code/modules/power/port_gen.dm
@@ -1,4 +1,3 @@
-
//Baseline portable generator. Has all the default handling. Not intended to be used on it's own (since it generates unlimited power).
/obj/machinery/power/port_gen
name = "portable generator"
@@ -8,10 +7,11 @@
density = TRUE
anchored = FALSE
use_power = NO_POWER_USE
+ ui_x = 450
+ ui_y = 340
- var/active = 0
+ var/active = FALSE
var/power_gen = 5000
- var/recent_fault = 0
var/power_output = 1
var/consumption = 0
var/base_icon = "portgen0"
@@ -27,8 +27,13 @@
QDEL_NULL(soundloop)
return ..()
+/obj/machinery/power/port_gen/connect_to_network()
+ if(!anchored)
+ return FALSE
+ . = ..()
+
/obj/machinery/power/port_gen/proc/HasFuel() //Placeholder for fuel check.
- return 1
+ return TRUE
/obj/machinery/power/port_gen/proc/UseFuel() //Placeholder for fuel use.
return
@@ -39,26 +44,38 @@
/obj/machinery/power/port_gen/proc/handleInactive()
return
+/obj/machinery/power/port_gen/proc/TogglePower()
+ if(active)
+ active = FALSE
+ update_icon()
+ soundloop.stop()
+ else if(HasFuel())
+ active = TRUE
+ START_PROCESSING(SSmachines, src)
+ update_icon()
+ soundloop.start()
+
/obj/machinery/power/port_gen/update_icon_state()
icon_state = "[base_icon]_[active]"
/obj/machinery/power/port_gen/process()
- if(active && HasFuel() && !crit_fail && anchored && powernet)
- add_avail(power_gen * power_output)
+ if(active)
+ if(!HasFuel() || !anchored)
+ TogglePower()
+ return
+ if(powernet)
+ add_avail(power_gen * power_output)
UseFuel()
- src.updateDialog()
- soundloop.start()
-
else
- active = 0
handleInactive()
- update_icon()
- soundloop.stop()
/obj/machinery/power/port_gen/examine(mob/user)
. = ..()
. += "It is[!active?"n't":""] running."
+/////////////////
+// P.A.C.M.A.N //
+/////////////////
/obj/machinery/power/port_gen/pacman
name = "\improper P.A.C.M.A.N.-type portable generator"
circuit = /obj/item/circuitboard/machine/pacman
@@ -78,8 +95,8 @@
/obj/machinery/power/port_gen/pacman/Initialize()
. = ..()
- var/obj/sheet = new sheet_path(null)
- sheet_name = sheet.name
+ var/obj/S = sheet_path
+ sheet_name = initial(S.name)
/obj/machinery/power/port_gen/pacman/Destroy()
DropFuel()
@@ -100,16 +117,16 @@
/obj/machinery/power/port_gen/pacman/examine(mob/user)
. = ..()
- . += "The generator has [sheets] units of [sheet_name] fuel left, producing [power_gen] per cycle."
- if(crit_fail)
- . += "The generator seems to have broken down."
+ . += "The generator has [sheets] units of [sheet_name] fuel left, producing [DisplayPower(power_gen)] per cycle."
+ if(anchored)
+ . += "It is anchored to the ground."
if(in_range(user, src) || isobserver(user))
. += "The status display reads: Fuel efficiency increased by [(consumption*100)-100]%."
/obj/machinery/power/port_gen/pacman/HasFuel()
if(sheets >= 1 / (time_per_sheet / power_output) - sheet_left)
- return 1
- return 0
+ return TRUE
+ return FALSE
/obj/machinery/power/port_gen/pacman/DropFuel()
if(sheets)
@@ -145,13 +162,11 @@
if (current_heat > 300)
overheat()
qdel(src)
- return
/obj/machinery/power/port_gen/pacman/handleInactive()
-
- if (current_heat > 0)
- current_heat = max(current_heat - 2, 0)
- src.updateDialog()
+ current_heat = max(current_heat - 2, 0)
+ if(current_heat == 0)
+ STOP_PROCESSING(SSmachines, src)
/obj/machinery/power/port_gen/pacman/proc/overheat()
explosion(src.loc, 2, 5, 2, -1)
@@ -166,24 +181,21 @@
to_chat(user, "You add [amount] sheets to the [src.name].")
sheets += amount
addstack.use(amount)
- updateUsrDialog()
return
else if(!active)
-
- if(istype(O, /obj/item/wrench))
-
+ if(O.tool_behaviour == TOOL_WRENCH)
if(!anchored && !isinspace())
+ anchored = TRUE
connect_to_network()
to_chat(user, "You secure the generator to the floor.")
- anchored = TRUE
else if(anchored)
+ anchored = FALSE
disconnect_from_network()
to_chat(user, "You unsecure the generator from the floor.")
- anchored = FALSE
- playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1)
+ playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE)
return
- else if(istype(O, /obj/item/screwdriver))
+ else if(O.tool_behaviour == TOOL_SCREWDRIVER)
panel_open = !panel_open
O.play_tool_sound(src)
if(panel_open)
@@ -196,12 +208,10 @@
return ..()
/obj/machinery/power/port_gen/pacman/emag_act(mob/user)
- . = ..()
if(obj_flags & EMAGGED)
return
obj_flags |= EMAGGED
emp_act(EMP_HEAVY)
- return TRUE
/obj/machinery/power/port_gen/pacman/attack_ai(mob/user)
interact(user)
@@ -209,60 +219,52 @@
/obj/machinery/power/port_gen/pacman/attack_paw(mob/user)
interact(user)
-/obj/machinery/power/port_gen/pacman/ui_interact(mob/user)
- . = ..()
- if (get_dist(src, user) > 1 )
- if(!isAI(user))
- user.unset_machine()
- user << browse(null, "window=port_gen")
- return
+/obj/machinery/power/port_gen/pacman/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
+ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
+ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "PortableGenerator", name, ui_x, ui_y, master_ui, state)
+ ui.open()
- var/dat = text("[name] ")
- if (active)
- dat += text("Generator: On ")
- else
- dat += text("Generator: Off ")
- dat += text("[capitalize(sheet_name)]: [sheets] - Eject ")
- var/stack_percent = round(sheet_left * 100, 1)
- dat += text("Current stack: [stack_percent]% ")
- dat += text("Power output: - [power_gen * power_output] + ")
- dat += text("Power current: [(powernet == null ? "Unconnected" : "[DisplayPower(avail())]")] ")
- dat += text("Heat: [current_heat] ")
- dat += " Close"
- user << browse(dat, "window=port_gen")
- onclose(user, "port_gen")
+/obj/machinery/power/port_gen/pacman/ui_data()
+ var/data = list()
-/obj/machinery/power/port_gen/pacman/Topic(href, href_list)
+ data["active"] = active
+ data["sheet_name"] = capitalize(sheet_name)
+ data["sheets"] = sheets
+ data["stack_percent"] = round(sheet_left * 100, 0.1)
+
+ data["anchored"] = anchored
+ data["connected"] = (powernet == null ? 0 : 1)
+ data["ready_to_boot"] = anchored && HasFuel()
+ data["power_generated"] = DisplayPower(power_gen)
+ data["power_output"] = DisplayPower(power_gen * power_output)
+ data["power_available"] = (powernet == null ? 0 : DisplayPower(avail()))
+ data["current_heat"] = current_heat
+ . = data
+
+/obj/machinery/power/port_gen/pacman/ui_act(action, params)
if(..())
return
+ switch(action)
+ if("toggle_power")
+ TogglePower()
+ . = TRUE
- src.add_fingerprint(usr)
- if(href_list["action"])
- if(href_list["action"] == "enable")
- if(!active && HasFuel() && !crit_fail)
- active = 1
- src.updateUsrDialog()
- update_icon()
- if(href_list["action"] == "disable")
- if (active)
- active = 0
- src.updateUsrDialog()
- update_icon()
- if(href_list["action"] == "eject")
+ if("eject")
if(!active)
DropFuel()
- src.updateUsrDialog()
- if(href_list["action"] == "lower_power")
+ . = TRUE
+
+ if("lower_power")
if (power_output > 1)
power_output--
- src.updateUsrDialog()
- if (href_list["action"] == "higher_power")
+ . = TRUE
+
+ if("higher_power")
if (power_output < 4 || (obj_flags & EMAGGED))
power_output++
- src.updateUsrDialog()
- if (href_list["action"] == "close")
- usr << browse(null, "window=port_gen")
- usr.unset_machine()
+ . = TRUE
/obj/machinery/power/port_gen/pacman/super
name = "\improper S.U.P.E.R.P.A.C.M.A.N.-type portable generator"
diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm
index f84b639d68..9bbdcf4f66 100644
--- a/code/modules/power/power.dm
+++ b/code/modules/power/power.dm
@@ -299,8 +299,8 @@
//siemens_coeff - layman's terms, conductivity
//dist_check - set to only shock mobs within 1 of source (vendors, airlocks, etc.)
//No animations will be performed by this proc.
-/proc/electrocute_mob(mob/living/carbon/M, power_source, obj/source, siemens_coeff = 1, dist_check = FALSE)
- if(!M || ismecha(M.loc))
+/proc/electrocute_mob(mob/living/M, power_source, obj/source, siemens_coeff = 1, dist_check = FALSE)
+ if(!istype(M) || ismecha(M.loc))
return 0 //feckin mechs are dumb
if(dist_check)
if(!in_range(source,M))
@@ -386,4 +386,4 @@
var/target = base_area ? base_area : src
for(var/obj/machinery/power/apc/APC in GLOB.apcs_list)
if(APC.area == target)
- return APC
\ No newline at end of file
+ return APC
diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm
index 651892e5b1..256b13ee72 100644
--- a/code/modules/power/singularity/collector.dm
+++ b/code/modules/power/singularity/collector.dm
@@ -47,31 +47,29 @@
if(!loaded_tank)
return
if(!bitcoinmining)
- if(!loaded_tank.air_contents.gases[/datum/gas/plasma])
+ if(loaded_tank.air_contents.get_moles(/datum/gas/plasma) < 0.0001)
investigate_log("out of fuel.", INVESTIGATE_SINGULO)
playsound(src, 'sound/machines/ding.ogg', 50, 1)
Radio.talk_into(src, "Insufficient plasma in [get_area(src)] [src], ejecting \the [loaded_tank].", FREQ_ENGINEERING)
eject()
else
- var/gasdrained = min(powerproduction_drain*drainratio,loaded_tank.air_contents.gases[/datum/gas/plasma])
- loaded_tank.air_contents.gases[/datum/gas/plasma] -= 2.7 * gasdrained
- loaded_tank.air_contents.gases[/datum/gas/tritium] += 2.7 * gasdrained
- GAS_GARBAGE_COLLECT(loaded_tank.air_contents.gases)
+ var/gasdrained = min(powerproduction_drain*drainratio,loaded_tank.air_contents.get_moles(/datum/gas/plasma))
+ loaded_tank.air_contents.adjust_moles(/datum/gas/plasma, -gasdrained)
+ loaded_tank.air_contents.adjust_moles(/datum/gas/tritium, gasdrained)
var/power_produced = RAD_COLLECTOR_OUTPUT
add_avail(power_produced)
stored_power-=power_produced
else if(is_station_level(z) && SSresearch.science_tech)
- if(!loaded_tank.air_contents.gases[/datum/gas/tritium] || !loaded_tank.air_contents.gases[/datum/gas/oxygen])
+ if(!loaded_tank.air_contents.get_moles(/datum/gas/tritium) || !loaded_tank.air_contents.get_moles(/datum/gas/oxygen))
playsound(src, 'sound/machines/ding.ogg', 50, 1)
Radio.talk_into(src, "Insufficient oxygen and tritium in [get_area(src)] [src] to produce research points, ejecting \the [loaded_tank].", FREQ_ENGINEERING)
eject()
else
var/gasdrained = bitcoinproduction_drain*drainratio
- loaded_tank.air_contents.gases[/datum/gas/tritium] -= gasdrained
- loaded_tank.air_contents.gases[/datum/gas/oxygen] -= gasdrained
- loaded_tank.air_contents.gases[/datum/gas/carbon_dioxide] += gasdrained*2
- GAS_GARBAGE_COLLECT(loaded_tank.air_contents.gases)
+ loaded_tank.air_contents.adjust_moles(/datum/gas/tritium, -gasdrained)
+ loaded_tank.air_contents.adjust_moles(/datum/gas/oxygen, -gasdrained)
+ loaded_tank.air_contents.adjust_moles(/datum/gas/carbon_dioxide, gasdrained*2)
var/bitcoins_mined = stored_power*RAD_COLLECTOR_MINING_CONVERSION_RATE
var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_ENG)
if(D)
@@ -86,9 +84,7 @@
toggle_power()
user.visible_message("[user.name] turns the [src.name] [active? "on":"off"].", \
"You turn the [src.name] [active? "on":"off"].")
- var/fuel
- if(loaded_tank)
- fuel = loaded_tank.air_contents.gases[/datum/gas/plasma]
+ var/fuel = loaded_tank.air_contents.get_moles(/datum/gas/plasma)
investigate_log("turned [active?"on":"off"] by [key_name(user)]. [loaded_tank?"Fuel: [round(fuel/0.29)]%":"It is empty"].", INVESTIGATE_SINGULO)
return
else
@@ -180,6 +176,7 @@
/obj/machinery/power/rad_collector/analyzer_act(mob/living/user, obj/item/I)
if(loaded_tank)
loaded_tank.analyzer_act(user, I)
+ return TRUE
/obj/machinery/power/rad_collector/examine(mob/user)
. = ..()
diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm
index 89596eb82f..dfb51df9cf 100644
--- a/code/modules/power/singularity/containment_field.dm
+++ b/code/modules/power/singularity/containment_field.dm
@@ -21,8 +21,7 @@
FG2.fields -= src
return ..()
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/machinery/field/containment/attack_hand(mob/user)
+/obj/machinery/field/containment/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(get_dist(src, user) > 1)
return FALSE
else
diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm
index 0d182e0a1b..50dae7d6bb 100644
--- a/code/modules/power/singularity/emitter.dm
+++ b/code/modules/power/singularity/emitter.dm
@@ -315,6 +315,9 @@
/obj/machinery/power/emitter/proc/integrate(obj/item/gun/energy/E,mob/user)
if(istype(E, /obj/item/gun/energy))
+ if(!E.can_emitter)
+ to_chat(user, "[E] cannot fit into emitters.")
+ return
if(!user.transferItemToLoc(E, src))
return
gun = E
diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
index e33116b02c..528a3abb8b 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
@@ -103,7 +103,6 @@
did_something = TRUE
if(did_something)
- user.changeNext_move(CLICK_CD_MELEE)
update_state()
update_icon()
return
diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm
index 957ceb986f..912fc0a72b 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_control.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm
@@ -9,15 +9,17 @@
idle_power_usage = 500
active_power_usage = 10000
dir = NORTH
- var/strength_upper_limit = 2
- var/interface_control = 1
- var/list/obj/structure/particle_accelerator/connected_parts
- var/assembled = 0
- var/construction_state = PA_CONSTRUCTION_UNSECURED
- var/active = 0
- var/strength = 0
- var/powered = 0
mouse_opacity = MOUSE_OPACITY_OPAQUE
+ ui_x = 350
+ ui_y = 185
+ var/strength_upper_limit = 2
+ var/interface_control = TRUE
+ var/list/obj/structure/particle_accelerator/connected_parts
+ var/assembled = FALSE
+ var/construction_state = PA_CONSTRUCTION_UNSECURED
+ var/active = FALSE
+ var/strength = 0
+ var/powered = FALSE
/obj/machinery/particle_accelerator/control_box/Initialize()
. = ..()
@@ -34,30 +36,27 @@
QDEL_NULL(wires)
return ..()
-/obj/machinery/particle_accelerator/control_box/attack_hand(mob/user)
+/obj/machinery/particle_accelerator/control_box/multitool_act(mob/living/user, obj/item/I)
. = ..()
- if(.)
- return
- if(construction_state == PA_CONSTRUCTION_COMPLETE)
- interact(user)
- else if(construction_state == PA_CONSTRUCTION_PANEL_OPEN)
+ if(construction_state == PA_CONSTRUCTION_PANEL_OPEN)
wires.interact(user)
+ return TRUE
/obj/machinery/particle_accelerator/control_box/proc/update_state()
if(construction_state < PA_CONSTRUCTION_COMPLETE)
use_power = NO_POWER_USE
- assembled = 0
- active = 0
+ assembled = FALSE
+ active = FALSE
for(var/CP in connected_parts)
var/obj/structure/particle_accelerator/part = CP
part.strength = null
- part.powered = 0
+ part.powered = FALSE
part.update_icon()
connected_parts.Cut()
return
if(!part_scan())
use_power = IDLE_POWER_USE
- active = 0
+ active = FALSE
connected_parts.Cut()
/obj/machinery/particle_accelerator/control_box/update_icon_state()
@@ -78,36 +77,6 @@
else
icon_state = "control_boxc"
-/obj/machinery/particle_accelerator/control_box/Topic(href, href_list)
- if(..())
- return
-
- if(!interface_control)
- to_chat(usr, "ERROR: Request timed out. Check wire contacts.")
- return
-
- if(href_list["close"])
- usr << browse(null, "window=pacontrol")
- usr.unset_machine()
- return
- if(href_list["togglep"])
- if(!wires.is_cut(WIRE_POWER))
- toggle_power()
-
- else if(href_list["scan"])
- part_scan()
-
- else if(href_list["strengthup"])
- if(!wires.is_cut(WIRE_STRENGTH))
- add_strength()
-
- else if(href_list["strengthdown"])
- if(!wires.is_cut(WIRE_STRENGTH))
- remove_strength()
-
- updateDialog()
- update_icon()
-
/obj/machinery/particle_accelerator/control_box/proc/strength_change()
for(var/CP in connected_parts)
var/obj/structure/particle_accelerator/part = CP
@@ -123,7 +92,6 @@
log_game("PA Control Computer increased to [strength] by [key_name(usr)] in [AREACOORD(src)]")
investigate_log("increased to [strength] by [key_name(usr)] at [AREACOORD(src)]", INVESTIGATE_SINGULO)
-
/obj/machinery/particle_accelerator/control_box/proc/remove_strength(s)
if(assembled && (strength > 0))
strength--
@@ -133,11 +101,10 @@
log_game("PA Control Computer decreased to [strength] by [key_name(usr)] in [AREACOORD(src)]")
investigate_log("decreased to [strength] by [key_name(usr)] at [AREACOORD(src)]", INVESTIGATE_SINGULO)
-
/obj/machinery/particle_accelerator/control_box/power_change()
- ..()
+ . = ..()
if(stat & NOPOWER)
- active = 0
+ active = FALSE
use_power = NO_POWER_USE
else if(!stat && construction_state == PA_CONSTRUCTION_COMPLETE)
use_power = IDLE_POWER_USE
@@ -160,49 +127,48 @@
var/odir = turn(dir,180)
var/turf/T = loc
- assembled = 0
+ assembled = FALSE
critical_machine = FALSE
var/obj/structure/particle_accelerator/fuel_chamber/F = locate() in orange(1,src)
if(!F)
- return 0
+ return FALSE
setDir(F.dir)
connected_parts.Cut()
T = get_step(T,rdir)
if(!check_part(T, /obj/structure/particle_accelerator/fuel_chamber))
- return 0
+ return FALSE
T = get_step(T,odir)
if(!check_part(T, /obj/structure/particle_accelerator/end_cap))
- return 0
+ return FALSE
T = get_step(T,dir)
T = get_step(T,dir)
if(!check_part(T, /obj/structure/particle_accelerator/power_box))
- return 0
+ return FALSE
T = get_step(T,dir)
if(!check_part(T, /obj/structure/particle_accelerator/particle_emitter/center))
- return 0
+ return FALSE
T = get_step(T,ldir)
if(!check_part(T, /obj/structure/particle_accelerator/particle_emitter/left))
- return 0
+ return FALSE
T = get_step(T,rdir)
T = get_step(T,rdir)
if(!check_part(T, /obj/structure/particle_accelerator/particle_emitter/right))
- return 0
+ return FALSE
- assembled = 1
+ assembled = TRUE
critical_machine = TRUE //Only counts if the PA is actually assembled.
- return 1
+ return TRUE
/obj/machinery/particle_accelerator/control_box/proc/check_part(turf/T, type)
var/obj/structure/particle_accelerator/PA = locate(/obj/structure/particle_accelerator) in T
if(istype(PA, type) && (PA.construction_state == PA_CONSTRUCTION_COMPLETE))
if(PA.connect_master(src))
connected_parts.Add(PA)
- return 1
- return 0
-
+ return TRUE
+ return FALSE
/obj/machinery/particle_accelerator/control_box/proc/toggle_power()
active = !active
@@ -214,47 +180,16 @@
for(var/CP in connected_parts)
var/obj/structure/particle_accelerator/part = CP
part.strength = strength
- part.powered = 1
+ part.powered = TRUE
part.update_icon()
else
use_power = IDLE_POWER_USE
for(var/CP in connected_parts)
var/obj/structure/particle_accelerator/part = CP
part.strength = null
- part.powered = 0
+ part.powered = FALSE
part.update_icon()
- return 1
-
-
-/obj/machinery/particle_accelerator/control_box/ui_interact(mob/user)
- . = ..()
- if((get_dist(src, user) > 1) || (stat & (BROKEN|NOPOWER)))
- if(!issilicon(user))
- user.unset_machine()
- user << browse(null, "window=pacontrol")
- return
-
- var/dat = ""
- dat += "Close
"
- dat += "
Status
"
- if(!assembled)
- dat += "Unable to detect all parts! "
- dat += "Run Scan
"
- else
- dat += "All parts in place.
"
- dat += "Power:"
- if(active)
- dat += "On "
- else
- dat += "Off "
- dat += "Toggle Power
"
- dat += "Particle Strength: [strength] "
- dat += "--|++
"
-
- var/datum/browser/popup = new(user, "pacontrol", name, 420, 300)
- popup.set_content(dat)
- popup.set_title_image(user.browse_rsc_icon(icon, icon_state))
- popup.open()
+ return TRUE
/obj/machinery/particle_accelerator/control_box/examine(mob/user)
. = ..()
@@ -266,53 +201,51 @@
if(PA_CONSTRUCTION_PANEL_OPEN)
. += "The panel is open."
-
/obj/machinery/particle_accelerator/control_box/attackby(obj/item/W, mob/user, params)
var/did_something = FALSE
switch(construction_state)
if(PA_CONSTRUCTION_UNSECURED)
- if(istype(W, /obj/item/wrench) && !isinspace())
+ if(W.tool_behaviour == TOOL_WRENCH && !isinspace())
W.play_tool_sound(src, 75)
anchored = TRUE
- user.visible_message("[user.name] secures the [name] to the floor.", \
- "You secure the external bolts.")
+ user.visible_message("[user.name] secures the [name] to the floor.", \
+ "You secure the external bolts.")
construction_state = PA_CONSTRUCTION_UNWIRED
did_something = TRUE
if(PA_CONSTRUCTION_UNWIRED)
- if(istype(W, /obj/item/wrench))
+ if(W.tool_behaviour == TOOL_WRENCH)
W.play_tool_sound(src, 75)
anchored = FALSE
- user.visible_message("[user.name] detaches the [name] from the floor.", \
- "You remove the external bolts.")
+ user.visible_message("[user.name] detaches the [name] from the floor.", \
+ "You remove the external bolts.")
construction_state = PA_CONSTRUCTION_UNSECURED
did_something = TRUE
else if(istype(W, /obj/item/stack/cable_coil))
if(W.use_tool(src, user, 0, 1))
- user.visible_message("[user.name] adds wires to the [name].", \
- "You add some wires.")
+ user.visible_message("[user.name] adds wires to the [name].", \
+ "You add some wires.")
construction_state = PA_CONSTRUCTION_PANEL_OPEN
did_something = TRUE
if(PA_CONSTRUCTION_PANEL_OPEN)
- if(istype(W, /obj/item/wirecutters))//TODO:Shock user if its on?
- user.visible_message("[user.name] removes some wires from the [name].", \
- "You remove some wires.")
+ if(W.tool_behaviour == TOOL_WIRECUTTER)//TODO:Shock user if its on?
+ user.visible_message("[user.name] removes some wires from the [name].", \
+ "You remove some wires.")
construction_state = PA_CONSTRUCTION_UNWIRED
did_something = TRUE
- else if(istype(W, /obj/item/screwdriver))
- user.visible_message("[user.name] closes the [name]'s access panel.", \
- "You close the access panel.")
+ else if(W.tool_behaviour == TOOL_SCREWDRIVER)
+ user.visible_message("[user.name] closes the [name]'s access panel.", \
+ "You close the access panel.")
construction_state = PA_CONSTRUCTION_COMPLETE
did_something = TRUE
if(PA_CONSTRUCTION_COMPLETE)
- if(istype(W, /obj/item/screwdriver))
- user.visible_message("[user.name] opens the [name]'s access panel.", \
- "You open the access panel.")
+ if(W.tool_behaviour == TOOL_SCREWDRIVER)
+ user.visible_message("[user.name] opens the [name]'s access panel.", \
+ "You open the access panel.")
construction_state = PA_CONSTRUCTION_PANEL_OPEN
did_something = TRUE
if(did_something)
- user.changeNext_move(CLICK_CD_MELEE)
update_state()
update_icon()
return
@@ -323,6 +256,65 @@
if(prob(50))
qdel(src)
+/obj/machinery/particle_accelerator/control_box/interact(mob/user)
+ if(construction_state == PA_CONSTRUCTION_PANEL_OPEN)
+ wires.interact(user)
+ else
+ ..()
+
+/obj/machinery/particle_accelerator/control_box/proc/is_interactive(mob/user)
+ if(!interface_control)
+ to_chat(user, "ERROR: Request timed out. Check wire contacts.")
+ return FALSE
+ if(construction_state != PA_CONSTRUCTION_COMPLETE)
+ return FALSE
+ return TRUE
+
+/obj/machinery/particle_accelerator/control_box/ui_status(mob/user)
+ if(is_interactive(user))
+ return ..()
+ return UI_CLOSE
+
+/obj/machinery/particle_accelerator/control_box/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
+ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
+ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "ParticleAccelerator", name, ui_x, ui_y, master_ui, state)
+ ui.open()
+
+/obj/machinery/particle_accelerator/control_box/ui_data(mob/user)
+ var/list/data = list()
+ data["assembled"] = assembled
+ data["power"] = active
+ data["strength"] = strength
+ return data
+
+/obj/machinery/particle_accelerator/control_box/ui_act(action, params)
+ if(..())
+ return
+
+ switch(action)
+ if("power")
+ if(wires.is_cut(WIRE_POWER))
+ return
+ toggle_power()
+ . = TRUE
+ if("scan")
+ part_scan()
+ . = TRUE
+ if("add_strength")
+ if(wires.is_cut(WIRE_STRENGTH))
+ return
+ add_strength()
+ . = TRUE
+ if("remove_strength")
+ if(wires.is_cut(WIRE_STRENGTH))
+ return
+ remove_strength()
+ . = TRUE
+
+ update_icon()
+
#undef PA_CONSTRUCTION_UNSECURED
#undef PA_CONSTRUCTION_UNWIRED
#undef PA_CONSTRUCTION_PANEL_OPEN
diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm
index 025784e909..cc3a19cf55 100644
--- a/code/modules/power/singularity/singularity.dm
+++ b/code/modules/power/singularity/singularity.dm
@@ -59,7 +59,7 @@
last_failed_movement = direct
return 0
-/obj/singularity/attack_hand(mob/user)
+/obj/singularity/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
consume(user)
return TRUE
diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm
index 85999707a2..fcc7faa29e 100644
--- a/code/modules/power/smes.dm
+++ b/code/modules/power/smes.dm
@@ -21,6 +21,9 @@
density = TRUE
use_power = NO_POWER_USE
circuit = /obj/item/circuitboard/machine/smes
+ ui_x = 340
+ ui_y = 350
+
var/capacity = 5e6 // maximum charge
var/charge = 0 // actual charge
@@ -54,7 +57,7 @@
break dir_loop
if(!terminal)
- stat |= BROKEN
+ obj_break()
return
terminal.master = src
update_icon()
@@ -123,22 +126,22 @@
return
to_chat(user, "You start building the power terminal...")
- playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1)
+ playsound(src.loc, 'sound/items/deconstruct.ogg', 50, TRUE)
if(C.use_tool(src, user, 20, 10))
var/obj/structure/cable/N = T.get_cable_node() //get the connecting node cable, if there's one
if (prob(50) && electrocute_mob(usr, N, N, 1, TRUE)) //animate the electrocution if uncautious and unlucky
do_sparks(5, TRUE, src)
return
+ if(!terminal)
+ C.use(10)
+ user.visible_message("[user.name] builds a power terminal.",\
+ "You build the power terminal.")
- user.visible_message(\
- "[user.name] has built a power terminal.",\
- "You build the power terminal.")
-
- //build the terminal and link it to the network
- make_terminal(T)
- terminal.connect_to_network()
- connect_to_network()
+ //build the terminal and link it to the network
+ make_terminal(T)
+ terminal.connect_to_network()
+ connect_to_network()
return
//crowbarring it !
@@ -148,13 +151,14 @@
log_game("[src] has been deconstructed by [key_name(user)] at [AREACOORD(src)]")
investigate_log("SMES deconstructed by [key_name(user)] at [AREACOORD(src)]", INVESTIGATE_SINGULO)
return
- else if(panel_open && istype(I, /obj/item/crowbar))
+ else if(panel_open && I.tool_behaviour == TOOL_CROWBAR)
return
return ..()
/obj/machinery/power/smes/wirecutter_act(mob/living/user, obj/item/I)
//disassembling the terminal
+ . = ..()
if(terminal && panel_open)
terminal.dismantle(user, I)
return TRUE
@@ -193,7 +197,7 @@
if(terminal)
terminal.master = null
terminal = null
- stat |= BROKEN
+ obj_break()
/obj/machinery/power/smes/update_overlays()
@@ -201,6 +205,9 @@
if((stat & BROKEN) || panel_open)
return
+ if(panel_open)
+ return
+
if(outputting)
. += "smes-op1"
else
@@ -208,14 +215,14 @@
if(inputting)
. += "smes-oc1"
- else
- if(input_attempt)
- . += "smes-oc0"
+ else if(input_attempt)
+ . += "smes-oc0"
var/clevel = chargedisplay()
if(clevel>0)
. += "smes-og[clevel]"
+
/obj/machinery/power/smes/proc/chargedisplay()
return clamp(round(5.5*charge/capacity),0,5)
@@ -228,6 +235,11 @@
var/last_chrg = inputting
var/last_onln = outputting
+ //check for self-recharging cells in stock parts and use them to self-charge
+ for(var/obj/item/stock_parts/cell/C in component_parts)
+ if(C.self_recharge)
+ charge += min(capacity-charge, C.chargerate) // If capacity-charge is smaller than the attempted charge rate, this avoids overcharging
+
//inputting
if(terminal && input_attempt)
input_available = terminal.surplus()
@@ -310,28 +322,26 @@
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, "smes", name, 340, 440, master_ui, state)
+ ui = new(user, src, ui_key, "Smes", name, ui_x, ui_y, master_ui, state)
ui.open()
/obj/machinery/power/smes/ui_data()
var/list/data = list(
- "capacityPercent" = round(100*charge/capacity, 0.1),
"capacity" = capacity,
+ "capacityPercent" = round(100*charge/capacity, 0.1),
"charge" = charge,
-
"inputAttempt" = input_attempt,
"inputting" = inputting,
"inputLevel" = input_level,
"inputLevel_text" = DisplayPower(input_level),
"inputLevelMax" = input_level_max,
- "inputAvailable" = DisplayPower(input_available),
-
+ "inputAvailable" = input_available,
"outputAttempt" = output_attempt,
"outputting" = outputting,
"outputLevel" = output_level,
"outputLevel_text" = DisplayPower(output_level),
"outputLevelMax" = output_level_max,
- "outputUsed" = DisplayPower(output_used)
+ "outputUsed" = output_used,
)
return data
@@ -352,11 +362,7 @@
if("input")
var/target = params["target"]
var/adjust = text2num(params["adjust"])
- if(target == "input")
- target = input("New input target (0-[input_level_max]):", name, input_level) as num|null
- if(!isnull(target) && !..())
- . = TRUE
- else if(target == "min")
+ if(target == "min")
target = 0
. = TRUE
else if(target == "max")
@@ -374,11 +380,7 @@
if("output")
var/target = params["target"]
var/adjust = text2num(params["adjust"])
- if(target == "input")
- target = input("New output target (0-[output_level_max]):", name, output_level) as num|null
- if(!isnull(target) && !..())
- . = TRUE
- else if(target == "min")
+ if(target == "min")
target = 0
. = TRUE
else if(target == "max")
diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm
index 89452affcb..2c258c1f49 100644
--- a/code/modules/power/solar.dm
+++ b/code/modules/power/solar.dm
@@ -350,7 +350,7 @@
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, "solar_control", name, 380, 230, master_ui, state)
+ ui = new(user, src, ui_key, "SolarControl", name, 380, 230, master_ui, state)
ui.open()
/obj/machinery/power/solar_control/ui_data()
@@ -481,8 +481,12 @@
//
/obj/item/paper/guides/jobs/engi/solars
- name = "paper- 'Going green! Setup your own solar array instructions.'"
- info = "
Welcome
At greencorps we love the environment, and space. With this package you are able to help mother nature and produce energy without any usage of fossil fuel or plasma! Singularity energy is dangerous while solar energy is safe, which is why it's better. Now here is how you setup your own solar array.
You can make a solar panel by wrenching the solar assembly onto a cable node. Adding a glass panel, reinforced or regular glass will do, will finish the construction of your solar panel. It is that easy!
Now after setting up 19 more of these solar panels you will want to create a solar tracker to keep track of our mother nature's gift, the sun. These are the same steps as before except you insert the tracker equipment circuit into the assembly before performing the final step of adding the glass. You now have a tracker! Now the last step is to add a computer to calculate the sun's movements and to send commands to the solar panels to change direction with the sun. Setting up the solar computer is the same as setting up any computer, so you should have no trouble in doing that. You do need to put a wire node under the computer, and the wire needs to be connected to the tracker.
Congratulations, you should have a working solar array. If you are having trouble, here are some tips. Make sure all solar equipment are on a cable node, even the computer. You can always deconstruct your creations if you make a mistake.
That's all to it, be safe, be green!
"
+ info = {"
+# Welcome!
+At greencorps we love the environment, and space. With this package you are able to help mother nature and produce energy without any usage of fossil fuel or plasma! Singularity energy is dangerous while solar energy is safe, which is why it's better. Now here is how you setup your own solar array.
+You can make a solar panel by wrenching the solar assembly onto a cable node. Adding a glass panel, reinforced or regular glass will do, will finish the construction of your solar panel. It is that easy!
Now after setting up 19 more of these solar panels you will want to create a solar tracker to keep track of our mother nature's gift, the sun. These are the same steps as before except you insert the tracker equipment circuit into the assembly before performing the final step of adding the glass. You now have a tracker! Now the last step is to add a computer to calculate the sun's movements and to send commands to the solar panels to change direction with the sun. Setting up the solar computer is the same as setting up any computer, so you should have no trouble in doing that. You do need to put a wire node under the computer, and the wire needs to be connected to the tracker.
+Congratulations, you should have a working solar array. If you are having trouble, here are some tips. Make sure all solar equipment are on a cable node, even the computer. You can always deconstruct your creations if you make a mistake.
You have purchased the latest in listening equipment. The telecommunication setup we created is the best in listening to common and private radio frequencies. Here is a step by step guide to start listening in on those saucy radio channels:
Equip yourself with a multitool
Use the multitool on the relay.
Turn it on. It has already been configured for you to listen on.
Simple as that. Now to listen to the private channels, you'll have to configure the intercoms. They are located on the front desk. Here is a list of frequencies for you to listen on.
145.9 - Common Channel
144.7 - Private AI Channel
135.9 - Security Channel
135.7 - Engineering Channel
135.5 - Medical Channel
135.3 - Command Channel
135.1 - Science Channel
134.9 - Service Channel
134.7 - Supply Channel
"
+ info = {"
+**Welcome new owner!**
+You have purchased the latest in listening equipment. The telecommunication setup we created is the best in listening to common and private radio frequencies. Here is a step by step guide to start listening in on those saucy radio channels:
+1. Equip yourself with a multitool
+2. Use the multitool on the relay.
+3. Turn it on. It has already been configured for you to listen on.
+Simple as that. Now to listen to the private channels, you'll have to configure the intercoms. They are located on the front desk. Here is a list of frequencies for you to listen on.
+* 145.9 - Common Channel
+* 144.7 - Private AI Channel
+* 135.9 - Security Channel
+* 135.7 - Engineering Channel
+* 135.5 - Medical Channel
+* 135.3 - Command Channel
+* 135.1 - Science Channel
+* 134.9 - Service Channel
+* 134.7 - Supply Channel
+"}
diff --git a/code/modules/ruins/spaceruin_code/TheDerelict.dm b/code/modules/ruins/spaceruin_code/TheDerelict.dm
index 58e257d587..513d16a0cb 100644
--- a/code/modules/ruins/spaceruin_code/TheDerelict.dm
+++ b/code/modules/ruins/spaceruin_code/TheDerelict.dm
@@ -6,14 +6,208 @@
/obj/item/paper/fluff/ruins/thederelict/syndie_mission
name = "Mission Objectives"
- info = "The Syndicate have cunningly disguised a Syndicate Uplink as your PDA. Simply enter the code \"678 Bravo\" into the ringtone select to unlock its hidden features.
Objective #1. Kill the God damn AI in a fire blast that it rocks the station. Success! Objective #2. Escape alive. Failed."
+ info = "The Syndicate have cunningly disguised a Syndicate Uplink as your PDA. Simply enter the code \"678 Bravo\" into the ringtone select to unlock its hidden features.\n \n__Objective #1__. Kill the God damn AI in a fire blast that it rocks the station. __Success!__ \n \n__Objective #2__. Escape alive. __Failed.__"
/obj/item/paper/fluff/ruins/thederelict/nukie_objectives
name = "Objectives of a Nuclear Operative"
- info = "Objective #1: Destroy the station with a nuclear device."
+ info = "__Objective #1__: Destroy the station with a nuclear device."
/obj/item/paper/crumpled/bloody/ruins/thederelict/unfinished
name = "unfinished paper scrap"
desc = "Looks like someone started shakily writing a will in space common, but were interrupted by something bloody..."
- info = "I, Victor Belyakov, do hereby leave my _- "
+ info = "__Objectives #1__: Find out what is hidden in Kosmicheskaya Stantsiya 13s Vault"
+
+/// Vault controller for use on the derelict/KS13.
+/obj/machinery/computer/vaultcontroller
+ name = "vault controller"
+ desc = "It seems to be powering and controlling the vault locks."
+ icon_screen = "power"
+ icon_keyboard = "power_key"
+ light_color = LIGHT_COLOR_YELLOW
+ use_power = NO_POWER_USE
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
+
+ var/obj/structure/cable/attached_cable
+ var/obj/machinery/door/airlock/vault/derelict/door1
+ var/obj/machinery/door/airlock/vault/derelict/door2
+ var/locked = TRUE
+ var/siphoned_power = 0
+ var/siphon_max = 1e7
+
+ ui_x = 300
+ ui_y = 120
+
+
+/obj/machinery/computer/monitor/examine(mob/user)
+ . = ..()
+ . += "It appears to be powered via a cable connector."
+
+
+//Checks for cable connection, charges if possible.
+/obj/machinery/computer/vaultcontroller/process()
+ if(siphoned_power >= siphon_max)
+ return
+ update_cable()
+ if(attached_cable)
+ attempt_siphon()
+
+
+///Looks for a cable connection beneath the machine.
+/obj/machinery/computer/vaultcontroller/proc/update_cable()
+ var/turf/T = get_turf(src)
+ attached_cable = locate(/obj/structure/cable) in T
+
+
+///Initializes airlock links.
+/obj/machinery/computer/vaultcontroller/proc/find_airlocks()
+ for(var/obj/machinery/door/airlock/A in GLOB.airlocks)
+ if(A.id_tag == "derelictvault")
+ if(!door1)
+ door1 = A
+ continue
+ if(door1 && !door2)
+ door2 = A
+ break
+
+
+///Tries to charge from powernet excess, no upper limit except max charge.
+/obj/machinery/computer/vaultcontroller/proc/attempt_siphon()
+ var/surpluspower = clamp(attached_cable.surplus(), 0, (siphon_max - siphoned_power))
+ if(surpluspower)
+ attached_cable.add_load(surpluspower)
+ siphoned_power += surpluspower
+
+
+///Handles the doors closing
+/obj/machinery/computer/vaultcontroller/proc/cycle_close(obj/machinery/door/airlock/A)
+ A.safe = FALSE //Make sure its forced closed, always
+ A.unbolt()
+ A.close()
+ A.bolt()
+
+
+///Handles the doors opening
+/obj/machinery/computer/vaultcontroller/proc/cycle_open(obj/machinery/door/airlock/A)
+ A.unbolt()
+ A.open()
+ A.bolt()
+
+
+///Attempts to lock the vault doors
+/obj/machinery/computer/vaultcontroller/proc/lock_vault()
+ if(door1 && !door1.density)
+ cycle_close(door1)
+ if(door2 && !door2.density)
+ cycle_close(door2)
+ if(door1.density && door1.locked && door2.density && door2.locked)
+ locked = TRUE
+
+
+///Attempts to unlock the vault doors
+/obj/machinery/computer/vaultcontroller/proc/unlock_vault()
+ if(door1 && door1.density)
+ cycle_open(door1)
+ if(door2 && door2.density)
+ cycle_open(door2)
+ if(!door1.density && door1.locked && !door2.density && door2.locked)
+ locked = FALSE
+
+
+///Attempts to lock/unlock vault doors, if machine is charged.
+/obj/machinery/computer/vaultcontroller/proc/activate_lock()
+ if(siphoned_power < siphon_max)
+ return
+ if(!door1 || !door2)
+ find_airlocks()
+ if(locked)
+ unlock_vault()
+ else
+ lock_vault()
+
+
+/obj/machinery/computer/vaultcontroller/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
+ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
+ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "VaultController", name, ui_x, ui_y, master_ui, state)
+ ui.open()
+
+
+/obj/machinery/computer/vaultcontroller/ui_act(action, params)
+ if(..())
+ return
+ switch(action)
+ if("togglelock")
+ activate_lock()
+
+
+/obj/machinery/computer/vaultcontroller/ui_data()
+ var/list/data = list()
+ data["stored"] = siphoned_power
+ data["max"] = siphon_max
+ data["doorstatus"] = locked
+ return data
+
+
+///Airlock that can't be deconstructed, broken or hacked.
+/obj/machinery/door/airlock/vault/derelict
+ locked = TRUE
+ move_resist = INFINITY
+ use_power = NO_POWER_USE
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
+ id_tag = "derelictvault"
+
+
+///Overrides screwdriver attack to prevent all deconstruction and hacking.
+/obj/machinery/door/airlock/vault/derelict/attackby(obj/item/C, mob/user, params)
+ if(C.tool_behaviour == TOOL_SCREWDRIVER)
+ return
+ ..()
+
+
+// So drones can teach borgs and AI dronespeak. For best effect, combine with mother drone lawset.
+
+/obj/item/dronespeak_manual
+ name = "dronespeak manual"
+ desc = "The book's cover reads: \"Understanding Dronespeak - An exercise in futility.\""
+ icon = 'icons/obj/library.dmi'
+ icon_state = "book2"
+
+/obj/item/dronespeak_manual/attack_self(mob/living/user)
+ ..()
+ if(isdrone(user) || issilicon(user))
+ if(user.has_language(/datum/language/drone))
+ to_chat(user, "You start skimming through [src], but you already know dronespeak.")
+ else
+ to_chat(user, "You start skimming through [src], and suddenly the drone chittering makes sense.")
+ user.grant_language(/datum/language/drone, TRUE, TRUE)
+ return
+
+ if(user.has_language(/datum/language/drone))
+ to_chat(user, "You start skimming through [src], but you already know dronespeak.")
+ else
+ to_chat(user, "You start skimming through [src], but you can't make any sense of the contents.")
+
+/obj/item/dronespeak_manual/attack(mob/living/M, mob/living/user)
+ if(!istype(M) || !istype(user))
+ return
+ if(M == user)
+ attack_self(user)
+ return
+
+ playsound(loc, "punch", 25, TRUE, -1)
+ if(isdrone(M) || issilicon(M))
+ if(M.has_language(/datum/language/drone))
+ M.visible_message("[user] beats [M] over the head with [src]!", "[user] beats you over the head with [src]!", "You hear smacking.")
+ else
+ M.visible_message("[user] teaches [M] by beating [M.p_them()] over the head with [src]!", "As [user] hits you with [src], chitters resonate in your mind.", "You hear smacking.")
+ M.grant_language(/datum/language/drone, TRUE, TRUE)
+ return
+
+/obj/structure/fluff/oldturret
+ name = "broken turret"
+ desc = "An obsolete model of turret, long non-functional."
+ icon = 'icons/obj/turrets.dmi'
+ icon_state = "turretCover"
+ density = TRUE
diff --git a/code/modules/ruins/spaceruin_code/hilbertshotel.dm b/code/modules/ruins/spaceruin_code/hilbertshotel.dm
index a60d564631..d97eae5766 100644
--- a/code/modules/ruins/spaceruin_code/hilbertshotel.dm
+++ b/code/modules/ruins/spaceruin_code/hilbertshotel.dm
@@ -263,7 +263,7 @@ GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337)
/turf/closed/indestructible/hoteldoor/attack_tk(mob/user)
return //need to be close.
-/turf/closed/indestructible/hoteldoor/attack_hand(mob/user)
+/turf/closed/indestructible/hoteldoor/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
promptExit(user)
/turf/closed/indestructible/hoteldoor/attack_animal(mob/user)
@@ -413,13 +413,13 @@ GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337)
. = ..()
if(ismob(AM))
var/mob/M = AM
- M.notransform = TRUE
+ M.mob_transforming = TRUE
/obj/item/abstracthotelstorage/Exited(atom/movable/AM, atom/newLoc)
. = ..()
if(ismob(AM))
var/mob/M = AM
- M.notransform = FALSE
+ M.mob_transforming = FALSE
//Space Ruin stuff
/area/ruin/space/has_grav/hilbertresearchfacility
@@ -474,29 +474,29 @@ GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337)
/obj/item/paper/crumpled/docslogs/Initialize()
. = ..()
GLOB.hhmysteryRoomNumber = rand(1, SHORT_REAL_LIMIT)
- info = {"
Research Logs
- I might just be onto something here!
- The strange space-warping properties of bluespace have been known about for awhile now, but I might be on the verge of discovering a new way of harnessing it.
- It's too soon to say for sure, but this might be the start of something quite important!
- I'll be sure to log any major future breakthroughs. This might be a lot more than I can manage on my own, perhaps I should hire that secretary after all...
-
Breakthrough!
- I can't believe it, but I did it! Just when I was certain it couldn't be done, I made the final necessary breakthrough.
- Exploiting the effects of space dilation caused by specific bluespace structures combined with a precise use of geometric calculus, I've discovered a way to correlate an infinite amount of space within a finite area!
- While the potential applications are endless, I utilized it in quite a nifty way so far by designing a system that recursively constructs subspace rooms and spatially links them to any of the infinite infinitesimally distinct points on the spheres surface.
- I call it: Hilbert's Hotel!
-
Goodbye
- I can't take this anymore. I know what happens next, and the fear of what is coming leaves me unable to continue working.
- Any fool in my field has heard the stories. It's not that I didn't believe them, it's just... I guess I underestimated the importance of my own research...
- Robert has reported a further increase in frequency of the strange, prying visitors who ask questions they have no business asking. I've requested him to keep everything on strict lockdown and have permanently dismissed all other assistants.
- I've also instructed him to use the encryption method we discussed for any important quantitative data. The poor lad... I don't think he truly understands what he's gotten himself into...
- It's clear what happens now. One day they'll show up uninvited, and claim my research as their own, leaving me as nothing more than a bullet ridden corpse floating in space.
- I can't stick around to the let that happen.
- I'm escaping into the very thing that brought all this trouble to my doorstep in the first place - my hotel.
- I'll be in [uppertext(num2hex(GLOB.hhmysteryRoomNumber, 0))] (That will make sense to anyone who should know)
- I'm sorry that I must go like this. Maybe one day things will be different and it will be safe to return... maybe...
- Goodbye
-
- Doctor Hilbert"}
+ info = {"
+### Research Logs
+I might just be onto something here!
+The strange space-warping properties of bluespace have been known about for awhile now, but I might be on the verge of discovering a new way of harnessing it.
+It's too soon to say for sure, but this might be the start of something quite important!
+I'll be sure to log any major future breakthroughs. This might be a lot more than I can manage on my own, perhaps I should hire that secretary after all...
+### Breakthrough!
+I can't believe it, but I did it! Just when I was certain it couldn't be done, I made the final necessary breakthrough.
+Exploiting the effects of space dilation caused by specific bluespace structures combined with a precise use of geometric calculus, I've discovered a way to correlate an infinite amount of space within a finite area!
+While the potential applications are endless, I utilized it in quite a nifty way so far by designing a system that recursively constructs subspace rooms and spatially links them to any of the infinite infinitesimally distinct points on the spheres surface.
+I call it: Hilbert's Hotel!
+
Goodbye
+I can't take this anymore. I know what happens next, and the fear of what is coming leaves me unable to continue working.
+Any fool in my field has heard the stories. It's not that I didn't believe them, it's just... I guess I underestimated the importance of my own research...
+Robert has reported a further increase in frequency of the strange, prying visitors who ask questions they have no business asking. I've requested him to keep everything on strict lockdown and have permanently dismissed all other assistants.
+I've also instructed him to use the encryption method we discussed for any important quantitative data. The poor lad... I don't think he truly understands what he's gotten himself into...
+It's clear what happens now. One day they'll show up uninvited, and claim my research as their own, leaving me as nothing more than a bullet ridden corpse floating in space.
+I can't stick around to the let that happen.
+I'm escaping into the very thing that brought all this trouble to my doorstep in the first place - my hotel.
+I'll be in [uppertext(num2hex(GLOB.hhmysteryRoomNumber, 0))] (That will make sense to anyone who should know)
+I'm sorry that I must go like this. Maybe one day things will be different and it will be safe to return... maybe...
+Goodbye
+ _Doctor Hilbert_"}
/obj/item/paper/crumpled/robertsworkjournal
name = "Work Journal"
@@ -526,16 +526,15 @@ GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337)
/obj/item/paper/crumpled/bloody/docsdeathnote
name = "note"
- info = {"This is it isn't it?
- No one's coming to help, that much has become clear.
- Sure, it's lonely, but do I have much choice? At least I brought the analyzer with me, they shouldn't be able to find me without it.
- Who knows who's waiting for me out there. Its either die out there in their hands, or die a slower, slightly more comfortable death in here.
- Everyday I can feel myself slipping away more and more, both physically and mentally. Who knows what happens now...
- Heh, so it's true then, this must be the inescapable path of all great minds... so be it then.
-
-
-
- Choose a room, and enter the sphere
- Lay your head to rest, it soon becomes clear
- There's always more room around every bend
- Not all that's countable has an end..."}
+ info = {"
+This is it isn't it?
+No one's coming to help, that much has become clear.
+Sure, it's lonely, but do I have much choice? At least I brought the analyzer with me, they shouldn't be able to find me without it.
+Who knows who's waiting for me out there. Its either die out there in their hands, or die a slower, slightly more comfortable death in here.
+Everyday I can feel myself slipping away more and more, both physically and mentally. Who knows what happens now...
+Heh, so it's true then, this must be the inescapable path of all great minds... so be it then.
+_Choose a room, and enter the sphere
+Lay your head to rest, it soon becomes clear
+There's always more room around every bend
+Not all that's countable has an end..._
+"}
diff --git a/code/modules/ruins/spaceruin_code/oldstation.dm b/code/modules/ruins/spaceruin_code/oldstation.dm
index e72dbea044..90de7040f4 100644
--- a/code/modules/ruins/spaceruin_code/oldstation.dm
+++ b/code/modules/ruins/spaceruin_code/oldstation.dm
@@ -38,8 +38,15 @@
/obj/item/paper/fluff/ruins/oldstation/protoinv
name = "Laboratory Inventory"
- info = "*Inventory*
(1) Prototype Hardsuit
(1)Health Analyser
(1)Prototype Energy Gun
(1)Singularity Generation Disk
DO NOT REMOVE WITHOUT \
- THE CAPTAIN AND RESEARCH DIRECTOR'S AUTHORISATION"
+ info = {"
+**Inventory**
+* (1) Prototype Hardsuit
+* (1)Health Analyser
+* (1)Prototype Energy Gun
+* (1)Singularity Generation Disk
+__DO NOT REMOVE WITHOUT HE CAPTAIN AND RESEARCH DIRECTOR'S AUTHORISATION__
+"}
+
/obj/item/paper/fluff/ruins/oldstation/report
name = "Crew Reawakening Report"
diff --git a/code/modules/ruins/spaceruin_code/originalcontent.dm b/code/modules/ruins/spaceruin_code/originalcontent.dm
index 5da28af26d..62d9170c2f 100644
--- a/code/modules/ruins/spaceruin_code/originalcontent.dm
+++ b/code/modules/ruins/spaceruin_code/originalcontent.dm
@@ -1,28 +1,28 @@
/////////// originalcontent items
/obj/item/paper/crumpled/ruins/originalcontent
- desc = "Various scrawled out drawings and sketches reside on the paper, apparently he didn't much care for these drawings."
+ desc = "_Various scrawled out drawings and sketches reside on the paper, apparently he didn't much care for these drawings._"
/obj/item/paper/pamphlet/ruin/originalcontent
icon = 'icons/obj/fluff.dmi'
/obj/item/paper/pamphlet/ruin/originalcontent/stickman
name = "Painting - 'BANG'"
- info = "This picture depicts a crudely-drawn stickman firing a crudely-drawn gun."
+ info = "_This picture depicts a crudely-drawn stickman firing a crudely-drawn gun._"
icon_state = "painting4"
/obj/item/paper/pamphlet/ruin/originalcontent/treeside
name = "Painting - 'Treeside'"
- info = "This picture depicts a sunny day on a lush hillside, set under a shaded tree."
+ info = "_This picture depicts a sunny day on a lush hillside, set under a shaded tree._"
icon_state = "painting1"
/obj/item/paper/pamphlet/ruin/originalcontent/pennywise
name = "Painting - 'Pennywise'"
- info = "This picture depicts a smiling clown. Something doesn't feel right about this.."
+ info = "_This picture depicts a smiling clown. Something doesn't feel right about this.._"
icon_state = "painting3"
/obj/item/paper/pamphlet/ruin/originalcontent/yelling
name = "Painting - 'Hands-On-Face'"
- info = "This picture depicts a man yelling on a bridge for no apparent reason."
+ info = "_This picture depicts a man yelling on a bridge for no apparent reason._"
icon_state = "painting2"
diff --git a/code/modules/ruins/spaceruin_code/spacehotel.dm b/code/modules/ruins/spaceruin_code/spacehotel.dm
index 69eebd8535..caea851783 100644
--- a/code/modules/ruins/spaceruin_code/spacehotel.dm
+++ b/code/modules/ruins/spaceruin_code/spacehotel.dm
@@ -3,10 +3,9 @@
/obj/item/paper/fluff/ruins/spacehotel/notice
name = "!NOTICE!"
- info = "!NOTICE!
We are expecting arriving guests soon from a nearby station! Stay sharp and make sure guests enjoy their time spent here. Don't think you can sneak off while they're here, either.
"
+ info = "__!NOTICE!__\n \nWe are expecting arriving guests soon from a nearby station! Stay sharp and make sure guests enjoy their time spent here. Don't think you can sneak off while they're here, either."
/obj/item/paper/pamphlet/ruin/spacehotel
name = "hotel pamphlet"
- info = "
The Twin Nexus Hotel
A place of Sanctuary
Welcome to The Twin-Nexus Hotel, \[insert name here]! The loyal staff stride to their best effort to cater for the best possible experience for all space(wo)men! If you have any questions or comments, please ask one of our on-board staff for more information.
"
-
+ info = "__The Twin Nexus Hotel__\n*A place of Sanctuary*\n \nWelcome to The Twin-Nexus Hotel, \[insert name here]! The loyal staff strive to their best effort to cater for the best possible experience for all space(wo)men! If you have any questions or comments, please ask one of our on-board staff for more information."
diff --git a/code/modules/security_levels/keycard_authentication.dm b/code/modules/security_levels/keycard_authentication.dm
index adf53ff0da..f6418b9236 100644
--- a/code/modules/security_levels/keycard_authentication.dm
+++ b/code/modules/security_levels/keycard_authentication.dm
@@ -16,6 +16,9 @@ GLOBAL_DATUM_INIT(keycard_events, /datum/events, new)
power_channel = ENVIRON
req_access = list(ACCESS_KEYCARD_AUTH)
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
+ ui_x = 375
+ ui_y = 125
+
var/datum/callback/ev
var/event = ""
var/obj/machinery/keycard_auth/event_source
@@ -36,7 +39,7 @@ GLOBAL_DATUM_INIT(keycard_events, /datum/events, new)
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.physical_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
- ui = new(user, src, ui_key, "keycard_auth", name, 375, 125, master_ui, state)
+ ui = new(user, src, ui_key, "KeycardAuth", name, ui_x, ui_y, master_ui, state)
ui.open()
/obj/machinery/keycard_auth/ui_data()
@@ -108,13 +111,13 @@ GLOBAL_DATUM_INIT(keycard_events, /datum/events, new)
/obj/machinery/keycard_auth/proc/trigger_event(confirmer)
log_game("[key_name(triggerer)] triggered and [key_name(confirmer)] confirmed event [event]")
- message_admins("[key_name(triggerer)] triggered and [key_name(confirmer)] confirmed event [event]")
+ message_admins("[ADMIN_LOOKUPFLW(triggerer)] triggered and [ADMIN_LOOKUPFLW(confirmer)] confirmed event [event]")
var/area/A1 = get_area(triggerer)
- deadchat_broadcast("[triggerer] triggered [event] at [A1.name].", triggerer)
+ deadchat_broadcast(" triggered [event] at [A1.name].", "[triggerer]", triggerer)
var/area/A2 = get_area(confirmer)
- deadchat_broadcast("[confirmer] confirmed [event] at [A2.name].", confirmer)
+ deadchat_broadcast(" confirmed [event] at [A2.name].", "[confirmer]", confirmer)
switch(event)
if(KEYCARD_RED_ALERT)
set_security_level(SEC_LEVEL_RED)
diff --git a/code/modules/shuttle/arrivals.dm b/code/modules/shuttle/arrivals.dm
index 190db2c362..8322c6cdd8 100644
--- a/code/modules/shuttle/arrivals.dm
+++ b/code/modules/shuttle/arrivals.dm
@@ -201,6 +201,6 @@
/obj/docking_port/mobile/arrivals/vv_edit_var(var_name, var_value)
switch(var_name)
- if("perma_docked")
+ if(NAMEOF(src, perma_docked))
SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("arrivals shuttle", "[var_value ? "stopped" : "started"]"))
return ..()
diff --git a/code/modules/shuttle/computer.dm b/code/modules/shuttle/computer.dm
index d2b13fc71a..682a7fa14b 100644
--- a/code/modules/shuttle/computer.dm
+++ b/code/modules/shuttle/computer.dm
@@ -57,6 +57,7 @@
switch(SSshuttle.moveShuttle(shuttleId, href_list["move"], 1))
if(0)
say("Shuttle departing. Please stand away from the doors.")
+ log_shuttle("[key_name(usr)] has sent shuttle \"[M]\" towards \"[href_list["move"]]\", using [src].")
if(1)
to_chat(usr, "Invalid shuttle requested.")
else
@@ -71,6 +72,6 @@
to_chat(user, "You fried the consoles ID checking system.")
return TRUE
-/obj/machinery/computer/shuttle/proc/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE)
+/obj/machinery/computer/shuttle/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE)
if(port && (shuttleId == initial(shuttleId) || override))
- shuttleId = port.id
\ No newline at end of file
+ shuttleId = port.id
diff --git a/code/modules/shuttle/custom_shuttle.dm b/code/modules/shuttle/custom_shuttle.dm
new file mode 100644
index 0000000000..c71b6ba9a8
--- /dev/null
+++ b/code/modules/shuttle/custom_shuttle.dm
@@ -0,0 +1,268 @@
+#define Z_DIST 500
+#define CUSTOM_ENGINES_START_TIME 65
+#define CALCULATE_STATS_COOLDOWN 2
+
+/obj/machinery/computer/custom_shuttle
+ name = "nanotrasen shuttle flight controller"
+ desc = "A terminal used to fly shuttles defined by the Shuttle Zoning Designator"
+ circuit = /obj/item/circuitboard/computer/shuttle/flight_control
+ icon_screen = "shuttle"
+ icon_keyboard = "tech_key"
+ light_color = LIGHT_COLOR_CYAN
+ req_access = list( )
+ var/shuttleId
+ var/possible_destinations = "whiteship_home"
+ var/admin_controlled
+ var/no_destination_swap = 0
+ var/calculated_mass = 0
+ var/calculated_dforce = 0
+ var/calculated_speed = 0
+ var/calculated_engine_count = 0
+ var/calculated_consumption = 0
+ var/calculated_cooldown = 0
+ var/calculated_non_operational_thrusters = 0
+ var/calculated_fuel_less_thrusters = 0
+ var/target_fuel_cost = 0
+ var/targetLocation
+ var/datum/browser/popup
+
+ var/stat_calc_cooldown = 0
+
+ //Upgrades
+ var/distance_multiplier = 1
+
+/obj/machinery/computer/custom_shuttle/examine(mob/user)
+ . = ..()
+ . += distance_multiplier < 1 ? "Bluespace shortcut module installed. Route is [distance_multiplier]x the original length." : ""
+
+/obj/machinery/computer/custom_shuttle/ui_interact(mob/user)
+ var/list/options = params2list(possible_destinations)
+ var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId)
+ var/dat = "[M ? "Current Location : [M.getStatusText()]" : "Shuttle link required."]
"
+ if(M)
+ dat += "Run Flight Calculations "
+ dat += "Shuttle Data"
+ dat += "Shuttle Mass: [calculated_mass/10]tons "
+ dat += "Engine Force: [calculated_dforce]kN ([calculated_engine_count] engines) "
+ dat += "Sublight Speed: [calculated_speed]ms-1 "
+ dat += calculated_speed < 1 ? "INSUFFICIENT ENGINE POWER " : ""
+ dat += calculated_non_operational_thrusters > 0 ? "Warning: [calculated_non_operational_thrusters] thrusters offline. " : ""
+ dat += "Fuel Consumption: [calculated_consumption]units per distance "
+ dat += "Engine Cooldown: [calculated_cooldown]s"
+ var/destination_found
+ for(var/obj/docking_port/stationary/S in SSshuttle.stationary)
+ if(!options.Find(S.id))
+ continue
+ if(!M.check_dock(S, silent=TRUE))
+ continue
+ if(calculated_speed == 0)
+ break
+ destination_found = TRUE
+ var/dist = round(calculateDistance(S))
+ dat += "Target [S.name] (Dist: [dist] | Fuel Cost: [round(dist * calculated_consumption)] | Time: [round(dist / calculated_speed)]) "
+ if(!destination_found)
+ dat += "No valid destinations "
+ dat += "[targetLocation ? "Target Location : [targetLocation]" : "No Target Location"]"
+ dat += "Initate Flight "
+ dat += "Close"
+
+ popup = new(user, "computer", M ? M.name : "shuttle", 350, 450)
+ popup.set_content("
[dat]
")
+ popup.set_title_image(usr.browse_rsc_icon(src.icon, src.icon_state))
+ popup.open()
+
+/obj/machinery/computer/custom_shuttle/Topic(href, href_list)
+ if(..())
+ return
+ usr.set_machine(src)
+ src.add_fingerprint(usr)
+ if(!allowed(usr))
+ to_chat(usr, "Access denied.")
+ return
+
+ if(href_list["calculate"])
+ calculateStats()
+ ui_interact(usr)
+ return
+ var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId)
+ if(!M)
+ return
+ if(M.launch_status == ENDGAME_LAUNCHED)
+ return
+ if(href_list["setloc"])
+ SetTargetLocation(href_list["setloc"])
+ ui_interact(usr)
+ return
+ else if(href_list["fly"])
+ Fly()
+ ui_interact(usr)
+ return
+
+/obj/machinery/computer/custom_shuttle/proc/calculateDistance(var/obj/docking_port/stationary/port)
+ var/deltaX = port.x - x
+ var/deltaY = port.y - y
+ var/deltaZ = (port.z - z) * Z_DIST
+ return sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ) * distance_multiplier
+
+/obj/machinery/computer/custom_shuttle/proc/linkShuttle(var/new_id)
+ shuttleId = new_id
+ possible_destinations = "whiteship_home;shuttle[new_id]_custom"
+
+/obj/machinery/computer/custom_shuttle/proc/calculateStats(var/useFuel = FALSE, var/dist = 0, var/ignore_cooldown = FALSE)
+ if(!ignore_cooldown && stat_calc_cooldown >= world.time)
+ to_chat(usr, "You are using this too fast, please slow down")
+ return
+ stat_calc_cooldown = world.time + CALCULATE_STATS_COOLDOWN
+ var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId)
+ if(!M)
+ return FALSE
+ //Reset data
+ calculated_mass = 0
+ calculated_dforce = 0
+ calculated_speed = 0
+ calculated_engine_count = 0
+ calculated_consumption = 0
+ calculated_cooldown = 0
+ calculated_fuel_less_thrusters = 0
+ calculated_non_operational_thrusters = 0
+ //Calculate all the data
+ var/list/areas = M.shuttle_areas
+ for(var/shuttleArea in areas)
+ calculated_mass += length(get_area_turfs(shuttleArea))
+ for(var/obj/machinery/shuttle/engine/E in shuttleArea)
+ E.check_setup()
+ if(!E.thruster_active) //Skipover thrusters with no valid heater
+ calculated_non_operational_thrusters ++
+ continue
+ if(E.attached_heater)
+ var/obj/machinery/atmospherics/components/unary/shuttle/heater/resolvedHeater = E.attached_heater.resolve()
+ if(resolvedHeater && !resolvedHeater.hasFuel(dist * E.fuel_use) && useFuel)
+ calculated_fuel_less_thrusters ++
+ continue
+ calculated_engine_count++
+ calculated_dforce += E.thrust
+ calculated_consumption += E.fuel_use
+ calculated_cooldown = max(calculated_cooldown, E.cooldown)
+ //This should really be accelleration, but its a 2d spessman game so who cares
+ if(calculated_mass == 0)
+ return FALSE
+ calculated_speed = (calculated_dforce*1000) / (calculated_mass*100)
+ return TRUE
+
+/obj/machinery/computer/custom_shuttle/proc/consumeFuel(var/dist)
+ var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId)
+ if(!M)
+ return FALSE
+ //Calculate all the data
+ for(var/obj/machinery/shuttle/engine/shuttle_machine in GLOB.custom_shuttle_machines)
+ shuttle_machine.check_setup()
+ if(!shuttle_machine.thruster_active)
+ continue
+ if(get_area(M) != get_area(shuttle_machine))
+ continue
+ if(shuttle_machine.attached_heater)
+ var/obj/machinery/atmospherics/components/unary/shuttle/heater/resolvedHeater = shuttle_machine.attached_heater.resolve()
+ if(resolvedHeater && !resolvedHeater.hasFuel(dist * shuttle_machine.fuel_use))
+ continue
+ resolvedHeater?.consumeFuel(dist * shuttle_machine.fuel_use)
+ shuttle_machine.fireEngine()
+
+/obj/machinery/computer/custom_shuttle/proc/SetTargetLocation(var/newTarget)
+ if(!(newTarget in params2list(possible_destinations)))
+ log_admin("[usr] attempted to href dock exploit on [src] with target location \"[newTarget]\"")
+ message_admins("[usr] just attempted to href dock exploit on [src] with target location \"[newTarget]\"")
+ return
+ targetLocation = newTarget
+ say("Shuttle route calculated.")
+ return
+
+/obj/machinery/computer/custom_shuttle/proc/Fly()
+ if(!targetLocation)
+ return
+ var/obj/docking_port/mobile/linkedShuttle = SSshuttle.getShuttle(shuttleId)
+ if(!linkedShuttle)
+ return
+ if(linkedShuttle.mode != SHUTTLE_IDLE)
+ return
+ if(!calculateStats(TRUE, 0, TRUE))
+ return
+ if(calculated_fuel_less_thrusters > 0)
+ say("Warning, [calculated_fuel_less_thrusters] do not have enough fuel for this journey, engine output may be limitted.")
+ if(calculated_speed < 1)
+ say("Insufficient engine power, shuttle requires [calculated_mass / 10]kN of thrust.")
+ return
+ var/obj/docking_port/stationary/targetPort = SSshuttle.getDock(targetLocation)
+ if(!targetPort)
+ return
+ var/dist = calculateDistance(targetPort)
+ var/time = min(max(round(dist / calculated_speed), 10), 90)
+ linkedShuttle.callTime = time * 10
+ linkedShuttle.rechargeTime = calculated_cooldown
+ //We need to find the direction of this console to the port
+ linkedShuttle.port_direction = angle2dir(dir2angle(dir) - (dir2angle(linkedShuttle.dir)) + 180)
+ linkedShuttle.preferred_direction = NORTH
+ linkedShuttle.ignitionTime = CUSTOM_ENGINES_START_TIME
+ linkedShuttle.count_engines()
+ linkedShuttle.hyperspace_sound(HYPERSPACE_WARMUP)
+ var/throwForce = clamp((calculated_speed / 2) - 5, 0, 10)
+ linkedShuttle.movement_force = list("KNOCKDOWN" = calculated_speed > 5 ? 3 : 0, "THROW" = throwForce)
+ if(!(targetLocation in params2list(possible_destinations)))
+ log_admin("[usr] attempted to launch a shuttle that has been affected by href dock exploit on [src] with target location \"[targetLocation]\"")
+ message_admins("[usr] attempted to launch a shuttle that has been affected by href dock exploit on [src] with target location \"[targetLocation]\"")
+ return
+ switch(SSshuttle.moveShuttle(shuttleId, targetLocation, 1))
+ if(0)
+ consumeFuel(dist)
+ say("Shuttle departing. Please stand away from the doors.")
+ if(1)
+ to_chat(usr, "Invalid shuttle requested.")
+ else
+ to_chat(usr, "Unable to comply.")
+ return
+
+/obj/machinery/computer/custom_shuttle/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE)
+ if(port && (shuttleId == initial(shuttleId) || override))
+ linkShuttle(port.id)
+
+//Custom shuttle docker locations
+/obj/machinery/computer/camera_advanced/shuttle_docker/custom
+ name = "Shuttle Navigation Computer"
+ desc = "Used to designate a precise transit location for private ships."
+ lock_override = NONE
+ whitelist_turfs = list(/turf/open/space,
+ /turf/open/lava,
+ /turf/open/floor/plating/beach,
+ /turf/open/floor/plating/ashplanet,
+ /turf/open/floor/plating/asteroid,
+ /turf/open/floor/plating/lavaland_baseturf)
+ jumpto_ports = list("whiteship_home" = 1)
+ view_range = 12
+ designate_time = 100
+ circuit = /obj/item/circuitboard/computer/shuttle/docker
+
+/obj/machinery/computer/camera_advanced/shuttle_docker/custom/Initialize()
+ . = ..()
+ GLOB.jam_on_wardec += src
+
+/obj/machinery/computer/camera_advanced/shuttle_docker/custom/Destroy()
+ GLOB.jam_on_wardec -= src
+ return ..()
+
+/obj/machinery/computer/camera_advanced/shuttle_docker/custom/placeLandingSpot()
+ if(!shuttleId)
+ return //Only way this would happen is if someone else delinks the console while in use somehow
+ var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId)
+ if(M?.mode != SHUTTLE_IDLE)
+ to_chat(usr, "You cannot target locations while in transit.")
+ return
+ ..()
+
+/obj/machinery/computer/camera_advanced/shuttle_docker/custom/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+ if(!shuttleId)
+ to_chat(user, "You must link the console to a shuttle first.")
+ return
+ return ..()
+
+/obj/machinery/computer/camera_advanced/shuttle_docker/custom/proc/linkShuttle(var/new_id)
+ shuttleId = new_id
+ shuttlePortId = "shuttle[new_id]_custom"
diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm
index 358fc5ad50..637d9ae334 100644
--- a/code/modules/shuttle/emergency.dm
+++ b/code/modules/shuttle/emergency.dm
@@ -49,8 +49,7 @@
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
- ui = new(user, src, ui_key, "emergency_shuttle_console", name,
- 400, 350, master_ui, state)
+ ui = new(user, src, ui_key, "EmergencyShuttleConsole", name, ui_x, ui_y, master_ui, state)
ui.open()
/obj/machinery/computer/emergency_shuttle/ui_data()
@@ -145,7 +144,7 @@
authorized += ID
message_admins("[ADMIN_LOOKUPFLW(user)] has authorized early shuttle launch")
- log_game("[key_name(user)] has authorized early shuttle launch in [COORD(src)]")
+ log_shuttle("[key_name(user)] has authorized early shuttle launch in [COORD(src)]")
// Now check if we're on our way
. = TRUE
process()
@@ -251,7 +250,7 @@
var/time = TIME_LEFT
message_admins("[ADMIN_LOOKUPFLW(user.client)] has emagged the emergency shuttle [time] seconds before launch.")
- log_game("[key_name(user)] has emagged the emergency shuttle in [COORD(src)] [time] seconds before launch.")
+ log_shuttle("[key_name(user)] has emagged the emergency shuttle in [COORD(src)] [time] seconds before launch.")
obj_flags |= EMAGGED
SSshuttle.emergency.movement_force = list("KNOCKDOWN" = 60, "THROW" = 20)//YOUR PUNY SEATBELTS can SAVE YOU NOW, MORTAL
var/datum/species/S = new
diff --git a/code/modules/shuttle/manipulator.dm b/code/modules/shuttle/manipulator.dm
index 8f98a89c36..5f120791cb 100644
--- a/code/modules/shuttle/manipulator.dm
+++ b/code/modules/shuttle/manipulator.dm
@@ -11,363 +11,13 @@
density = TRUE
- // UI state variables
- var/datum/map_template/shuttle/selected
-
- var/obj/docking_port/mobile/existing_shuttle
-
- var/obj/docking_port/mobile/preview_shuttle
- var/datum/map_template/shuttle/preview_template
-
-/obj/machinery/shuttle_manipulator/Initialize()
- . = ..()
- update_icon()
- SSshuttle.manipulator = src
-
-/obj/machinery/shuttle_manipulator/Destroy(force)
- if(!force)
- . = QDEL_HINT_LETMELIVE
- else
- SSshuttle.manipulator = null
- . = ..()
-
/obj/machinery/shuttle_manipulator/update_overlays()
. = ..()
var/mutable_appearance/hologram_projection = mutable_appearance(icon, "hologram_on")
hologram_projection.pixel_y = 22
var/mutable_appearance/hologram_ship = mutable_appearance(icon, "hologram_whiteship")
hologram_ship.pixel_y = 27
+ add_overlay(hologram_projection)
+ add_overlay(hologram_ship)
. += hologram_projection
. += hologram_ship
-
-/obj/machinery/shuttle_manipulator/can_interact(mob/user)
- // Only admins can use this, but they can use it from anywhere
- return user.client && check_rights_for(user.client, R_ADMIN)
-
-/obj/machinery/shuttle_manipulator/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.admin_state)
- ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
- if(!ui)
- ui = new(user, src, ui_key, "shuttle_manipulator", name, 800, 600, master_ui, state)
- ui.open()
-
-/proc/shuttlemode2str(mode)
- switch(mode)
- if(SHUTTLE_IDLE)
- . = "idle"
- if(SHUTTLE_IGNITING)
- . = "engines charging"
- if(SHUTTLE_RECALL)
- . = "recalled"
- if(SHUTTLE_CALL)
- . = "called"
- if(SHUTTLE_DOCKED)
- . = "docked"
- if(SHUTTLE_STRANDED)
- . = "stranded"
- if(SHUTTLE_ESCAPE)
- . = "escape"
- if(SHUTTLE_ENDGAME)
- . = "endgame"
- if(!.)
- CRASH("shuttlemode2str(): invalid mode [mode]")
-
-
-/obj/machinery/shuttle_manipulator/ui_data(mob/user)
- var/list/data = list()
- data["tabs"] = list("Status", "Templates", "Modification")
-
- // Templates panel
- data["templates"] = list()
- var/list/templates = data["templates"]
- data["templates_tabs"] = list()
- data["selected"] = list()
-
- for(var/shuttle_id in SSmapping.shuttle_templates)
- var/datum/map_template/shuttle/S = SSmapping.shuttle_templates[shuttle_id]
-
- if(!templates[S.port_id])
- data["templates_tabs"] += S.port_id
- templates[S.port_id] = list(
- "port_id" = S.port_id,
- "templates" = list())
-
- var/list/L = list()
- L["name"] = S.name
- L["shuttle_id"] = S.shuttle_id
- L["port_id"] = S.port_id
- L["description"] = S.description
- L["admin_notes"] = S.admin_notes
-
- if(selected == S)
- data["selected"] = L
-
- templates[S.port_id]["templates"] += list(L)
-
- data["templates_tabs"] = sortList(data["templates_tabs"])
-
- data["existing_shuttle"] = null
-
- // Status panel
- data["shuttles"] = list()
- for(var/i in SSshuttle.mobile)
- var/obj/docking_port/mobile/M = i
- var/timeleft = M.timeLeft(1)
- var/list/L = list()
- L["name"] = M.name
- L["id"] = M.id
- L["timer"] = M.timer
- L["timeleft"] = M.getTimerStr()
- if (timeleft > 1 HOURS)
- L["timeleft"] = "Infinity"
- L["can_fast_travel"] = M.timer && timeleft >= 50
- L["can_fly"] = TRUE
- if(istype(M, /obj/docking_port/mobile/emergency))
- L["can_fly"] = FALSE
- else if(!M.destination)
- L["can_fast_travel"] = FALSE
- if (M.mode != SHUTTLE_IDLE)
- L["mode"] = capitalize(shuttlemode2str(M.mode))
- L["status"] = M.getDbgStatusText()
- if(M == existing_shuttle)
- data["existing_shuttle"] = L
-
- data["shuttles"] += list(L)
-
- return data
-
-/obj/machinery/shuttle_manipulator/ui_act(action, params)
- if(..())
- return
-
- var/mob/user = usr
-
- // Preload some common parameters
- var/shuttle_id = params["shuttle_id"]
- var/datum/map_template/shuttle/S = SSmapping.shuttle_templates[shuttle_id]
-
- switch(action)
- if("select_template")
- if(S)
- existing_shuttle = SSshuttle.getShuttle(S.port_id)
- selected = S
- . = TRUE
- if("jump_to")
- if(params["type"] == "mobile")
- for(var/i in SSshuttle.mobile)
- var/obj/docking_port/mobile/M = i
- if(M.id == params["id"])
- user.forceMove(get_turf(M))
- . = TRUE
- break
-
- if("fly")
- for(var/i in SSshuttle.mobile)
- var/obj/docking_port/mobile/M = i
- if(M.id == params["id"])
- . = TRUE
- M.admin_fly_shuttle(user)
- break
-
- if("fast_travel")
- for(var/i in SSshuttle.mobile)
- var/obj/docking_port/mobile/M = i
- if(M.id == params["id"] && M.timer && M.timeLeft(1) >= 50)
- M.setTimer(50)
- . = TRUE
- message_admins("[key_name_admin(usr)] fast travelled [M]")
- log_admin("[key_name(usr)] fast travelled [M]")
- SSblackbox.record_feedback("text", "shuttle_manipulator", 1, "[M.name]")
- break
-
- if("preview")
- if(S)
- . = TRUE
- unload_preview()
- load_template(S)
- if(preview_shuttle)
- preview_template = S
- user.forceMove(get_turf(preview_shuttle))
- if("load")
- if(existing_shuttle == SSshuttle.backup_shuttle)
- // TODO make the load button disabled
- WARNING("The shuttle that the selected shuttle will replace \
- is the backup shuttle. Backup shuttle is required to be \
- intact for round sanity.")
- else if(S)
- . = TRUE
- // If successful, returns the mobile docking port
- var/obj/docking_port/mobile/mdp = action_load(S)
- if(mdp)
- user.forceMove(get_turf(mdp))
- message_admins("[key_name_admin(usr)] loaded [mdp] with the shuttle manipulator.")
- log_admin("[key_name(usr)] loaded [mdp] with the shuttle manipulator.
")
- SSblackbox.record_feedback("text", "shuttle_manipulator", 1, "[mdp.name]")
-
- update_icon()
-
-/obj/machinery/shuttle_manipulator/proc/action_load(datum/map_template/shuttle/loading_template, obj/docking_port/stationary/destination_port)
- // Check for an existing preview
- if(preview_shuttle && (loading_template != preview_template))
- preview_shuttle.jumpToNullSpace()
- preview_shuttle = null
- preview_template = null
-
- if(!preview_shuttle)
- if(load_template(loading_template))
- preview_shuttle.linkup(loading_template, destination_port)
- preview_template = loading_template
-
- // get the existing shuttle information, if any
- var/timer = 0
- var/mode = SHUTTLE_IDLE
- var/obj/docking_port/stationary/D
-
- if(istype(destination_port))
- D = destination_port
- else if(existing_shuttle)
- timer = existing_shuttle.timer
- mode = existing_shuttle.mode
- D = existing_shuttle.get_docked()
-
- if(!D)
- CRASH("No dock found for preview shuttle ([preview_template.name]), aborting.")
-
- var/result = preview_shuttle.canDock(D)
- // truthy value means that it cannot dock for some reason
- // but we can ignore the someone else docked error because we'll
- // be moving into their place shortly
- if((result != SHUTTLE_CAN_DOCK) && (result != SHUTTLE_SOMEONE_ELSE_DOCKED))
- WARNING("Template shuttle [preview_shuttle] cannot dock at [D] ([result]).")
- return
-
- if(existing_shuttle)
- existing_shuttle.jumpToNullSpace()
-
- var/list/force_memory = preview_shuttle.movement_force
- preview_shuttle.movement_force = list("KNOCKDOWN" = 0, "THROW" = 0)
- preview_shuttle.initiate_docking(D)
- preview_shuttle.movement_force = force_memory
-
- . = preview_shuttle
-
- // Shuttle state involves a mode and a timer based on world.time, so
- // plugging the existing shuttles old values in works fine.
- preview_shuttle.timer = timer
- preview_shuttle.mode = mode
-
- preview_shuttle.register()
-
- // TODO indicate to the user that success happened, rather than just
- // blanking the modification tab
- preview_shuttle = null
- preview_template = null
- existing_shuttle = null
- selected = null
-
-/obj/machinery/shuttle_manipulator/proc/load_template(datum/map_template/shuttle/S)
- . = FALSE
- // load shuttle template, centred at shuttle import landmark,
- var/turf/landmark_turf = get_turf(locate(/obj/effect/landmark/shuttle_import) in GLOB.landmarks_list)
- S.load(landmark_turf, centered = TRUE, register = FALSE)
-
- var/affected = S.get_affected_turfs(landmark_turf, centered = TRUE)
-
- var/found = 0
- // Search the turfs for docking ports
- // - We need to find the mobile docking port because that is the heart of
- // the shuttle.
- // - We need to check that no additional ports have slipped in from the
- // template, because that causes unintended behaviour.
- for(var/T in affected)
- for(var/obj/docking_port/P in T)
- if(istype(P, /obj/docking_port/mobile))
- found++
- if(found > 1)
- qdel(P, force=TRUE)
- log_world("Map warning: Shuttle Template [S.mappath] has multiple mobile docking ports.")
- else
- preview_shuttle = P
- if(istype(P, /obj/docking_port/stationary))
- log_world("Map warning: Shuttle Template [S.mappath] has a stationary docking port.")
- if(!found)
- var/msg = "load_template(): Shuttle Template [S.mappath] has no mobile docking port. Aborting import."
- for(var/T in affected)
- var/turf/T0 = T
- T0.empty()
-
- message_admins(msg)
- WARNING(msg)
- return
- //Everything fine
- S.on_bought()
- return TRUE
-
-/obj/machinery/shuttle_manipulator/proc/unload_preview()
- if(preview_shuttle)
- preview_shuttle.jumpToNullSpace()
- preview_shuttle = null
-
-/obj/docking_port/mobile/proc/admin_fly_shuttle(mob/user)
- var/list/options = list()
-
- for(var/port in SSshuttle.stationary)
- if (istype(port, /obj/docking_port/stationary/transit))
- continue // please don't do this
- var/obj/docking_port/stationary/S = port
- if (canDock(S) == SHUTTLE_CAN_DOCK)
- options[S.name || S.id] = S
-
- options += "--------"
- options += "Infinite Transit"
- options += "Delete Shuttle"
- options += "Into The Sunset (delete & greentext 'escape')"
-
- var/selection = input(user, "Select where to fly [name || id]:", "Fly Shuttle") as null|anything in options
- if(!selection)
- return
-
- switch(selection)
- if("Infinite Transit")
- destination = null
- mode = SHUTTLE_IGNITING
- setTimer(ignitionTime)
-
- if("Delete Shuttle")
- if(alert(user, "Really delete [name || id]?", "Delete Shuttle", "Cancel", "Really!") != "Really!")
- return
- jumpToNullSpace()
-
- if("Into The Sunset (delete & greentext 'escape')")
- if(alert(user, "Really delete [name || id] and greentext escape objectives?", "Delete Shuttle", "Cancel", "Really!") != "Really!")
- return
- intoTheSunset()
-
- else
- if(options[selection])
- request(options[selection])
-
-/obj/docking_port/mobile/emergency/admin_fly_shuttle(mob/user)
- return // use the existing verbs for this
-
-/obj/docking_port/mobile/arrivals/admin_fly_shuttle(mob/user)
- switch(alert(user, "Would you like to fly the arrivals shuttle once or change its destination?", "Fly Shuttle", "Fly", "Retarget", "Cancel"))
- if("Cancel")
- return
- if("Fly")
- return ..()
-
- var/list/options = list()
-
- for(var/port in SSshuttle.stationary)
- if (istype(port, /obj/docking_port/stationary/transit))
- continue // please don't do this
- var/obj/docking_port/stationary/S = port
- if (canDock(S) == SHUTTLE_CAN_DOCK)
- options[S.name || S.id] = S
-
- var/selection = input(user, "Select the new arrivals destination:", "Fly Shuttle") as null|anything in options
- if(!selection)
- return
- target_dock = options[selection]
- if(!QDELETED(target_dock))
- destination = target_dock
diff --git a/code/modules/shuttle/navigation_computer.dm b/code/modules/shuttle/navigation_computer.dm
index 69eb4a6be4..195e87720c 100644
--- a/code/modules/shuttle/navigation_computer.dm
+++ b/code/modules/shuttle/navigation_computer.dm
@@ -29,7 +29,7 @@
. = ..()
GLOB.navigation_computers -= src
-/obj/machinery/computer/camera_advanced/shuttle_docker/attack_hand(mob/user)
+/obj/machinery/computer/camera_advanced/shuttle_docker/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(jammed)
to_chat(user, "The Syndicate is jamming the console!")
return
@@ -253,7 +253,7 @@
current_user.client.images -= remove_images
current_user.client.images += add_images
-/obj/machinery/computer/camera_advanced/shuttle_docker/proc/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE)
+/obj/machinery/computer/camera_advanced/shuttle_docker/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE)
if(port && (shuttleId == initial(shuttleId) || override))
shuttleId = port.id
shuttlePortId = "[port.id]_custom"
diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm
index 665361af49..d7a6d4a583 100644
--- a/code/modules/shuttle/shuttle.dm
+++ b/code/modules/shuttle/shuttle.dm
@@ -11,17 +11,31 @@
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
anchored = TRUE
-//
+ /// The identifier of the port or ship.
+ /// This will be used in numerous other places like the console,
+ /// stationary ports and whatnot to tell them your ship's mobile
+ /// port can be used in these places, or the docking port is compatible, etc.
var/id
- // this should point -away- from the dockingport door, ie towards the ship
+ ///Common standard is for this to point -away- from the dockingport door, ie towards the ship
dir = NORTH
- var/width = 0 //size of covered area, perpendicular to dir
- var/height = 0 //size of covered area, parallel to dir
- var/dwidth = 0 //position relative to covered area, perpendicular to dir
- var/dheight = 0 //position relative to covered area, parallel to dir
+ ///size of covered area, perpendicular to dir. You shouldn't modify this for mobile dockingports, set automatically.
+ var/width = 0
+ ///size of covered area, parallel to dir. You shouldn't modify this for mobile dockingports, set automatically.
+ var/height = 0
+ ///position relative to covered area, perpendicular to dir. You shouldn't modify this for mobile dockingports, set automatically.
+ var/dwidth = 0
+ ///position relative to covered area, parallel to dir. You shouldn't modify this for mobile dockingports, set automatically.
+ var/dheight = 0
var/area_type
- var/hidden = FALSE //are we invisible to shuttle navigation computers?
+ ///are we invisible to shuttle navigation computers?
+ var/hidden = FALSE
+
+ ///Delete this port after ship fly off.
+ var/delete_after = FALSE
+
+/obj/docking_port/proc/get_save_vars()
+ return list("pixel_x", "pixel_y", "dir", "name", "req_access", "req_access_txt", "piping_layer", "color", "icon_state", "pipe_color", "amount", "width", "height", "dwidth", "dheight")
//these objects are indestructible
/obj/docking_port/Destroy(force)
@@ -155,8 +169,6 @@
/obj/docking_port/stationary
name = "dock"
- area_type = SHUTTLE_DEFAULT_UNDERLYING_AREA
-
var/last_dock_time
var/datum/map_template/shuttle/roundstart_template
@@ -169,6 +181,9 @@
id = "[SSshuttle.stationary.len]"
if(name == "dock")
name = "dock[SSshuttle.stationary.len]"
+ if(!area_type)
+ var/area/place = get_area(src)
+ area_type = place?.type || SHUTTLE_DEFAULT_UNDERLYING_AREA // We might be created in nullspace
if(mapload)
for(var/turf/T in return_turfs())
@@ -183,6 +198,13 @@
SSshuttle.stationary -= src
. = ..()
+/obj/docking_port/stationary/Moved(atom/oldloc, dir, forced)
+ . = ..()
+ if(area_type) // We already have one
+ return
+ var/area/newarea = get_area(src)
+ area_type = newarea?.type
+
/obj/docking_port/stationary/proc/load_roundstart()
if(json_key)
var/sid = SSmapping.config.shuttles[json_key]
@@ -194,10 +216,10 @@
roundstart_template = SSmapping.shuttle_templates[sid]
if(!roundstart_template)
- CRASH("Invalid path ([roundstart_template]) passed to docking port.")
+ CRASH("Invalid path ([sid]/[roundstart_template]) passed to docking port.")
if(roundstart_template)
- SSshuttle.manipulator.action_load(roundstart_template, src)
+ SSshuttle.action_load(roundstart_template, src)
//returns first-found touching shuttleport
/obj/docking_port/stationary/get_docked()
@@ -235,16 +257,25 @@
var/list/shuttle_areas
- var/timer //used as a timer (if you want time left to complete move, use timeLeft proc)
+ ///used as a timer (if you want time left to complete move, use timeLeft proc)
+ var/timer
var/last_timer_length
+ ///current shuttle mode
+ var/mode = SHUTTLE_IDLE
+ ///time spent in transit (deciseconds). Should not be lower then 10 seconds without editing the animation of the hyperspace ripples.
+ var/callTime = 100
+ /// time spent "starting the engines". Also rate limits how often we try to reserve transit space if its ever full of transiting shuttles.
+ var/ignitionTime = 55
+ /// time spent after arrival before being able to begin ignition
+ var/rechargeTime = 0
+ /// time spent after transit 'landing' before actually arriving
+ var/prearrivalTime = 0
- var/mode = SHUTTLE_IDLE //current shuttle mode
- var/callTime = 100 //time spent in transit (deciseconds). Should not be lower then 10 seconds without editing the animation of the hyperspace ripples.
- var/ignitionTime = 55 // time spent "starting the engines". Also rate limits how often we try to reserve transit space if its ever full of transiting shuttles.
-
- // The direction the shuttle prefers to travel in
+ /// The direction the shuttle prefers to travel in, ie what direction
+ /// the animation will cause it to appear to be traveling in
var/preferred_direction = NORTH
- // And the angle from the front of the shuttle to the port
+ /// relative direction of the docking port from the front of the shuttle
+ /// NORTH is towards front, EAST would be starboard side, WEST port, etc.
var/port_direction = NORTH
var/obj/docking_port/stationary/destination
@@ -254,13 +285,16 @@
var/launch_status = NOLAUNCH
- var/list/movement_force = list("KNOCKDOWN" = 3, "THROW" = 2)
+ ///Whether or not you want your ship to knock people down, and also whether it will throw them several tiles upon launching.
+ var/list/movement_force = list("KNOCKDOWN" = 3, "THROW" = 0)
var/list/ripples = list()
- var/engine_coeff = 1 //current engine coeff
- var/current_engines = 0 //current engine power
- var/initial_engines = 0 //initial engine power
- var/can_move_docking_ports = FALSE //if this shuttle can move docking ports other than the one it is docked at
+ var/engine_coeff = 1
+ var/current_engines = 0
+ var/initial_engines = 0
+ var/list/engine_list = list()
+ ///if this shuttle can move docking ports other than the one it is docked at
+ var/can_move_docking_ports = FALSE
var/list/hidden_turfs = list()
/obj/docking_port/mobile/proc/register()
@@ -308,14 +342,12 @@
id = "[id][idnum]"
if(name == initial(name))
name = "[name] [idnum]"
- for(var/i in shuttle_areas)
- var/area/place = i
- for(var/obj/machinery/computer/shuttle/comp in place)
- comp.connect_to_shuttle(src, dock, idnum)
- for(var/obj/machinery/computer/camera_advanced/shuttle_docker/comp in place)
- comp.connect_to_shuttle(src, dock, idnum)
- for(var/obj/machinery/status_display/shuttle/sd in place)
- sd.connect_to_shuttle(src, dock, idnum)
+ for(var/place in shuttle_areas)
+ var/area/area = place
+ area.connect_to_shuttle(src, dock, idnum, FALSE)
+ for(var/each in place)
+ var/atom/atom = each
+ atom.connect_to_shuttle(src, dock, idnum, FALSE)
//this is a hook for custom behaviour. Maybe at some point we could add checks to see if engines are intact
@@ -423,7 +455,10 @@
if(initiate_docking(S1) != DOCKING_SUCCESS)
WARNING("shuttle \"[id]\" could not enter transit space. Docked at [S0 ? S0.id : "null"]. Transit dock [S1 ? S1.id : "null"].")
else
- previous = S0
+ if(S0.delete_after)
+ qdel(S0, TRUE)
+ else
+ previous = S0
else
WARNING("shuttle \"[id]\" could not enter transit space. S0=[S0 ? S0.id : "null"] S1=[S1 ? S1.id : "null"]")
@@ -472,7 +507,7 @@
if(M.mind && !istype(t, /turf/open/floor/plasteel/shuttle/red) && !istype(t, /turf/open/floor/mineral/plastitanium/red/brig))
M.mind.force_escaped = TRUE
// Ghostize them and put them in nullspace stasis (for stat & possession checks)
- M.notransform = TRUE
+ M.mob_transforming = TRUE
M.ghostize(FALSE)
M.moveToNullspace()
@@ -536,7 +571,11 @@
// If we can't dock or we don't have a transit slot, wait for 20 ds,
// then try again
switch(mode)
- if(SHUTTLE_CALL)
+ if(SHUTTLE_CALL, SHUTTLE_PREARRIVAL)
+ if(prearrivalTime && mode != SHUTTLE_PREARRIVAL)
+ mode = SHUTTLE_PREARRIVAL
+ setTimer(prearrivalTime)
+ return
var/error = initiate_docking(destination, preferred_direction)
if(error && error & (DOCKING_NULL_DESTINATION | DOCKING_NULL_SOURCE))
var/msg = "A mobile dock in transit exited initiate_docking() with an error. This is most likely a mapping problem: Error: [error], ([src]) ([previous][ADMIN_JMP(previous)] -> [destination][ADMIN_JMP(destination)])"
@@ -547,6 +586,10 @@
else if(error)
setTimer(20)
return
+ if(rechargeTime)
+ mode = SHUTTLE_RECHARGING
+ setTimer(rechargeTime)
+ return
if(SHUTTLE_RECALL)
if(initiate_docking(previous) != DOCKING_SUCCESS)
setTimer(20)
@@ -649,6 +692,10 @@
return "ESC"
if(SHUTTLE_STRANDED)
return "ERR"
+ if(SHUTTLE_RECHARGING)
+ return "RCH"
+ if(SHUTTLE_PREARRIVAL)
+ return "LDN"
return ""
// returns 5-letter timer string, used by status screens and mob status panel
@@ -667,7 +714,7 @@
/obj/docking_port/mobile/proc/getStatusText()
var/obj/docking_port/stationary/dockedAt = get_docked()
-
+ var/docked_at = dockedAt?.name || "unknown"
if(istype(dockedAt, /obj/docking_port/stationary/transit))
if (timeLeft() > 1 HOURS)
return "hyperspace"
@@ -678,8 +725,10 @@
else
dst = destination
. = "transit towards [dst?.name || "unknown location"] ([getTimerStr()])"
+ else if(mode == SHUTTLE_RECHARGING)
+ return "[docked_at], recharging [getTimerStr()]"
else
- return dockedAt?.name || "unknown"
+ return docked_at
/obj/docking_port/mobile/proc/getDbgStatusText()
@@ -711,19 +760,47 @@
return null
/obj/docking_port/mobile/proc/hyperspace_sound(phase, list/areas)
- var/s
+ var/selected_sound
switch(phase)
if(HYPERSPACE_WARMUP)
- s = 'sound/effects/hyperspace_begin.ogg'
+ selected_sound = "hyperspace_begin"
if(HYPERSPACE_LAUNCH)
- s = 'sound/effects/hyperspace_progress.ogg'
+ selected_sound = "hyperspace_progress"
if(HYPERSPACE_END)
- s = 'sound/effects/hyperspace_end.ogg'
+ selected_sound = "hyperspace_end"
else
CRASH("Invalid hyperspace sound phase: [phase]")
- for(var/A in areas)
- for(var/obj/machinery/door/E in A) //dumb, I know, but playing it on the engines doesn't do it justice
- playsound(E, s, 100, FALSE, max(width, height) - world.view)
+ // This previously was played from each door at max volume, and was one of the worst things I had ever seen.
+ // Now it's instead played from the nearest engine if close, or the first engine in the list if far since it doesn't really matter.
+ // Or a door if for some reason the shuttle has no engine, fuck oh hi daniel fuck it
+ var/range = (engine_coeff * max(width, height))
+ var/long_range = range * 2.5
+ var/atom/distant_source
+ if(LAZYLEN(engine_list))
+ distant_source = engine_list[1]
+ else
+ for(var/A in areas)
+ distant_source = locate(/obj/machinery/door) in A
+ if(distant_source)
+ break
+
+ if(distant_source)
+ for(var/mob/M in SSmobs.clients_by_zlevel[z])
+ var/dist_far = get_dist(M, distant_source)
+ if(dist_far <= long_range && dist_far > range)
+ M.playsound_local(distant_source, "sound/effects/[selected_sound]_distance.ogg", 100, falloff = 20)
+ else if(dist_far <= range)
+ var/source
+ if(engine_list.len == 0)
+ source = distant_source
+ else
+ var/closest_dist = 10000
+ for(var/obj/O in engine_list)
+ var/dist_near = get_dist(M, O)
+ if(dist_near < closest_dist)
+ source = O
+ closest_dist = dist_near
+ M.playsound_local(source, "sound/effects/[selected_sound].ogg", 100, falloff = range / 2)
// Losing all initial engines should get you 2
// Adding another set of engines at 0.5 time
@@ -743,7 +820,12 @@
var/area/shuttle/areaInstance = thing
for(var/obj/structure/shuttle/engine/E in areaInstance.contents)
if(!QDELETED(E))
+ engine_list += E
. += E.engine_power
+ for(var/obj/machinery/shuttle/engine/E in areaInstance.contents)
+ if(!QDELETED(E))
+ engine_list += E
+ . += E.thruster_active ? 1 : 0
// Double initial engines to get to 0.5 minimum
// Lose all initial engines to get to 2
@@ -768,7 +850,7 @@
/obj/docking_port/mobile/proc/in_flight()
switch(mode)
- if(SHUTTLE_CALL,SHUTTLE_RECALL)
+ if(SHUTTLE_CALL,SHUTTLE_RECALL,SHUTTLE_PREARRIVAL)
return TRUE
if(SHUTTLE_IDLE,SHUTTLE_IGNITING)
return FALSE
diff --git a/code/modules/shuttle/shuttle_creation/shuttle_creator.dm b/code/modules/shuttle/shuttle_creation/shuttle_creator.dm
new file mode 100644
index 0000000000..f5a11db60f
--- /dev/null
+++ b/code/modules/shuttle/shuttle_creation/shuttle_creator.dm
@@ -0,0 +1,370 @@
+#define SHUTTLE_CREATOR_MAX_SIZE CONFIG_GET(number/max_shuttle_size)
+#define CUSTOM_SHUTTLE_LIMIT CONFIG_GET(number/max_shuttle_count)
+#define CARDINAL_DIRECTIONS_X list(1, 0, -1, 0)
+#define CARDINAL_DIRECTIONS_Y list(0, 1, 0, -1)
+
+GLOBAL_VAR_INIT(custom_shuttle_count, 0) //The amount of custom shuttles created to prevent creating hundreds
+GLOBAL_LIST_EMPTY(custom_shuttle_machines) //Machines that require updating (Heaters, engines)
+
+//============ Shuttle Creator Object ============
+/obj/item/shuttle_creator
+ name = "Rapid Shuttle Designator"
+ icon = 'icons/obj/tools.dmi'
+ icon_state = "rsd"
+ lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
+ desc = "A device used to define the area required for custom ships. Uses bluespace crystals to create bluespace-capable ships."
+ density = FALSE
+ anchored = FALSE
+ flags_1 = CONDUCT_1
+ item_flags = NOBLUDGEON
+ force = 0
+ throwforce = 8
+ throw_speed = 3
+ throw_range = 5
+ w_class = WEIGHT_CLASS_NORMAL
+ req_access_txt = "11"
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
+ resistance_flags = FIRE_PROOF
+ var/ready = TRUE
+ //pre-designation
+ var/override_max_shuttles = FALSE
+ var/obj/machinery/computer/camera_advanced/shuttle_creator/internal_shuttle_creator
+ //During designation
+ var/overwritten_area = /area/space
+ var/list/loggedTurfs = list()
+ var/loggedOldArea
+ var/recorded_shuttle_area
+ var/datum/shuttle_creator_overlay_holder/overlay_holder
+ //After designation
+ var/linkedShuttleId
+
+/obj/item/shuttle_creator/Initialize()
+ . = ..()
+ internal_shuttle_creator = new()
+ internal_shuttle_creator.owner_rsd = src
+ overlay_holder = new()
+
+/obj/item/shuttle_creator/Destroy()
+ . = ..()
+ if(internal_shuttle_creator)
+ internal_shuttle_creator.owner_rsd = null
+ QDEL_NULL(internal_shuttle_creator)
+ if(overlay_holder)
+ QDEL_NULL(overlay_holder)
+
+/obj/item/shuttle_creator/attack_self(mob/user)
+ ..()
+ if(linkedShuttleId)
+ return
+ if(GLOB.custom_shuttle_count > CUSTOM_SHUTTLE_LIMIT && !override_max_shuttles)
+ to_chat(user, "Too many shuttles have been created.")
+ message_admins("[ADMIN_FLW(user)] attempted to create a shuttle, however [CUSTOM_SHUTTLE_LIMIT] have already been created.")
+ return
+ if(!internal_shuttle_creator)
+ return
+ overlay_holder.add_client(user.client)
+ internal_shuttle_creator.attack_hand(user)
+
+/obj/item/shuttle_creator/afterattack(atom/target, mob/user, proximity_flag)
+ . = ..()
+ if(!ready)
+ to_chat(user, "You need to define a shuttle area first.")
+ return
+ if(!proximity_flag)
+ return
+ if(istype(target, /obj/machinery/computer/custom_shuttle))
+ if(!linkedShuttleId)
+ to_chat(user, "Error, no defined shuttle linked to device")
+ return
+ var/obj/machinery/computer/custom_shuttle/console = target
+ console.linkShuttle(linkedShuttleId)
+ to_chat(user, "Console linked successfully!")
+ return
+ else if(istype(target, /obj/machinery/computer/camera_advanced/shuttle_docker/custom))
+ if(!linkedShuttleId)
+ to_chat(user, "Error, no defined shuttle linked to device")
+ return
+ var/obj/machinery/computer/camera_advanced/shuttle_docker/custom/console = target
+ console.linkShuttle(linkedShuttleId)
+ to_chat(user, "Console linked successfully!")
+ return
+ to_chat(user, "The [src] bleeps. Select an airlock to create a docking port, or a valid machine to link.")
+ return
+
+//=========== shuttle designation actions ============
+/obj/item/shuttle_creator/proc/calculate_bounds(obj/docking_port/mobile/port)
+ if(!port || !istype(port, /obj/docking_port/mobile))
+ return FALSE
+ //Heights is the distance away from the port
+ //width is the distance perpendicular to the port
+ var/minX = INFINITY
+ var/maxX = 0
+ var/minY = INFINITY
+ var/maxY = 0
+ for(var/turf/T in loggedTurfs)
+ minX = min(T.x, minX)
+ maxX = max(T.x, maxX)
+ minY = min(T.y, minY)
+ maxY = max(T.y, maxY)
+ //Make sure shuttle was actually found.
+ if(maxX == INFINITY || maxY == INFINITY)
+ return FALSE
+ minX--
+ minY--
+ var/width = maxX - minX
+ var/height = maxY - minY
+ var/offset_x = port.x - minX
+ var/offset_y = port.y - minY
+ switch(port.dir) //Source: code/datums/shuttles.dm line 77 (14/03/2020) :)
+ if(NORTH)
+ port.width = width
+ port.height = height
+ port.dwidth = offset_x - 1
+ port.dheight = offset_y - 1
+ if(EAST)
+ port.width = height
+ port.height = width
+ port.dwidth = height - offset_y
+ port.dheight = offset_x - 1
+ if(SOUTH)
+ port.width = width
+ port.height = height
+ port.dwidth = width - offset_x
+ port.dheight = height - offset_y
+ if(WEST)
+ port.width = height
+ port.height = width
+ port.dwidth = offset_y - 1
+ port.dheight = width - offset_x
+ return TRUE
+
+//Go through all the all_turfs and check which direction doesn't have the shuttle
+/obj/item/shuttle_creator/proc/getNonShuttleDirection(turf/targetTurf)
+ var/position = null
+ if(!(get_offset_target_turf(targetTurf, 0, 1) in loggedTurfs))
+ if(position != null)
+ return null
+ position = NORTH
+ if(!(get_offset_target_turf(targetTurf, 0, -1) in loggedTurfs))
+ if(position != null)
+ return null
+ position = SOUTH
+ if(!(get_offset_target_turf(targetTurf, 1, 0) in loggedTurfs))
+ if(position != null)
+ return null
+ position = EAST
+ if(!(get_offset_target_turf(targetTurf, -1, 0) in loggedTurfs))
+ if(position != null)
+ return null
+ position = WEST
+ return position
+
+/obj/item/shuttle_creator/proc/invertDir(var/input_dir)
+ if(input_dir == NORTH)
+ return SOUTH
+ else if(input_dir == SOUTH)
+ return NORTH
+ else if(input_dir == EAST)
+ return WEST
+ else if(input_dir == WEST)
+ return EAST
+ return null
+
+/obj/item/shuttle_creator/proc/shuttle_create_docking_port(atom/target, mob/user)
+
+ if(loggedTurfs.len == 0 || !recorded_shuttle_area)
+ to_chat(user, "Invalid shuttle, restarting bluespace systems...")
+ return FALSE
+
+ var/datum/map_template/shuttle/new_shuttle = new /datum/map_template/shuttle()
+
+ var/obj/docking_port/mobile/port = new /obj/docking_port/mobile(get_turf(target))
+ var/obj/docking_port/stationary/stationary_port = new /obj/docking_port/stationary(get_turf(target))
+ port.callTime = 50
+ port.dir = 1 //Point away from space.
+ port.id = "custom_[GLOB.custom_shuttle_count]"
+ linkedShuttleId = port.id
+ port.ignitionTime = 25
+ port.name = "Custom Shuttle"
+ port.port_direction = 2
+ port.preferred_direction = 4
+ port.area_type = recorded_shuttle_area
+
+ stationary_port.area_type = overwritten_area
+
+ var/portDirection = getNonShuttleDirection(get_turf(port))
+ var/invertedDir = invertDir(portDirection)
+ if(!portDirection || !invertedDir)
+ to_chat(usr, "Shuttle creation aborted, docking airlock must be on an external wall. Please select a new airlock.")
+ port.Destroy()
+ stationary_port.Destroy()
+ linkedShuttleId = null
+ return FALSE
+ port.dir = invertedDir
+ port.port_direction = portDirection
+
+ if(!calculate_bounds(port))
+ to_chat(usr, "Bluespace calculations failed, please select a new airlock.")
+ port.Destroy()
+ stationary_port.Destroy()
+ linkedShuttleId = null
+ return FALSE
+
+ port.shuttle_areas = list()
+ //var/list/all_turfs = port.return_ordered_turfs(port.x, port.y, port.z, port.dir)
+ var/list/all_turfs = loggedTurfs
+ for(var/i in 1 to all_turfs.len)
+ var/turf/curT = all_turfs[i]
+ var/area/cur_area = curT.loc
+ //Add the area to the shuttle <3
+ if(istype(cur_area, recorded_shuttle_area))
+ if(istype(curT, /turf/open/space))
+ continue
+ if(length(curT.baseturfs) < 2)
+ continue
+ //Add the shuttle base shit to the shuttle
+ curT.baseturfs.Insert(3, /turf/baseturf_skipover/shuttle)
+ port.shuttle_areas[cur_area] = TRUE
+
+ port.linkup(new_shuttle, stationary_port)
+
+ port.movement_force = list("KNOCKDOWN" = 0, "THROW" = 0)
+ port.initiate_docking(stationary_port)
+
+ port.mode = SHUTTLE_IDLE
+ port.timer = 0
+
+ port.register()
+
+ icon_state = "rsd_used"
+
+ //Clear highlights
+ overlay_holder.clear_highlights()
+ GLOB.custom_shuttle_count ++
+ message_admins("[ADMIN_LOOKUPFLW(user)] created a new shuttle with a [src] at [ADMIN_VERBOSEJMP(user)] ([GLOB.custom_shuttle_count] custom shuttles, limit is [CUSTOM_SHUTTLE_LIMIT])")
+ log_game("[key_name(user)] created a new shuttle with a [src] at [AREACOORD(user)] ([GLOB.custom_shuttle_count] custom shuttles, limit is [CUSTOM_SHUTTLE_LIMIT])")
+ return TRUE
+
+/obj/item/shuttle_creator/proc/create_shuttle_area(mob/user)
+ //Check to see if the user can make a new area to prevent spamming
+ if(user)
+ if(user.create_area_cooldown >= world.time)
+ to_chat(user, "Smoke vents from the [src], maybe you should let it cooldown before using it again.")
+ return FALSE
+ user.create_area_cooldown = world.time + 10
+ if(!loggedTurfs)
+ return FALSE
+ if(!check_area(loggedTurfs, FALSE)) //Makes sure nothing (Shuttles) has moved into the area during creation
+ return FALSE
+ //Create the new area
+ var/area/shuttle/custom/powered/newS
+ var/area/oldA = loggedOldArea
+ var/str = stripped_input(user, "Shuttle Name:", "Blueprint Editing", "", MAX_NAME_LEN)
+ if(!str || !length(str))
+ return FALSE
+ if(length(str) > 50)
+ to_chat(user, "The provided ship name is too long, blares the [src]")
+ return FALSE
+ newS = new /area/shuttle/custom/powered()
+ newS.setup(str)
+ newS.set_dynamic_lighting()
+ //Shuttles always have gravity
+ newS.has_gravity = TRUE
+ newS.requires_power = TRUE
+ //Record the area for use when creating the docking port
+ recorded_shuttle_area = newS
+
+ for(var/i in 1 to loggedTurfs.len)
+ var/turf/turf_holder = loggedTurfs[i]
+ var/area/old_area = turf_holder.loc
+ newS.contents += turf_holder
+ turf_holder.change_area(old_area, newS)
+
+ newS.reg_in_areas_in_z()
+
+ var/list/firedoors = oldA.firedoors
+ for(var/door in firedoors)
+ var/obj/machinery/door/firedoor/FD = door
+ FD.CalculateAffectingAreas()
+ return TRUE
+
+//Checks an area to ensure that the turfs provided are valid to be made into a shuttle
+/obj/item/shuttle_creator/proc/check_area(list/turfs, addingTurfs = TRUE)
+ if(!turfs)
+ to_chat(usr, "Shuttles must be created in an airtight space, ensure that the shuttle is airtight, including corners.")
+ return FALSE
+ if(turfs.len + (addingTurfs ? loggedTurfs.len : 0) > SHUTTLE_CREATOR_MAX_SIZE)
+ to_chat(usr, "The [src]'s internal cooling system wizzes violently and a message appears on the screen, \"Caution, this device can only handle the creation of shuttles up to [SHUTTLE_CREATOR_MAX_SIZE] units in size. Please reduce your shuttle by [turfs.len-SHUTTLE_CREATOR_MAX_SIZE]. Sorry for the inconvinience\"")
+ return FALSE
+ //Check to see if it's a valid shuttle
+ for(var/i in 1 to turfs.len)
+ var/area/place = get_area(turfs[i])
+ //If any of the turfs are on station / not in space, a shuttle cannot be forced there
+ if(!place)
+ to_chat(usr, "You can't seem to overpower the bluespace harmonics in this location, try somewhere else.")
+ return FALSE
+ if(istype(place, /area/space))
+ overwritten_area = /area/space
+ else if(istype(place, /area/lavaland/surface/outdoors))
+ overwritten_area = /area/lavaland/surface/outdoors
+ else
+ to_chat(usr, "Caution, shuttle must not use any material connected to the station. Your shuttle is currenly overlapping with [place.name]")
+ return FALSE
+ //Finally, check to see if the area is actually attached
+ if(!LAZYLEN(loggedTurfs))
+ return TRUE
+ for(var/turf/T in turfs)
+ if(turf_connected_to_saved_turfs(T))
+ return TRUE
+ CHECK_TICK
+ to_chat(usr, "Caution, new areas of the shuttle must be connected to the other areas of the shuttle.")
+ return FALSE
+
+/obj/item/shuttle_creator/proc/turf_connected_to_saved_turfs(turf/T)
+ for(var/i in 1 to 4)
+ var/turf/adjacentT = get_offset_target_turf(T, CARDINAL_DIRECTIONS_X[i], CARDINAL_DIRECTIONS_Y[i])
+ if(adjacentT in loggedTurfs)
+ return TRUE
+ return FALSE
+
+/obj/item/shuttle_creator/proc/turf_in_list(turf/T)
+ return loggedTurfs.Find(T)
+
+/obj/item/shuttle_creator/proc/add_single_turf(turf/T)
+ if(!check_area(list(T)))
+ return FALSE
+ loggedTurfs |= T
+ loggedOldArea = get_area(T)
+ overlay_holder.highlight_turf(T)
+
+/obj/item/shuttle_creator/proc/add_saved_area(mob/user)
+ var/static/area_or_turf_fail_types = typecacheof(list(
+ /turf/open/space,
+ /area/shuttle
+ ))
+ //Detect the turfs connected in the curerrent enclosed area
+ var/list/turfs = detect_room(get_turf(user), area_or_turf_fail_types)
+ if(!check_area(turfs))
+ return FALSE
+ loggedOldArea = get_area(get_turf(user))
+ loggedTurfs |= turfs
+ overlay_holder.highlight_area(turfs)
+ //TODO READD THIS SHIT: icon_state = "rsd_used"
+ to_chat(user, "You add the area into the buffer of the [src], you made add more areas or select an airlock to act as a docking port to complete the shuttle.")
+ return turfs
+
+/obj/item/shuttle_creator/proc/remove_single_turf(turf/T)
+ if(!turf_in_list(T))
+ return
+ loggedTurfs -= T
+ loggedOldArea = get_area(T)
+ overlay_holder.unhighlight_turf(T)
+
+/obj/item/shuttle_creator/proc/reset_saved_area()
+ overlay_holder.clear_highlights()
+ loggedTurfs.Cut()
+ to_chat(usr, "You reset the area buffer on the [src].")
+
+#undef CARDINAL_DIRECTIONS_X
+#undef CARDINAL_DIRECTIONS_Y
diff --git a/code/modules/shuttle/shuttle_creation/shuttle_creator_actions.dm b/code/modules/shuttle/shuttle_creation/shuttle_creator_actions.dm
new file mode 100644
index 0000000000..f50b3bf59f
--- /dev/null
+++ b/code/modules/shuttle/shuttle_creation/shuttle_creator_actions.dm
@@ -0,0 +1,101 @@
+//============ Actions ============
+/datum/action/innate/shuttle_creator
+ icon_icon = 'icons/mob/actions/actions_shuttle.dmi'
+ var/mob/living/C
+ var/mob/camera/aiEye/remote/shuttle_creation/remote_eye
+ var/obj/item/shuttle_creator/shuttle_creator
+
+/datum/action/innate/shuttle_creator/Activate()
+ if(!target)
+ return TRUE
+ C = owner
+ remote_eye = C.remote_control
+ var/obj/machinery/computer/camera_advanced/shuttle_creator/internal_console = target
+ shuttle_creator = internal_console.owner_rsd
+
+//Add an area
+/datum/action/innate/shuttle_creator/designate_area
+ name = "Designate Room"
+ button_icon_state = "designate_area"
+
+/datum/action/innate/shuttle_creator/designate_area/Activate()
+ if(..())
+ return
+ shuttle_creator.add_saved_area(remote_eye)
+
+//Add a single turf
+/datum/action/innate/shuttle_creator/designate_turf
+ name = "Designate Turf"
+ button_icon_state = "designate_turf"
+
+/datum/action/innate/shuttle_creator/designate_turf/Activate()
+ if(..())
+ return
+ var/turf/T = get_turf(remote_eye)
+ if(istype(T, /turf/open/space))
+ var/connectors_exist = FALSE
+ for(var/obj/structure/lattice/lattice in T)
+ connectors_exist = TRUE
+ break
+ if(!connectors_exist)
+ to_chat(usr, "This turf requires support, build some catwalks or lattices.")
+ return
+ if(!shuttle_creator.check_area(list(T)))
+ return
+ if(shuttle_creator.turf_in_list(T))
+ return
+ shuttle_creator.add_single_turf(T)
+
+//Clear a single entire area
+/datum/action/innate/shuttle_creator/clear_turf
+ name = "Clear Turf"
+ button_icon_state = "clear_turf"
+
+/datum/action/innate/shuttle_creator/clear_turf/Activate()
+ if(..())
+ return
+ shuttle_creator.remove_single_turf(get_turf(remote_eye))
+
+//Clear the entire area
+/datum/action/innate/shuttle_creator/reset
+ name = "Reset Buffer"
+ button_icon_state = "clear_area"
+
+/datum/action/innate/shuttle_creator/reset/Activate()
+ if(..())
+ return
+ shuttle_creator.reset_saved_area()
+
+//Finish the shuttle
+/datum/action/innate/shuttle_creator/airlock
+ name = "Select Docking Airlock"
+ button_icon_state = "select_airlock"
+
+/datum/action/innate/shuttle_creator/airlock/Activate()
+ if(..())
+ return
+ var/turf/T = get_turf(remote_eye)
+ for(var/obj/machinery/door/airlock/A in T)
+ if(get_area(A) != shuttle_creator.loggedOldArea)
+ to_chat(C, "Caution, airlock must be on the shuttle to function as a dock.")
+ return
+ if(shuttle_creator.linkedShuttleId)
+ return
+ if(GLOB.custom_shuttle_count > CUSTOM_SHUTTLE_LIMIT)
+ to_chat(C, "Shuttle limit reached, sorry.")
+ return
+ if(shuttle_creator.loggedTurfs.len > SHUTTLE_CREATOR_MAX_SIZE)
+ to_chat(C, "This shuttle is too large!")
+ return
+ if(!shuttle_creator.getNonShuttleDirection(T))
+ to_chat(C, "Docking port must be on an external wall, with only 1 side exposed to space.")
+ return
+ if(!shuttle_creator.create_shuttle_area(C))
+ return
+ if(shuttle_creator.shuttle_create_docking_port(A, C))
+ to_chat(C, "Shuttle created!")
+ //Remove eye control
+ var/obj/machinery/computer/camera_advanced/shuttle_creator/internal_console = target
+ internal_console.remove_eye_control()
+ qdel(internal_console)
+ return
diff --git a/code/modules/shuttle/shuttle_creation/shuttle_creator_console.dm b/code/modules/shuttle/shuttle_creation/shuttle_creator_console.dm
new file mode 100644
index 0000000000..314d5e8b80
--- /dev/null
+++ b/code/modules/shuttle/shuttle_creation/shuttle_creator_console.dm
@@ -0,0 +1,93 @@
+//============The internal camera console used for designating the area=============
+/obj/machinery/computer/camera_advanced/shuttle_creator
+ name = "internal shuttle creator console"
+ desc = "You should not have access to this, please report this as a bug"
+ networks = list()
+ var/obj/item/shuttle_creator/owner_rsd
+ var/datum/action/innate/shuttle_creator/designate_area/area_action = new
+ var/datum/action/innate/shuttle_creator/designate_turf/turf_action = new
+ var/datum/action/innate/shuttle_creator/clear_turf/clear_turf_action = new
+ var/datum/action/innate/shuttle_creator/reset/reset_action = new
+ var/datum/action/innate/shuttle_creator/airlock/airlock_action = new
+
+/obj/machinery/computer/camera_advanced/shuttle_creator/check_eye(mob/user)
+ if(user.eye_blind || user.incapacitated())
+ user.unset_machine()
+
+/obj/machinery/computer/camera_advanced/shuttle_creator/CreateEye()
+ eyeobj = new /mob/camera/aiEye/remote/shuttle_creation(get_turf(owner_rsd))
+ eyeobj.origin = src
+ eyeobj.use_static = USE_STATIC_NONE
+
+/obj/machinery/computer/camera_advanced/shuttle_creator/is_operational()
+ return TRUE
+
+/obj/machinery/computer/camera_advanced/shuttle_creator/can_interact(mob/user)
+ if(!isliving(user))
+ return FALSE
+ var/mob/living/L = user
+ if(L.incapacitated())
+ return FALSE
+ return TRUE
+
+/obj/machinery/computer/camera_advanced/shuttle_creator/GrantActions(mob/living/user)
+ ..(user)
+ eyeobj.invisibility = SEE_INVISIBLE_LIVING
+ if(area_action)
+ area_action.target = src
+ area_action.Grant(user)
+ actions += area_action
+ if(turf_action)
+ turf_action.target = src
+ turf_action.Grant(user)
+ actions += turf_action
+ if(clear_turf_action)
+ clear_turf_action.target = src
+ clear_turf_action.Grant(user)
+ actions += clear_turf_action
+ if(reset_action)
+ reset_action.target = src
+ reset_action.Grant(user)
+ actions += reset_action
+ if(airlock_action)
+ airlock_action.target = src
+ airlock_action.Grant(user)
+ actions += airlock_action
+
+/obj/machinery/computer/camera_advanced/shuttle_creator/remove_eye_control(mob/living/user)
+ . = ..()
+ owner_rsd.overlay_holder.remove_client()
+ eyeobj.invisibility = INVISIBILITY_MAXIMUM
+ if(user?.client)
+ user.client.images -= eyeobj.user_image
+
+/obj/machinery/computer/camera_advanced/shuttle_creator/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+ if(!is_operational()) //you cant use broken machine you chumbis
+ return
+ if(current_user)
+ to_chat(user, "The console is already in use!")
+ return
+ var/mob/living/L = user
+ if(!can_use(user))
+ return
+ if(!eyeobj)
+ CreateEye()
+ if(!eyeobj.eye_initialized)
+ var/camera_location = get_turf(owner_rsd)
+ if(camera_location)
+ eyeobj.eye_initialized = TRUE
+ give_eye_control(L)
+ eyeobj.setLoc(camera_location)
+ var/mob/camera/aiEye/remote/shuttle_creation/shuttle_eye = eyeobj
+ shuttle_eye.source_turf = get_turf(user)
+ else
+ user.unset_machine()
+ else
+ var/camera_location = get_turf(owner_rsd)
+ var/mob/camera/aiEye/remote/shuttle_creation/eye = eyeobj
+ give_eye_control(L)
+ if(camera_location)
+ eye.source_turf = camera_location
+ eyeobj.setLoc(camera_location)
+ else
+ eyeobj.setLoc(eyeobj.loc)
diff --git a/code/modules/shuttle/shuttle_creation/shuttle_creator_eye.dm b/code/modules/shuttle/shuttle_creation/shuttle_creator_eye.dm
new file mode 100644
index 0000000000..ff96e2ae65
--- /dev/null
+++ b/code/modules/shuttle/shuttle_creation/shuttle_creator_eye.dm
@@ -0,0 +1,54 @@
+//===============Camera Eye================
+/mob/camera/aiEye/remote/shuttle_creation
+ name = "shuttle holo-drone"
+ icon = 'icons/obj/mining.dmi'
+ icon_state = "construction_drone"
+ visible_icon = FALSE
+ acceleration = 0
+ var/turf/source_turf
+ var/max_range = 12
+
+/mob/camera/aiEye/remote/shuttle_creation/Initialize()
+ . = ..()
+ setLoc(get_turf(source_turf))
+
+/mob/camera/aiEye/remote/shuttle_creation/update_remote_sight(mob/living/user)
+ user.sight = BLIND|SEE_TURFS
+ user.lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE
+ user.sync_lighting_plane_alpha()
+ return TRUE
+
+/mob/camera/aiEye/remote/shuttle_creation/relaymove(mob/user, direct)
+ dir = direct //This camera eye is visible as a drone, and needs to keep the dir updated
+ var/initial = initial(sprint)
+ var/max_sprint = 50
+
+ if(cooldown && cooldown < world.timeofday) // 3 seconds
+ sprint = initial
+
+ for(var/i = 0; i < max(sprint, initial); i += 20)
+ var/turf/step = get_turf(get_step(src, direct))
+ if(step && can_move_to(step))
+ setLoc(step)
+
+ cooldown = world.timeofday + 5
+ if(acceleration)
+ sprint = min(sprint + 0.5, max_sprint)
+ else
+ sprint = initial
+
+/mob/camera/aiEye/remote/shuttle_creation/proc/can_move_to(var/turf/T)
+ var/origin_x = source_turf.x
+ var/origin_y = source_turf.y
+ var/change_X = abs(origin_x - T.x)
+ var/change_Y = abs(origin_y - T.y)
+ return (change_X < max_range && change_Y < max_range)
+
+/mob/camera/aiEye/remote/shuttle_creation/setLoc(T)
+ ..()
+ if(eye_user?.client)
+ eye_user.client.images -= user_image
+ var/image/I = image(icon, loc, icon_state, FLY_LAYER, dir)
+ I.plane = MASSIVE_OBJ_LAYER
+ user_image = I
+ eye_user.client.images += user_image
diff --git a/code/modules/shuttle/shuttle_creation/shuttle_creator_overlay.dm b/code/modules/shuttle/shuttle_creation/shuttle_creator_overlay.dm
new file mode 100644
index 0000000000..83c03ed33c
--- /dev/null
+++ b/code/modules/shuttle/shuttle_creation/shuttle_creator_overlay.dm
@@ -0,0 +1,53 @@
+/*
+ * Manages the overlays for the shuttle creator drone.
+*/
+
+/datum/shuttle_creator_overlay_holder
+ var/client/holder
+ var/list/images = list()
+ var/list/turfs = list()
+
+/datum/shuttle_creator_overlay_holder/proc/add_client(client/C)
+ holder = C
+ holder.images += images
+
+/datum/shuttle_creator_overlay_holder/proc/remove_client()
+ if(holder)
+ holder.images -= images
+ holder = null
+
+/datum/shuttle_creator_overlay_holder/proc/clear_highlights()
+ if(holder)
+ holder.images -= images
+ images.Cut()
+ turfs.Cut()
+
+/datum/shuttle_creator_overlay_holder/proc/create_hightlight(turf/T)
+ if(T in turfs)
+ return
+ var/image/I = image('icons/turf/overlays.dmi', T, "greenOverlay")
+ I.plane = ABOVE_LIGHTING_PLANE
+ images += I
+ holder.images += I
+ turfs += T
+
+/datum/shuttle_creator_overlay_holder/proc/remove_hightlight(turf/T)
+ if(!(T in turfs))
+ return
+ turfs -= T
+ holder.images -= images
+ for(var/image/I in images)
+ if(get_turf(I) != T)
+ continue
+ images -= I
+ holder.images += images
+
+/datum/shuttle_creator_overlay_holder/proc/highlight_area(list/turfs)
+ for(var/turf/T in turfs)
+ highlight_turf(T)
+
+/datum/shuttle_creator_overlay_holder/proc/highlight_turf(turf/T)
+ create_hightlight(T)
+
+/datum/shuttle_creator_overlay_holder/proc/unhighlight_turf(turf/T)
+ remove_hightlight(T)
diff --git a/code/modules/shuttle/shuttle_creation/shuttle_upgrades.dm b/code/modules/shuttle/shuttle_creation/shuttle_upgrades.dm
new file mode 100644
index 0000000000..6b67eec5b8
--- /dev/null
+++ b/code/modules/shuttle/shuttle_creation/shuttle_upgrades.dm
@@ -0,0 +1,39 @@
+/obj/item/shuttle_route_optimisation
+ name = "Route Optimisation Upgrade"
+ desc = "Used on a custom shuttle control console to calculate more efficient routes."
+ icon = 'icons/obj/module.dmi'
+ icon_state = "shuttledisk"
+ force = 0
+ throwforce = 0
+ throw_speed = 1
+ throw_range = 7
+ density = FALSE
+ anchored = FALSE
+ item_flags = NOBLUDGEON
+ var/upgrade_amount = 0.8
+
+/obj/item/shuttle_route_optimisation/hyperlane
+ name = "Bluespace Hyperlane Calculator"
+ desc = "Used on a custom shuttle control console to allow for the following of bluespace hyperlanes, increasing the efficiency of the shuttle."
+ icon_state = "shuttledisk_better"
+ upgrade_amount = 0.6
+
+/obj/item/shuttle_route_optimisation/void
+ name = "Voidspace Route Calculator"
+ desc = "Used on a custom shuttle control console to allow it to navigate into voidspace, making the routes almost instant."
+ icon_state = "shuttledisk_void"
+ upgrade_amount = 0.2
+
+/obj/item/shuttle_route_optimisation/attack_obj(obj/O, mob/living/user)
+ . = ..()
+ if(!istype(O, /obj/machinery/computer))
+ return
+ if(!istype(O, /obj/machinery/computer/custom_shuttle))
+ to_chat(user, "This upgrade only works on a custom shuttle flight console.")
+ return
+ if (!user.transferItemToLoc(src, get_turf(O)))
+ return
+ var/obj/machinery/computer/custom_shuttle/link_comp = O
+ link_comp.distance_multiplier = clamp(link_comp.distance_multiplier, 0, upgrade_amount)
+ playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0)
+ to_chat(usr, "You insert the disk into the flight computer, allowing for routes to be [upgrade_amount]x the original distance.")
diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm
index a4ef2dfde9..7af0315934 100644
--- a/code/modules/shuttle/supply.dm
+++ b/code/modules/shuttle/supply.dm
@@ -101,6 +101,10 @@ GLOBAL_LIST_INIT(cargo_shuttle_leave_behind_typecache, typecacheof(list(
if(!SSshuttle.shoppinglist.len)
return
+ var/list/obj/miscboxes = list() //miscboxes are combo boxes that contain all goody orders grouped
+ var/list/misc_order_num = list() //list of strings of order numbers, so that the manifest can show all orders in a box
+ var/list/misc_contents = list() //list of lists of items that each box will contain
+
var/list/empty_turfs = list()
for(var/place in shuttle_areas)
var/area/shuttle/shuttle_area = place
@@ -117,10 +121,13 @@ GLOBAL_LIST_INIT(cargo_shuttle_leave_behind_typecache, typecacheof(list(
break
var/price = SO.pack.cost
+ if(SO.applied_coupon)
+ price *= (1 - SO.applied_coupon.discount_pct_off)
var/datum/bank_account/D
if(SO.paying_account) //Someone paid out of pocket
D = SO.paying_account
- price *= 1.1 //TODO make this customizable by the quartermaster
+ if(!SO.pack.goody)
+ price *= 1.1 //TODO make this customizable by the quartermaster
else
D = cargo_budget
if(D)
@@ -136,14 +143,46 @@ GLOBAL_LIST_INIT(cargo_shuttle_leave_behind_typecache, typecacheof(list(
value += SO.pack.cost
SSshuttle.shoppinglist -= SO
SSshuttle.orderhistory += SO
+ QDEL_NULL(SO.applied_coupon)
+
+ if(SO.pack.goody) //goody means it gets piled in the miscbox
+ if(SO.paying_account)
+ if(!miscboxes.len || !miscboxes[D.account_holder]) //if there's no miscbox for this person
+ miscboxes[D.account_holder] = new /obj/item/storage/lockbox/order(pick_n_take(empty_turfs))
+ var/obj/item/storage/lockbox/order/our_box = miscboxes[D.account_holder]
+ our_box.buyer_account = SO.paying_account
+ miscboxes[D.account_holder].name = "small items case - purchased by [D.account_holder]"
+ misc_contents[D.account_holder] = list()
+ for (var/item in SO.pack.contains)
+ misc_contents[D.account_holder] += item
+ misc_order_num[D.account_holder] = "[misc_order_num[D.account_holder]]#[SO.id] "
+ else //No private payment, so we just stuff it all into a generic crate
+ if(!miscboxes.len || !miscboxes["Cargo"])
+ miscboxes["Cargo"] = new /obj/structure/closet/secure_closet/goodies(pick_n_take(empty_turfs))
+ miscboxes["Cargo"].name = "small items closet"
+ misc_contents["Cargo"] = list()
+ miscboxes["Cargo"].req_access = list()
+ for (var/item in SO.pack.contains)
+ misc_contents["Cargo"] += item
+ //new item(miscboxes["Cargo"])
+ if(SO.pack.access)
+ miscboxes["Cargo"].req_access += SO.pack.access
+ misc_order_num["Cargo"] = "[misc_order_num["Cargo"]]#[SO.id] "
+ else
+ SO.generate(pick_n_take(empty_turfs))
- SO.generate(pick_n_take(empty_turfs))
SSblackbox.record_feedback("nested tally", "cargo_imports", 1, list("[SO.pack.cost]", "[SO.pack.name]"))
investigate_log("Order #[SO.id] ([SO.pack.name], placed by [key_name(SO.orderer_ckey)]), paid by [D.account_holder] has shipped.", INVESTIGATE_CARGO)
if(SO.pack.dangerous)
message_admins("\A [SO.pack.name] ordered by [ADMIN_LOOKUPFLW(SO.orderer_ckey)], paid by [D.account_holder] has shipped.")
purchases++
+ for(var/I in miscboxes)
+ var/datum/supply_order/SO = new/datum/supply_order()
+ SO.id = misc_order_num[I]
+ SO.generateCombo(miscboxes[I], I, misc_contents[I])
+ qdel(SO)
+
investigate_log("[purchases] orders in this shipment, worth [value] credits. [cargo_budget.account_balance] credits left.", INVESTIGATE_CARGO)
/obj/docking_port/mobile/supply/proc/sell()
diff --git a/code/modules/shuttle/syndicate.dm b/code/modules/shuttle/syndicate.dm
index 440e6cb03b..0076f584e9 100644
--- a/code/modules/shuttle/syndicate.dm
+++ b/code/modules/shuttle/syndicate.dm
@@ -1,4 +1,4 @@
-#define SYNDICATE_CHALLENGE_TIMER 12000 //20 minutes
+#define SYNDICATE_CHALLENGE_TIMER 9000 // 15 minutes
/obj/machinery/computer/shuttle/syndicate
name = "syndicate shuttle terminal"
@@ -21,8 +21,8 @@
/obj/machinery/computer/shuttle/syndicate/Topic(href, href_list)
if(href_list["move"])
var/obj/item/circuitboard/computer/syndicate_shuttle/board = circuit
- if(board.challenge && world.time < SYNDICATE_CHALLENGE_TIMER)
- to_chat(usr, "You've issued a combat challenge to the station! You've got to give them at least [DisplayTimeText(SYNDICATE_CHALLENGE_TIMER - world.time)] more to allow them to prepare.")
+ if(board.challenge && ((world.time - SSticker.round_start_time) < SYNDICATE_CHALLENGE_TIMER))
+ to_chat(usr, "You've issued a combat challenge to the station! You've got to give them at least [DisplayTimeText(SYNDICATE_CHALLENGE_TIMER - (world.time - SSticker.round_start_time))] more to allow them to prepare.")
return 0
board.moved = TRUE
..()
diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm
index 143fe508b6..57502e2cd5 100644
--- a/code/modules/spells/spell.dm
+++ b/code/modules/spells/spell.dm
@@ -56,11 +56,6 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th
to_chat(caller, "[caller.ranged_ability.name] has been disabled.")
caller.ranged_ability.remove_ranged_ability()
return TRUE //TRUE for failed, FALSE for passed.
- if(ranged_clickcd_override >= 0)
- ranged_ability_user.next_click = world.time + ranged_clickcd_override
- else
- ranged_ability_user.next_click = world.time + CLICK_CD_CLICK_ABILITY
- ranged_ability_user.face_atom(A)
return FALSE
/obj/effect/proc_holder/proc/add_ranged_ability(mob/living/user, msg, forced)
@@ -120,7 +115,7 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th
var/list/mobs_blacklist //The opposite of the above.
var/stat_allowed = 0 //see if it requires being conscious/alive, need to set to 1 for ghostpells
var/phase_allowed = 0 // If true, the spell can be cast while phased, eg. blood crawling, ethereal jaunting
- var/antimagic_allowed = TRUE // If false, the spell cannot be cast while under the effect of antimagic
+ var/antimagic_allowed = FALSE // If false, the spell cannot be cast while under the effect of antimagic
var/invocation = "HURP DURP" //what is uttered when the wizard casts the spell
var/invocation_emote_self = null
var/invocation_type = "none" //can be none, whisper, emote and shout
diff --git a/code/modules/spells/spell_types/bloodcrawl.dm b/code/modules/spells/spell_types/bloodcrawl.dm
index e59fc2049d..39b0f1709e 100644
--- a/code/modules/spells/spell_types/bloodcrawl.dm
+++ b/code/modules/spells/spell_types/bloodcrawl.dm
@@ -25,6 +25,11 @@
/obj/effect/proc_holder/spell/bloodcrawl/perform(obj/effect/decal/cleanable/target, recharge = 1, mob/living/user = usr)
if(istype(user))
+ if(istype(user, /mob/living/simple_animal/slaughter))
+ var/mob/living/simple_animal/slaughter/slaught = user
+ slaught.current_hitstreak = 0
+ slaught.wound_bonus = initial(slaught.wound_bonus)
+ slaught.bare_wound_bonus = initial(slaught.bare_wound_bonus)
if(phased)
if(user.phasein(target))
phased = 0
diff --git a/code/modules/spells/spell_types/curse.dm b/code/modules/spells/spell_types/curse.dm
new file mode 100644
index 0000000000..9449e4a5d0
--- /dev/null
+++ b/code/modules/spells/spell_types/curse.dm
@@ -0,0 +1,37 @@
+GLOBAL_VAR_INIT(curse_of_madness_triggered, FALSE)
+
+/proc/curse_of_madness(mob/user, message)
+ if(user) //in this case either someone holding a spellbook or a badmin
+ to_chat(user, "You sent a curse of madness with the message \"[message]\"!")
+ message_admins("[ADMIN_LOOKUPFLW(user)] sent a curse of madness with the message \"[message]\"!")
+ log_game("[key_name(user)] sent a curse of madness with the message \"[message]\"!")
+
+ GLOB.curse_of_madness_triggered = message // So latejoiners are also afflicted.
+
+ deadchat_broadcast("A Curse of Madness has stricken the station, shattering their minds with the awful secret: \"[message]\"")
+
+ for(var/mob/living/carbon/human/H in GLOB.player_list)
+ if(H.stat == DEAD)
+ continue
+ var/turf/T = get_turf(H)
+ if(T && !is_station_level(T.z))
+ continue
+ if(H.anti_magic_check(TRUE, FALSE, TRUE))
+ to_chat(H, "You have a strange feeling for a moment, but then it passes.")
+ continue
+ give_madness(H, message)
+
+/proc/give_madness(mob/living/carbon/human/H, message)
+ H.playsound_local(H,'sound/magic/curse.ogg',40,1)
+ to_chat(H, "[message]")
+ to_chat(H, "Your mind shatters!")
+ switch(rand(1,10))
+ if(1 to 3)
+ H.gain_trauma_type(BRAIN_TRAUMA_MILD, TRAUMA_RESILIENCE_LOBOTOMY)
+ H.gain_trauma_type(BRAIN_TRAUMA_MILD, TRAUMA_RESILIENCE_LOBOTOMY)
+ if(4 to 6)
+ H.gain_trauma_type(BRAIN_TRAUMA_SEVERE, TRAUMA_RESILIENCE_LOBOTOMY)
+ if(7 to 8)
+ H.gain_trauma_type(BRAIN_TRAUMA_MAGIC, TRAUMA_RESILIENCE_LOBOTOMY)
+ if(9 to 10)
+ H.gain_trauma_type(BRAIN_TRAUMA_SPECIAL, TRAUMA_RESILIENCE_LOBOTOMY)
diff --git a/code/modules/spells/spell_types/devil.dm b/code/modules/spells/spell_types/devil.dm
index 34b033fd17..3b76107905 100644
--- a/code/modules/spells/spell_types/devil.dm
+++ b/code/modules/spells/spell_types/devil.dm
@@ -5,7 +5,7 @@
include_user = 1
range = -1
clothes_req = NONE
- item_type = /obj/item/twohanded/pitchfork/demonic
+ item_type = /obj/item/pitchfork/demonic
school = "conjuration"
charge_max = 150
@@ -15,10 +15,10 @@
action_background_icon_state = "bg_demon"
/obj/effect/proc_holder/spell/targeted/conjure_item/summon_pitchfork/greater
- item_type = /obj/item/twohanded/pitchfork/demonic/greater
+ item_type = /obj/item/pitchfork/demonic/greater
/obj/effect/proc_holder/spell/targeted/conjure_item/summon_pitchfork/ascended
- item_type = /obj/item/twohanded/pitchfork/demonic/ascended
+ item_type = /obj/item/pitchfork/demonic/ascended
/obj/effect/proc_holder/spell/targeted/conjure_item/violin
item_type = /obj/item/instrument/violin/golden
@@ -118,14 +118,14 @@
revert_cast()
return ..()
else
- user.notransform = TRUE
+ user.mob_transforming = TRUE
user.fakefire()
to_chat(src, "You begin to phase back into sinful flames.")
if(do_mob(user,user,150))
user.infernalphaseout()
else
to_chat(user, "You must remain still while exiting.")
- user.notransform = FALSE
+ user.mob_transforming = FALSE
user.fakefireextinguish()
start_recharge()
return
@@ -149,11 +149,11 @@
ExtinguishMob()
forceMove(holder)
holder = holder
- notransform = 0
+ mob_transforming = 0
fakefireextinguish()
/mob/living/proc/infernalphasein()
- if(notransform)
+ if(mob_transforming)
to_chat(src, "You're too busy to jaunt in.")
return FALSE
fakefire()
diff --git a/code/modules/spells/spell_types/ethereal_jaunt.dm b/code/modules/spells/spell_types/ethereal_jaunt.dm
index f485ae578f..8cf51d45c6 100644
--- a/code/modules/spells/spell_types/ethereal_jaunt.dm
+++ b/code/modules/spells/spell_types/ethereal_jaunt.dm
@@ -22,14 +22,14 @@
INVOKE_ASYNC(src, .proc/do_jaunt, target)
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/proc/do_jaunt(mob/living/target)
- target.notransform = 1
+ target.mob_transforming = 1
var/turf/mobloc = get_turf(target)
var/obj/effect/dummy/phased_mob/spell_jaunt/holder = new /obj/effect/dummy/phased_mob/spell_jaunt(mobloc)
new jaunt_out_type(mobloc, target.dir)
target.ExtinguishMob()
target.forceMove(holder)
target.reset_perspective(holder)
- target.notransform=0 //mob is safely inside holder now, no need for protection.
+ target.mob_transforming=0 //mob is safely inside holder now, no need for protection.
jaunt_steam(mobloc)
sleep(jaunt_duration)
@@ -102,4 +102,4 @@
return
/obj/effect/dummy/phased_mob/spell_jaunt/bullet_act(blah)
- return BULLET_ACT_FORCE_PIERCE
\ No newline at end of file
+ return BULLET_ACT_FORCE_PIERCE
diff --git a/code/modules/spells/spell_types/lichdom.dm b/code/modules/spells/spell_types/lichdom.dm
index f6f56c049a..11518b236f 100644
--- a/code/modules/spells/spell_types/lichdom.dm
+++ b/code/modules/spells/spell_types/lichdom.dm
@@ -132,7 +132,7 @@
lich.real_name = mind.name
mind.transfer_to(lich)
mind.grab_ghost(force=TRUE)
- lich.hardset_dna(null,null,lich.real_name,null, new /datum/species/skeleton/space)
+ lich.hardset_dna(null,null,null,lich.real_name,null, new /datum/species/skeleton)
to_chat(lich, "Your bones clatter and shudder as you are pulled back into this world!")
var/turf/body_turf = get_turf(old_body)
lich.DefaultCombatKnockdown(200 + 200*resurrections)
diff --git a/code/modules/spells/spell_types/mime.dm b/code/modules/spells/spell_types/mime.dm
index 8f39da5031..26a6b57b25 100644
--- a/code/modules/spells/spell_types/mime.dm
+++ b/code/modules/spells/spell_types/mime.dm
@@ -12,6 +12,7 @@
range = 0
cast_sound = null
mobs_whitelist = list(/mob/living/carbon/human)
+ antimagic_allowed = TRUE
action_icon_state = "mime"
action_background_icon_state = "bg_mime"
@@ -40,6 +41,7 @@
action_icon_state = "mime"
action_background_icon_state = "bg_mime"
+ antimagic_allowed = TRUE
/obj/effect/proc_holder/spell/targeted/mime/speak/Trigger(mob/user, skip_can_cast = TRUE)
if(user.mind?.miming)
@@ -76,6 +78,7 @@
action_icon_state = "mime"
action_background_icon_state = "bg_mime"
+ antimagic_allowed = TRUE
/obj/effect/proc_holder/spell/targeted/forcewall/mime/Trigger(mob/user, skip_can_cast = TRUE)
if(user.mind)
@@ -107,6 +110,7 @@
action_icon_state = "mime"
action_background_icon_state = "bg_mime"
base_icon_state = "mime"
+ antimagic_allowed = TRUE
/obj/effect/proc_holder/spell/aimed/finger_guns/Trigger(mob/user, skip_can_cast = TRUE)
@@ -137,6 +141,7 @@
action_icon_state = "mime"
action_background_icon_state = "bg_mime"
hand_path = /obj/item/melee/touch_attack/mimerope
+ antimagic_allowed = TRUE
/obj/effect/proc_holder/spell/targeted/touch/mimerope/Trigger(mob/user, skip_can_cast = TRUE)
if(user.mind)
diff --git a/code/modules/spells/spell_types/rod_form.dm b/code/modules/spells/spell_types/rod_form.dm
index 7a96d0ac55..6b974608d6 100644
--- a/code/modules/spells/spell_types/rod_form.dm
+++ b/code/modules/spells/spell_types/rod_form.dm
@@ -18,7 +18,7 @@
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
+ M.mob_transforming = 1
M.status_flags |= GODMODE
//Wizard Version of the Immovable Rod
@@ -37,7 +37,7 @@
/obj/effect/immovablerod/wizard/Destroy()
if(wizard)
wizard.status_flags &= ~GODMODE
- wizard.notransform = 0
+ wizard.mob_transforming = 0
wizard.forceMove(get_turf(src))
return ..()
diff --git a/code/modules/spells/spell_types/santa.dm b/code/modules/spells/spell_types/santa.dm
index 64ed925455..4f6957433b 100644
--- a/code/modules/spells/spell_types/santa.dm
+++ b/code/modules/spells/spell_types/santa.dm
@@ -13,3 +13,4 @@
summon_type = list("/obj/item/a_gift")
summon_lifespan = 0
summon_amt = 5
+ antimagic_allowed = TRUE
diff --git a/code/modules/spells/spell_types/shadow_walk.dm b/code/modules/spells/spell_types/shadow_walk.dm
index 83996b5bfb..1dd949caa0 100644
--- a/code/modules/spells/spell_types/shadow_walk.dm
+++ b/code/modules/spells/spell_types/shadow_walk.dm
@@ -12,6 +12,7 @@
action_icon = 'icons/mob/actions/actions_minor_antag.dmi'
action_icon_state = "ninja_cloak"
action_background_icon_state = "bg_alien"
+ antimagic_allowed = TRUE
/obj/effect/proc_holder/spell/targeted/shadowwalk/cast(list/targets,mob/living/user = usr)
var/L = user.loc
diff --git a/code/modules/spells/spell_types/shapeshift.dm b/code/modules/spells/spell_types/shapeshift.dm
index c6966ccee9..e513865246 100644
--- a/code/modules/spells/spell_types/shapeshift.dm
+++ b/code/modules/spells/spell_types/shapeshift.dm
@@ -100,12 +100,12 @@
if(stored.mind)
stored.mind.transfer_to(shape)
stored.forceMove(src)
- stored.notransform = TRUE
+ stored.mob_transforming = TRUE
if(source.convert_damage)
var/damage_percent = (stored.maxHealth - stored.health)/stored.maxHealth;
var/damapply = damage_percent * shape.maxHealth;
- shape.apply_damage(damapply, source.convert_damage_type, forced = TRUE);
+ shape.apply_damage(damapply, source.convert_damage_type, forced = TRUE, wound_bonus=CANT_WOUND);
slink = soullink(/datum/soullink/shapeshift, stored , shape)
slink.source = src
@@ -148,7 +148,7 @@
restoring = TRUE
qdel(slink)
stored.forceMove(get_turf(src))
- stored.notransform = FALSE
+ stored.mob_transforming = FALSE
if(shape.mind)
shape.mind.transfer_to(stored)
if(death)
@@ -158,7 +158,7 @@
var/damage_percent = (shape.maxHealth - shape.health)/shape.maxHealth;
var/damapply = stored.maxHealth * damage_percent
- stored.apply_damage(damapply, source.convert_damage_type, forced = TRUE)
+ stored.apply_damage(damapply, source.convert_damage_type, forced = TRUE, wound_bonus=CANT_WOUND)
qdel(shape)
qdel(src)
diff --git a/code/modules/spells/spell_types/spacetime_distortion.dm b/code/modules/spells/spell_types/spacetime_distortion.dm
index 3af4d3883f..5797cbf8b7 100644
--- a/code/modules/spells/spell_types/spacetime_distortion.dm
+++ b/code/modules/spells/spell_types/spacetime_distortion.dm
@@ -110,8 +110,7 @@
else
walk_link(user)
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/effect/cross_action/spacetime_dist/attack_hand(mob/user)
+/obj/effect/cross_action/spacetime_dist/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
walk_link(user)
/obj/effect/cross_action/spacetime_dist/attack_paw(mob/user)
diff --git a/code/modules/spells/spell_types/summonitem.dm b/code/modules/spells/spell_types/summonitem.dm
index 94de75faac..2f3ed64655 100644
--- a/code/modules/spells/spell_types/summonitem.dm
+++ b/code/modules/spells/spell_types/summonitem.dm
@@ -76,20 +76,6 @@
break
M.dropItemToGround(item_to_retrieve)
- if(iscarbon(M)) //Edge case housekeeping
- var/mob/living/carbon/C = M
- if(C.stomach_contents && (item_to_retrieve in C.stomach_contents))
- C.stomach_contents -= item_to_retrieve
- for(var/X in C.bodyparts)
- var/obj/item/bodypart/part = X
- if(item_to_retrieve in part.embedded_objects)
- part.embedded_objects -= item_to_retrieve
- to_chat(C, "The [item_to_retrieve] that was embedded in your [L] has mysteriously vanished. How fortunate!")
- if(!C.has_embedded_objects())
- C.clear_alert("embeddedobject")
- SEND_SIGNAL(C, COMSIG_CLEAR_MOOD_EVENT, "embedded")
- break
-
else
if(istype(item_to_retrieve.loc, /obj/machinery/portable_atmospherics/)) //Edge cases for moved machinery
var/obj/machinery/portable_atmospherics/P = item_to_retrieve.loc
diff --git a/code/modules/spells/spell_types/taeclowndo.dm b/code/modules/spells/spell_types/taeclowndo.dm
index 5b1e09565b..59826daf07 100644
--- a/code/modules/spells/spell_types/taeclowndo.dm
+++ b/code/modules/spells/spell_types/taeclowndo.dm
@@ -10,6 +10,7 @@
cooldown_min = 30
action_icon = 'icons/obj/food/piecake.dmi'
action_icon_state = "pie"
+ antimagic_allowed = TRUE
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -24,6 +25,7 @@
range = 7
selection_type = "view"
projectile_type = null
+ antimagic_allowed = TRUE
active_msg = "You focus, your mind reaching to the clown dimension, ready to make a peel matrialize wherever you want!"
deactive_msg = "You relax, the peel remaining right in the \"thin air\" it would appear out of."
@@ -62,6 +64,7 @@
charge_max = 100
clothes_req = NONE
cooldown_min = 100
+ antimagic_allowed = TRUE
action_icon = 'icons/mecha/mecha_equipment.dmi'
action_icon_state = "mecha_honker"
@@ -76,6 +79,7 @@
charge_max = 450
clothes_req = NONE
cooldown_min = 450
+ antimagic_allowed = TRUE
action_icon = 'icons/obj/food/piecake.dmi'
action_icon_state = "frostypie"
diff --git a/code/modules/spells/spell_types/telepathy.dm b/code/modules/spells/spell_types/telepathy.dm
index 4b4f91eb18..caf9ec79c6 100644
--- a/code/modules/spells/spell_types/telepathy.dm
+++ b/code/modules/spells/spell_types/telepathy.dm
@@ -8,6 +8,7 @@
action_icon = 'icons/mob/actions/actions_revenant.dmi'
action_icon_state = "r_transmit"
action_background_icon_state = "bg_spell"
+ antimagic_allowed = TRUE
var/notice = "notice"
var/boldnotice = "boldnotice"
var/magic_check = FALSE
diff --git a/code/modules/spells/spell_types/voice_of_god.dm b/code/modules/spells/spell_types/voice_of_god.dm
index 495681a818..a920344adc 100644
--- a/code/modules/spells/spell_types/voice_of_god.dm
+++ b/code/modules/spells/spell_types/voice_of_god.dm
@@ -5,6 +5,7 @@
cooldown_min = 0
level_max = 1
clothes_req = NONE
+ antimagic_allowed = TRUE
action_icon = 'icons/mob/actions/actions_items.dmi'
action_icon_state = "voice_of_god"
var/command
diff --git a/code/modules/spells/spell_types/wizard.dm b/code/modules/spells/spell_types/wizard.dm
index e9432e2f58..13c47ab9ac 100644
--- a/code/modules/spells/spell_types/wizard.dm
+++ b/code/modules/spells/spell_types/wizard.dm
@@ -306,6 +306,7 @@
sound = 'sound/magic/tail_swing.ogg'
charge_max = 150
clothes_req = NONE
+ antimagic_allowed = TRUE
range = 2
cooldown_min = 150
invocation_type = "none"
@@ -370,7 +371,7 @@
if(isliving(hit_atom))
var/mob/living/M = hit_atom
if(!M.anti_magic_check())
- M.electrocute_act(80, src, SHOCK_ILLUSION)
+ M.electrocute_act(80, src, null, SHOCK_ILLUSION)
qdel(src)
/obj/item/spellpacket/lightningbolt/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback)
diff --git a/code/modules/station_goals/bsa.dm b/code/modules/station_goals/bsa.dm
index 183462a8f7..2ca0e65477 100644
--- a/code/modules/station_goals/bsa.dm
+++ b/code/modules/station_goals/bsa.dm
@@ -223,7 +223,7 @@
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.physical_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
- ui = new(user, src, ui_key, "bsa", name, 400, 220, master_ui, state)
+ ui = new(user, src, ui_key, "BluespaceArtillery", name, ui_x, ui_y, master_ui, state)
ui.open()
/obj/machinery/computer/bsa_control/ui_data()
diff --git a/code/modules/station_goals/dna_vault.dm b/code/modules/station_goals/dna_vault.dm
index 6c21456e63..6d8ab9cc7f 100644
--- a/code/modules/station_goals/dna_vault.dm
+++ b/code/modules/station_goals/dna_vault.dm
@@ -178,7 +178,7 @@
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
roll_powers(user)
- ui = new(user, src, ui_key, "dna_vault", name, 350, 400, master_ui, state)
+ ui = new(user, src, ui_key, "DnaVault", name, ui_x, ui_y, master_ui, state)
ui.open()
@@ -279,5 +279,5 @@
H.add_movespeed_modifier(/datum/movespeed_modifier/dna_vault_speedup)
if(VAULT_QUICK)
to_chat(H, "Your arms move as fast as lightning.")
- H.next_move_modifier = 0.5
+ H.action_cooldown_mod = 0.5
power_lottery[H] = list()
diff --git a/code/modules/station_goals/shield.dm b/code/modules/station_goals/shield.dm
index cf0d79c742..299fda4a26 100644
--- a/code/modules/station_goals/shield.dm
+++ b/code/modules/station_goals/shield.dm
@@ -45,7 +45,7 @@
/obj/machinery/computer/sat_control/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
- ui = new(user, src, ui_key, "sat_control", name, 400, 305, master_ui, state)
+ ui = new(user, src, ui_key, "SatelliteControl", name, ui_x, ui_y, master_ui, state)
ui.open()
/obj/machinery/computer/sat_control/ui_act(action, params)
diff --git a/code/modules/surgery/advanced/revival.dm b/code/modules/surgery/advanced/revival.dm
index cf3a218d80..c61ee330e6 100644
--- a/code/modules/surgery/advanced/revival.dm
+++ b/code/modules/surgery/advanced/revival.dm
@@ -25,12 +25,12 @@
return TRUE
/datum/surgery_step/revive
name = "electrically stimulate brain"
- implements = list(/obj/item/twohanded/shockpaddles = 100, /obj/item/abductor/gizmo = 100, /obj/item/melee/baton = 75, /obj/item/organ/cyberimp/arm/baton = 75, /obj/item/organ/cyberimp/arm/gun/taser = 60, /obj/item/gun/energy/e_gun/advtaser = 60, /obj/item/gun/energy/taser = 60)
+ implements = list(/obj/item/shockpaddles = 100, /obj/item/abductor/gizmo = 100, /obj/item/melee/baton = 75, /obj/item/organ/cyberimp/arm/baton = 75, /obj/item/organ/cyberimp/arm/gun/taser = 60, /obj/item/gun/energy/e_gun/advtaser = 60, /obj/item/gun/energy/taser = 60)
time = 120
/datum/surgery_step/revive/tool_check(mob/user, obj/item/tool)
. = TRUE
- if(istype(tool, /obj/item/twohanded/shockpaddles))
- var/obj/item/twohanded/shockpaddles/S = tool
+ if(istype(tool, /obj/item/shockpaddles))
+ var/obj/item/shockpaddles/S = tool
if((S.req_defib && !S.defib.powered) || !S.wielded || S.cooldown || S.busy)
to_chat(user, "You need to wield both paddles, and [S.defib] must be powered!")
return FALSE
@@ -60,6 +60,7 @@
playsound(get_turf(target), 'sound/magic/lightningbolt.ogg', 50, 1)
target.adjustOxyLoss(-50, 0)
target.updatehealth()
+ var/tplus = world.time - target.timeofdeath
if(target.revive())
user.visible_message("...[target] wakes up, alive and aware!", "IT'S ALIVE!")
target.visible_message("...[target] wakes up, alive and aware!")
@@ -68,6 +69,13 @@
for(var/obj/item/organ/O in target.internal_organs)//zap those buggers back to life!
if(O.organ_flags & ORGAN_FAILING)
O.applyOrganDamage(-5)
+ var/list/policies = CONFIG_GET(keyed_list/policyconfig)
+ var/timelimit = CONFIG_GET(number/defib_cmd_time_limit)
+ var/late = timelimit && (tplus > timelimit)
+ var/policy = late? policies[POLICYCONFIG_ON_DEFIB_LATE] : policies[POLICYCONFIG_ON_DEFIB_INTACT]
+ if(policy)
+ to_chat(target, policy)
+ target.log_message("revived using surgical revival, [tplus] deciseconds from time of death, considered [late? "late" : "memory-intact"] revival under configured policy limits.", LOG_GAME)
return TRUE
else
user.visible_message("...[target.p_they()] convulses, then lies still.")
diff --git a/code/modules/surgery/amputation.dm b/code/modules/surgery/amputation.dm
index 5c77532188..e00ff66ee7 100644
--- a/code/modules/surgery/amputation.dm
+++ b/code/modules/surgery/amputation.dm
@@ -6,7 +6,7 @@
requires_bodypart_type = 0
/datum/surgery_step/sever_limb
name = "sever limb"
- implements = list(TOOL_SCALPEL = 100, TOOL_SAW = 100, /obj/item/melee/transforming/energy/sword/cyborg/saw = 100, /obj/item/melee/arm_blade = 80, /obj/item/twohanded/required/chainsaw = 80, /obj/item/mounted_chainsaw = 80, /obj/item/twohanded/fireaxe = 50, /obj/item/hatchet = 40, /obj/item/kitchen/knife/butcher = 25)
+ implements = list(TOOL_SCALPEL = 100, TOOL_SAW = 100, /obj/item/melee/transforming/energy/sword/cyborg/saw = 100, /obj/item/melee/arm_blade = 80, /obj/item/chainsaw = 80, /obj/item/mounted_chainsaw = 80, /obj/item/fireaxe = 50, /obj/item/hatchet = 40, /obj/item/kitchen/knife/butcher = 25)
time = 64
/datum/surgery_step/sever_limb/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm
similarity index 71%
rename from code/modules/surgery/bodyparts/bodyparts.dm
rename to code/modules/surgery/bodyparts/_bodyparts.dm
index 09ac7a8cb2..07c80322ae 100644
--- a/code/modules/surgery/bodyparts/bodyparts.dm
+++ b/code/modules/surgery/bodyparts/_bodyparts.dm
@@ -71,6 +71,28 @@
var/medium_burn_msg = "blistered"
var/heavy_burn_msg = "peeling away"
+ /// The wounds currently afflicting this body part
+ var/list/wounds
+
+ /// The scars currently afflicting this body part
+ var/list/scars
+ /// Our current stored wound damage multiplier
+ var/wound_damage_multiplier = 1
+
+ /// This number is subtracted from all wound rolls on this bodypart, higher numbers mean more defense, negative means easier to wound
+ var/wound_resistance = 0
+ /// When this bodypart hits max damage, this number is added to all wound rolls. Obviously only relevant for bodyparts that have damage caps.
+ var/disabled_wound_penalty = 15
+
+ /// A hat won't cover your face, but a shirt covering your chest will cover your... you know, chest
+ var/scars_covered_by_clothes = TRUE
+ /// Descriptions for the locations on the limb for scars to be assigned, just cosmetic
+ var/list/specific_locations = list("general area")
+ /// So we know if we need to scream if this limb hits max damage
+ var/last_maxed
+ /// How much generic bleedstacks we have on this bodypart
+ var/generic_bleedstacks
+
/obj/item/bodypart/examine(mob/user)
. = ..()
if(brute_dam > DAMAGE_PRECISION)
@@ -149,7 +171,7 @@
//Applies brute and burn damage to the organ. Returns 1 if the damage-icon states changed at all.
//Damage will not exceed max_damage using this proc
//Cannot apply negative damage
-/obj/item/bodypart/proc/receive_damage(brute = 0, burn = 0, stamina = 0, updating_health = TRUE)
+/obj/item/bodypart/proc/receive_damage(brute = 0, burn = 0, stamina = 0, blocked = 0, updating_health = TRUE, required_status = null, wound_bonus = 0, bare_wound_bonus = 0, sharpness = FALSE) // maybe separate BRUTE_SHARP and BRUTE_OTHER eventually somehow hmm
if(owner && (owner.status_flags & GODMODE))
return FALSE //godmode
var/dmg_mlt = CONFIG_GET(number/damage_multiplier)
@@ -163,20 +185,38 @@
if(!brute && !burn && !stamina)
return FALSE
+ brute *= wound_damage_multiplier
+ burn *= wound_damage_multiplier
+
switch(animal_origin)
if(ALIEN_BODYPART,LARVA_BODYPART) //aliens take some additional burn //nothing can burn with so much snowflake code around
burn *= 1.2
+ var/wounding_type = (brute > burn ? WOUND_BRUTE : WOUND_BURN)
+ var/wounding_dmg = max(brute, burn)
+ if(wounding_type == WOUND_BRUTE && sharpness)
+ wounding_type = WOUND_SHARP
+ // i know this is effectively the same check as above but i don't know if those can null the damage by rounding and want to be safe
+ if(owner && wounding_dmg > 4 && wound_bonus != CANT_WOUND)
+ // if you want to make tox wounds or some other type, this will need to be expanded and made more modular
+ // handle all our wounding stuff
+ check_wounding(wounding_type, wounding_dmg, wound_bonus, bare_wound_bonus)
+
var/can_inflict = max_damage - get_damage()
- if(can_inflict <= 0)
- return FALSE
var/total_damage = brute + burn
- if(total_damage > can_inflict)
+ if(total_damage > can_inflict && total_damage > 0) // TODO: the second part of this check should be removed once disabling is all done
brute = round(brute * (max_damage / total_damage),DAMAGE_PRECISION)
burn = round(burn * (max_damage / total_damage),DAMAGE_PRECISION)
+ if(can_inflict <= 0)
+ return FALSE
+
+ for(var/i in wounds)
+ var/datum/wound/W = i
+ W.receive_damage(wounding_type, wounding_dmg, wound_bonus)
+
brute_dam += brute
burn_dam += burn
@@ -196,6 +236,107 @@
update_disabled()
return update_bodypart_damage_state()
+/**
+ * check_wounding() is where we handle rolling for, selecting, and applying a wound if we meet the criteria
+ *
+ * We generate a "score" for how woundable the attack was based on the damage and other factors discussed in [check_wounding_mods()], then go down the list from most severe to least severe wounds in that category.
+ * We can promote a wound from a lesser to a higher severity this way, but we give up if we have a wound of the given type and fail to roll a higher severity, so no sidegrades/downgrades
+ *
+ * Arguments:
+ * * woundtype- Either WOUND_SHARP, WOUND_BRUTE, or WOUND_BURN based on the attack type.
+ * * damage- How much damage is tied to this attack, since wounding potential scales with damage in an attack (see: WOUND_DAMAGE_EXPONENT)
+ * * wound_bonus- The wound_bonus of an attack
+ * * bare_wound_bonus- The bare_wound_bonus of an attack
+ */
+/obj/item/bodypart/proc/check_wounding(woundtype, damage, wound_bonus, bare_wound_bonus)
+ // actually roll wounds if applicable
+ if(HAS_TRAIT(owner, TRAIT_EASYLIMBDISABLE))
+ damage *= 1.5
+
+ var/base_roll = rand(1, round(damage ** WOUND_DAMAGE_EXPONENT))
+ var/injury_roll = base_roll
+ injury_roll += check_woundings_mods(woundtype, damage, wound_bonus, bare_wound_bonus)
+ var/list/wounds_checking
+
+ switch(woundtype)
+ if(WOUND_SHARP)
+ wounds_checking = WOUND_LIST_CUT
+ if(WOUND_BRUTE)
+ wounds_checking = WOUND_LIST_BONE
+ if(WOUND_BURN)
+ wounds_checking = WOUND_LIST_BURN
+
+ //cycle through the wounds of the relevant category from the most severe down
+ for(var/PW in wounds_checking)
+ var/datum/wound/possible_wound = PW
+ var/datum/wound/replaced_wound
+ for(var/i in wounds)
+ var/datum/wound/existing_wound = i
+ if(existing_wound.type in wounds_checking)
+ if(existing_wound.severity >= initial(possible_wound.severity))
+ return
+ else
+ replaced_wound = existing_wound
+
+ if(initial(possible_wound.threshold_minimum) < injury_roll)
+ if(replaced_wound)
+ var/datum/wound/new_wound = replaced_wound.replace_wound(possible_wound)
+ log_wound(owner, new_wound, damage, wound_bonus, bare_wound_bonus, base_roll)
+ else
+ var/datum/wound/new_wound = new possible_wound
+ new_wound.apply_wound(src)
+ log_wound(owner, new_wound, damage, wound_bonus, bare_wound_bonus, base_roll)
+ return
+
+// try forcing a specific wound, but only if there isn't already a wound of that severity or greater for that type on this bodypart
+/obj/item/bodypart/proc/force_wound_upwards(specific_woundtype, smited = FALSE)
+ var/datum/wound/potential_wound = specific_woundtype
+ for(var/i in wounds)
+ var/datum/wound/existing_wound = i
+ if(existing_wound.type in (initial(potential_wound.wound_type)))
+ if(existing_wound.severity < initial(potential_wound.severity)) // we only try if the existing one is inferior to the one we're trying to force
+ existing_wound.replace_wound(potential_wound, smited)
+ return
+
+ var/datum/wound/new_wound = new potential_wound
+ new_wound.apply_wound(src, smited = smited)
+
+/obj/item/bodypart/proc/check_woundings_mods(wounding_type, damage, wound_bonus, bare_wound_bonus)
+ var/armor_ablation = 0
+ var/injury_mod = 0
+
+ //var/bwb = 0
+
+ if(owner && ishuman(owner))
+ var/mob/living/carbon/human/H = owner
+ var/list/clothing = H.clothingonpart(src)
+ for(var/c in clothing)
+ var/obj/item/clothing/C = c
+ // unlike normal armor checks, we tabluate these piece-by-piece manually so we can also pass on appropriate damage the clothing's limbs if necessary
+ armor_ablation += C.armor.getRating("wound")
+ if(wounding_type == WOUND_SHARP)
+ C.take_damage_zone(body_zone, damage, BRUTE, armour_penetration)
+ else if(wounding_type == WOUND_BURN && damage >= 10) // lazy way to block freezing from shredding clothes without adding another var onto apply_damage()
+ C.take_damage_zone(body_zone, damage, BURN, armour_penetration)
+
+ if(!armor_ablation)
+ injury_mod += bare_wound_bonus
+
+ injury_mod -= armor_ablation
+ injury_mod += wound_bonus
+
+ for(var/thing in wounds)
+ var/datum/wound/W = thing
+ injury_mod += W.threshold_penalty
+
+ var/part_mod = -wound_resistance
+ if(is_disabled())
+ part_mod += disabled_wound_penalty
+
+ injury_mod += part_mod
+
+ return injury_mod
+
//Heals brute and burn damage for the organ. Returns 1 if the damage-icon states changed at all.
//Damage cannot go below zero.
//Cannot remove negative damage (i.e. apply damage)
@@ -227,16 +368,29 @@
//Checks disabled status thresholds
/obj/item/bodypart/proc/update_disabled()
+ if(!owner)
+ return
set_disabled(is_disabled())
/obj/item/bodypart/proc/is_disabled()
+ if(!owner)
+ return
if(HAS_TRAIT(owner, TRAIT_PARALYSIS))
return BODYPART_DISABLED_PARALYSIS
+ for(var/i in wounds)
+ var/datum/wound/W = i
+ if(W.disabling)
+ return BODYPART_DISABLED_WOUND
if(can_dismember() && !HAS_TRAIT(owner, TRAIT_NODISMEMBER))
. = disabled //inertia, to avoid limbs healing 0.1 damage and being re-enabled
if((get_damage(TRUE) >= max_damage) || (HAS_TRAIT(owner, TRAIT_EASYLIMBDISABLE) && (get_damage(TRUE) >= (max_damage * 0.6)))) //Easy limb disable disables the limb at 40% health instead of 0%
- return BODYPART_DISABLED_DAMAGE
- if(disabled && (get_damage(TRUE) <= (max_damage * 0.5)))
+ if(!last_maxed)
+ owner.emote("scream")
+ last_maxed = TRUE
+ if(!is_organic_limb())
+ return BODYPART_DISABLED_DAMAGE
+ else if(disabled && (get_damage(TRUE) <= (max_damage * 0.8))) // reenabled at 80% now instead of 50% as of wounds update
+ last_maxed = FALSE
return BODYPART_NOT_DISABLED
else
return BODYPART_NOT_DISABLED
@@ -251,9 +405,11 @@
/obj/item/bodypart/proc/set_disabled(new_disabled)
- if(disabled == new_disabled)
+ if(disabled == new_disabled || !owner)
return FALSE
disabled = new_disabled
+ if(disabled && owner.get_item_for_held_index(held_index))
+ owner.dropItemToGround(owner.get_item_for_held_index(held_index))
owner.update_health_hud() //update the healthdoll
owner.update_body()
owner.update_mobility()
@@ -334,9 +490,9 @@
//body marking memes
var/list/colorlist = list()
colorlist.Cut()
- colorlist += ReadRGB("[H.dna.features["mcolor"]]0")
- colorlist += ReadRGB("[H.dna.features["mcolor2"]]0")
- colorlist += ReadRGB("[H.dna.features["mcolor3"]]0")
+ colorlist += ReadRGB("[H.dna.features["mcolor"]]00")
+ colorlist += ReadRGB("[H.dna.features["mcolor2"]]00")
+ colorlist += ReadRGB("[H.dna.features["mcolor3"]]00")
colorlist += list(0,0,0, S.hair_alpha)
for(var/index=1, index<=colorlist.len, index++)
colorlist[index] = colorlist[index]/255
@@ -581,293 +737,41 @@
drop_organs()
qdel(src)
-/obj/item/bodypart/chest
- name = BODY_ZONE_CHEST
- desc = "It's impolite to stare at a person's chest."
- icon_state = "default_human_chest"
- max_damage = 200
- body_zone = BODY_ZONE_CHEST
- body_part = CHEST
- px_x = 0
- px_y = 0
- stam_damage_coeff = 1
- max_stamina_damage = 200
- var/obj/item/cavity_item
-
-/obj/item/bodypart/chest/can_dismember(obj/item/I)
- if(!((owner.stat == DEAD) || owner.InFullCritical()))
- return FALSE
- return ..()
-
-/obj/item/bodypart/chest/Destroy()
- if(cavity_item)
- qdel(cavity_item)
- return ..()
-
-/obj/item/bodypart/chest/drop_organs(mob/user)
- if(cavity_item)
- cavity_item.forceMove(user.loc)
- cavity_item = null
- ..()
-
-/obj/item/bodypart/chest/monkey
- icon = 'icons/mob/animal_parts.dmi'
- icon_state = "default_monkey_chest"
- animal_origin = MONKEY_BODYPART
-
-/obj/item/bodypart/chest/alien
- icon = 'icons/mob/animal_parts.dmi'
- icon_state = "alien_chest"
- dismemberable = 0
- max_damage = 500
- animal_origin = ALIEN_BODYPART
-
-/obj/item/bodypart/chest/devil
- dismemberable = 0
- max_damage = 5000
- animal_origin = DEVIL_BODYPART
-
-/obj/item/bodypart/chest/larva
- icon = 'icons/mob/animal_parts.dmi'
- icon_state = "larva_chest"
- dismemberable = 0
- max_damage = 50
- animal_origin = LARVA_BODYPART
-
-/obj/item/bodypart/l_arm
- name = "left arm"
- desc = "Did you know that the word 'sinister' stems originally from the \
- Latin 'sinestra' (left hand), because the left hand was supposed to \
- be possessed by the devil? This arm appears to be possessed by no \
- one though."
- icon_state = "default_human_l_arm"
- attack_verb = list("slapped", "punched")
- max_damage = 50
- max_stamina_damage = 50
- body_zone = BODY_ZONE_L_ARM
- body_part = ARM_LEFT
- aux_icons = list(BODY_ZONE_PRECISE_L_HAND = HANDS_PART_LAYER, "l_hand_behind" = BODY_BEHIND_LAYER)
- body_damage_coeff = 0.75
- held_index = 1
- px_x = -6
- px_y = 0
- stam_heal_tick = 4
-
-/obj/item/bodypart/l_arm/is_disabled()
- if(HAS_TRAIT(owner, TRAIT_PARALYSIS_L_ARM))
- return BODYPART_DISABLED_PARALYSIS
- return ..()
-
-/obj/item/bodypart/l_arm/set_disabled(new_disabled)
- . = ..()
- if(!.)
+/// Get whatever wound of the given type is currently attached to this limb, if any
+/obj/item/bodypart/proc/get_wound_type(checking_type)
+ if(isnull(wounds))
return
- if(owner.stat < UNCONSCIOUS)
- switch(disabled)
- if(BODYPART_DISABLED_DAMAGE)
- owner.emote("scream")
- to_chat(owner, "Your [name] is too damaged to function!")
- if(BODYPART_DISABLED_PARALYSIS)
- to_chat(owner, "You can't feel your [name]!")
- if(held_index)
- owner.dropItemToGround(owner.get_item_for_held_index(held_index))
- if(owner.hud_used)
- var/obj/screen/inventory/hand/L = owner.hud_used.hand_slots["[held_index]"]
- if(L)
- L.update_icon()
+ for(var/thing in wounds)
+ var/datum/wound/W = thing
+ if(istype(W, checking_type))
+ return W
-/obj/item/bodypart/l_arm/monkey
- icon = 'icons/mob/animal_parts.dmi'
- icon_state = "default_monkey_l_arm"
- animal_origin = MONKEY_BODYPART
- px_x = -5
- px_y = -3
+/// very rough start for updating efficiency and other stats on a body part whenever a wound is gained/lost
+/obj/item/bodypart/proc/update_wounds()
+ var/dam_mul = 1 //initial(wound_damage_multiplier)
+ // we can only have one wound per type, but remember there's multiple types
+ for(var/datum/wound/W in wounds)
+ dam_mul *= W.damage_mulitplier_penalty
+ wound_damage_multiplier = dam_mul
+ update_disabled()
-/obj/item/bodypart/l_arm/alien
- icon = 'icons/mob/animal_parts.dmi'
- icon_state = "alien_l_arm"
- px_x = 0
- px_y = 0
- dismemberable = 0
- max_damage = 100
- animal_origin = ALIEN_BODYPART
-
-/obj/item/bodypart/l_arm/devil
- dismemberable = 0
- max_damage = 5000
- animal_origin = DEVIL_BODYPART
-
-/obj/item/bodypart/r_arm
- name = "right arm"
- desc = "Over 87% of humans are right handed. That figure is much lower \
- among humans missing their right arm."
- icon_state = "default_human_r_arm"
- attack_verb = list("slapped", "punched")
- max_damage = 50
- body_zone = BODY_ZONE_R_ARM
- body_part = ARM_RIGHT
- aux_icons = list(BODY_ZONE_PRECISE_R_HAND = HANDS_PART_LAYER, "r_hand_behind" = BODY_BEHIND_LAYER)
- body_damage_coeff = 0.75
- held_index = 2
- px_x = 6
- px_y = 0
- stam_heal_tick = 4
- max_stamina_damage = 50
-
-/obj/item/bodypart/r_arm/is_disabled()
- if(HAS_TRAIT(owner, TRAIT_PARALYSIS_R_ARM))
- return BODYPART_DISABLED_PARALYSIS
- return ..()
-
-/obj/item/bodypart/r_arm/set_disabled(new_disabled)
- . = ..()
- if(!.)
+/obj/item/bodypart/proc/get_bleed_rate()
+ if(status != BODYPART_ORGANIC) // maybe in the future we can bleed oil from aug parts, but not now
return
- if(owner.stat < UNCONSCIOUS)
- switch(disabled)
- if(BODYPART_DISABLED_DAMAGE)
- owner.emote("scream")
- to_chat(owner, "Your [name] is too damaged to function!")
- if(BODYPART_DISABLED_PARALYSIS)
- to_chat(owner, "You can't feel your [name]!")
- if(held_index)
- owner.dropItemToGround(owner.get_item_for_held_index(held_index))
- if(owner.hud_used)
- var/obj/screen/inventory/hand/R = owner.hud_used.hand_slots["[held_index]"]
- if(R)
- R.update_icon()
+ var/bleed_rate = 0
+ if(generic_bleedstacks > 0)
+ bleed_rate++
+ if(brute_dam >= 40)
+ bleed_rate += (brute_dam * 0.008)
+ //We want an accurate reading of .len
+ listclearnulls(embedded_objects)
+ for(var/obj/item/embeddies in embedded_objects)
+ if(!embeddies.isEmbedHarmless())
+ bleed_rate += 0.5
-/obj/item/bodypart/r_arm/monkey
- icon = 'icons/mob/animal_parts.dmi'
- icon_state = "default_monkey_r_arm"
- animal_origin = MONKEY_BODYPART
- px_x = 5
- px_y = -3
+ for(var/thing in wounds)
+ var/datum/wound/W = thing
+ bleed_rate += W.blood_flow
-/obj/item/bodypart/r_arm/alien
- icon = 'icons/mob/animal_parts.dmi'
- icon_state = "alien_r_arm"
- px_x = 0
- px_y = 0
- dismemberable = 0
- max_damage = 100
- animal_origin = ALIEN_BODYPART
-
-/obj/item/bodypart/r_arm/devil
- dismemberable = 0
- max_damage = 5000
- animal_origin = DEVIL_BODYPART
-
-/obj/item/bodypart/l_leg
- name = "left leg"
- desc = "Some athletes prefer to tie their left shoelaces first for good \
- luck. In this instance, it probably would not have helped."
- icon_state = "default_human_l_leg"
- attack_verb = list("kicked", "stomped")
- max_damage = 50
- body_zone = BODY_ZONE_L_LEG
- body_part = LEG_LEFT
- body_damage_coeff = 0.75
- px_x = -2
- px_y = 12
- stam_heal_tick = 4
- max_stamina_damage = 50
-
-/obj/item/bodypart/l_leg/is_disabled()
- if(HAS_TRAIT(owner, TRAIT_PARALYSIS_L_LEG))
- return BODYPART_DISABLED_PARALYSIS
- return ..()
-
-/obj/item/bodypart/l_leg/set_disabled(new_disabled)
- . = ..()
- if(!. || owner.stat >= UNCONSCIOUS)
- return
- switch(disabled)
- if(BODYPART_DISABLED_DAMAGE)
- owner.emote("scream")
- to_chat(owner, "Your [name] is too damaged to function!")
- if(BODYPART_DISABLED_PARALYSIS)
- to_chat(owner, "You can't feel your [name]!")
-
-
-/obj/item/bodypart/l_leg/digitigrade
- name = "left digitigrade leg"
- use_digitigrade = FULL_DIGITIGRADE
-
-/obj/item/bodypart/l_leg/monkey
- icon = 'icons/mob/animal_parts.dmi'
- icon_state = "default_monkey_l_leg"
- animal_origin = MONKEY_BODYPART
- px_y = 4
-
-/obj/item/bodypart/l_leg/alien
- icon = 'icons/mob/animal_parts.dmi'
- icon_state = "alien_l_leg"
- px_x = 0
- px_y = 0
- dismemberable = 0
- max_damage = 100
- animal_origin = ALIEN_BODYPART
-
-/obj/item/bodypart/l_leg/devil
- dismemberable = 0
- max_damage = 5000
- animal_origin = DEVIL_BODYPART
-
-/obj/item/bodypart/r_leg
- name = "right leg"
- desc = "You put your right leg in, your right leg out. In, out, in, out, \
- shake it all about. And apparently then it detaches.\n\
- The hokey pokey has certainly changed a lot since space colonisation."
- // alternative spellings of 'pokey' are availible
- icon_state = "default_human_r_leg"
- attack_verb = list("kicked", "stomped")
- max_damage = 50
- body_zone = BODY_ZONE_R_LEG
- body_part = LEG_RIGHT
- body_damage_coeff = 0.75
- px_x = 2
- px_y = 12
- max_stamina_damage = 50
- stam_heal_tick = 4
-
-/obj/item/bodypart/r_leg/is_disabled()
- if(HAS_TRAIT(owner, TRAIT_PARALYSIS_R_LEG))
- return BODYPART_DISABLED_PARALYSIS
- return ..()
-
-/obj/item/bodypart/r_leg/set_disabled(new_disabled)
- . = ..()
- if(!. || owner.stat >= UNCONSCIOUS)
- return
- switch(disabled)
- if(BODYPART_DISABLED_DAMAGE)
- owner.emote("scream")
- to_chat(owner, "Your [name] is too damaged to function!")
- if(BODYPART_DISABLED_PARALYSIS)
- to_chat(owner, "You can't feel your [name]!")
-
-/obj/item/bodypart/r_leg/digitigrade
- name = "right digitigrade leg"
- use_digitigrade = FULL_DIGITIGRADE
-
-/obj/item/bodypart/r_leg/monkey
- icon = 'icons/mob/animal_parts.dmi'
- icon_state = "default_monkey_r_leg"
- animal_origin = MONKEY_BODYPART
- px_y = 4
-
-/obj/item/bodypart/r_leg/alien
- icon = 'icons/mob/animal_parts.dmi'
- icon_state = "alien_r_leg"
- px_x = 0
- px_y = 0
- dismemberable = 0
- max_damage = 100
- animal_origin = ALIEN_BODYPART
-
-/obj/item/bodypart/r_leg/devil
- dismemberable = 0
- max_damage = 5000
- animal_origin = DEVIL_BODYPART
+ return bleed_rate
diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm
index f654270df7..2ce6ca8862 100644
--- a/code/modules/surgery/bodyparts/dismemberment.dm
+++ b/code/modules/surgery/bodyparts/dismemberment.dm
@@ -15,7 +15,7 @@
if(HAS_TRAIT(C, TRAIT_NODISMEMBER))
return FALSE
var/obj/item/bodypart/affecting = C.get_bodypart(BODY_ZONE_CHEST)
- affecting.receive_damage(clamp(brute_dam/2 * affecting.body_damage_coeff, 15, 50), clamp(burn_dam/2 * affecting.body_damage_coeff, 0, 50)) //Damage the chest based on limb's existing damage
+ affecting.receive_damage(clamp(brute_dam/2 * affecting.body_damage_coeff, 15, 50), clamp(burn_dam/2 * affecting.body_damage_coeff, 0, 50), wound_bonus=CANT_WOUND) //Damage the chest based on limb's existing damage
C.visible_message("[C]'s [src.name] has been violently dismembered!")
C.emote("scream")
SEND_SIGNAL(C, COMSIG_ADD_MOOD_EVENT, "dismembered", /datum/mood_event/dismembered)
@@ -83,11 +83,12 @@
//limb removal. The "special" argument is used for swapping a limb with a new one without the effects of losing a limb kicking in.
-/obj/item/bodypart/proc/drop_limb(special)
+/obj/item/bodypart/proc/drop_limb(special, dismembered)
if(!owner)
return
var/atom/Tsec = owner.drop_location()
var/mob/living/carbon/C = owner
+ SEND_SIGNAL(C, COMSIG_CARBON_REMOVE_LIMB, src, dismembered)
update_limb(1)
C.bodyparts -= src
@@ -95,6 +96,15 @@
C.dropItemToGround(owner.get_item_for_held_index(held_index), 1)
C.hand_bodyparts[held_index] = null
+ for(var/thing in scars)
+ var/datum/scar/S = thing
+ S.victim = null
+ LAZYREMOVE(owner.all_scars, S)
+
+ for(var/thing in wounds)
+ var/datum/wound/W = thing
+ W.remove_wound(TRUE)
+
owner = null
for(var/X in C.surgeries) //if we had an ongoing surgery on that limb, we stop it.
@@ -298,6 +308,15 @@
for(var/obj/item/organ/O in contents)
O.Insert(C)
+ for(var/thing in scars)
+ var/datum/scar/S = thing
+ S.victim = C
+ LAZYADD(C.all_scars, thing)
+
+ for(var/i in wounds)
+ var/datum/wound/W = i
+ W.apply_wound(src, TRUE)
+
update_bodypart_damage_state()
update_disabled()
diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm
index a74b1dad28..a67f16b934 100644
--- a/code/modules/surgery/bodyparts/head.dm
+++ b/code/modules/surgery/bodyparts/head.dm
@@ -35,6 +35,10 @@
//If the head is a special sprite
var/custom_head
+ wound_resistance = 10
+ specific_locations = list("left eyebrow", "cheekbone", "neck", "throat", "jawline", "entire face")
+ scars_covered_by_clothes = FALSE
+
/obj/item/bodypart/head/can_dismember(obj/item/I)
if(!((owner.stat == DEAD) || owner.InFullCritical()))
return FALSE
diff --git a/code/modules/surgery/bodyparts/helpers.dm b/code/modules/surgery/bodyparts/helpers.dm
index a1f1bd7daf..3161419449 100644
--- a/code/modules/surgery/bodyparts/helpers.dm
+++ b/code/modules/surgery/bodyparts/helpers.dm
@@ -10,6 +10,16 @@
if(L.body_zone == zone)
return L
+///Get the bodypart for whatever hand we have active, Only relevant for carbons
+/mob/proc/get_active_hand()
+ return FALSE
+
+/mob/living/carbon/get_active_hand()
+ var/which_hand = BODY_ZONE_PRECISE_L_HAND
+ if(!(active_hand_index % 2))
+ which_hand = BODY_ZONE_PRECISE_R_HAND
+ return get_bodypart(check_zone(which_hand))
+
/mob/living/carbon/has_hand_for_held_index(i)
if(i)
var/obj/item/bodypart/L = hand_bodyparts[i]
@@ -152,26 +162,24 @@
disabled += zone
return disabled
-//Remove all embedded objects from all limbs on the carbon mob
+///Remove a specific embedded item from the carbon mob
+/mob/living/carbon/proc/remove_embedded_object(obj/item/I)
+ SEND_SIGNAL(src, COMSIG_CARBON_EMBED_REMOVAL, I)
+
+///Remove all embedded objects from all limbs on the carbon mob
/mob/living/carbon/proc/remove_all_embedded_objects()
- var/turf/T = get_turf(src)
-
for(var/X in bodyparts)
var/obj/item/bodypart/L = X
for(var/obj/item/I in L.embedded_objects)
- L.embedded_objects -= I
- I.forceMove(T)
- I.unembedded()
+ remove_embedded_object(I)
- clear_alert("embeddedobject")
- SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "embedded")
-
-/mob/living/carbon/proc/has_embedded_objects()
- . = 0
+/mob/living/carbon/proc/has_embedded_objects(include_harmless=FALSE)
for(var/X in bodyparts)
var/obj/item/bodypart/L = X
for(var/obj/item/I in L.embedded_objects)
- return 1
+ if(!include_harmless && I.isEmbedHarmless())
+ continue
+ return TRUE
//Helper for quickly creating a new limb - used by augment code in species.dm spec_attacked_by
diff --git a/code/modules/surgery/bodyparts/parts.dm b/code/modules/surgery/bodyparts/parts.dm
new file mode 100644
index 0000000000..a18b31e4c1
--- /dev/null
+++ b/code/modules/surgery/bodyparts/parts.dm
@@ -0,0 +1,289 @@
+/obj/item/bodypart/chest
+ name = BODY_ZONE_CHEST
+ desc = "It's impolite to stare at a person's chest."
+ icon_state = "default_human_chest"
+ max_damage = 200
+ body_zone = BODY_ZONE_CHEST
+ body_part = CHEST
+ px_x = 0
+ px_y = 0
+ stam_damage_coeff = 1
+ max_stamina_damage = 200
+ var/obj/item/cavity_item
+
+/obj/item/bodypart/chest/can_dismember(obj/item/I)
+ if(!((owner.stat == DEAD) || owner.InFullCritical()))
+ return FALSE
+ return ..()
+
+/obj/item/bodypart/chest/Destroy()
+ if(cavity_item)
+ qdel(cavity_item)
+ return ..()
+
+/obj/item/bodypart/chest/drop_organs(mob/user)
+ if(cavity_item)
+ cavity_item.forceMove(user.loc)
+ cavity_item = null
+ ..()
+
+/obj/item/bodypart/chest/monkey
+ icon = 'icons/mob/animal_parts.dmi'
+ icon_state = "default_monkey_chest"
+ animal_origin = MONKEY_BODYPART
+
+/obj/item/bodypart/chest/alien
+ icon = 'icons/mob/animal_parts.dmi'
+ icon_state = "alien_chest"
+ dismemberable = 0
+ max_damage = 500
+ animal_origin = ALIEN_BODYPART
+
+/obj/item/bodypart/chest/devil
+ dismemberable = 0
+ max_damage = 5000
+ animal_origin = DEVIL_BODYPART
+
+/obj/item/bodypart/chest/larva
+ icon = 'icons/mob/animal_parts.dmi'
+ icon_state = "larva_chest"
+ dismemberable = 0
+ max_damage = 50
+ animal_origin = LARVA_BODYPART
+
+/obj/item/bodypart/l_arm
+ name = "left arm"
+ desc = "Did you know that the word 'sinister' stems originally from the \
+ Latin 'sinestra' (left hand), because the left hand was supposed to \
+ be possessed by the devil? This arm appears to be possessed by no \
+ one though."
+ icon_state = "default_human_l_arm"
+ attack_verb = list("slapped", "punched")
+ max_damage = 50
+ max_stamina_damage = 50
+ body_zone = BODY_ZONE_L_ARM
+ body_part = ARM_LEFT
+ aux_icons = list(BODY_ZONE_PRECISE_L_HAND = HANDS_PART_LAYER, "l_hand_behind" = BODY_BEHIND_LAYER)
+ body_damage_coeff = 0.75
+ held_index = 1
+ px_x = -6
+ px_y = 0
+ stam_heal_tick = STAM_RECOVERY_LIMB
+
+/obj/item/bodypart/l_arm/is_disabled()
+ if(HAS_TRAIT(owner, TRAIT_PARALYSIS_L_ARM))
+ return BODYPART_DISABLED_PARALYSIS
+ return ..()
+
+/obj/item/bodypart/l_arm/set_disabled(new_disabled)
+ . = ..()
+ if(!.)
+ return
+ if(owner.stat < UNCONSCIOUS)
+ switch(disabled)
+ if(BODYPART_DISABLED_DAMAGE)
+ owner.emote("scream")
+ to_chat(owner, "Your [name] is too damaged to function!")
+ if(BODYPART_DISABLED_PARALYSIS)
+ to_chat(owner, "You can't feel your [name]!")
+ if(held_index)
+ owner.dropItemToGround(owner.get_item_for_held_index(held_index))
+ if(owner.hud_used)
+ var/obj/screen/inventory/hand/L = owner.hud_used.hand_slots["[held_index]"]
+ if(L)
+ L.update_icon()
+
+/obj/item/bodypart/l_arm/monkey
+ icon = 'icons/mob/animal_parts.dmi'
+ icon_state = "default_monkey_l_arm"
+ animal_origin = MONKEY_BODYPART
+ px_x = -5
+ px_y = -3
+
+/obj/item/bodypart/l_arm/alien
+ icon = 'icons/mob/animal_parts.dmi'
+ icon_state = "alien_l_arm"
+ px_x = 0
+ px_y = 0
+ dismemberable = 0
+ max_damage = 100
+ animal_origin = ALIEN_BODYPART
+
+/obj/item/bodypart/l_arm/devil
+ dismemberable = 0
+ max_damage = 5000
+ animal_origin = DEVIL_BODYPART
+
+/obj/item/bodypart/r_arm
+ name = "right arm"
+ desc = "Over 87% of humans are right handed. That figure is much lower \
+ among humans missing their right arm."
+ icon_state = "default_human_r_arm"
+ attack_verb = list("slapped", "punched")
+ max_damage = 50
+ body_zone = BODY_ZONE_R_ARM
+ body_part = ARM_RIGHT
+ aux_icons = list(BODY_ZONE_PRECISE_R_HAND = HANDS_PART_LAYER, "r_hand_behind" = BODY_BEHIND_LAYER)
+ body_damage_coeff = 0.75
+ held_index = 2
+ px_x = 6
+ px_y = 0
+ stam_heal_tick = STAM_RECOVERY_LIMB
+ max_stamina_damage = 50
+
+/obj/item/bodypart/r_arm/is_disabled()
+ if(HAS_TRAIT(owner, TRAIT_PARALYSIS_R_ARM))
+ return BODYPART_DISABLED_PARALYSIS
+ return ..()
+
+/obj/item/bodypart/r_arm/set_disabled(new_disabled)
+ . = ..()
+ if(!.)
+ return
+ if(owner.stat < UNCONSCIOUS)
+ switch(disabled)
+ if(BODYPART_DISABLED_DAMAGE)
+ owner.emote("scream")
+ to_chat(owner, "Your [name] is too damaged to function!")
+ if(BODYPART_DISABLED_PARALYSIS)
+ to_chat(owner, "You can't feel your [name]!")
+ if(held_index)
+ owner.dropItemToGround(owner.get_item_for_held_index(held_index))
+ if(owner.hud_used)
+ var/obj/screen/inventory/hand/R = owner.hud_used.hand_slots["[held_index]"]
+ if(R)
+ R.update_icon()
+
+
+/obj/item/bodypart/r_arm/monkey
+ icon = 'icons/mob/animal_parts.dmi'
+ icon_state = "default_monkey_r_arm"
+ animal_origin = MONKEY_BODYPART
+ px_x = 5
+ px_y = -3
+
+/obj/item/bodypart/r_arm/alien
+ icon = 'icons/mob/animal_parts.dmi'
+ icon_state = "alien_r_arm"
+ px_x = 0
+ px_y = 0
+ dismemberable = 0
+ max_damage = 100
+ animal_origin = ALIEN_BODYPART
+
+/obj/item/bodypart/r_arm/devil
+ dismemberable = 0
+ max_damage = 5000
+ animal_origin = DEVIL_BODYPART
+
+/obj/item/bodypart/l_leg
+ name = "left leg"
+ desc = "Some athletes prefer to tie their left shoelaces first for good \
+ luck. In this instance, it probably would not have helped."
+ icon_state = "default_human_l_leg"
+ attack_verb = list("kicked", "stomped")
+ max_damage = 50
+ body_zone = BODY_ZONE_L_LEG
+ body_part = LEG_LEFT
+ body_damage_coeff = 0.75
+ px_x = -2
+ px_y = 12
+ stam_heal_tick = STAM_RECOVERY_LIMB
+ max_stamina_damage = 50
+
+/obj/item/bodypart/l_leg/is_disabled()
+ if(HAS_TRAIT(owner, TRAIT_PARALYSIS_L_LEG))
+ return BODYPART_DISABLED_PARALYSIS
+ return ..()
+
+/obj/item/bodypart/l_leg/set_disabled(new_disabled)
+ . = ..()
+ if(!. || owner.stat >= UNCONSCIOUS)
+ return
+ switch(disabled)
+ if(BODYPART_DISABLED_DAMAGE)
+ owner.emote("scream")
+ to_chat(owner, "Your [name] is too damaged to function!")
+ if(BODYPART_DISABLED_PARALYSIS)
+ to_chat(owner, "You can't feel your [name]!")
+
+/obj/item/bodypart/l_leg/digitigrade
+ name = "left digitigrade leg"
+ use_digitigrade = FULL_DIGITIGRADE
+
+/obj/item/bodypart/l_leg/monkey
+ icon = 'icons/mob/animal_parts.dmi'
+ icon_state = "default_monkey_l_leg"
+ animal_origin = MONKEY_BODYPART
+ px_y = 4
+
+/obj/item/bodypart/l_leg/alien
+ icon = 'icons/mob/animal_parts.dmi'
+ icon_state = "alien_l_leg"
+ px_x = 0
+ px_y = 0
+ dismemberable = 0
+ max_damage = 100
+ animal_origin = ALIEN_BODYPART
+
+/obj/item/bodypart/l_leg/devil
+ dismemberable = 0
+ max_damage = 5000
+ animal_origin = DEVIL_BODYPART
+
+/obj/item/bodypart/r_leg
+ name = "right leg"
+ desc = "You put your right leg in, your right leg out. In, out, in, out, \
+ shake it all about. And apparently then it detaches.\n\
+ The hokey pokey has certainly changed a lot since space colonisation."
+ // alternative spellings of 'pokey' are availible
+ icon_state = "default_human_r_leg"
+ attack_verb = list("kicked", "stomped")
+ max_damage = 50
+ body_zone = BODY_ZONE_R_LEG
+ body_part = LEG_RIGHT
+ body_damage_coeff = 0.75
+ px_x = 2
+ px_y = 12
+ max_stamina_damage = 50
+ stam_heal_tick = STAM_RECOVERY_LIMB
+
+/obj/item/bodypart/r_leg/is_disabled()
+ if(HAS_TRAIT(owner, TRAIT_PARALYSIS_R_LEG))
+ return BODYPART_DISABLED_PARALYSIS
+ return ..()
+
+/obj/item/bodypart/r_leg/set_disabled(new_disabled)
+ . = ..()
+ if(!. || owner.stat >= UNCONSCIOUS)
+ return
+ switch(disabled)
+ if(BODYPART_DISABLED_DAMAGE)
+ owner.emote("scream")
+ to_chat(owner, "Your [name] is too damaged to function!")
+ if(BODYPART_DISABLED_PARALYSIS)
+ to_chat(owner, "You can't feel your [name]!")
+
+/obj/item/bodypart/r_leg/digitigrade
+ name = "right digitigrade leg"
+ use_digitigrade = FULL_DIGITIGRADE
+
+/obj/item/bodypart/r_leg/monkey
+ icon = 'icons/mob/animal_parts.dmi'
+ icon_state = "default_monkey_r_leg"
+ animal_origin = MONKEY_BODYPART
+ px_y = 4
+
+/obj/item/bodypart/r_leg/alien
+ icon = 'icons/mob/animal_parts.dmi'
+ icon_state = "alien_r_leg"
+ px_x = 0
+ px_y = 0
+ dismemberable = 0
+ max_damage = 100
+ animal_origin = ALIEN_BODYPART
+
+/obj/item/bodypart/r_leg/devil
+ dismemberable = 0
+ max_damage = 5000
+ animal_origin = DEVIL_BODYPART
diff --git a/code/modules/surgery/bone_mending.dm b/code/modules/surgery/bone_mending.dm
new file mode 100644
index 0000000000..81d9fa8d97
--- /dev/null
+++ b/code/modules/surgery/bone_mending.dm
@@ -0,0 +1,139 @@
+
+/////BONE FIXING SURGERIES//////
+
+///// Repair Hairline Fracture (Severe)
+/datum/surgery/repair_bone_hairline
+ name = "Repair bone fracture (hairline)"
+ steps = list(/datum/surgery_step/incise, /datum/surgery_step/repair_bone_hairline, /datum/surgery_step/close)
+ target_mobtypes = list(/mob/living/carbon/human)
+ possible_locs = list(BODY_ZONE_R_ARM,BODY_ZONE_L_ARM,BODY_ZONE_R_LEG,BODY_ZONE_L_LEG,BODY_ZONE_CHEST,BODY_ZONE_HEAD)
+ requires_real_bodypart = TRUE
+ targetable_wound = /datum/wound/brute/bone/severe
+
+/datum/surgery/repair_bone_hairline/can_start(mob/living/user, mob/living/carbon/target)
+ if(..())
+ var/obj/item/bodypart/targeted_bodypart = target.get_bodypart(user.zone_selected)
+ return(targeted_bodypart.get_wound_type(targetable_wound))
+
+
+///// Repair Compound Fracture (Critical)
+/datum/surgery/repair_bone_compound
+ name = "Repair Compound Fracture"
+ steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/reset_compound_fracture, /datum/surgery_step/repair_bone_compound, /datum/surgery_step/close)
+ target_mobtypes = list(/mob/living/carbon/human)
+ possible_locs = list(BODY_ZONE_R_ARM,BODY_ZONE_L_ARM,BODY_ZONE_R_LEG,BODY_ZONE_L_LEG,BODY_ZONE_CHEST,BODY_ZONE_HEAD)
+ requires_real_bodypart = TRUE
+ targetable_wound = /datum/wound/brute/bone/critical
+
+/datum/surgery/repair_bone_compound/can_start(mob/living/user, mob/living/carbon/target)
+ if(..())
+ var/obj/item/bodypart/targeted_bodypart = target.get_bodypart(user.zone_selected)
+ return(targeted_bodypart.get_wound_type(targetable_wound))
+
+
+
+//SURGERY STEPS
+
+///// Repair Hairline Fracture (Severe)
+/datum/surgery_step/repair_bone_hairline
+ name = "repair hairline fracture (bonesetter/bone gel/tape)"
+ implements = list(/obj/item/bonesetter = 100, /obj/item/stack/medical/bone_gel = 100, /obj/item/stack/sticky_tape/surgical = 100, /obj/item/stack/sticky_tape/super = 50, /obj/item/stack/sticky_tape = 30)
+ time = 40
+
+/datum/surgery_step/repair_bone_hairline/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ if(surgery.operated_wound)
+ display_results(user, target, "You begin to repair the fracture in [target]'s [parse_zone(user.zone_selected)]...",
+ "[user] begins to repair the fracture in [target]'s [parse_zone(user.zone_selected)] with [tool].",
+ "[user] begins to repair the fracture in [target]'s [parse_zone(user.zone_selected)].")
+ else
+ user.visible_message("[user] looks for [target]'s [parse_zone(user.zone_selected)].", "You look for [target]'s [parse_zone(user.zone_selected)]...")
+
+/datum/surgery_step/repair_bone_hairline/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE)
+ if(surgery.operated_wound)
+ if(istype(tool, /obj/item/stack))
+ var/obj/item/stack/used_stack = tool
+ used_stack.use(1)
+ display_results(user, target, "You successfully repair the fracture in [target]'s [parse_zone(target_zone)].",
+ "[user] successfully repairs the fracture in [target]'s [parse_zone(target_zone)] with [tool]!",
+ "[user] successfully repairs the fracture in [target]'s [parse_zone(target_zone)]!")
+ log_combat(user, target, "repaired a hairline fracture in", addition="INTENT: [uppertext(user.a_intent)]")
+ qdel(surgery.operated_wound)
+ else
+ to_chat(user, "[target] has no hairline fracture there!")
+ return ..()
+
+/datum/surgery_step/repair_bone_hairline/failure(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, var/fail_prob = 0)
+ ..()
+ if(istype(tool, /obj/item/stack))
+ var/obj/item/stack/used_stack = tool
+ used_stack.use(1)
+
+
+
+///// Reset Compound Fracture (Crticial)
+/datum/surgery_step/reset_compound_fracture
+ name = "reset bone"
+ implements = list(/obj/item/bonesetter = 100, /obj/item/stack/sticky_tape/surgical = 60, /obj/item/stack/sticky_tape/super = 40, /obj/item/stack/sticky_tape = 20)
+ time = 40
+
+/datum/surgery_step/reset_compound_fracture/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ if(surgery.operated_wound)
+ display_results(user, target, "You begin to reset the bone in [target]'s [parse_zone(user.zone_selected)]...",
+ "[user] begins to reset the bone in [target]'s [parse_zone(user.zone_selected)] with [tool].",
+ "[user] begins to reset the bone in [target]'s [parse_zone(user.zone_selected)].")
+ else
+ user.visible_message("[user] looks for [target]'s [parse_zone(user.zone_selected)].", "You look for [target]'s [parse_zone(user.zone_selected)]...")
+
+/datum/surgery_step/reset_compound_fracture/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE)
+ if(surgery.operated_wound)
+ if(istype(tool, /obj/item/stack))
+ var/obj/item/stack/used_stack = tool
+ used_stack.use(1)
+ display_results(user, target, "You successfully reset the bone in [target]'s [parse_zone(target_zone)].",
+ "[user] successfully resets the bone in [target]'s [parse_zone(target_zone)] with [tool]!",
+ "[user] successfully resets the bone in [target]'s [parse_zone(target_zone)]!")
+ log_combat(user, target, "reset a compound fracture in", addition="INTENT: [uppertext(user.a_intent)]")
+ else
+ to_chat(user, "[target] has no compound fracture there!")
+ return ..()
+
+/datum/surgery_step/reset_compound_fracture/failure(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, var/fail_prob = 0)
+ ..()
+ if(istype(tool, /obj/item/stack))
+ var/obj/item/stack/used_stack = tool
+ used_stack.use(1)
+
+
+///// Repair Compound Fracture (Crticial)
+/datum/surgery_step/repair_bone_compound
+ name = "repair compound fracture (bone gel/tape)"
+ implements = list(/obj/item/stack/medical/bone_gel = 100, /obj/item/stack/sticky_tape/surgical = 100, /obj/item/stack/sticky_tape/super = 50, /obj/item/stack/sticky_tape = 30)
+ time = 40
+
+/datum/surgery_step/repair_bone_compound/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ if(surgery.operated_wound)
+ display_results(user, target, "You begin to repair the fracture in [target]'s [parse_zone(user.zone_selected)]...",
+ "[user] begins to repair the fracture in [target]'s [parse_zone(user.zone_selected)] with [tool].",
+ "[user] begins to repair the fracture in [target]'s [parse_zone(user.zone_selected)].")
+ else
+ user.visible_message("[user] looks for [target]'s [parse_zone(user.zone_selected)].", "You look for [target]'s [parse_zone(user.zone_selected)]...")
+
+/datum/surgery_step/repair_bone_compound/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE)
+ if(surgery.operated_wound)
+ if(istype(tool, /obj/item/stack))
+ var/obj/item/stack/used_stack = tool
+ used_stack.use(1)
+ display_results(user, target, "You successfully repair the fracture in [target]'s [parse_zone(target_zone)].",
+ "[user] successfully repairs the fracture in [target]'s [parse_zone(target_zone)] with [tool]!",
+ "[user] successfully repairs the fracture in [target]'s [parse_zone(target_zone)]!")
+ log_combat(user, target, "repaired a compound fracture in", addition="INTENT: [uppertext(user.a_intent)]")
+ qdel(surgery.operated_wound)
+ else
+ to_chat(user, "[target] has no compound fracture there!")
+ return ..()
+
+/datum/surgery_step/repair_bone_compound/failure(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, var/fail_prob = 0)
+ ..()
+ if(istype(tool, /obj/item/stack))
+ var/obj/item/stack/used_stack = tool
+ used_stack.use(1)
diff --git a/code/modules/surgery/burn_dressing.dm b/code/modules/surgery/burn_dressing.dm
new file mode 100644
index 0000000000..1688f7b5d1
--- /dev/null
+++ b/code/modules/surgery/burn_dressing.dm
@@ -0,0 +1,106 @@
+
+/////BURN FIXING SURGERIES//////
+
+///// Debride burnt flesh
+/datum/surgery/debride
+ name = "Debride infected flesh"
+ steps = list(/datum/surgery_step/debride, /datum/surgery_step/dress)
+ target_mobtypes = list(/mob/living/carbon/human)
+ possible_locs = list(BODY_ZONE_R_ARM,BODY_ZONE_L_ARM,BODY_ZONE_R_LEG,BODY_ZONE_L_LEG,BODY_ZONE_CHEST,BODY_ZONE_HEAD)
+ requires_real_bodypart = TRUE
+ targetable_wound = /datum/wound/burn
+
+/datum/surgery/debride/can_start(mob/living/user, mob/living/carbon/target)
+ if(..())
+ var/obj/item/bodypart/targeted_bodypart = target.get_bodypart(user.zone_selected)
+ var/datum/wound/burn/burn_wound = targeted_bodypart.get_wound_type(targetable_wound)
+ return(burn_wound && burn_wound.infestation > 0)
+
+//SURGERY STEPS
+
+///// Debride
+/datum/surgery_step/debride
+ name = "excise infection"
+ implements = list(TOOL_HEMOSTAT = 100, TOOL_SCALPEL = 85, TOOL_SAW = 60, TOOL_WIRECUTTER = 40)
+ time = 30
+ repeatable = TRUE
+
+/datum/surgery_step/debride/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ if(surgery.operated_wound)
+ var/datum/wound/burn/burn_wound = surgery.operated_wound
+ if(burn_wound.infestation <= 0)
+ to_chat(user, "[target]'s [parse_zone(user.zone_selected)] has no infected flesh to remove!")
+ surgery.status++
+ repeatable = FALSE
+ return
+ display_results(user, target, "You begin to excise infected flesh from [target]'s [parse_zone(user.zone_selected)]...",
+ "[user] begins to excise infected flesh from [target]'s [parse_zone(user.zone_selected)] with [tool].",
+ "[user] begins to excise infected flesh from [target]'s [parse_zone(user.zone_selected)].")
+ else
+ user.visible_message("[user] looks for [target]'s [parse_zone(user.zone_selected)].", "You look for [target]'s [parse_zone(user.zone_selected)]...")
+
+/datum/surgery_step/debride/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE)
+ var/datum/wound/burn/burn_wound = surgery.operated_wound
+ if(burn_wound)
+ display_results(user, target, "You successfully excise some of the infected flesh from [target]'s [parse_zone(target_zone)].",
+ "[user] successfully excises some of the infected flesh from [target]'s [parse_zone(target_zone)] with [tool]!",
+ "[user] successfully excises some of the infected flesh from [target]'s [parse_zone(target_zone)]!")
+ log_combat(user, target, "excised infected flesh in", addition="INTENT: [uppertext(user.a_intent)]")
+ surgery.operated_bodypart.receive_damage(brute=3, wound_bonus=CANT_WOUND)
+ burn_wound.infestation -= 0.5
+ burn_wound.sanitization += 0.5
+ if(burn_wound.infestation <= 0)
+ repeatable = FALSE
+ else
+ to_chat(user, "[target] has no infected flesh there!")
+ return ..()
+
+/datum/surgery_step/debride/failure(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, var/fail_prob = 0)
+ ..()
+ display_results(user, target, "You carve away some of the healthy flesh from [target]'s [parse_zone(target_zone)].",
+ "[user] carves away some of the healthy flesh from [target]'s [parse_zone(target_zone)] with [tool]!",
+ "[user] carves away some of the healthy flesh from [target]'s [parse_zone(target_zone)]!")
+ surgery.operated_bodypart.receive_damage(brute=rand(4,8), sharpness=TRUE)
+
+/datum/surgery_step/debride/initiate(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, try_to_fail = FALSE)
+ if(!..())
+ return
+ var/datum/wound/burn/burn_wound = surgery.operated_wound
+ while(burn_wound && burn_wound.infestation > 0.25)
+ if(!..())
+ break
+
+///// Dressing burns
+/datum/surgery_step/dress
+ name = "bandage burns"
+ implements = list(/obj/item/stack/medical/gauze = 100, /obj/item/stack/sticky_tape/surgical = 100)
+ time = 40
+
+/datum/surgery_step/dress/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ var/datum/wound/burn/burn_wound = surgery.operated_wound
+ if(burn_wound)
+ display_results(user, target, "You begin to dress the burns on [target]'s [parse_zone(user.zone_selected)]...",
+ "[user] begins to dress the burns on [target]'s [parse_zone(user.zone_selected)] with [tool].",
+ "[user] begins to dress the burns on [target]'s [parse_zone(user.zone_selected)].")
+ else
+ user.visible_message("[user] looks for [target]'s [parse_zone(user.zone_selected)].", "You look for [target]'s [parse_zone(user.zone_selected)]...")
+
+/datum/surgery_step/dress/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE)
+ var/datum/wound/burn/burn_wound = surgery.operated_wound
+ if(burn_wound)
+ display_results(user, target, "You successfully wrap [target]'s [parse_zone(target_zone)] with [tool].",
+ "[user] successfully wraps [target]'s [parse_zone(target_zone)] with [tool]!",
+ "[user] successfully wraps [target]'s [parse_zone(target_zone)]!")
+ log_combat(user, target, "dressed burns in", addition="INTENT: [uppertext(user.a_intent)]")
+ burn_wound.sanitization += 3
+ burn_wound.flesh_healing += 5
+ burn_wound.force_bandage(tool)
+ else
+ to_chat(user, "[target] has no burns there!")
+ return ..()
+
+/datum/surgery_step/dress/failure(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, var/fail_prob = 0)
+ ..()
+ if(istype(tool, /obj/item/stack))
+ var/obj/item/stack/used_stack = tool
+ used_stack.use(1)
diff --git a/code/modules/surgery/coronary_bypass.dm b/code/modules/surgery/coronary_bypass.dm
index af736e393c..d1d478ddfe 100644
--- a/code/modules/surgery/coronary_bypass.dm
+++ b/code/modules/surgery/coronary_bypass.dm
@@ -31,7 +31,8 @@
display_results(user, target, "Blood pools around the incision in [H]'s heart.",
"Blood pools around the incision in [H]'s heart.",
"")
- H.bleed_rate += 10
+ var/obj/item/bodypart/BP = H.get_bodypart(target_zone)
+ BP.generic_bleedstacks += 10
H.adjustBruteLoss(10)
return TRUE
@@ -41,7 +42,8 @@
display_results(user, target, "You screw up, cutting too deeply into the heart!",
"[user] screws up, causing blood to spurt out of [H]'s chest!",
"[user] screws up, causing blood to spurt out of [H]'s chest!")
- H.bleed_rate += 20
+ var/obj/item/bodypart/BP = H.get_bodypart(target_zone)
+ BP.generic_bleedstacks += 10
H.adjustOrganLoss(ORGAN_SLOT_HEART, 10)
H.adjustBruteLoss(10)
@@ -73,5 +75,6 @@
"[user] screws up, causing blood to spurt out of [H]'s chest profusely!",
"[user] screws up, causing blood to spurt out of [H]'s chest profusely!")
H.adjustOrganLoss(ORGAN_SLOT_HEART, 20)
- H.bleed_rate += 30
+ var/obj/item/bodypart/BP = H.get_bodypart(target_zone)
+ BP.generic_bleedstacks += 30
return FALSE
diff --git a/code/modules/surgery/emergency_cardioversion_recovery.dm b/code/modules/surgery/emergency_cardioversion_recovery.dm
index 5646c43f00..5df90c5e80 100644
--- a/code/modules/surgery/emergency_cardioversion_recovery.dm
+++ b/code/modules/surgery/emergency_cardioversion_recovery.dm
@@ -6,13 +6,13 @@
/datum/surgery_step/ventricular_electrotherapy
name = "ventricular electrotherapy"
- implements = list(/obj/item/twohanded/shockpaddles = 90, /obj/item/defibrillator = 75, /obj/item/inducer = 55, /obj/item/stock_parts/cell = 25) //Just because the idea of a new player using the whole magine to defib is hillarious to me
+ implements = list(/obj/item/shockpaddles = 90, /obj/item/defibrillator = 75, /obj/item/inducer = 55, /obj/item/stock_parts/cell = 25) //Just because the idea of a new player using the whole magine to defib is hillarious to me
time = 50
repeatable = TRUE //So you can retry
/datum/surgery_step/ventricular_electrotherapy/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- if(istype(tool, /obj/item/twohanded/shockpaddles))
- var/obj/item/twohanded/shockpaddles/pads = tool
+ if(istype(tool, /obj/item/shockpaddles))
+ var/obj/item/shockpaddles/pads = tool
if(!pads.wielded)
to_chat(user, "You need to wield the paddles in both hands before you can use them!")
return FALSE
@@ -23,8 +23,8 @@
playsound(src, 'sound/machines/defib_charge.ogg', 75, 0)
/datum/surgery_step/ventricular_electrotherapy/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- if(istype(tool, /obj/item/twohanded/shockpaddles))
- var/obj/item/twohanded/shockpaddles/pads = tool
+ if(istype(tool, /obj/item/shockpaddles))
+ var/obj/item/shockpaddles/pads = tool
if(!pads.wielded)
return FALSE
var/mob/living/carbon/human/H = target
@@ -52,7 +52,7 @@
H.adjustOrganLoss(ORGAN_SLOT_BRAIN, -5)
H.electrocute_act(0, (tool), 1, SHOCK_ILLUSION)
//If we're using a defib, let the defib handle the revive.
- if(istype(tool, /obj/item/twohanded/shockpaddles))
+ if(istype(tool, /obj/item/shockpaddles))
return
//Otherwise, we're ad hocing it
if(!(do_after(user, 50, target = target)))
diff --git a/code/modules/surgery/experimental_dissection.dm b/code/modules/surgery/experimental_dissection.dm
index 6110bb6202..b9d877d0c1 100644
--- a/code/modules/surgery/experimental_dissection.dm
+++ b/code/modules/surgery/experimental_dissection.dm
@@ -78,7 +78,7 @@
"[user] dissects [target]!")
SSresearch.science_tech.add_point_list(list(TECHWEB_POINT_TYPE_GENERIC = points_earned))
var/obj/item/bodypart/L = target.get_bodypart(BODY_ZONE_CHEST)
- target.apply_damage(80, BRUTE, L)
+ target.apply_damage(80, BRUTE, L, wound_bonus=CANT_WOUND)
ADD_TRAIT(target, TRAIT_DISSECTED, "[surgery.name]")
repeatable = FALSE
return TRUE
@@ -89,7 +89,7 @@
"[user] dissects [target], but looks a little dissapointed.")
SSresearch.science_tech.add_point_list(list(TECHWEB_POINT_TYPE_GENERIC = (round(check_value(target, surgery) * 0.01))))
var/obj/item/bodypart/L = target.get_bodypart(BODY_ZONE_CHEST)
- target.apply_damage(80, BRUTE, L)
+ target.apply_damage(80, BRUTE, L, wound_bonus=CANT_WOUND)
return TRUE
/datum/surgery/advanced/experimental_dissection/adv
diff --git a/code/modules/surgery/healing.dm b/code/modules/surgery/healing.dm
index 4069199864..0680dda404 100644
--- a/code/modules/surgery/healing.dm
+++ b/code/modules/surgery/healing.dm
@@ -87,7 +87,7 @@
urdamageamt_brute += round((target.getBruteLoss()/ (missinghpbonus*2)),0.1)
urdamageamt_burn += round((target.getFireLoss()/ (missinghpbonus*2)),0.1)
- target.take_bodypart_damage(urdamageamt_brute, urdamageamt_burn)
+ target.take_bodypart_damage(urdamageamt_brute, urdamageamt_burn, wound_bonus=CANT_WOUND)
return FALSE
/***************************BRUTE***************************/
diff --git a/code/modules/surgery/organ_manipulation.dm b/code/modules/surgery/organ_manipulation.dm
index f493137424..4ce51ae119 100644
--- a/code/modules/surgery/organ_manipulation.dm
+++ b/code/modules/surgery/organ_manipulation.dm
@@ -61,7 +61,7 @@
time = 64
name = "manipulate organs"
repeatable = 1
- implements = list(/obj/item/organ = 100, /obj/item/reagent_containers/food/snacks/organ = 0, /obj/item/organ_storage = 100)
+ implements = list(/obj/item/organ = 100, /obj/item/organ_storage = 100)
var/implements_extract = list(TOOL_HEMOSTAT = 100, TOOL_CROWBAR = 55)
var/current_type
var/obj/item/organ/I = null
@@ -85,6 +85,10 @@
if(target_zone != I.zone || target.getorganslot(I.slot))
to_chat(user, "There is no room for [I] in [target]'s [parse_zone(target_zone)]!")
return -1
+ var/obj/item/organ/meatslab = tool
+ if(!meatslab.useable)
+ to_chat(user, "[I] seems to have been chewed on, you can't use this!")
+ return -1
display_results(user, target, "You begin to insert [tool] into [target]'s [parse_zone(target_zone)]...",
"[user] begins to insert [tool] into [target]'s [parse_zone(target_zone)].",
"[user] begins to insert something into [target]'s [parse_zone(target_zone)].")
@@ -111,9 +115,6 @@
else
return -1
- else if(istype(tool, /obj/item/reagent_containers/food/snacks/organ))
- to_chat(user, "[tool] was bitten by someone! It's too damaged to use!")
- return -1
/datum/surgery_step/manipulate_organs/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
if(current_type == "insert")
if(istype(tool, /obj/item/organ_storage))
diff --git a/code/modules/surgery/organic_steps.dm b/code/modules/surgery/organic_steps.dm
index 3b05873a0a..8e893875a9 100644
--- a/code/modules/surgery/organic_steps.dm
+++ b/code/modules/surgery/organic_steps.dm
@@ -21,7 +21,9 @@
display_results(user, target, "Blood pools around the incision in [H]'s [parse_zone(target_zone)].",
"Blood pools around the incision in [H]'s [parse_zone(target_zone)].",
"")
- H.bleed_rate += 3
+ var/obj/item/bodypart/BP = target.get_bodypart(target_zone)
+ if(BP)
+ BP.generic_bleedstacks += 10
return TRUE
/datum/surgery_step/incise/nobleed //silly friendly!
@@ -50,7 +52,9 @@
target.heal_bodypart_damage(20,0)
if (ishuman(target))
var/mob/living/carbon/human/H = target
- H.bleed_rate = max( (H.bleed_rate - 3), 0)
+ var/obj/item/bodypart/BP = H.get_bodypart(target_zone)
+ if(BP)
+ BP.generic_bleedstacks -= 3
return ..()
//retract skin
/datum/surgery_step/retract_skin
@@ -86,12 +90,14 @@
target.heal_bodypart_damage(45,0)
if (ishuman(target))
var/mob/living/carbon/human/H = target
- H.bleed_rate = max( (H.bleed_rate - 3), 0)
+ var/obj/item/bodypart/BP = H.get_bodypart(target_zone)
+ if(BP)
+ BP.generic_bleedstacks -= 3
return ..()
//saw bone
/datum/surgery_step/saw
name = "saw bone"
- implements = list(TOOL_SAW = 100, /obj/item/melee/arm_blade = 75, /obj/item/twohanded/fireaxe = 50, /obj/item/hatchet = 35, /obj/item/kitchen/knife/butcher = 25)
+ implements = list(TOOL_SAW = 100, /obj/item/melee/arm_blade = 75, /obj/item/fireaxe = 50, /obj/item/hatchet = 35, /obj/item/kitchen/knife/butcher = 25)
time = 54
/datum/surgery_step/saw/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
@@ -100,7 +106,7 @@
"[user] begins to saw through the bone in [target]'s [parse_zone(target_zone)].")
/datum/surgery_step/saw/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- target.apply_damage(50, BRUTE, "[target_zone]")
+ target.apply_damage(50, BRUTE, "[target_zone]", wound_bonus=CANT_WOUND)
display_results(user, target, "You saw [target]'s [parse_zone(target_zone)] open.",
"[user] saws [target]'s [parse_zone(target_zone)] open!",
"[user] saws [target]'s [parse_zone(target_zone)] open!")
diff --git a/code/modules/surgery/organs/appendix.dm b/code/modules/surgery/organs/appendix.dm
index c737e8bc30..782991d79c 100644
--- a/code/modules/surgery/organs/appendix.dm
+++ b/code/modules/surgery/organs/appendix.dm
@@ -37,9 +37,3 @@
..()
if(inflamed)
M.ForceContractDisease(new /datum/disease/appendicitis(), FALSE, TRUE)
-
-/obj/item/organ/appendix/prepare_eat()
- var/obj/S = ..()
- if(inflamed)
- S.reagents.add_reagent(/datum/reagent/toxin/bad_food, 5)
- return S
diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm
index b7dfa3eb88..b42770723b 100644
--- a/code/modules/surgery/organs/augments_arms.dm
+++ b/code/modules/surgery/organs/augments_arms.dm
@@ -132,6 +132,7 @@
"You extend [holder] from your [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm.",
"You hear a short mechanical noise.")
playsound(get_turf(owner), 'sound/mecha/mechmove03.ogg', 50, 1)
+ return TRUE
/obj/item/organ/cyberimp/arm/ui_action_click()
if(crit_fail || (organ_flags & ORGAN_FAILING) || (!holder && !contents.len))
@@ -273,12 +274,29 @@
desc = "A deployable riot shield to help deal with civil unrest."
contents = newlist(/obj/item/shield/riot/implant)
-/obj/item/organ/cyberimp/arm/shield/Extend(obj/item/I)
+/obj/item/organ/cyberimp/arm/shield/Extend(obj/item/I, silent = FALSE)
if(I.obj_integrity == 0) //that's how the shield recharge works
- to_chat(owner, "[I] is still too unstable to extend. Give it some time!")
+ if(!silent)
+ to_chat(owner, "[I] is still too unstable to extend. Give it some time!")
return FALSE
return ..()
+/obj/item/organ/cyberimp/arm/shield/Insert(mob/living/carbon/M, special = FALSE, drop_if_replaced = TRUE)
+ . = ..()
+ if(.)
+ RegisterSignal(M, COMSIG_LIVING_ACTIVE_BLOCK_START, .proc/on_signal)
+
+/obj/item/organ/cyberimp/arm/shield/Remove(special = FALSE)
+ UnregisterSignal(owner, COMSIG_LIVING_ACTIVE_BLOCK_START)
+ return ..()
+
+/obj/item/organ/cyberimp/arm/shield/proc/on_signal(datum/source, obj/item/blocking_item, list/other_items)
+ if(!blocking_item) //if they don't have something
+ var/obj/item/shield/S = locate() in contents
+ if(!Extend(S, TRUE))
+ return
+ other_items += S
+
/obj/item/organ/cyberimp/arm/shield/emag_act()
. = ..()
if(obj_flags & EMAGGED)
diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm
index 465c10c4cd..e251abfd35 100644
--- a/code/modules/surgery/organs/heart.dm
+++ b/code/modules/surgery/organs/heart.dm
@@ -61,10 +61,10 @@
return "a healthy"
return "an unstable"
-/obj/item/organ/heart/prepare_eat()
- var/obj/S = ..()
- S.icon_state = "[icon_base]-off"
- return S
+/obj/item/organ/heart/OnEatFrom(eater, feeder)
+ . = ..()
+ beating = FALSE
+ update_icon()
/obj/item/organ/heart/on_life()
. = ..()
diff --git a/code/modules/surgery/organs/liver.dm b/code/modules/surgery/organs/liver.dm
index b24034ca4a..f0f98a5fa5 100755
--- a/code/modules/surgery/organs/liver.dm
+++ b/code/modules/surgery/organs/liver.dm
@@ -23,6 +23,7 @@
var/toxLethality = LIVER_DEFAULT_TOX_LETHALITY//affects how much damage toxins do to the liver
var/filterToxins = TRUE //whether to filter toxins
var/cachedmoveCalc = 1
+ food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/iron = 5)
/obj/item/organ/liver/on_life()
. = ..()
@@ -44,11 +45,6 @@
if(damage > 10 && prob(damage/3))//the higher the damage the higher the probability
to_chat(owner, "You feel a dull pain in your abdomen.")
-/obj/item/organ/liver/prepare_eat()
- var/obj/S = ..()
- S.reagents.add_reagent(/datum/reagent/iron, 5)
- return S
-
/obj/item/organ/liver/applyOrganDamage(d, maximum = maxHealth)
. = ..()
if(!. || QDELETED(owner))
@@ -77,8 +73,8 @@
/obj/item/organ/liver/proc/sizeMoveMod(value, mob/living/carbon/C)
if(cachedmoveCalc == value)
return
- C.next_move_modifier /= cachedmoveCalc
- C.next_move_modifier *= value
+ C.action_cooldown_mod /= cachedmoveCalc
+ C.action_cooldown_mod *= value
cachedmoveCalc = value
/obj/item/organ/liver/fly
diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm
index b3020ae13f..e34fd8e8a9 100644
--- a/code/modules/surgery/organs/lungs.dm
+++ b/code/modules/surgery/organs/lungs.dm
@@ -24,6 +24,8 @@
now_fixed = "Your lungs seem to once again be able to hold air."
high_threshold_cleared = "The constriction around your chest loosens as your breathing calms down."
+ food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/medicine/salbutamol = 5)
+
//Breath damage
var/safe_oxygen_min = 16 // Minimum safe partial pressure of O2, in kPa
@@ -131,13 +133,11 @@
var/gas_breathed = 0
- var/list/breath_gases = breath.gases
-
//Partial pressures in our breath
- var/O2_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/oxygen])+(8*breath.get_breath_partial_pressure(breath_gases[/datum/gas/pluoxium]))
- var/N2_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/nitrogen])
- var/Toxins_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/plasma])
- var/CO2_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/carbon_dioxide])
+ var/O2_pp = breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/oxygen))+(8*breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/pluoxium)))
+ var/N2_pp = breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/nitrogen))
+ var/Toxins_pp = breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/plasma))
+ var/CO2_pp = breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/carbon_dioxide))
//-- OXY --//
@@ -145,7 +145,7 @@
//Too much oxygen! //Yes, some species may not like it.
if(safe_oxygen_max)
if((O2_pp > safe_oxygen_max) && safe_oxygen_max == 0) //I guess plasma men technically need to have a check.
- var/ratio = (breath_gases[/datum/gas/oxygen]/safe_oxygen_max) * 10
+ var/ratio = (breath.get_moles(/datum/gas/oxygen)/safe_oxygen_max) * 10
H.apply_damage_type(clamp(ratio, oxy_breath_dam_min, oxy_breath_dam_max), oxy_damage_type)
H.throw_alert("too_much_oxy", /obj/screen/alert/too_much_oxy)
@@ -168,18 +168,18 @@
//Too little oxygen!
if(safe_oxygen_min)
if(O2_pp < safe_oxygen_min)
- gas_breathed = handle_too_little_breath(H, O2_pp, safe_oxygen_min, breath_gases[/datum/gas/oxygen])
+ gas_breathed = handle_too_little_breath(H, O2_pp, safe_oxygen_min, breath.get_moles(/datum/gas/oxygen))
H.throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy)
else
H.failed_last_breath = FALSE
if(H.health >= H.crit_threshold)
H.adjustOxyLoss(-breathModifier) //More damaged lungs = slower oxy rate up to a factor of half
- gas_breathed = breath_gases[/datum/gas/oxygen]
+ gas_breathed = breath.get_moles(/datum/gas/oxygen)
H.clear_alert("not_enough_oxy")
//Exhale
- breath_gases[/datum/gas/oxygen] -= gas_breathed
- breath_gases[/datum/gas/carbon_dioxide] += gas_breathed
+ breath.adjust_moles(/datum/gas/oxygen, -gas_breathed)
+ breath.adjust_moles(/datum/gas/carbon_dioxide, gas_breathed)
gas_breathed = 0
//-- Nitrogen --//
@@ -187,7 +187,7 @@
//Too much nitrogen!
if(safe_nitro_max)
if(N2_pp > safe_nitro_max)
- var/ratio = (breath_gases[/datum/gas/nitrogen]/safe_nitro_max) * 10
+ var/ratio = (breath.get_moles(/datum/gas/nitrogen)/safe_nitro_max) * 10
H.apply_damage_type(clamp(ratio, nitro_breath_dam_min, nitro_breath_dam_max), nitro_damage_type)
H.throw_alert("too_much_nitro", /obj/screen/alert/too_much_nitro)
H.losebreath += 2
@@ -197,18 +197,18 @@
//Too little nitrogen!
if(safe_nitro_min)
if(N2_pp < safe_nitro_min)
- gas_breathed = handle_too_little_breath(H, N2_pp, safe_nitro_min, breath_gases[/datum/gas/nitrogen])
+ gas_breathed = handle_too_little_breath(H, N2_pp, safe_nitro_min, breath.get_moles(/datum/gas/nitrogen))
H.throw_alert("nitro", /obj/screen/alert/not_enough_nitro)
else
H.failed_last_breath = FALSE
if(H.health >= H.crit_threshold)
H.adjustOxyLoss(-breathModifier)
- gas_breathed = breath_gases[/datum/gas/nitrogen]
+ gas_breathed = breath.get_moles(/datum/gas/nitrogen)
H.clear_alert("nitro")
//Exhale
- breath_gases[/datum/gas/nitrogen] -= gas_breathed
- breath_gases[/datum/gas/carbon_dioxide] += gas_breathed
+ breath.adjust_moles(/datum/gas/nitrogen, -gas_breathed)
+ breath.adjust_moles(/datum/gas/carbon_dioxide, gas_breathed)
gas_breathed = 0
//-- CO2 --//
@@ -234,18 +234,18 @@
//Too little CO2!
if(safe_co2_min)
if(CO2_pp < safe_co2_min)
- gas_breathed = handle_too_little_breath(H, CO2_pp, safe_co2_min, breath_gases[/datum/gas/carbon_dioxide])
+ gas_breathed = handle_too_little_breath(H, CO2_pp, safe_co2_min, breath.get_moles(/datum/gas/carbon_dioxide))
H.throw_alert("not_enough_co2", /obj/screen/alert/not_enough_co2)
else
H.failed_last_breath = FALSE
if(H.health >= H.crit_threshold)
H.adjustOxyLoss(-breathModifier)
- gas_breathed = breath_gases[/datum/gas/carbon_dioxide]
+ gas_breathed = breath.get_moles(/datum/gas/carbon_dioxide)
H.clear_alert("not_enough_co2")
//Exhale
- breath_gases[/datum/gas/carbon_dioxide] -= gas_breathed
- breath_gases[/datum/gas/oxygen] += gas_breathed
+ breath.adjust_moles(/datum/gas/carbon_dioxide, -gas_breathed)
+ breath.adjust_moles(/datum/gas/oxygen, gas_breathed)
gas_breathed = 0
@@ -254,7 +254,7 @@
//Too much toxins!
if(safe_toxins_max)
if(Toxins_pp > safe_toxins_max)
- var/ratio = (breath_gases[/datum/gas/plasma]/safe_toxins_max) * 10
+ var/ratio = (breath.get_moles(/datum/gas/plasma)/safe_toxins_max) * 10
H.apply_damage_type(clamp(ratio, tox_breath_dam_min, tox_breath_dam_max), tox_damage_type)
H.throw_alert("too_much_tox", /obj/screen/alert/too_much_tox)
else
@@ -264,18 +264,18 @@
//Too little toxins!
if(safe_toxins_min)
if(Toxins_pp < safe_toxins_min)
- gas_breathed = handle_too_little_breath(H, Toxins_pp, safe_toxins_min, breath_gases[/datum/gas/plasma])
+ gas_breathed = handle_too_little_breath(H, Toxins_pp, safe_toxins_min, breath.get_moles(/datum/gas/plasma))
H.throw_alert("not_enough_tox", /obj/screen/alert/not_enough_tox)
else
H.failed_last_breath = FALSE
if(H.health >= H.crit_threshold)
H.adjustOxyLoss(-breathModifier)
- gas_breathed = breath_gases[/datum/gas/plasma]
+ gas_breathed = breath.get_moles(/datum/gas/plasma)
H.clear_alert("not_enough_tox")
//Exhale
- breath_gases[/datum/gas/plasma] -= gas_breathed
- breath_gases[/datum/gas/carbon_dioxide] += gas_breathed
+ breath.adjust_moles(/datum/gas/plasma, -gas_breathed)
+ breath.adjust_moles(/datum/gas/carbon_dioxide, gas_breathed)
gas_breathed = 0
@@ -285,7 +285,7 @@
// N2O
- var/SA_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/nitrous_oxide])
+ var/SA_pp = breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/nitrous_oxide))
if(SA_pp > SA_para_min) // Enough to make us stunned for a bit
H.Unconscious(60) // 60 gives them one second to wake up and run away a bit!
if(SA_pp > SA_sleep_min) // Enough to make us sleep as well
@@ -299,7 +299,7 @@
// BZ
- var/bz_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/bz])
+ var/bz_pp = breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/bz))
if(bz_pp > BZ_trip_balls_min)
H.hallucination += 10
H.reagents.add_reagent(/datum/reagent/bz_metabolites,5)
@@ -312,14 +312,14 @@
// Tritium
- var/trit_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/tritium])
+ var/trit_pp = breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/tritium))
if (trit_pp > 50)
H.radiation += trit_pp/2 //If you're breathing in half an atmosphere of radioactive gas, you fucked up.
else
H.radiation += trit_pp/10
// Nitryl
- var/nitryl_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/nitryl])
+ var/nitryl_pp = breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/nitryl))
if (prob(nitryl_pp))
to_chat(H, "Your mouth feels like it's burning!")
if (nitryl_pp >40)
@@ -330,22 +330,22 @@
H.silent = max(H.silent, 3)
else
H.adjustFireLoss(nitryl_pp/4)
- gas_breathed = breath_gases[/datum/gas/nitryl]
+ gas_breathed = breath.get_moles(/datum/gas/nitryl)
if (gas_breathed > gas_stimulation_min)
H.reagents.add_reagent(/datum/reagent/nitryl,1)
- breath_gases[/datum/gas/nitryl]-=gas_breathed
+ breath.adjust_moles(/datum/gas/nitryl, -gas_breathed)
// Stimulum
- gas_breathed = breath_gases[/datum/gas/stimulum]
+ gas_breathed = breath.get_moles(/datum/gas/stimulum)
if (gas_breathed > gas_stimulation_min)
var/existing = H.reagents.get_reagent_amount(/datum/reagent/stimulum)
H.reagents.add_reagent(/datum/reagent/stimulum, max(0, 5 - existing))
- breath_gases[/datum/gas/stimulum]-=gas_breathed
+ breath.adjust_moles(/datum/gas/stimulum, -gas_breathed)
// Miasma
- if (breath_gases[/datum/gas/miasma])
- var/miasma_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/miasma])
+ if (breath.get_moles(/datum/gas/miasma))
+ var/miasma_pp = breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/miasma))
if(miasma_pp > MINIMUM_MOLES_DELTA_TO_MOVE)
//Miasma sickness
@@ -385,14 +385,13 @@
// Then again, this is a purely hypothetical scenario and hardly reachable
owner.adjust_disgust(0.1 * miasma_pp)
- breath_gases[/datum/gas/miasma]-=gas_breathed
+ breath.adjust_moles(/datum/gas/miasma, -gas_breathed)
// Clear out moods when no miasma at all
else
SEND_SIGNAL(owner, COMSIG_CLEAR_MOOD_EVENT, "smell")
handle_breath_temperature(breath, H)
- GAS_GARBAGE_COLLECT(breath.gases)
return TRUE
@@ -414,7 +413,7 @@
/obj/item/organ/lungs/proc/handle_breath_temperature(datum/gas_mixture/breath, mob/living/carbon/human/H) // called by human/life, handles temperatures
- var/breath_temperature = breath.temperature
+ var/breath_temperature = breath.return_temperature()
if(!HAS_TRAIT(H, TRAIT_RESISTCOLD)) // COLD DAMAGE
var/cold_modifier = H.dna.species.coldmod
@@ -458,11 +457,6 @@
else if(!(organ_flags & ORGAN_FAILING))
failed = FALSE
-/obj/item/organ/lungs/prepare_eat()
- var/obj/S = ..()
- S.reagents.add_reagent(/datum/reagent/medicine/salbutamol, 5)
- return S
-
/obj/item/organ/lungs/ipc
name = "ipc lungs"
icon_state = "lungs-c"
@@ -536,8 +530,8 @@
/obj/item/organ/lungs/slime/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/H)
. = ..()
- if (breath && breath.gases[/datum/gas/plasma])
- var/plasma_pp = breath.get_breath_partial_pressure(breath.gases[/datum/gas/plasma])
+ if (breath)
+ var/plasma_pp = breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/plasma))
owner.blood_volume += (0.2 * plasma_pp) // 10/s when breathing literally nothing but plasma, which will suffocate you.
/obj/item/organ/lungs/yamerol
diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm
index 761ebc17a2..cb4de69fbd 100644
--- a/code/modules/surgery/organs/organ_internal.dm
+++ b/code/modules/surgery/organs/organ_internal.dm
@@ -8,7 +8,7 @@
var/zone = BODY_ZONE_CHEST
var/slot
// DO NOT add slots with matching names to different zones - it will break internal_organs_slot list!
- var/organ_flags = NONE
+ var/organ_flags = ORGAN_EDIBLE
var/maxHealth = STANDARD_ORGAN_THRESHOLD
var/damage = 0 //total damage this organ has sustained
///Healing factor and decay factor function on % of maxhealth, and do not work by applying a static number per tick
@@ -25,7 +25,23 @@
var/now_fixed
var/high_threshold_cleared
var/low_threshold_cleared
- rad_flags = RAD_NO_CONTAMINATE
+
+ ///When you take a bite you cant jam it in for surgery anymore.
+ var/useable = TRUE
+ var/list/food_reagents = list(/datum/reagent/consumable/nutriment = 5)
+
+/obj/item/organ/Initialize()
+ . = ..()
+ if(organ_flags & ORGAN_EDIBLE)
+ AddComponent(/datum/component/edible, food_reagents, null, RAW | MEAT | GROSS, null, 10, null, null, null, CALLBACK(src, .proc/OnEatFrom))
+ START_PROCESSING(SSobj, src)
+
+/obj/item/organ/Destroy()
+ if(owner)
+ // The special flag is important, because otherwise mobs can die
+ // while undergoing transformation into different mobs.
+ Remove(TRUE)
+ return ..()
/obj/item/organ/proc/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE)
if(!iscarbon(M) || owner == M)
@@ -106,7 +122,7 @@
if(istype(loc, /turf/))//Only concern is adding an organ to a freezer when the area around it is cold.
var/turf/T = loc
var/datum/gas_mixture/enviro = T.return_air()
- local_temp = enviro.temperature
+ local_temp = enviro.return_temperature()
else if(!owner && ismob(loc))
var/mob/M = loc
@@ -116,7 +132,7 @@
return TRUE
var/turf/T = M.loc
var/datum/gas_mixture/enviro = T.return_air()
- local_temp = enviro.temperature
+ local_temp = enviro.return_temperature()
if(owner)
//Don't interfere with bodies frozen by structures.
@@ -157,47 +173,8 @@
if(damage > high_threshold)
. += "[src] is starting to look discolored."
-
-/obj/item/organ/proc/prepare_eat()
- var/obj/item/reagent_containers/food/snacks/organ/S = new
- S.name = name
- S.desc = desc
- S.icon = icon
- S.icon_state = icon_state
- S.w_class = w_class
-
- return S
-
-/obj/item/reagent_containers/food/snacks/organ
- name = "appendix"
- icon_state = "appendix"
- icon = 'icons/obj/surgery.dmi'
- list_reagents = list(/datum/reagent/consumable/nutriment = 5)
- foodtype = RAW | MEAT | GROSS
-
-
-/obj/item/organ/Initialize()
- . = ..()
- START_PROCESSING(SSobj, src)
-
-/obj/item/organ/Destroy()
- if(owner)
- // The special flag is important, because otherwise mobs can die
- // while undergoing transformation into different mobs.
- Remove(TRUE)
- return ..()
-
-/obj/item/organ/attack(mob/living/carbon/M, mob/user)
- if(M == user && ishuman(user))
- var/mob/living/carbon/human/H = user
- if(status == ORGAN_ORGANIC)
- var/obj/item/reagent_containers/food/snacks/S = prepare_eat()
- if(S)
- qdel(src)
- if(H.put_in_active_hand(S))
- S.attack(H, H)
- else
- ..()
+/obj/item/organ/proc/OnEatFrom(eater, feeder)
+ useable = FALSE //You can't use it anymore after eating it you spaztic
/obj/item/organ/item_action_slot_check(slot,mob/user)
return //so we don't grant the organ's action to mobs who pick up the organ.
diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm
index f8547dda6e..1c4a2d3043 100644
--- a/code/modules/surgery/organs/tongue.dm
+++ b/code/modules/surgery/organs/tongue.dm
@@ -252,6 +252,7 @@
name = "robotic voicebox"
desc = "A voice synthesizer that can interface with organic lifeforms."
status = ORGAN_ROBOTIC
+ organ_flags = ORGAN_NO_SPOIL
icon_state = "tonguerobot"
say_mod = "states"
attack_verb = list("beeped", "booped")
diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm
index 65e53df26f..b6b74efe32 100644
--- a/code/modules/surgery/organs/vocal_cords.dm
+++ b/code/modules/surgery/organs/vocal_cords.dm
@@ -254,7 +254,6 @@
var/static/regex/clap_words = regex("clap|applaud")
var/static/regex/honk_words = regex("ho+nk") //hooooooonk
var/static/regex/multispin_words = regex("like a record baby|right round")
- var/static/regex/orgasm_words = regex("cum|orgasm|climax|squirt|heyo") //CITADEL CHANGE
var/static/regex/dab_words = regex("dab|mood") //CITADEL CHANGE
var/static/regex/snap_words = regex("snap") //CITADEL CHANGE
var/static/regex/bwoink_words = regex("what the fuck are you doing|bwoink|hey you got a moment?") //CITADEL CHANGE
@@ -319,13 +318,14 @@
cooldown = COOLDOWN_DAMAGE
for(var/V in listeners)
var/mob/living/L = V
- L.apply_damage(15 * power_multiplier, def_zone = BODY_ZONE_CHEST)
+ L.apply_damage(15 * power_multiplier, def_zone = BODY_ZONE_CHEST, wound_bonus=CANT_WOUND)
//BLEED
else if((findtext(message, bleed_words)))
cooldown = COOLDOWN_DAMAGE
for(var/mob/living/carbon/human/H in listeners)
- H.bleed_rate += (5 * power_multiplier)
+ var/obj/item/bodypart/BP = pick(H.bodyparts)
+ BP.generic_bleedstacks += 5
//FIRE
else if((findtext(message, burn_words)))
@@ -572,16 +572,6 @@
var/mob/living/L = V
L.SpinAnimation(speed = 10, loops = 5)
- //CITADEL CHANGES
- //ORGASM
- else if((findtext(message, orgasm_words)))
- cooldown = COOLDOWN_MEME
- for(var/V in listeners)
- var/mob/living/carbon/human/H = V
-
- if(H.client && H.client.prefs && H.client.prefs.cit_toggles & HYPNO) // probably a redundant check but for good measure
- H.mob_climax(forced_climax=TRUE)
-
//DAB
else if((findtext(message, dab_words)))
cooldown = COOLDOWN_DAMAGE
@@ -765,7 +755,6 @@
var/static/regex/forget_words = regex("forget|muddled|awake and forget")
var/static/regex/attract_words = regex("come here|come to me|get over here|attract")
//phase 2
- var/static/regex/orgasm_words = regex("cum|orgasm|climax|squirt|heyo") //wah, lewd
var/static/regex/awoo_words = regex("howl|awoo|bark")
var/static/regex/nya_words = regex("nya|meow|mewl")
var/static/regex/sleep_words = regex("sleep|slumber|rest")
@@ -1092,28 +1081,6 @@
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "You are drawn towards [user]!"), 5)
to_chat(user, "You draw [L] towards you!")
-
- //teir 2
-
- /* removed for now
- //ORGASM
- else if((findtext(message, orgasm_words)))
- for(var/V in listeners)
- var/mob/living/carbon/human/H = V
- var/datum/status_effect/chem/enthrall/E = H.has_status_effect(/datum/status_effect/chem/enthrall)
- if(E.phase > 1)
- if(E.lewd) // probably a redundant check but for good measure
- addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "Your [E.enthrallGender] pushes you over the limit, overwhelming your body with pleasure."), 5)
- H.mob_climax(forced_climax=TRUE)
- H.SetStun(20)
- E.resistanceTally = 0 //makes resistance 0, but resets arousal, resistance buildup is faster unaroused (massively so).
- E.enthrallTally += power_multiplier
- E.cooldown += 6
- else
- H.throw_at(get_step_towards(user,H), 3 * power_multiplier, 1 * power_multiplier)
- */
-
-
//awoo
else if((findtext(message, awoo_words)))
for(var/V in listeners)
diff --git a/code/modules/surgery/prosthetic_replacement.dm b/code/modules/surgery/prosthetic_replacement.dm
index 62ce16e7e6..8eac5b7895 100644
--- a/code/modules/surgery/prosthetic_replacement.dm
+++ b/code/modules/surgery/prosthetic_replacement.dm
@@ -13,7 +13,7 @@
return 1
/datum/surgery_step/add_prosthetic
name = "add prosthetic"
- implements = list(/obj/item/bodypart = 100, /obj/item/organ_storage = 100, /obj/item/twohanded/required/chainsaw = 100, /obj/item/melee/synthetic_arm_blade = 100)
+ implements = list(/obj/item/bodypart = 100, /obj/item/organ_storage = 100, /obj/item/chainsaw = 100, /obj/item/melee/synthetic_arm_blade = 100)
time = 32
var/organ_rejection_dam = 0
/datum/surgery_step/add_prosthetic/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
@@ -79,7 +79,7 @@
"[user] finishes attaching [tool]!",
"[user] finishes the attachment procedure!")
qdel(tool)
- if(istype(tool, /obj/item/twohanded/required/chainsaw))
+ if(istype(tool, /obj/item/chainsaw))
var/obj/item/mounted_chainsaw/new_arm = new(target)
target_zone == BODY_ZONE_R_ARM ? target.put_in_r_hand(new_arm) : target.put_in_l_hand(new_arm)
return 1
diff --git a/code/modules/surgery/remove_embedded_object.dm b/code/modules/surgery/remove_embedded_object.dm
index 7d7cd2df63..f974c39bb4 100644
--- a/code/modules/surgery/remove_embedded_object.dm
+++ b/code/modules/surgery/remove_embedded_object.dm
@@ -23,12 +23,7 @@
var/objects = 0
for(var/obj/item/I in L.embedded_objects)
objects++
- I.forceMove(get_turf(H))
- L.embedded_objects -= I
- I.unembedded()
- if(!H.has_embedded_objects())
- H.clear_alert("embeddedobject")
- SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "embedded")
+ H.remove_embedded_object(I)
if(objects > 0)
display_results(user, target, "You successfully remove [objects] objects from [H]'s [L.name].",
diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm
index 51ce2726b0..4d42cb6c23 100644
--- a/code/modules/surgery/surgery.dm
+++ b/code/modules/surgery/surgery.dm
@@ -18,6 +18,8 @@
var/lying_required = TRUE //Does the vicitm needs to be lying down.
var/requires_tech = FALSE
var/replaced_by
+ var/datum/wound/operated_wound //The actual wound datum instance we're targeting
+ var/datum/wound/targetable_wound //The wound type this surgery targets
/datum/surgery/New(surgery_target, surgery_location, surgery_bodypart)
..()
@@ -28,8 +30,13 @@
location = surgery_location
if(surgery_bodypart)
operated_bodypart = surgery_bodypart
+ if(targetable_wound)
+ operated_wound = operated_bodypart.get_wound_type(targetable_wound)
+ operated_wound.attached_surgery = src
/datum/surgery/Destroy()
+ if(operated_wound)
+ operated_wound.attached_surgery = null
if(target)
target.surgeries -= src
target = null
diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm
index 584a0a189a..150016f570 100644
--- a/code/modules/surgery/tools.dm
+++ b/code/modules/surgery/tools.dm
@@ -166,6 +166,7 @@
sharpness = IS_SHARP_ACCURATE
tool_behaviour = TOOL_SCALPEL
toolspeed = 1
+ bare_wound_bonus = 20
/obj/item/scalpel/Initialize()
. = ..()
@@ -247,6 +248,8 @@
sharpness = IS_SHARP
tool_behaviour = TOOL_SAW
toolspeed = 1
+ wound_bonus = 10
+ bare_wound_bonus = 15
/obj/item/circular_saw/Initialize()
. = ..()
@@ -374,3 +377,18 @@
advanced_surgeries |= OC.advanced_surgeries
return TRUE
return
+
+/obj/item/bonesetter
+ name = "bonesetter"
+ desc = "For setting things right."
+ icon = 'icons/obj/surgery.dmi'
+ icon_state = "bone setter"
+ lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
+ custom_materials = list(/datum/material/iron=5000, /datum/material/glass=2500)
+ flags_1 = CONDUCT_1
+ item_flags = SURGICAL_TOOL
+ w_class = WEIGHT_CLASS_SMALL
+ attack_verb = list("corrected", "properly set")
+ tool_behaviour = TOOL_BONESET
+ toolspeed = 1
diff --git a/code/modules/tgui/external.dm b/code/modules/tgui/external.dm
index 38a5a27e0c..5de54c439c 100644
--- a/code/modules/tgui/external.dm
+++ b/code/modules/tgui/external.dm
@@ -1,133 +1,142 @@
- /**
- * tgui external
- *
- * Contains all external tgui declarations.
- **/
+/**
+ * tgui external
+ *
+ * Contains all external tgui declarations.
+ */
- /**
- * public
- *
- * Used to open and update UIs.
- * If this proc is not implemented properly, the UI will not update correctly.
- *
- * required user mob The mob who opened/is using the UI.
- * optional ui_key string The ui_key of the UI.
- * optional ui datum/tgui The UI to be updated, if it exists.
- * optional force_open bool If the UI should be re-opened instead of updated.
- * optional master_ui datum/tgui The parent UI.
- * optional state datum/ui_state The state used to determine status.
- **/
+/**
+ * public
+ *
+ * Used to open and update UIs.
+ * If this proc is not implemented properly, the UI will not update correctly.
+ *
+ * required user mob The mob who opened/is using the UI.
+ * optional ui_key string The ui_key of the UI.
+ * optional ui datum/tgui The UI to be updated, if it exists.
+ * optional force_open bool If the UI should be re-opened instead of updated.
+ * optional master_ui datum/tgui The parent UI.
+ * optional state datum/ui_state The state used to determine status.
+ */
/datum/proc/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
return FALSE // Not implemented.
- /**
- * public
- *
- * Data to be sent to the UI.
- * This must be implemented for a UI to work.
- *
- * required user mob The mob interacting with the UI.
- *
- * return list Data to be sent to the UI.
- **/
+/**
+ * public
+ *
+ * Data to be sent to the UI.
+ * This must be implemented for a UI to work.
+ *
+ * required user mob The mob interacting with the UI.
+ *
+ * return list Data to be sent to the UI.
+ */
/datum/proc/ui_data(mob/user)
return list() // Not implemented.
- /**
- * public
- *
- * Static Data to be sent to the UI.
- * Static data differs from normal data in that it's large data that should be sent infrequently
- * This is implemented optionally for heavy uis that would be sending a lot of redundant data
- * frequently.
- * Gets squished into one object on the frontend side, but the static part is cached.
- *
- * required user mob The mob interacting with the UI.
- *
- * return list Statuic Data to be sent to the UI.
- **/
+/**
+ * public
+ *
+ * Static Data to be sent to the UI.
+ * Static data differs from normal data in that it's large data that should be sent infrequently
+ * This is implemented optionally for heavy uis that would be sending a lot of redundant data
+ * frequently.
+ * Gets squished into one object on the frontend side, but the static part is cached.
+ *
+ * required user mob The mob interacting with the UI.
+ *
+ * return list Statuic Data to be sent to the UI.
+ */
/datum/proc/ui_static_data(mob/user)
return list()
/**
- * public
- *
- * Forces an update on static data. Should be done manually whenever something happens to change static data.
- *
- * required user the mob currently interacting with the ui
- * optional ui ui to be updated
- * optional ui_key ui key of ui to be updated
- *
-**/
+ * public
+ *
+ * Forces an update on static data. Should be done manually whenever something happens to change static data.
+ *
+ * required user the mob currently interacting with the ui
+ * optional ui ui to be updated
+ * optional ui_key ui key of ui to be updated
+ */
/datum/proc/update_static_data(mob/user, datum/tgui/ui, ui_key = "main")
ui = SStgui.try_update_ui(user, src, ui_key, ui)
+ // If there was no ui to update, there's no static data to update either.
if(!ui)
- return //If there was no ui to update, there's no static data to update either.
+ return
ui.push_data(null, ui_static_data(), TRUE)
- /**
- * public
- *
- * Called on a UI when the UI receieves a href.
- * Think of this as Topic().
- *
- * required action string The action/button that has been invoked by the user.
- * required params list A list of parameters attached to the button.
- *
- * return bool If the UI should be updated or not.
- **/
+/**
+ * public
+ *
+ * Called on a UI when the UI receieves a href.
+ * Think of this as Topic().
+ *
+ * required action string The action/button that has been invoked by the user.
+ * required params list A list of parameters attached to the button.
+ *
+ * return bool If the UI should be updated or not.
+ */
/datum/proc/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
+ // If UI is not interactive or usr calling Topic is not the UI user, bail.
if(!ui || ui.status != UI_INTERACTIVE)
- return 1 // If UI is not interactive or usr calling Topic is not the UI user, bail.
+ return 1
- /**
- * public
- *
- * Called on an object when a tgui object is being created, allowing you to customise the html
- * For example: inserting a custom stylesheet that you need in the head
- *
- * For this purpose, some tags are available in the html, to be parsed out with replacetext
- * (customheadhtml) - Additions to the head tag
- *
- * required html the html base text
- *
- **/
+/**
+ * public
+ *
+ * Called on an object when a tgui object is being created, allowing you to
+ * customise the html
+ * For example: inserting a custom stylesheet that you need in the head
+ *
+ * For this purpose, some tags are available in the html, to be parsed out
+ ^ with replacetext
+ * (customheadhtml) - Additions to the head tag
+ *
+ * required html the html base text
+ */
/datum/proc/ui_base_html(html)
return html
- /**
- * private
- *
- * The UI's host object (usually src_object).
- * This allows modules/datums to have the UI attached to them,
- * and be a part of another object.
- **/
+/**
+ * private
+ *
+ * The UI's host object (usually src_object).
+ * This allows modules/datums to have the UI attached to them,
+ * and be a part of another object.
+ */
/datum/proc/ui_host(mob/user)
return src // Default src.
- /**
- * global
- *
- * Used to track UIs for a mob.
- **/
-/mob/var/list/open_uis = list()
- /**
- * public
- *
- * Called on a UI's object when the UI is closed, not to be confused with client/verb/uiclose(), which closes the ui window
- *
- *
- **/
-/datum/proc/ui_close()
+/**
+ * global
+ *
+ * Associative list of JSON-encoded shared states that were set by
+ * tgui clients.
+ */
+/datum/var/list/tgui_shared_states
- /**
- * verb
- *
- * Called by UIs when they are closed.
- * Must be a verb so winset() can call it.
- *
- * required uiref ref The UI that was closed.
- **/
+/**
+ * global
+ *
+ * Used to track UIs for a mob.
+ */
+/mob/var/list/open_uis = list()
+/**
+ * public
+ *
+ * Called on a UI's object when the UI is closed, not to be confused with
+ * client/verb/uiclose(), which closes the ui window
+ */
+/datum/proc/ui_close(mob/user)
+
+/**
+ * verb
+ *
+ * Called by UIs when they are closed.
+ * Must be a verb so winset() can call it.
+ *
+ * required uiref ref The UI that was closed.
+ */
/client/verb/uiclose(ref as text)
// Name the verb, and hide it from the user panel.
set name = "uiclose"
diff --git a/code/modules/tgui/states.dm b/code/modules/tgui/states.dm
index 723e5f90ed..e626b98815 100644
--- a/code/modules/tgui/states.dm
+++ b/code/modules/tgui/states.dm
@@ -1,19 +1,19 @@
- /**
- * tgui states
- *
- * Base state and helpers for states. Just does some sanity checks, implement a state for in-depth checks.
- **/
+/**
+ * tgui states
+ *
+ * Base state and helpers for states. Just does some sanity checks, implement a state for in-depth checks.
+ */
- /**
- * public
- *
- * Checks the UI state for a mob.
- *
- * required user mob The mob who opened/is using the UI.
- * required state datum/ui_state The state to check.
- *
- * return UI_state The state of the UI.
- **/
+/**
+ * public
+ *
+ * Checks the UI state for a mob.
+ *
+ * required user mob The mob who opened/is using the UI.
+ * required state datum/ui_state The state to check.
+ *
+ * return UI_state The state of the UI.
+ */
/datum/proc/ui_status(mob/user, datum/ui_state/state)
var/src_object = ui_host(user)
. = UI_CLOSE
@@ -34,27 +34,27 @@
var/result = state.can_use_topic(src_object, user)
. = max(., result)
- /**
- * private
- *
- * Checks if a user can use src_object's UI, and returns the state.
- * Can call a mob proc, which allows overrides for each mob.
- *
- * required src_object datum The object/datum which owns the UI.
- * required user mob The mob who opened/is using the UI.
- *
- * return UI_state The state of the UI.
- **/
+/**
+ * private
+ *
+ * Checks if a user can use src_object's UI, and returns the state.
+ * Can call a mob proc, which allows overrides for each mob.
+ *
+ * required src_object datum The object/datum which owns the UI.
+ * required user mob The mob who opened/is using the UI.
+ *
+ * return UI_state The state of the UI.
+ */
/datum/ui_state/proc/can_use_topic(src_object, mob/user)
return UI_CLOSE // Don't allow interaction by default.
- /**
- * public
- *
- * Standard interaction/sanity checks. Different mob types may have overrides.
- *
- * return UI_state The state of the UI.
- **/
+/**
+ * public
+ *
+ * Standard interaction/sanity checks. Different mob types may have overrides.
+ *
+ * return UI_state The state of the UI.
+ */
/mob/proc/shared_ui_interaction(src_object)
if(!client) // Close UIs if mindless.
return UI_CLOSE
@@ -75,31 +75,31 @@
return ..()
/**
- * public
- *
- * Check the distance for a living mob.
- * Really only used for checks outside the context of a mob.
- * Otherwise, use shared_living_ui_distance().
- *
- * required src_object The object which owns the UI.
- * required user mob The mob who opened/is using the UI.
- *
- * return UI_state The state of the UI.
- **/
+ * public
+ *
+ * Check the distance for a living mob.
+ * Really only used for checks outside the context of a mob.
+ * Otherwise, use shared_living_ui_distance().
+ *
+ * required src_object The object which owns the UI.
+ * required user mob The mob who opened/is using the UI.
+ *
+ * return UI_state The state of the UI.
+ */
/atom/proc/contents_ui_distance(src_object, mob/living/user)
return user.shared_living_ui_distance(src_object) // Just call this mob's check.
- /**
- * public
- *
- * Distance versus interaction check.
- *
- * required src_object atom/movable The object which owns the UI.
- *
- * return UI_state The state of the UI.
- **/
-/mob/living/proc/shared_living_ui_distance(atom/movable/src_object)
- if(!(src_object in fov_view())) // If the object is obscured, close it.
+/**
+ * public
+ *
+ * Distance versus interaction check.
+ *
+ * required src_object atom/movable The object which owns the UI.
+ *
+ * return UI_state The state of the UI.
+ */
+/mob/living/proc/shared_living_ui_distance(atom/movable/src_object, viewcheck = TRUE)
+ if(viewcheck && !(src_object in view(src))) // If the object is obscured, close it.
return UI_CLOSE
var/dist = get_dist(src_object, src)
@@ -111,7 +111,7 @@
return UI_DISABLED
return UI_CLOSE // Otherwise, we got nothing.
-/mob/living/carbon/human/shared_living_ui_distance(atom/movable/src_object)
+/mob/living/carbon/human/shared_living_ui_distance(atom/movable/src_object, viewcheck = TRUE)
if(dna.check_mutation(TK) && tkMaxRangeCheck(src, src_object))
return UI_INTERACTIVE
return ..()
diff --git a/code/modules/tgui/states/admin.dm b/code/modules/tgui/states/admin.dm
index 945a864430..61fc373118 100644
--- a/code/modules/tgui/states/admin.dm
+++ b/code/modules/tgui/states/admin.dm
@@ -1,8 +1,8 @@
- /**
- * tgui state: admin_state
- *
- * Checks that the user is an admin, end-of-story.
- **/
+/**
+ * tgui state: admin_state
+ *
+ * Checks that the user is an admin, end-of-story.
+ */
GLOBAL_DATUM_INIT(admin_state, /datum/ui_state/admin_state, new)
diff --git a/code/modules/tgui/states/always.dm b/code/modules/tgui/states/always.dm
index b6c689d5d8..a741e2e3d4 100644
--- a/code/modules/tgui/states/always.dm
+++ b/code/modules/tgui/states/always.dm
@@ -1,9 +1,8 @@
-
- /**
- * tgui state: always_state
- *
- * Always grants the user UI_INTERACTIVE. Period.
- **/
+/**
+ * tgui state: always_state
+ *
+ * Always grants the user UI_INTERACTIVE. Period.
+ */
GLOBAL_DATUM_INIT(always_state, /datum/ui_state/always_state, new)
diff --git a/code/modules/tgui/states/conscious.dm b/code/modules/tgui/states/conscious.dm
index 4323c1391c..4e2793d130 100644
--- a/code/modules/tgui/states/conscious.dm
+++ b/code/modules/tgui/states/conscious.dm
@@ -1,8 +1,8 @@
- /**
- * tgui state: conscious_state
- *
- * Only checks if the user is conscious.
- **/
+/**
+ * tgui state: conscious_state
+ *
+ * Only checks if the user is conscious.
+ */
GLOBAL_DATUM_INIT(conscious_state, /datum/ui_state/conscious_state, new)
diff --git a/code/modules/tgui/states/contained.dm b/code/modules/tgui/states/contained.dm
index 7387f7e6cb..f02424d01e 100644
--- a/code/modules/tgui/states/contained.dm
+++ b/code/modules/tgui/states/contained.dm
@@ -1,8 +1,8 @@
- /**
- * tgui state: contained_state
- *
- * Checks that the user is inside the src_object.
- **/
+/**
+ * tgui state: contained_state
+ *
+ * Checks that the user is inside the src_object.
+ */
GLOBAL_DATUM_INIT(contained_state, /datum/ui_state/contained_state, new)
diff --git a/code/modules/tgui/states/deep_inventory.dm b/code/modules/tgui/states/deep_inventory.dm
index 06bdb92f3a..43758cbab1 100644
--- a/code/modules/tgui/states/deep_inventory.dm
+++ b/code/modules/tgui/states/deep_inventory.dm
@@ -1,8 +1,8 @@
- /**
- * tgui state: deep_inventory_state
- *
- * Checks that the src_object is in the user's deep (backpack, box, toolbox, etc) inventory.
- **/
+/**
+ * tgui state: deep_inventory_state
+ *
+ * Checks that the src_object is in the user's deep (backpack, box, toolbox, etc) inventory.
+ */
GLOBAL_DATUM_INIT(deep_inventory_state, /datum/ui_state/deep_inventory_state, new)
diff --git a/code/modules/tgui/states/default.dm b/code/modules/tgui/states/default.dm
index c6741f20b8..6bb159640e 100644
--- a/code/modules/tgui/states/default.dm
+++ b/code/modules/tgui/states/default.dm
@@ -1,8 +1,8 @@
- /**
- * tgui state: default_state
- *
- * Checks a number of things -- mostly physical distance for humans and view for robots.
- **/
+/**
+ * tgui state: default_state
+ *
+ * Checks a number of things -- mostly physical distance for humans and view for robots.
+ */
GLOBAL_DATUM_INIT(default_state, /datum/ui_state/default, new)
diff --git a/code/modules/tgui/states/default_contained.dm b/code/modules/tgui/states/default_contained.dm
new file mode 100644
index 0000000000..c532e9f5d1
--- /dev/null
+++ b/code/modules/tgui/states/default_contained.dm
@@ -0,0 +1,13 @@
+/**
+ * tgui state: default_contained
+ *
+ * Basically default and contained combined, allowing for both
+ */
+
+GLOBAL_DATUM_INIT(default_contained_state, /datum/ui_state/default/contained, new)
+
+/datum/ui_state/default/contained/can_use_topic(atom/src_object, mob/user)
+ if(src_object.contains(user))
+ return UI_INTERACTIVE
+ return ..()
+
\ No newline at end of file
diff --git a/code/modules/tgui/states/hands.dm b/code/modules/tgui/states/hands.dm
index 5da0e5d500..d73d1058ea 100644
--- a/code/modules/tgui/states/hands.dm
+++ b/code/modules/tgui/states/hands.dm
@@ -1,8 +1,8 @@
- /**
- * tgui state: hands_state
- *
- * Checks that the src_object is in the user's hands.
- **/
+/**
+ * tgui state: hands_state
+ *
+ * Checks that the src_object is in the user's hands.
+ */
GLOBAL_DATUM_INIT(hands_state, /datum/ui_state/hands_state, new)
@@ -19,7 +19,7 @@ GLOBAL_DATUM_INIT(hands_state, /datum/ui_state/hands_state, new)
return UI_INTERACTIVE
return UI_CLOSE
-/mob/living/silicon/robot/hands_can_use_topic(src_object)
- if(activated(src_object))
+/mob/living/silicon/robot/hands_can_use_topic(obj/src_object)
+ if(activated(src_object) || istype(src_object.loc, /obj/item/weapon/gripper))
return UI_INTERACTIVE
return UI_CLOSE
diff --git a/code/modules/tgui/states/human_adjacent.dm b/code/modules/tgui/states/human_adjacent.dm
index 0ab20b36ff..7aefe43e44 100644
--- a/code/modules/tgui/states/human_adjacent.dm
+++ b/code/modules/tgui/states/human_adjacent.dm
@@ -1,10 +1,9 @@
-
- /**
- * tgui state: human_adjacent_state
- *
- * In addition to default checks, only allows interaction for a
- * human adjacent user.
- **/
+/**
+ * tgui state: human_adjacent_state
+ *
+ * In addition to default checks, only allows interaction for a
+ * human adjacent user.
+ */
GLOBAL_DATUM_INIT(human_adjacent_state, /datum/ui_state/human_adjacent_state, new)
diff --git a/code/modules/tgui/states/inventory.dm b/code/modules/tgui/states/inventory.dm
index b8b1ad3b6a..43fe2cb451 100644
--- a/code/modules/tgui/states/inventory.dm
+++ b/code/modules/tgui/states/inventory.dm
@@ -1,8 +1,8 @@
- /**
- * tgui state: inventory_state
- *
- * Checks that the src_object is in the user's top-level (hand, ear, pocket, belt, etc) inventory.
- **/
+/**
+ * tgui state: inventory_state
+ *
+ * Checks that the src_object is in the user's top-level (hand, ear, pocket, belt, etc) inventory.
+ */
GLOBAL_DATUM_INIT(inventory_state, /datum/ui_state/inventory_state, new)
diff --git a/code/modules/tgui/states/language_menu.dm b/code/modules/tgui/states/language_menu.dm
index fedc4320e4..5c816c8922 100644
--- a/code/modules/tgui/states/language_menu.dm
+++ b/code/modules/tgui/states/language_menu.dm
@@ -1,6 +1,6 @@
- /**
- * tgui state: language_menu_state
- */
+/**
+ * tgui state: language_menu_state
+ */
GLOBAL_DATUM_INIT(language_menu_state, /datum/ui_state/language_menu, new)
diff --git a/code/modules/tgui/states/not_incapacitated.dm b/code/modules/tgui/states/not_incapacitated.dm
index 12fe266bc5..364b59424d 100644
--- a/code/modules/tgui/states/not_incapacitated.dm
+++ b/code/modules/tgui/states/not_incapacitated.dm
@@ -1,16 +1,16 @@
- /**
- * tgui state: not_incapacitated_state
- *
- * Checks that the user isn't incapacitated
- **/
+/**
+ * tgui state: not_incapacitated_state
+ *
+ * Checks that the user isn't incapacitated
+ */
GLOBAL_DATUM_INIT(not_incapacitated_state, /datum/ui_state/not_incapacitated_state, new)
- /**
- * tgui state: not_incapacitated_turf_state
- *
- * Checks that the user isn't incapacitated and that their loc is a turf
- **/
+/**
+ * tgui state: not_incapacitated_turf_state
+ *
+ * Checks that the user isn't incapacitated and that their loc is a turf
+ */
GLOBAL_DATUM_INIT(not_incapacitated_turf_state, /datum/ui_state/not_incapacitated_state, new(no_turfs = TRUE))
diff --git a/code/modules/tgui/states/notcontained.dm b/code/modules/tgui/states/notcontained.dm
index 77a7fe01b0..642c6ce95f 100644
--- a/code/modules/tgui/states/notcontained.dm
+++ b/code/modules/tgui/states/notcontained.dm
@@ -1,8 +1,8 @@
- /**
- * tgui state: notcontained_state
- *
- * Checks that the user is not inside src_object, and then makes the default checks.
- **/
+/**
+ * tgui state: notcontained_state
+ *
+ * Checks that the user is not inside src_object, and then makes the default checks.
+ */
GLOBAL_DATUM_INIT(notcontained_state, /datum/ui_state/notcontained_state, new)
diff --git a/code/modules/tgui/states/observer.dm b/code/modules/tgui/states/observer.dm
index ade0ce66bb..86ad776b13 100644
--- a/code/modules/tgui/states/observer.dm
+++ b/code/modules/tgui/states/observer.dm
@@ -1,8 +1,8 @@
- /**
- * tgui state: observer_state
- *
- * Checks that the user is an observer/ghost.
- **/
+/**
+ * tgui state: observer_state
+ *
+ * Checks that the user is an observer/ghost.
+ */
GLOBAL_DATUM_INIT(observer_state, /datum/ui_state/observer_state, new)
diff --git a/code/modules/tgui/states/physical.dm b/code/modules/tgui/states/physical.dm
index 3b13dc5b3d..88c8a291aa 100644
--- a/code/modules/tgui/states/physical.dm
+++ b/code/modules/tgui/states/physical.dm
@@ -1,8 +1,8 @@
- /**
- * tgui state: physical_state
- *
- * Short-circuits the default state to only check physical distance.
- */
+/**
+ * tgui state: physical_state
+ *
+ * Short-circuits the default state to only check physical distance.
+ */
GLOBAL_DATUM_INIT(physical_state, /datum/ui_state/physical, new)
@@ -23,6 +23,7 @@ GLOBAL_DATUM_INIT(physical_state, /datum/ui_state/physical, new)
/mob/living/silicon/ai/physical_can_use_topic(src_object)
return UI_UPDATE // AIs are not physical.
+
/**
* tgui state: physical_obscured_state
*
@@ -40,10 +41,10 @@ GLOBAL_DATUM_INIT(physical_obscured_state, /datum/ui_state/physical_obscured_sta
return UI_CLOSE
/mob/living/physical_obscured_can_use_topic(src_object)
- return shared_living_ui_distance(src_object)
+ return shared_living_ui_distance(src_object, viewcheck = FALSE)
/mob/living/silicon/physical_obscured_can_use_topic(src_object)
- return max(UI_UPDATE, shared_living_ui_distance(src_object)) // Silicons can always see.
+ return max(UI_UPDATE, shared_living_ui_distance(src_object, viewcheck = FALSE)) // Silicons can always see.
/mob/living/silicon/ai/physical_obscured_can_use_topic(src_object)
- return UI_UPDATE // AIs are not physical.
\ No newline at end of file
+ return UI_UPDATE // AIs are not physical.
diff --git a/code/modules/tgui/states/self.dm b/code/modules/tgui/states/self.dm
index 10849772c6..b0c9500fbc 100644
--- a/code/modules/tgui/states/self.dm
+++ b/code/modules/tgui/states/self.dm
@@ -1,8 +1,8 @@
- /**
- * tgui state: self_state
- *
- * Only checks that the user and src_object are the same.
- **/
+/**
+ * tgui state: self_state
+ *
+ * Only checks that the user and src_object are the same.
+ */
GLOBAL_DATUM_INIT(self_state, /datum/ui_state/self_state, new)
diff --git a/code/modules/tgui/states/zlevel.dm b/code/modules/tgui/states/zlevel.dm
index 6ccfd0fe7d..5e3ccfb7de 100644
--- a/code/modules/tgui/states/zlevel.dm
+++ b/code/modules/tgui/states/zlevel.dm
@@ -1,8 +1,8 @@
- /**
- * tgui state: z_state
- *
- * Only checks that the Z-level of the user and src_object are the same.
- **/
+/**
+ * tgui state: z_state
+ *
+ * Only checks that the Z-level of the user and src_object are the same.
+ */
GLOBAL_DATUM_INIT(z_state, /datum/ui_state/z_state, new)
diff --git a/code/modules/tgui/subsystem.dm b/code/modules/tgui/subsystem.dm
index 90a00fb607..cbe94e2d7f 100644
--- a/code/modules/tgui/subsystem.dm
+++ b/code/modules/tgui/subsystem.dm
@@ -1,22 +1,22 @@
- /**
- * tgui subsystem
- *
- * Contains all tgui state and subsystem code.
- **/
+/**
+ * tgui subsystem
+ *
+ * Contains all tgui state and subsystem code.
+ */
- /**
- * public
- *
- * Get a open UI given a user, src_object, and ui_key and try to update it with data.
- *
- * required user mob The mob who opened/is using the UI.
- * required src_object datum The object/datum which owns the UI.
- * required ui_key string The ui_key of the UI.
- * optional ui datum/tgui The UI to be updated, if it exists.
- * optional force_open bool If the UI should be re-opened instead of updated.
- *
- * return datum/tgui The found UI.
- **/
+/**
+ * public
+ *
+ * Get a open UI given a user, src_object, and ui_key and try to update it with data.
+ *
+ * required user mob The mob who opened/is using the UI.
+ * required src_object datum The object/datum which owns the UI.
+ * required ui_key string The ui_key of the UI.
+ * optional ui datum/tgui The UI to be updated, if it exists.
+ * optional force_open bool If the UI should be re-opened instead of updated.
+ *
+ * return datum/tgui The found UI.
+ */
/datum/controller/subsystem/tgui/proc/try_update_ui(mob/user, datum/src_object, ui_key, datum/tgui/ui, force_open = FALSE)
if(isnull(ui)) // No UI was passed, so look for one.
ui = get_open_ui(user, src_object, ui_key)
@@ -31,17 +31,17 @@
else
return null // We couldn't find a UI.
- /**
- * private
- *
- * Get a open UI given a user, src_object, and ui_key.
- *
- * required user mob The mob who opened/is using the UI.
- * required src_object datum The object/datum which owns the UI.
- * required ui_key string The ui_key of the UI.
- *
- * return datum/tgui The found UI.
- **/
+/**
+ * private
+ *
+ * Get a open UI given a user, src_object, and ui_key.
+ *
+ * required user mob The mob who opened/is using the UI.
+ * required src_object datum The object/datum which owns the UI.
+ * required ui_key string The ui_key of the UI.
+ *
+ * return datum/tgui The found UI.
+ */
/datum/controller/subsystem/tgui/proc/get_open_ui(mob/user, datum/src_object, ui_key)
var/src_object_key = "[REF(src_object)]"
if(isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list))
@@ -55,15 +55,15 @@
return null // Couldn't find a UI!
- /**
- * private
- *
- * Update all UIs attached to src_object.
- *
- * required src_object datum The object/datum which owns the UIs.
- *
- * return int The number of UIs updated.
- **/
+/**
+ * private
+ *
+ * Update all UIs attached to src_object.
+ *
+ * required src_object datum The object/datum which owns the UIs.
+ *
+ * return int The number of UIs updated.
+ */
/datum/controller/subsystem/tgui/proc/update_uis(datum/src_object)
var/src_object_key = "[REF(src_object)]"
if(isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list))
@@ -77,15 +77,15 @@
update_count++ // Count each UI we update.
return update_count
- /**
- * private
- *
- * Close all UIs attached to src_object.
- *
- * required src_object datum The object/datum which owns the UIs.
- *
- * return int The number of UIs closed.
- **/
+/**
+ * private
+ *
+ * Close all UIs attached to src_object.
+ *
+ * required src_object datum The object/datum which owns the UIs.
+ *
+ * return int The number of UIs closed.
+ */
/datum/controller/subsystem/tgui/proc/close_uis(datum/src_object)
var/src_object_key = "[REF(src_object)]"
if(isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list))
@@ -99,13 +99,13 @@
close_count++ // Count each UI we close.
return close_count
- /**
- * private
- *
- * Close *ALL* UIs
- *
- * return int The number of UIs closed.
- **/
+/**
+ * private
+ *
+ * Close *ALL* UIs
+ *
+ * return int The number of UIs closed.
+ */
/datum/controller/subsystem/tgui/proc/close_all_uis()
var/close_count = 0
for(var/src_object_key in open_uis)
@@ -116,17 +116,17 @@
close_count++ // Count each UI we close.
return close_count
- /**
- * private
- *
- * Update all UIs belonging to a user.
- *
- * required user mob The mob who opened/is using the UI.
- * optional src_object datum If provided, only update UIs belonging this src_object.
- * optional ui_key string If provided, only update UIs with this UI key.
- *
- * return int The number of UIs updated.
- **/
+/**
+ * private
+ *
+ * Update all UIs belonging to a user.
+ *
+ * required user mob The mob who opened/is using the UI.
+ * optional src_object datum If provided, only update UIs belonging this src_object.
+ * optional ui_key string If provided, only update UIs with this UI key.
+ *
+ * return int The number of UIs updated.
+ */
/datum/controller/subsystem/tgui/proc/update_user_uis(mob/user, datum/src_object = null, ui_key = null)
if(isnull(user.open_uis) || !istype(user.open_uis, /list) || open_uis.len == 0)
return 0 // Couldn't find any UIs for this user.
@@ -138,17 +138,17 @@
update_count++ // Count each UI we upadte.
return update_count
- /**
- * private
- *
- * Close all UIs belonging to a user.
- *
- * required user mob The mob who opened/is using the UI.
- * optional src_object datum If provided, only close UIs belonging this src_object.
- * optional ui_key string If provided, only close UIs with this UI key.
- *
- * return int The number of UIs closed.
- **/
+/**
+ * private
+ *
+ * Close all UIs belonging to a user.
+ *
+ * required user mob The mob who opened/is using the UI.
+ * optional src_object datum If provided, only close UIs belonging this src_object.
+ * optional ui_key string If provided, only close UIs with this UI key.
+ *
+ * return int The number of UIs closed.
+ */
/datum/controller/subsystem/tgui/proc/close_user_uis(mob/user, datum/src_object = null, ui_key = null)
if(isnull(user.open_uis) || !istype(user.open_uis, /list) || open_uis.len == 0)
return 0 // Couldn't find any UIs for this user.
@@ -160,13 +160,13 @@
close_count++ // Count each UI we close.
return close_count
- /**
- * private
- *
- * Add a UI to the list of open UIs.
- *
- * required ui datum/tgui The UI to be added.
- **/
+/**
+ * private
+ *
+ * Add a UI to the list of open UIs.
+ *
+ * required ui datum/tgui The UI to be added.
+ */
/datum/controller/subsystem/tgui/proc/on_open(datum/tgui/ui)
var/src_object_key = "[REF(ui.src_object)]"
if(isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list))
@@ -180,15 +180,15 @@
uis |= ui
processing_uis |= ui
- /**
- * private
- *
- * Remove a UI from the list of open UIs.
- *
- * required ui datum/tgui The UI to be removed.
- *
- * return bool If the UI was removed or not.
- **/
+/**
+ * private
+ *
+ * Remove a UI from the list of open UIs.
+ *
+ * required ui datum/tgui The UI to be removed.
+ *
+ * return bool If the UI was removed or not.
+ */
/datum/controller/subsystem/tgui/proc/on_close(datum/tgui/ui)
var/src_object_key = "[REF(ui.src_object)]"
if(isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list))
@@ -210,28 +210,28 @@
return 1 // Let the caller know we did it.
- /**
- * private
- *
- * Handle client logout, by closing all their UIs.
- *
- * required user mob The mob which logged out.
- *
- * return int The number of UIs closed.
- **/
+/**
+ * private
+ *
+ * Handle client logout, by closing all their UIs.
+ *
+ * required user mob The mob which logged out.
+ *
+ * return int The number of UIs closed.
+ */
/datum/controller/subsystem/tgui/proc/on_logout(mob/user)
return close_user_uis(user)
- /**
- * private
- *
- * Handle clients switching mobs, by transferring their UIs.
- *
- * required user source The client's original mob.
- * required user target The client's new mob.
- *
- * return bool If the UIs were transferred.
- **/
+/**
+ * private
+ *
+ * Handle clients switching mobs, by transferring their UIs.
+ *
+ * required user source The client's original mob.
+ * required user target The client's new mob.
+ *
+ * return bool If the UIs were transferred.
+ */
/datum/controller/subsystem/tgui/proc/on_transfer(mob/source, mob/target)
if(!source || isnull(source.open_uis) || !istype(source.open_uis, /list) || open_uis.len == 0)
return 0 // The old mob had no open UIs.
diff --git a/code/modules/tgui/tgui.dm b/code/modules/tgui/tgui.dm
index 55fe8f0bb5..7971a940d4 100644
--- a/code/modules/tgui/tgui.dm
+++ b/code/modules/tgui/tgui.dm
@@ -1,12 +1,12 @@
- /**
- * tgui
- *
- * /tg/station user interface library
- **/
+/**
+ * tgui
+ *
+ * /tg/station user interface library
+ */
- /**
- * tgui datum (represents a UI).
- **/
+/**
+ * tgui datum (represents a UI).
+ */
/datum/tgui
/// The mob who opened/is using the UI.
var/mob/user
@@ -22,8 +22,6 @@
var/width = 0
/// The window height
var/height = 0
- /// The style to be used for this UI.
- var/style = "nanotrasen"
/// The interface (template) to be used for this UI.
var/interface
/// Update the UI every MC tick.
@@ -34,6 +32,8 @@
var/list/initial_data
/// The static data used to initialize the UI.
var/list/initial_static_data
+ /// Holder for the json string, that is sent during the initial update
+ var/_initial_update
/// The status/visibility of the UI.
var/status = UI_INTERACTIVE
/// Topic state used to determine status/interactability.
@@ -42,34 +42,31 @@
var/datum/tgui/master_ui
/// Children of this UI.
var/list/datum/tgui/children = list()
- var/custom_browser_id = FALSE
- var/ui_screen = "home"
- /**
- * public
- *
- * Create a new UI.
- *
- * required user mob The mob who opened/is using the UI.
- * required src_object datum The object or datum which owns the UI.
- * required ui_key string The ui_key of the UI.
- * required interface string The interface used to render the UI.
- * optional title string The title of the UI.
- * optional width int The window width.
- * optional height int The window height.
- * optional master_ui datum/tgui The parent UI.
- * optional state datum/ui_state The state used to determine status.
- *
- * return datum/tgui The requested UI.
- **/
-/datum/tgui/New(mob/user, datum/src_object, ui_key, interface, title, width = 0, height = 0, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state, browser_id = null)
+/**
+ * public
+ *
+ * Create a new UI.
+ *
+ * required user mob The mob who opened/is using the UI.
+ * required src_object datum The object or datum which owns the UI.
+ * required ui_key string The ui_key of the UI.
+ * required interface string The interface used to render the UI.
+ * optional title string The title of the UI.
+ * optional width int The window width.
+ * optional height int The window height.
+ * optional master_ui datum/tgui The parent UI.
+ * optional state datum/ui_state The state used to determine status.
+ *
+ * return datum/tgui The requested UI.
+ */
+/datum/tgui/New(mob/user, datum/src_object, ui_key, interface, title, width = 0, height = 0, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
src.user = user
src.src_object = src_object
src.ui_key = ui_key
- src.window_id = browser_id ? browser_id : "[REF(src_object)]-[ui_key]" // DO NOT replace with \ref here. src_object could potentially be tagged
- src.custom_browser_id = browser_id ? TRUE : FALSE
-
- set_interface(interface)
+ // DO NOT replace with \ref here. src_object could potentially be tagged
+ src.window_id = "[REF(src_object)]-[ui_key]"
+ src.interface = interface
if(title)
src.title = sanitize(title)
@@ -86,11 +83,11 @@
var/datum/asset/assets = get_asset_datum(/datum/asset/group/tgui)
assets.send(user)
- /**
- * public
- *
- * Open this UI (and initialize it with data).
- **/
+/**
+ * public
+ *
+ * Open this UI (and initialize it with data).
+ */
/datum/tgui/proc/open()
if(!user.client)
return // Bail if there is no client.
@@ -99,18 +96,16 @@
if(status < UI_UPDATE)
return // Bail if we're not supposed to open.
- var/window_size
- if(width && height) // If we have a width and height, use them.
- window_size = "size=[width]x[height];"
- else
- window_size = ""
-
+ // Build window options
+ var/window_options = "can_minimize=0;auto_format=0;"
+ // If we have a width and height, use them.
+ if(width && height)
+ window_options += "size=[width]x[height];"
// Remove titlebar and resize handles for a fancy window
- var/have_title_bar
if(user.client.prefs.tgui_fancy)
- have_title_bar = "titlebar=0;can_resize=0;"
+ window_options += "titlebar=0;can_resize=0;"
else
- have_title_bar = "titlebar=1;can_resize=1;"
+ window_options += "titlebar=1;can_resize=1;"
// Generate page html
var/html
@@ -120,50 +115,54 @@
// Replace template tokens with important UI data
// NOTE: Intentional \ref usage; tgui datums can't/shouldn't
// be tagged, so this is an effective unwrap
- html = replacetextEx(html, "\[ref]", "\ref[src]")
- html = replacetextEx(html, "\[style]", style)
+ html = replacetextEx(html, "\[tgui:ref]", "\ref[src]")
// Open the window.
- user << browse(html, "window=[window_id];can_minimize=0;auto_format=0;[window_size][have_title_bar]")
- if (!custom_browser_id)
- // Instruct the client to signal UI when the window is closed.
- // NOTE: Intentional \ref usage; tgui datums can't/shouldn't
- // be tagged, so this is an effective unwrap
- winset(user, window_id, "on-close=\"uiclose \ref[src]\"")
+ user << browse(html, "window=[window_id];[window_options]")
- if(!initial_data)
+ // Instruct the client to signal UI when the window is closed.
+ // NOTE: Intentional \ref usage; tgui datums can't/shouldn't
+ // be tagged, so this is an effective unwrap
+ winset(user, window_id, "on-close=\"uiclose \ref[src]\"")
+
+ // Pre-fetch initial state while browser is still loading in
+ // another thread
+ if(!initial_data) {
initial_data = src_object.ui_data(user)
- if(!initial_static_data)
+ }
+ if(!initial_static_data) {
initial_static_data = src_object.ui_static_data(user)
+ }
+ _initial_update = url_encode(get_json(initial_data, initial_static_data))
SStgui.on_open(src)
- /**
- * public
- *
- * Reinitialize the UI.
- * (Possibly with a new interface and/or data).
- *
- * optional template string The name of the new interface.
- * optional data list The new initial data.
- **/
+/**
+ * public
+ *
+ * Reinitialize the UI.
+ * (Possibly with a new interface and/or data).
+ *
+ * optional template string The name of the new interface.
+ * optional data list The new initial data.
+ */
/datum/tgui/proc/reinitialize(interface, list/data, list/static_data)
if(interface)
- set_interface(interface) // Set a new interface.
+ src.interface = interface
if(data)
initial_data = data
if(static_data)
initial_static_data = static_data
open()
- /**
- * public
- *
- * Close the UI, and all its children.
- **/
+/**
+ * public
+ *
+ * Close the UI, and all its children.
+ */
/datum/tgui/proc/close()
user << browse(null, "window=[window_id]") // Close the window.
- src_object.ui_close()
+ src_object.ui_close(user)
SStgui.on_close(src)
for(var/datum/tgui/child in children) // Loop through and close all children.
child.close()
@@ -172,67 +171,49 @@
master_ui = null
qdel(src)
- /**
- * public
- *
- * Set the style for this UI.
- *
- * required style string The new UI style.
- **/
-/datum/tgui/proc/set_style(style)
- src.style = lowertext(style)
-
- /**
- * public
- *
- * Set the interface (template) for this UI.
- *
- * required interface string The new UI interface.
- **/
-/datum/tgui/proc/set_interface(interface)
- src.interface = lowertext(interface)
-
- /**
- * public
- *
- * Enable/disable auto-updating of the UI.
- *
- * required state bool Enable/disable auto-updating.
- **/
+/**
+ * public
+ *
+ * Enable/disable auto-updating of the UI.
+ *
+ * required state bool Enable/disable auto-updating.
+ */
/datum/tgui/proc/set_autoupdate(state = TRUE)
autoupdate = state
- /**
- * private
- *
- * Package the data to send to the UI, as JSON.
- * This includes the UI data and config_data.
- *
- * return string The packaged JSON.
- **/
+/**
+ * private
+ *
+ * Package the data to send to the UI, as JSON.
+ * This includes the UI data and config_data.
+ *
+ * return string The packaged JSON.
+ */
/datum/tgui/proc/get_json(list/data, list/static_data)
var/list/json_data = list()
json_data["config"] = list(
"title" = title,
"status" = status,
- "screen" = ui_screen,
- "style" = style,
"interface" = interface,
"fancy" = user.client.prefs.tgui_fancy,
- "locked" = user.client.prefs.tgui_lock && !custom_browser_id,
+ "locked" = user.client.prefs.tgui_lock,
"observer" = isobserver(user),
"window" = window_id,
// NOTE: Intentional \ref usage; tgui datums can't/shouldn't
// be tagged, so this is an effective unwrap
"ref" = "\ref[src]"
)
-
+
if(!isnull(data))
json_data["data"] = data
if(!isnull(static_data))
json_data["static_data"] = static_data
+ // Send shared states
+ if(src_object.tgui_shared_states)
+ json_data["shared"] = src_object.tgui_shared_states
+
// Generate the JSON.
var/json = json_encode(json_data)
// Strip #255/improper.
@@ -240,13 +221,13 @@
json = replacetext(json, "\improper", "")
return json
- /**
- * private
- *
- * Handle clicks from the UI.
- * Call the src_object's ui_act() if status is UI_INTERACTIVE.
- * If the src_object's ui_act() returns 1, update all UIs attacked to it.
- **/
+/**
+ * private
+ *
+ * Handle clicks from the UI.
+ * Call the src_object's ui_act() if status is UI_INTERACTIVE.
+ * If the src_object's ui_act() returns 1, update all UIs attacked to it.
+ */
/datum/tgui/Topic(href, href_list)
if(user != usr)
return // Something is not right here.
@@ -256,35 +237,47 @@
switch(action)
if("tgui:initialize")
- user << output(url_encode(get_json(initial_data, initial_static_data)), "[custom_browser_id ? window_id : "[window_id].browser"]:initialize")
+ user << output(_initial_update, "[window_id].browser:update")
initialized = TRUE
- if("tgui:view")
- if(params["screen"])
- ui_screen = params["screen"]
+ if("tgui:setSharedState")
+ // Update the window state.
+ update_status(push = FALSE)
+ // Bail if UI is not interactive or usr calling Topic
+ // is not the UI user.
+ if(status != UI_INTERACTIVE)
+ return
+ var/key = params["key"]
+ var/value = params["value"]
+ if(!src_object.tgui_shared_states)
+ src_object.tgui_shared_states = list()
+ src_object.tgui_shared_states[key] = value
SStgui.update_uis(src_object)
+ if("tgui:setFancy")
+ var/value = text2num(params["value"])
+ user.client.prefs.tgui_fancy = value
if("tgui:log")
// Force window to show frills on fatal errors
if(params["fatal"])
winset(user, window_id, "titlebar=1;can-resize=1;size=600x600")
+ log_message(params["log"])
if("tgui:link")
user << link(params["url"])
- if("tgui:fancy")
- user.client.prefs.tgui_fancy = TRUE
- if("tgui:nofrills")
- user.client.prefs.tgui_fancy = FALSE
else
- update_status(push = FALSE) // Update the window state.
- if(src_object.ui_act(action, params, src, state)) // Call ui_act() on the src_object.
- SStgui.update_uis(src_object) // Update if the object requested it.
+ // Update the window state.
+ update_status(push = FALSE)
+ // Call ui_act() on the src_object.
+ if(src_object.ui_act(action, params, src, state))
+ // Update if the object requested it.
+ SStgui.update_uis(src_object)
- /**
- * private
- *
- * Update the UI.
- * Only updates the data if update is true, otherwise only updates the status.
- *
- * optional force bool If the UI should be forced to update.
- **/
+/**
+ * private
+ *
+ * Update the UI.
+ * Only updates the data if update is true, otherwise only updates the status.
+ *
+ * optional force bool If the UI should be forced to update.
+ */
/datum/tgui/process(force = FALSE)
var/datum/host = src_object.ui_host(user)
if(!src_object || !host || !user) // If the object or user died (or something else), abort.
@@ -296,42 +289,46 @@
else
update_status(push = TRUE) // Otherwise only update status.
- /**
- * private
- *
- * Push data to an already open UI.
- *
- * required data list The data to send.
- * optional force bool If the update should be sent regardless of state.
- **/
+/**
+ * private
+ *
+ * Push data to an already open UI.
+ *
+ * required data list The data to send.
+ * optional force bool If the update should be sent regardless of state.
+ */
/datum/tgui/proc/push_data(data, static_data, force = FALSE)
- update_status(push = FALSE) // Update the window state.
+ // Update the window state.
+ update_status(push = FALSE)
+ // Cannot update UI if it is not set up yet.
if(!initialized)
- return // Cannot update UI if it is not set up yet.
+ return
+ // Cannot update UI, we have no visibility.
if(status <= UI_DISABLED && !force)
- return // Cannot update UI, we have no visibility.
-
+ return
// Send the new JSON to the update() Javascript function.
- user << output(url_encode(get_json(data, static_data)), "[custom_browser_id ? window_id : "[window_id].browser"]:update")
+ user << output(
+ url_encode(get_json(data, static_data)),
+ "[window_id].browser:update")
- /**
- * private
- *
- * Updates the UI by interacting with the src_object again, which will hopefully
- * call try_ui_update on it.
- *
- * optional force_open bool If force_open should be passed to ui_interact.
- **/
+/**
+ * private
+ *
+ * Updates the UI by interacting with the src_object again, which will hopefully
+ * call try_ui_update on it.
+ *
+ * optional force_open bool If force_open should be passed to ui_interact.
+ */
/datum/tgui/proc/update(force_open = FALSE)
src_object.ui_interact(user, ui_key, src, force_open, master_ui, state)
- /**
- * private
- *
- * Update the status/visibility of the UI for its user.
- *
- * optional push bool Push an update to the UI (an update is always sent for UI_DISABLED).
- **/
+/**
+ * private
+ *
+ * Update the status/visibility of the UI for its user.
+ *
+ * optional push bool Push an update to the UI (an update is always sent for UI_DISABLED).
+ */
/datum/tgui/proc/update_status(push = FALSE)
var/status = src_object.ui_status(user, state)
if(master_ui)
@@ -340,25 +337,26 @@
if(status == UI_CLOSE)
close()
- /**
- * private
- *
- * Set the status/visibility of the UI.
- *
- * required status int The status to set (UI_CLOSE/UI_DISABLED/UI_UPDATE/UI_INTERACTIVE).
- * optional push bool Push an update to the UI (an update is always sent for UI_DISABLED).
- **/
+/**
+ * private
+ *
+ * Set the status/visibility of the UI.
+ *
+ * required status int The status to set (UI_CLOSE/UI_DISABLED/UI_UPDATE/UI_INTERACTIVE).
+ * optional push bool Push an update to the UI (an update is always sent for UI_DISABLED).
+ */
/datum/tgui/proc/set_status(status, push = FALSE)
- if(src.status != status) // Only update if status has changed.
+ // Only update if status has changed.
+ if(src.status != status)
if(src.status == UI_DISABLED)
src.status = status
if(push)
update()
else
src.status = status
- if(status == UI_DISABLED || push) // Update if the UI just because disabled, or a push is requested.
+ // Update if the UI just because disabled, or a push is requested.
+ if(status == UI_DISABLED || push)
push_data(null, force = TRUE)
/datum/tgui/proc/log_message(message)
log_tgui("[user] ([user.ckey]) using \"[title]\":\n[message]")
-
diff --git a/code/modules/uplink/uplink_items/uplink_ammo.dm b/code/modules/uplink/uplink_items/uplink_ammo.dm
index 4a7e1f146e..ce74773f8d 100644
--- a/code/modules/uplink/uplink_items/uplink_ammo.dm
+++ b/code/modules/uplink/uplink_items/uplink_ammo.dm
@@ -189,6 +189,13 @@
cost = 4
include_modes = list(/datum/game_mode/nuclear)
+/datum/uplink_item/ammo/machinegun/match
+ name = "7.12x82mm (Match) Box Magazine"
+ desc = "A 50-round magazine of 7.12x82mm ammunition for use in the L6 SAW; you didn't know there was a demand for match grade \
+ precision bullet hose ammo, but these rounds are finely tuned and perfect for ricocheting off walls all fancy-like."
+ item = /obj/item/ammo_box/magazine/mm712x82/match
+ cost = 10
+
/datum/uplink_item/ammo/machinegun
cost = 6
surplus = 0
diff --git a/code/modules/uplink/uplink_items/uplink_bundles.dm b/code/modules/uplink/uplink_items/uplink_bundles.dm
index 321b9121bc..fbeaee8939 100644
--- a/code/modules/uplink/uplink_items/uplink_bundles.dm
+++ b/code/modules/uplink/uplink_items/uplink_bundles.dm
@@ -50,7 +50,7 @@
Combines with all martial arts, but the user will be unable to bring themselves to use guns, nor remove the armbands."
item = /obj/item/storage/box/syndie_kit/northstar
cost = 20
- exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops)
+ exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops, /datum/game_mode/traitor/internal_affairs)
/datum/uplink_item/suits/infiltrator_bundle
name = "Insidious Infiltration Gear Case"
@@ -117,7 +117,7 @@
you will receive. May contain discontinued and/or exotic items."
item = /obj/item/storage/box/syndicate
cost = 20
- exclude_modes = list(/datum/game_mode/nuclear)
+ exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/traitor/internal_affairs)
cant_discount = TRUE
/datum/uplink_item/bundles_TC/surplus
@@ -127,7 +127,7 @@
item = /obj/structure/closet/crate
cost = 20
player_minimum = 25
- exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops)
+ exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops, /datum/game_mode/traitor/internal_affairs)
cant_discount = TRUE
var/starting_crate_value = 50
@@ -163,7 +163,7 @@
/datum/uplink_item/bundles_TC/reroll
name = "Renegotiate Contract"
- desc = "Selecting this will inform the syndicate that you wish to change employers. Can only be done once; no take-backs."
+ desc = "Selecting this will inform your employers that you wish for new objectives. Can only be done once; no take-backs."
item = /obj/effect/gibspawner/generic
cost = 0
cant_discount = TRUE
@@ -184,6 +184,7 @@
item = /obj/effect/gibspawner/generic // non-tangible item because techwebs use this path to determine illegal tech
cost = 0
cant_discount = TRUE
+ exclude_modes = list(/datum/game_mode/traitor/internal_affairs)
/datum/uplink_item/bundles_TC/random/purchase(mob/user, datum/component/uplink/U)
var/list/uplink_items = U.uplink_items
@@ -193,6 +194,8 @@
var/datum/uplink_item/I = uplink_items[category][item]
if(src == I || !I.item)
continue
+ if(istype(I, /datum/uplink_item/bundles_TC/reroll)) //oops!
+ continue
if(U.telecrystals < I.cost)
continue
if(I.limited_stock == 0)
diff --git a/code/modules/uplink/uplink_items/uplink_dangerous.dm b/code/modules/uplink/uplink_items/uplink_dangerous.dm
index 99c9c505c0..e068094776 100644
--- a/code/modules/uplink/uplink_items/uplink_dangerous.dm
+++ b/code/modules/uplink/uplink_items/uplink_dangerous.dm
@@ -21,7 +21,7 @@
item = /obj/item/storage/box/syndie_kit/revolver
cost = 13
surplus = 50
- exclude_modes = list(/datum/game_mode/nuclear/clown_ops)
+ exclude_modes = list(/datum/game_mode/nuclear/clown_ops, /datum/game_mode/traitor/internal_affairs)
/datum/uplink_item/dangerous/rawketlawnchair
name = "84mm Rocket Propelled Grenade Launcher"
@@ -109,10 +109,10 @@
name = "Double-Bladed Energy Sword"
desc = "The double-bladed energy sword does slightly more damage than a standard energy sword and will deflect \
all energy projectiles, but requires two hands to wield."
- item = /obj/item/twohanded/dualsaber
+ item = /obj/item/dualsaber
player_minimum = 25
cost = 16
- exclude_modes = list(/datum/game_mode/nuclear/clown_ops)
+ exclude_modes = list(/datum/game_mode/nuclear/clown_ops, /datum/game_mode/traitor/internal_affairs)
/datum/uplink_item/dangerous/doublesword/get_discount()
return pick(4;0.8,2;0.65,1;0.5)
@@ -123,7 +123,7 @@
pocketed when inactive. Activating it produces a loud, distinctive noise."
item = /obj/item/melee/transforming/energy/sword/saber
cost = 8
- exclude_modes = list(/datum/game_mode/nuclear/clown_ops)
+ exclude_modes = list(/datum/game_mode/nuclear/clown_ops, /datum/game_mode/traitor/internal_affairs)
/datum/uplink_item/dangerous/shield
name = "Energy Shield"
@@ -141,7 +141,7 @@
However, due to the size of the blade and obvious nature of the sheath, the weapon stands out as being obviously nefarious."
item = /obj/item/storage/belt/sabre/rapier
cost = 8
- exclude_modes = list(/datum/game_mode/nuclear/clown_ops)
+ exclude_modes = list(/datum/game_mode/nuclear/clown_ops, /datum/game_mode/traitor/internal_affairs)
/datum/uplink_item/dangerous/flamethrower
name = "Flamethrower"
@@ -180,7 +180,7 @@
refundable = TRUE
cant_discount = TRUE
surplus = 0
- exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops)
+ exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops, /datum/game_mode/traitor/internal_affairs)
player_minimum = 25
restricted = TRUE
refund_path = /obj/item/guardiancreator/tech/choose/traitor
@@ -211,6 +211,7 @@
deal extra damage and hit targets further. Use a screwdriver to take out any attached tanks."
item = /obj/item/melee/powerfist
cost = 8
+ exclude_modes = list(/datum/game_mode/traitor/internal_affairs)
/datum/uplink_item/dangerous/sniper
name = "Sniper Rifle"
@@ -250,4 +251,4 @@
darts effective at incapacitating a target."
item = /obj/item/gun/ballistic/automatic/toy/pistol/riot
cost = 3
- surplus = 10
\ No newline at end of file
+ surplus = 10
diff --git a/code/modules/uplink/uplink_items/uplink_devices.dm b/code/modules/uplink/uplink_items/uplink_devices.dm
index df6373b8de..5149259bb8 100644
--- a/code/modules/uplink/uplink_items/uplink_devices.dm
+++ b/code/modules/uplink/uplink_items/uplink_devices.dm
@@ -206,10 +206,10 @@
/datum/uplink_item/device_tools/stimpack
name = "Stimpack"
- desc = "Stimpacks, the tool of many great heroes, make you nearly immune to stuns and knockdowns for about \
+ desc = "Stimpacks, the tool of many great heroes. Makes you nearly immune to non-lethal weaponry for about \
5 minutes after injection."
item = /obj/item/reagent_containers/syringe/stimulants
- cost = 3
+ cost = 5
surplus = 90
/datum/uplink_item/device_tools/medkit
@@ -230,17 +230,9 @@
/datum/uplink_item/device_tools/surgerybag_adv
name = "Advanced Syndicate Surgery Duffel Bag"
- desc = "The Syndicate surgery duffel bag is a toolkit containing all advanced surgery tools, surgical drapes, \
- a Syndicate brand MMI, a straitjacket, a muzzle, and an outdated, yet still useful Combat Medic Kit."
+ desc = "A Syndicate surgery duffel bag, with a set of upgraded surgery tools to boot."
item = /obj/item/storage/backpack/duffelbag/syndie/surgery_adv
- cost = 10
-
-/datum/uplink_item/device_tools/brainwash_disk
- name = "Brainwashing Surgery Program"
- desc = "A disk containing the procedure to perform a brainwashing surgery, allowing you to implant an objective onto a target. \
- Insert into an Operating Console to enable the procedure."
- item = /obj/item/disk/surgery/brainwashing
- cost = 3
+ cost = 6
/datum/uplink_item/device_tools/encryptionkey
name = "Syndicate Encryption Key"
diff --git a/code/modules/uplink/uplink_items/uplink_explosives.dm b/code/modules/uplink/uplink_items/uplink_explosives.dm
index c52651fee9..6cc1c9fe05 100644
--- a/code/modules/uplink/uplink_items/uplink_explosives.dm
+++ b/code/modules/uplink/uplink_items/uplink_explosives.dm
@@ -58,6 +58,7 @@
item = /obj/item/storage/backpack/duffelbag/syndie/x4
cost = 4 //
cant_discount = TRUE
+ exclude_modes = list(/datum/game_mode/traitor/internal_affairs)
/datum/uplink_item/explosives/clown_bomb_clownops
name = "Clown Bomb"
@@ -123,6 +124,7 @@
be defused, and some crew may attempt to do so."
item = /obj/item/sbeacondrop/bomb
cost = 11
+ exclude_modes = list(/datum/game_mode/traitor/internal_affairs)
/datum/uplink_item/explosives/syndicate_detonator
name = "Syndicate Detonator"
@@ -140,7 +142,7 @@
in addition to dealing high amounts of damage to nearby personnel."
item = /obj/item/grenade/syndieminibomb
cost = 6
- exclude_modes = list(/datum/game_mode/nuclear/clown_ops)
+ exclude_modes = list(/datum/game_mode/nuclear/clown_ops, /datum/game_mode/traitor/internal_affairs)
/datum/uplink_item/explosives/tearstache
name = "Teachstache Grenade"
diff --git a/code/modules/uplink/uplink_items/uplink_roles.dm b/code/modules/uplink/uplink_items/uplink_roles.dm
index da25cf5298..b8eaf41371 100644
--- a/code/modules/uplink/uplink_items/uplink_roles.dm
+++ b/code/modules/uplink/uplink_items/uplink_roles.dm
@@ -30,6 +30,7 @@
item = /obj/item/gun/blastcannon
cost = 14 //High cost because of the potential for extreme damage in the hands of a skilled gas masked scientist.
restricted_roles = list("Research Director", "Scientist")
+ exclude_modes = list(/datum/game_mode/traitor/internal_affairs)
/datum/uplink_item/role_restricted/alientech
name = "Alien Research Disk"
@@ -39,6 +40,14 @@
cost = 12
restricted_roles = list("Research Director", "Scientist", "Roboticist")
+/datum/uplink_item/device_tools/brainwash_disk
+ name = "Brainwashing Surgery Program"
+ desc = "A disk containing the procedure to perform a brainwashing surgery, allowing you to implant an objective onto a target. \
+ Insert into an Operating Console to enable the procedure."
+ item = /obj/item/disk/surgery/brainwashing
+ restricted_roles = list("Medical Doctor", "Roboticist")
+ cost = 5
+
/datum/uplink_item/role_restricted/clown_bomb
name = "Clown Bomb"
desc = "The Clown bomb is a hilarious device capable of massive pranks. It has an adjustable timer, \
@@ -92,6 +101,7 @@
player_minimum = 20
refundable = TRUE
restricted_roles = list("Chaplain")
+ exclude_modes = list(/datum/game_mode/traitor/internal_affairs)
/datum/uplink_item/role_restricted/arcane_tome
name = "Arcane Tome"
@@ -101,6 +111,7 @@
player_minimum = 20
refundable = TRUE
restricted_roles = list("Chaplain")
+ exclude_modes = list(/datum/game_mode/traitor/internal_affairs)
/datum/uplink_item/role_restricted/explosive_hot_potato
name = "Exploding Hot Potato"
diff --git a/code/modules/uplink/uplink_items/uplink_stealth.dm b/code/modules/uplink/uplink_items/uplink_stealth.dm
index b4933b30ba..ff6d66a483 100644
--- a/code/modules/uplink/uplink_items/uplink_stealth.dm
+++ b/code/modules/uplink/uplink_items/uplink_stealth.dm
@@ -51,7 +51,7 @@
gain skin as hard as steel and swat bullets from the air, but you also refuse to use dishonorable ranged weaponry."
item = /obj/item/book/granter/martial/carp
cost = 17
- player_minimum = 30
+ player_minimum = 20
surplus = 0
exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops)
@@ -61,10 +61,20 @@
and dodging all ranged weapon fire, but you will refuse to use dishonorable ranged weaponry."
item = /obj/item/book/granter/martial/bass
cost = 18
- player_minimum = 30
+ player_minimum = 20
surplus = 0
exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops)
+/datum/uplink_item/stealthy_weapons/martialartsthree
+ name = "Krav Maga Scroll"
+ desc = "This scroll contains the secrets of an ancient martial arts technique. You will gain special unarmed attacks for \
+ stealthy takedowns."
+ item = /obj/item/book/granter/martial/krav_maga
+ cost = 16
+ player_minimum = 25
+ surplus = 0
+ include_modes = list(/datum/game_mode/traitor/internal_affairs)
+
/datum/uplink_item/stealthy_weapons/crossbow
name = "Miniature Energy Crossbow"
desc = "A short bow mounted across a tiller in miniature. Small enough to \
diff --git a/code/modules/vehicles/atv.dm b/code/modules/vehicles/atv.dm
index 4a0e2f0b58..d125453e5a 100644
--- a/code/modules/vehicles/atv.dm
+++ b/code/modules/vehicles/atv.dm
@@ -68,7 +68,7 @@
/obj/vehicle/ridden/atv/snowmobile/Moved()
. = ..()
- var/static/list/snow_typecache = typecacheof(list(/turf/open/floor/plating/asteroid/snow/icemoon, /turf/open/floor/plating/snowed/smoothed/icemoon))
+ var/static/list/snow_typecache = typecacheof(list(/turf/open/floor/plating/asteroid/snow/icemoon, /turf/open/floor/plating/snowed/smoothed/icemoon, /turf/open/floor/plating/snowed, /turf/open/floor/plating/asteroid/snow))
var/datum/component/riding/E = LoadComponent(/datum/component/riding)
if(snow_typecache[loc.type])
E.vehicle_move_delay = 1
diff --git a/code/modules/vehicles/cars/car.dm b/code/modules/vehicles/cars/car.dm
index d45cb8d26f..4545fab2a7 100644
--- a/code/modules/vehicles/cars/car.dm
+++ b/code/modules/vehicles/cars/car.dm
@@ -57,7 +57,7 @@
return FALSE
return ..()
-/obj/vehicle/sealed/car/attack_hand(mob/living/user)
+/obj/vehicle/sealed/car/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(!(car_traits & CAN_KIDNAP))
return
diff --git a/code/modules/vehicles/pimpin_ride.dm b/code/modules/vehicles/pimpin_ride.dm
index ef374f5db0..8f9d553ec7 100644
--- a/code/modules/vehicles/pimpin_ride.dm
+++ b/code/modules/vehicles/pimpin_ride.dm
@@ -62,11 +62,8 @@
if(floorbuffer)
. += "cart_buffer"
-/obj/vehicle/ridden/janicart/attack_hand(mob/user)
- . = ..()
- if(.)
- return
- else if(mybag)
+/obj/vehicle/ridden/janicart/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+ if(mybag)
mybag.forceMove(get_turf(user))
user.put_in_hands(mybag)
mybag = null
diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm
index 6e6636cd62..a7b9b6a298 100644
--- a/code/modules/vending/_vending.dm
+++ b/code/modules/vending/_vending.dm
@@ -105,6 +105,12 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
///Last world tick we sent a slogan message out
var/last_slogan
var/last_shopper
+ var/tilted = FALSE
+ var/tiltable = TRUE
+ var/squish_damage = 75
+ var/forcecrit = 0
+ var/num_shards = 7
+ var/list/pinned_mobs = list()
///How many ticks until we can send another
var/slogan_delay = 6000
///Icon when vending an item to the user
@@ -372,6 +378,7 @@ GLOBAL_LIST_EMPTY(vending_products)
..()
if(panel_open)
default_unfasten_wrench(user, I, time = 60)
+ unbuckle_all_mobs(TRUE)
return TRUE
/obj/machinery/vending/screwdriver_act(mob/living/user, obj/item/I)
@@ -435,6 +442,148 @@ GLOBAL_LIST_EMPTY(vending_products)
updateUsrDialog()
else
. = ..()
+ if(tiltable && !tilted && I.force)
+ switch(rand(1, 100))
+ if(1 to 5)
+ freebie(user, 3)
+ if(6 to 15)
+ freebie(user, 2)
+ if(16 to 25)
+ freebie(user, 1)
+ if(76 to 90)
+ tilt(user)
+ if(91 to 100)
+ tilt(user, crit=TRUE)
+
+/obj/machinery/vending/proc/freebie(mob/fatty, freebies)
+ visible_message("[src] yields [freebies > 1 ? "several free goodies" : "a free goody"]!")
+
+ for(var/i in 1 to freebies)
+ playsound(src, 'sound/machines/machine_vend.ogg', 50, TRUE, extrarange = -3)
+ for(var/datum/data/vending_product/R in shuffle(product_records))
+
+ if(R.amount <= 0) //Try to use a record that actually has something to dump.
+ continue
+ var/dump_path = R.product_path
+ if(!dump_path)
+ continue
+
+ R.amount--
+ new dump_path(get_turf(src))
+ break
+
+/obj/machinery/vending/proc/tilt(mob/fatty, crit=FALSE)
+ visible_message("[src] tips over!")
+ tilted = TRUE
+ layer = ABOVE_MOB_LAYER
+
+ var/crit_case
+ if(crit)
+ crit_case = rand(1,6)
+
+ if(forcecrit)
+ crit_case = forcecrit
+
+ if(in_range(fatty, src))
+ for(var/mob/living/L in get_turf(fatty))
+ var/mob/living/carbon/C = L
+
+ if(istype(C))
+ var/crit_rebate = 0 // lessen the normal damage we deal for some of the crits
+
+ if(crit_case < 5) // the head asplode case has its own description
+ C.visible_message("[C] is crushed by [src]!", \
+ "You are crushed by [src]!")
+
+ switch(crit_case) // only carbons can have the fun crits
+ if(1) // shatter their legs and bleed 'em
+ crit_rebate = 60
+ C.bleed(150)
+ var/obj/item/bodypart/l_leg/l = C.get_bodypart(BODY_ZONE_L_LEG)
+ if(l)
+ l.receive_damage(brute=200)
+ var/obj/item/bodypart/r_leg/r = C.get_bodypart(BODY_ZONE_R_LEG)
+ if(r)
+ r.receive_damage(brute=200)
+ if(l || r)
+ C.visible_message("[C]'s legs shatter with a sickening crunch!", \
+ "Your legs shatter with a sickening crunch!")
+ if(2) // pin them beneath the machine until someone untilts it
+ forceMove(get_turf(C))
+ buckle_mob(C, force=TRUE)
+ C.visible_message("[C] is pinned underneath [src]!", \
+ "You are pinned down by [src]!")
+ if(3) // glass candy
+ crit_rebate = 50
+ for(var/i = 0, i < num_shards, i++)
+ var/obj/item/shard/shard = new /obj/item/shard(get_turf(C))
+ shard.embedding = list(embed_chance = 100, ignore_throwspeed_threshold = TRUE, impact_pain_mult=1, pain_chance=5)
+ shard.updateEmbedding()
+ C.hitby(shard, skipcatch = TRUE, hitpush = FALSE)
+ shard.embedding = list()
+ shard.updateEmbedding()
+ if(4) // paralyze this binch
+ // the new paraplegic gets like 4 lines of losing their legs so skip them
+ visible_message("[C]'s spinal cord is obliterated with a sickening crunch!", ignored_mobs = list(C))
+ C.gain_trauma(/datum/brain_trauma/severe/paralysis/spinesnapped)
+ if(5) // limb squish!
+ for(var/i in C.bodyparts)
+ var/obj/item/bodypart/squish_part = i
+ if(squish_part.is_organic_limb())
+ //var/type_wound = pick(WOUND_LIST_BONE)
+ var/type_wound = pick(list(/datum/wound/brute/bone/critical, /datum/wound/brute/bone/severe, /datum/wound/brute/bone/critical, /datum/wound/brute/bone/severe, /datum/wound/brute/bone/moderate))
+ squish_part.force_wound_upwards(type_wound)
+ else
+ squish_part.receive_damage(brute=30)
+ C.visible_message("[C]'s body is maimed underneath the mass of [src]!", \
+ "Your body is maimed underneath the mass of [src]!")
+ if(6) // skull squish!
+ var/obj/item/bodypart/head/O = C.get_bodypart(BODY_ZONE_HEAD)
+ if(O)
+ C.visible_message("[O] explodes in a shower of gore beneath [src]!", \
+ "Oh f-")
+ O.dismember()
+ O.drop_organs()
+ qdel(O)
+ new /obj/effect/gibspawner/human/bodypartless(get_turf(C))
+
+ if(prob(30))
+ C.apply_damage(max(0, squish_damage - crit_rebate), forced=TRUE, spread_damage=TRUE) // the 30% chance to spread the damage means you escape breaking any bones
+ else
+ C.take_bodypart_damage((squish_damage - crit_rebate)*0.5, wound_bonus = 5) // otherwise, deal it to 2 random limbs (or the same one) which will likely shatter something
+ C.take_bodypart_damage((squish_damage - crit_rebate)*0.5, wound_bonus = 5)
+ C.AddElement(/datum/element/squish, 18 SECONDS)
+ else
+ L.visible_message("[L] is crushed by [src]!", \
+ "You are crushed by [src]!")
+ L.apply_damage(squish_damage, forced=TRUE)
+ if(crit_case)
+ L.apply_damage(squish_damage, forced=TRUE)
+
+ L.Paralyze(60)
+ L.emote("scream")
+ playsound(L, 'sound/effects/blobattack.ogg', 40, TRUE)
+ playsound(L, 'sound/effects/splat.ogg', 50, TRUE)
+
+ var/matrix/M = matrix()
+ M.Turn(pick(90, 270))
+ transform = M
+
+ if(get_turf(fatty) != get_turf(src))
+ throw_at(get_turf(fatty), 1, 1, spin=FALSE)
+
+/obj/machinery/vending/proc/untilt(mob/user)
+ user.visible_message("[user] rights [src].", \
+ "You right [src].")
+
+ unbuckle_all_mobs(TRUE)
+
+ tilted = FALSE
+ layer = initial(layer)
+
+ var/matrix/M = matrix()
+ M.Turn(0)
+ transform = M
/obj/machinery/vending/proc/loadingAttempt(obj/item/I, mob/user)
. = TRUE
@@ -447,6 +596,12 @@ GLOBAL_LIST_EMPTY(vending_products)
to_chat(user, "You insert [I] into [src]'s input compartment.")
loaded_items++
+
+/obj/machinery/vending/unbuckle_mob(mob/living/buckled_mob, force=FALSE)
+ if(!force)
+ return
+ . = ..()
+
/**
* Is the passed in user allowed to load this vending machines compartments
*
@@ -511,6 +666,11 @@ GLOBAL_LIST_EMPTY(vending_products)
if(seconds_electrified && !(stat & NOPOWER))
if(shock(user, 100))
return
+ if(tilted && !user.buckled && !isAI(user))
+ to_chat(user, "You begin righting [src].")
+ if(do_after(user, 50, target=src))
+ untilt(user)
+ return
return ..()
/obj/machinery/vending/ui_base_html(html)
@@ -522,7 +682,7 @@ GLOBAL_LIST_EMPTY(vending_products)
if(!ui)
var/datum/asset/assets = get_asset_datum(/datum/asset/spritesheet/vending)
assets.send(user)
- ui = new(user, src, ui_key, "vending", name, 450, 600, master_ui, state)
+ ui = new(user, src, ui_key, "Vending", ui_key, 450, 600, master_ui, state)
ui.open()
/obj/machinery/vending/ui_static_data(mob/user)
@@ -922,7 +1082,7 @@ GLOBAL_LIST_EMPTY(vending_products)
C = H.get_idcard(TRUE)
if(C?.registered_account)
private_a = C.registered_account
- say("\The [src] has been linked to [C].")
+ say("[src] has been linked to [C].")
if(compartmentLoadAccessCheck(user))
if(istype(I, /obj/item/pen))
diff --git a/code/modules/vending/assist.dm b/code/modules/vending/assist.dm
index 92e40bc3a8..29d1e760d4 100644
--- a/code/modules/vending/assist.dm
+++ b/code/modules/vending/assist.dm
@@ -14,8 +14,7 @@
/obj/item/stock_parts/cell/upgraded = 2)
premium = list(/obj/item/stock_parts/cell/upgraded/plus = 2,
/obj/item/flashlight/lantern = 2,
- /obj/item/beacon = 2,
- /obj/item/airlock_painter/decal = 5)
+ /obj/item/beacon = 2)
product_ads = "Only the finest!;Have some tools.;The most robust equipment.;The finest gear in space!"
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
refill_canister = /obj/item/vending_refill/assist
diff --git a/code/modules/vending/autodrobe.dm b/code/modules/vending/autodrobe.dm
index 9dfb4c76a0..bc824cc994 100644
--- a/code/modules/vending/autodrobe.dm
+++ b/code/modules/vending/autodrobe.dm
@@ -84,8 +84,10 @@
/obj/item/clothing/suit/poncho = 1,
/obj/item/clothing/suit/poncho/green = 1,
/obj/item/clothing/suit/poncho/red = 1,
+ /obj/item/clothing/head/maid = 1,
/obj/item/clothing/under/costume/maid = 1,
/obj/item/clothing/under/rank/civilian/janitor/maid = 1,
+ /obj/item/clothing/gloves/evening = 1,
/obj/item/clothing/glasses/cold=1,
/obj/item/clothing/glasses/heat=1,
/obj/item/clothing/suit/whitedress = 1,
@@ -114,7 +116,8 @@
/obj/item/gun/magic/wand = 2,
/obj/item/clothing/glasses/sunglasses/garb = 2,
/obj/item/clothing/glasses/sunglasses/blindfold = 1,
- /obj/item/clothing/mask/muzzle = 2)
+ /obj/item/clothing/mask/muzzle = 2,
+ /obj/item/clothing/under/syndicate/camo/cosmetic = 3)
premium = list(/obj/item/clothing/suit/pirate/captain = 2,
/obj/item/clothing/head/pirate/captain = 2,
/obj/item/clothing/head/helmet/roman/fake = 1,
diff --git a/code/modules/vending/cartridge.dm b/code/modules/vending/cartridge.dm
index beaf6bb873..69635007c9 100644
--- a/code/modules/vending/cartridge.dm
+++ b/code/modules/vending/cartridge.dm
@@ -10,6 +10,7 @@
/obj/item/cartridge/security = 10,
/obj/item/cartridge/janitor = 10,
/obj/item/cartridge/signal/toxins = 10,
+ /obj/item/cartridge/roboticist = 10,
/obj/item/pda/heads = 10)
premium = list(/obj/item/cartridge/captain = 2,
/obj/item/cartridge/quartermaster = 2)
diff --git a/code/modules/vending/clothesmate.dm b/code/modules/vending/clothesmate.dm
index 963fff9368..7005a0b02f 100644
--- a/code/modules/vending/clothesmate.dm
+++ b/code/modules/vending/clothesmate.dm
@@ -14,6 +14,10 @@
/obj/item/clothing/head/beret/blue = 3,
/obj/item/clothing/glasses/monocle = 3,
/obj/item/clothing/suit/jacket = 4,
+ /obj/item/clothing/suit/jacket/flannel = 4,
+ /obj/item/clothing/suit/jacket/flannel/red = 4,
+ /obj/item/clothing/suit/jacket/flannel/aqua = 4,
+ /obj/item/clothing/suit/jacket/flannel/brown = 4,
/obj/item/clothing/suit/jacket/puffer/vest = 4,
/obj/item/clothing/suit/jacket/puffer = 4,
/obj/item/clothing/suit/hooded/cloak/david = 4,
@@ -150,7 +154,8 @@
/obj/item/clothing/under/costume/qipao/red = 3,
/obj/item/clothing/under/costume/cheongsam = 3,
/obj/item/clothing/under/costume/cheongsam/white = 3,
- /obj/item/clothing/under/costume/cheongsam/red = 3)
+ /obj/item/clothing/under/costume/cheongsam/red = 3,
+ /obj/item/storage/backpack/snail = 3)
contraband = list(/obj/item/clothing/under/syndicate/tacticool = 3,
/obj/item/clothing/under/syndicate/tacticool/skirt = 3,
/obj/item/clothing/mask/balaclava = 3,
diff --git a/code/modules/vending/cola.dm b/code/modules/vending/cola.dm
index b667f4c7c9..bb5b8ef288 100644
--- a/code/modules/vending/cola.dm
+++ b/code/modules/vending/cola.dm
@@ -15,7 +15,8 @@
/obj/item/reagent_containers/food/drinks/soda_cans/sol_dry = 10,
/obj/item/reagent_containers/glass/beaker/waterbottle = 10)
contraband = list(/obj/item/reagent_containers/food/drinks/soda_cans/thirteenloko = 6,
- /obj/item/reagent_containers/food/drinks/soda_cans/shamblers = 6)
+ /obj/item/reagent_containers/food/drinks/soda_cans/shamblers = 6,
+ /obj/item/reagent_containers/glass/beaker/waterbottle/wataur = 2)
premium = list(/obj/item/reagent_containers/food/drinks/drinkingglass/filled/nuka_cola = 1,
/obj/item/reagent_containers/food/drinks/soda_cans/air = 1,
/obj/item/reagent_containers/food/drinks/soda_cans/grey_bull = 1,
diff --git a/code/modules/vending/engivend.dm b/code/modules/vending/engivend.dm
index 50e0fb9cde..965ebddd15 100644
--- a/code/modules/vending/engivend.dm
+++ b/code/modules/vending/engivend.dm
@@ -15,7 +15,6 @@
/obj/item/electronics/airalarm = 10,
/obj/item/electronics/firealarm = 10,
/obj/item/electronics/firelock = 10,
- /obj/item/airlock_painter/decal = 5,
/obj/item/rcd_ammo = 3
)
contraband = list(/obj/item/stock_parts/cell/potato = 3,
@@ -25,7 +24,8 @@
)
premium = list(/obj/item/storage/belt/utility = 3,
/obj/item/storage/box/smart_metal_foam = 3,
- /obj/item/rcd_ammo/large = 5
+ /obj/item/rcd_ammo/large = 5,
+ /obj/item/storage/bag/material = 3
)
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
refill_canister = /obj/item/vending_refill/engivend
diff --git a/code/modules/vending/games.dm b/code/modules/vending/games.dm
index 7bed27b0bd..7fd8246dd6 100644
--- a/code/modules/vending/games.dm
+++ b/code/modules/vending/games.dm
@@ -4,7 +4,7 @@
product_ads = "Escape to a fantasy world!;Fuel your gambling addiction!;Ruin your friendships!;Roll for initiative!;Elves and dwarves!;Paranoid computers!;Totally not satanic!;Fun times forever!"
icon_state = "games"
products = list(/obj/item/toy/cards/deck = 5,
- /obj/item/storage/pill_bottle/dice = 10,
+ /obj/item/storage/box/dice = 10,
/obj/item/toy/cards/deck/cas = 3,
/obj/item/toy/cards/deck/cas/black = 3,
/obj/item/toy/cards/deck/unum = 3)
diff --git a/code/modules/vending/kinkmate.dm b/code/modules/vending/kinkmate.dm
index 24fb685eac..df8a4e8a96 100644
--- a/code/modules/vending/kinkmate.dm
+++ b/code/modules/vending/kinkmate.dm
@@ -6,8 +6,10 @@
product_slogans = "Kinky!;Sexy!;Check me out, big boy!"
vend_reply = "Have fun, you shameless pervert!"
products = list(
+ /obj/item/clothing/head/maid = 5,
/obj/item/clothing/under/costume/maid = 5,
/obj/item/clothing/under/rank/civilian/janitor/maid = 5,
+ /obj/item/clothing/gloves/evening = 5,
/obj/item/clothing/neck/petcollar = 5,
/obj/item/clothing/neck/petcollar/choker = 5,
/obj/item/clothing/neck/petcollar/leather = 5,
@@ -21,10 +23,10 @@
/obj/item/dildo/custom = 5,
/obj/item/electropack/shockcollar = 3,
/obj/item/assembly/signaler = 3,
- /obj/item/clothing/under/shorts/polychromic/pantsu,
- /obj/item/clothing/under/misc/poly_bottomless,
- /obj/item/clothing/under/misc/poly_tanktop,
- /obj/item/clothing/under/misc/poly_tanktop/female
+ /obj/item/clothing/under/shorts/polychromic/pantsu = 3,
+ /obj/item/clothing/under/misc/poly_bottomless = 3,
+ /obj/item/clothing/under/misc/poly_tanktop = 3,
+ /obj/item/clothing/under/misc/poly_tanktop/female = 3
)
contraband = list(
/obj/item/clothing/neck/petcollar/locked = 2,
diff --git a/code/modules/vending/liberation_toy.dm b/code/modules/vending/liberation_toy.dm
index 1ce0b6cfaf..9093d55b0d 100644
--- a/code/modules/vending/liberation_toy.dm
+++ b/code/modules/vending/liberation_toy.dm
@@ -20,7 +20,7 @@
/obj/item/gun/ballistic/automatic/l6_saw/toy/unrestricted/riot = 10,
/obj/item/ammo_box/foambox/riot = 20,
/obj/item/toy/katana = 10,
- /obj/item/twohanded/dualsaber/toy = 5,
+ /obj/item/dualsaber/toy = 5,
/obj/item/toy/cards/deck/syndicate = 10) //Gambling and it hurts, making it a +18 item
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
resistance_flags = FIRE_PROOF
diff --git a/code/modules/vending/medical.dm b/code/modules/vending/medical.dm
index fbd9a10bf2..34de3b490c 100644
--- a/code/modules/vending/medical.dm
+++ b/code/modules/vending/medical.dm
@@ -29,7 +29,12 @@
/obj/item/storage/hypospraykit/brute = 2,
/obj/item/storage/hypospraykit/enlarge = 2,
/obj/item/reagent_containers/glass/bottle/vial/small = 5,
- /obj/item/storage/briefcase/medical = 2)
+ /obj/item/storage/briefcase/medical = 2,
+ /obj/item/stack/sticky_tape/surgical = 3,
+ /obj/item/healthanalyzer/wound = 4,
+ /obj/item/stack/medical/ointment = 2,
+ /obj/item/stack/medical/suture = 2,
+ /obj/item/stack/medical/bone_gel = 4)
contraband = list(/obj/item/reagent_containers/pill/tox = 3,
/obj/item/reagent_containers/pill/morphine = 4,
/obj/item/reagent_containers/pill/charcoal = 6)
diff --git a/code/modules/vending/medical_wall.dm b/code/modules/vending/medical_wall.dm
index 694d2b0c34..31f3dc49f1 100644
--- a/code/modules/vending/medical_wall.dm
+++ b/code/modules/vending/medical_wall.dm
@@ -11,6 +11,8 @@
/obj/item/reagent_containers/medspray/silver_sulf = 2,
/obj/item/reagent_containers/pill/charcoal = 2,
/obj/item/reagent_containers/medspray/sterilizine = 1,
+ /obj/item/healthanalyzer/wound = 2,
+ /obj/item/stack/medical/bone_gel = 2,
/obj/item/reagent_containers/syringe/dart = 10)
contraband = list(/obj/item/reagent_containers/pill/tox = 2,
/obj/item/reagent_containers/pill/morphine = 2)
@@ -22,6 +24,7 @@
extra_price = PRICE_NORMAL
payment_department = ACCOUNT_MED
cost_multiplier_per_dept = list(ACCOUNT_MED = 0)
+ tiltable = FALSE
/obj/item/vending_refill/wallmed
machine_name = "NanoMed"
diff --git a/code/modules/vending/megaseed.dm b/code/modules/vending/megaseed.dm
index 2eb68aaf4a..45199298ca 100644
--- a/code/modules/vending/megaseed.dm
+++ b/code/modules/vending/megaseed.dm
@@ -4,7 +4,8 @@
product_slogans = "THIS'S WHERE TH' SEEDS LIVE! GIT YOU SOME!;Hands down the best seed selection on the station!;Also certain mushroom varieties available, more for experts! Get certified today!"
product_ads = "We like plants!;Grow some crops!;Grow, baby, growww!;Aw h'yeah son!"
icon_state = "seeds"
- products = list(/obj/item/seeds/ambrosia = 3,
+ products = list(/obj/item/seeds/aloe = 3,
+ /obj/item/seeds/ambrosia = 3,
/obj/item/seeds/apple = 3,
/obj/item/seeds/banana = 3,
/obj/item/seeds/berry = 3,
diff --git a/code/modules/vending/security.dm b/code/modules/vending/security.dm
index 43f3a96d3d..8ad4b0568c 100644
--- a/code/modules/vending/security.dm
+++ b/code/modules/vending/security.dm
@@ -15,15 +15,15 @@
/obj/item/secbat = 5)
contraband = list(/obj/item/clothing/glasses/sunglasses = 2,
/obj/item/storage/fancy/donut_box = 2,
- /obj/item/ssword_kit = 1,
- /obj/item/storage/bag/ammo = 1)
+ /obj/item/ssword_kit = 1)
premium = list(/obj/item/coin/antagtoken = 1,
/obj/item/clothing/head/helmet/blueshirt = 1,
/obj/item/clothing/suit/armor/vest/blueshirt = 1,
/obj/item/clothing/under/rank/security/officer/blueshirt = 1,
/obj/item/clothing/gloves/tackler = 5,
+ /obj/item/grenade/stingbang = 1,
/obj/item/ssword_kit = 1,
- /obj/item/storage/bag/ammo = 2)
+ /obj/item/storage/bag/ammo = 3)
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
resistance_flags = FIRE_PROOF
refill_canister = /obj/item/vending_refill/security
diff --git a/code/modules/vending/toys.dm b/code/modules/vending/toys.dm
index d628c888a5..c5095ebff8 100644
--- a/code/modules/vending/toys.dm
+++ b/code/modules/vending/toys.dm
@@ -21,7 +21,7 @@
/obj/item/gun/ballistic/automatic/c20r/toy/unrestricted = 10,
/obj/item/gun/ballistic/automatic/l6_saw/toy/unrestricted = 10,
/obj/item/toy/katana = 10,
- /obj/item/twohanded/dualsaber/toy = 5)
+ /obj/item/dualsaber/toy = 5)
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
resistance_flags = FIRE_PROOF
refill_canister = /obj/item/vending_refill/donksoft
diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm
index 76ef5e6f23..26beccaac0 100644
--- a/code/modules/vending/wardrobes.dm
+++ b/code/modules/vending/wardrobes.dm
@@ -248,6 +248,7 @@
vend_reply = "Thank you for using the BarDrobe!"
products = list(/obj/item/clothing/head/that = 3,
/obj/item/radio/headset/headset_srv = 3,
+ /obj/item/clothing/suit/hooded/wintercoat/bar = 3,
/obj/item/clothing/under/suit/sl = 3,
/obj/item/clothing/under/rank/civilian/bartender = 3,
/obj/item/clothing/under/rank/civilian/bartender/skirt = 2,
@@ -309,7 +310,7 @@
/obj/item/cartridge/janitor = 3,
/obj/item/clothing/gloves/color/black = 2,
/obj/item/clothing/head/soft/purple = 2,
- /obj/item/twohanded/broom = 2,
+ /obj/item/broom = 2,
/obj/item/paint/paint_remover = 2,
/obj/item/melee/flyswatter = 2,
/obj/item/flashlight = 2,
diff --git a/code/modules/vending/youtool.dm b/code/modules/vending/youtool.dm
index c936d9c32c..2119197aed 100644
--- a/code/modules/vending/youtool.dm
+++ b/code/modules/vending/youtool.dm
@@ -18,8 +18,7 @@
/obj/item/clothing/gloves/color/fyellow = 4,
/obj/item/multitool = 2)
premium = list(/obj/item/clothing/gloves/color/yellow = 2,
- /obj/item/weldingtool/hugetank = 2,
- /obj/item/airlock_painter/decal = 3)
+ /obj/item/weldingtool/hugetank = 2)
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 70)
refill_canister = /obj/item/vending_refill/tool
resistance_flags = FIRE_PROOF
diff --git a/code/modules/vore/eating/belly_obj.dm b/code/modules/vore/eating/belly_obj.dm
index 50cdc32bf6..a367abb098 100644
--- a/code/modules/vore/eating/belly_obj.dm
+++ b/code/modules/vore/eating/belly_obj.dm
@@ -542,8 +542,6 @@
if (!(R in contents))
return // User is not in this belly
- R.changeNext_move(CLICK_CD_BREAKOUT*0.5)
-
if(owner.stat) //If owner is stat (dead, KO) we can actually escape
to_chat(R,"You attempt to climb out of \the [lowertext(name)]. (This will take around [escapetime/10] seconds.)")
to_chat(owner,"Someone is attempting to climb out of your [lowertext(name)]!")
diff --git a/code/modules/vore/eating/bellymodes.dm b/code/modules/vore/eating/bellymodes.dm
index 77864021b4..291ef8654f 100644
--- a/code/modules/vore/eating/bellymodes.dm
+++ b/code/modules/vore/eating/bellymodes.dm
@@ -76,7 +76,7 @@
play_sound = pick(pred_digest)
//Pref protection!
- if (!M.vore_flags & DIGESTABLE || M.vore_flags & ABSORBED)
+ if (!CHECK_BITFIELD(M.vore_flags, DIGESTABLE) || M.vore_flags & ABSORBED)
continue
//Person just died in guts!
diff --git a/code/modules/vore/eating/living.dm b/code/modules/vore/eating/living.dm
index bffb8b2517..9395cef952 100644
--- a/code/modules/vore/eating/living.dm
+++ b/code/modules/vore/eating/living.dm
@@ -116,7 +116,7 @@
testing("[user] attempted to feed [prey] to [pred], via [lowertext(belly.name)] but it went wrong.")
return
- if (!prey.vore_flags & DEVOURABLE)
+ if (!CHECK_BITFIELD(prey.vore_flags, DEVOURABLE))
to_chat(user, "This can't be eaten!")
return FALSE
@@ -349,7 +349,7 @@
if(incapacitated(ignore_restraints = TRUE))
to_chat(src, "You can't do that while incapacitated.")
return
- if(next_move > world.time)
+ if(!CheckActionCooldown())
to_chat(src, "You can't do that so fast, slow down.")
return
@@ -366,11 +366,10 @@
if(QDELETED(tasted) || (tasted.ckey && !(tasted.client?.prefs.vore_flags & LICKABLE)) || !Adjacent(tasted) || incapacitated(ignore_restraints = TRUE))
return
- changeNext_move(CLICK_CD_MELEE)
+ DelayNextAction(CLICK_CD_MELEE)
visible_message("[src] licks [tasted]!","You lick [tasted]. They taste rather like [tasted.get_taste_message()].","Slurp!")
-
/mob/living/proc/get_taste_message(allow_generic = TRUE, datum/species/mrace)
if(!vore_taste && !allow_generic)
return FALSE
diff --git a/code/modules/zombie/items.dm b/code/modules/zombie/items.dm
index d4d92f54c4..cf61e4b210 100644
--- a/code/modules/zombie/items.dm
+++ b/code/modules/zombie/items.dm
@@ -11,9 +11,13 @@
var/icon_left = "bloodhand_left"
var/icon_right = "bloodhand_right"
hitsound = 'sound/hallucinations/growl1.ogg'
- force = 21 // Just enough to break airlocks with melee attacks
+ force = 18
+ sharpness = IS_SHARP_ACCURATE //it's a claw, they're sharp.
damtype = "brute"
total_mass = TOTAL_MASS_HAND_REPLACEMENT
+ sharpness = IS_SHARP
+ wound_bonus = -30
+ bare_wound_bonus = 15
/obj/item/zombie_hand/Initialize()
. = ..()
@@ -32,11 +36,15 @@
. = ..()
if(!proximity_flag)
return
- else if(isliving(target))
- if(ishuman(target))
- try_to_zombie_infect(target)
- else
- check_feast(target, user)
+ else
+ if(istype(target, /obj)) //do far more damage to non mobs so we can get through airlocks
+ var/obj/target_object = target
+ target_object.take_damage(force * 3, BRUTE, "melee", 0)
+ else if(isliving(target))
+ if(ishuman(target))
+ try_to_zombie_infect(target)
+ else
+ check_feast(target, user)
/proc/try_to_zombie_infect(mob/living/carbon/human/target)
CHECK_DNA_AND_SPECIES(target)
@@ -52,8 +60,6 @@
infection = new()
infection.Insert(target)
-
-
/obj/item/zombie_hand/suicide_act(mob/user)
user.visible_message("[user] is ripping [user.p_their()] brains out! It looks like [user.p_theyre()] trying to commit suicide!")
if(isliving(user))
diff --git a/code/modules/zombie/organs.dm b/code/modules/zombie/organs.dm
index 3d045ba31e..2681f781a9 100644
--- a/code/modules/zombie/organs.dm
+++ b/code/modules/zombie/organs.dm
@@ -93,7 +93,8 @@
playsound(owner.loc, 'sound/hallucinations/far_noise.ogg', 50, 1)
owner.do_jitter_animation(living_transformation_time)
owner.Stun(living_transformation_time)
- to_chat(owner, "You are now a zombie!")
+ to_chat(owner, "You are now a zombie! You claw and bite, turning your fellow crewmembers into friends that help spread the plague.")
+ to_chat(owner, "You are a zombie. Please act like one. Letting the crew remove the tumor inside your brain is a dick move to whoever infected you. Please do not do it.")
/obj/item/organ/zombie_infection/nodamage
causes_damage = FALSE
diff --git a/config/awaymissionconfig.txt b/config/awaymissionconfig.txt
index c6a5d9ef8f..768942c434 100644
--- a/config/awaymissionconfig.txt
+++ b/config/awaymissionconfig.txt
@@ -7,16 +7,13 @@
#Do NOT tick the maps during compile -- the game uses this list to decide which map to load. Ticking the maps will result in them ALL being loaded at once.
#DO tick the associated code file for the away mission you are enabling. Otherwise, the map will be trying to reference objects which do not exist, which will cause runtime errors!
-#_maps/RandomZLevels/away_mission/blackmarketpackers.dmm
-#_maps/RandomZLevels/away_mission/spacebattle.dmm
#_maps/RandomZLevels/away_mission/TheBeach.dmm
#_maps/RandomZLevels/away_mission/Academy.dmm
#_maps/RandomZLevels/away_mission/wildwest.dmm
#_maps/RandomZLevels/away_mission/challenge.dmm
-#_maps/RandomZLevels/away_mission/centcomAway.dmm
#_maps/RandomZLevels/away_mission/moonoutpost19.dmm
#_maps/RandomZLevels/away_mission/undergroundoutpost45.dmm
#_maps/RandomZLevels/away_mission/caves.dmm
#_maps/RandomZLevels/away_mission/snowdin.dmm
#_maps/RandomZLevels/away_mission/research.dmm
-#_maps/RandomZLevels/away_mission/Cabin.dmm
+#_maps/RandomZLevels/away_mission/SnowCabin.dmm
\ No newline at end of file
diff --git a/config/config.txt b/config/config.txt
index 35af0e848b..46f9a0cdc4 100644
--- a/config/config.txt
+++ b/config/config.txt
@@ -8,6 +8,7 @@ $include donator_groupings.txt
$include dynamic_config.txt
$include plushies/defines.txt
$include job_threats.txt
+$include policy.txt
# You can use the @ character at the beginning of a config option to lock it from being edited in-game
# Example usage:
@@ -524,3 +525,7 @@ FAIL2TOPIC_RULE_NAME _dd_fail2topic
## Enable automatic profiling - Byond 513.1506 and newer only.
#AUTO_PROFILE
+
+## Uncomment to enable global ban DB using the provided URL. The API should expect to receive a ckey at the end of the URL.
+## More API details can be found here: https://centcom.melonmesa.com
+CENTCOM_BAN_DB https://centcom.melonmesa.com/ban/search
diff --git a/config/in_character_filter.txt b/config/in_character_filter.txt
new file mode 100644
index 0000000000..46df3fd60c
--- /dev/null
+++ b/config/in_character_filter.txt
@@ -0,0 +1,7 @@
+###############################################################################################
+# Words that will block in character chat messages from sending. #
+# Case is not important. Commented-out examples are listed below, just remove the "#". #
+###############################################################################################
+#lol
+#omg
+#wtf
\ No newline at end of file
diff --git a/config/maps.txt b/config/maps.txt
index d97bd99be6..a90fea7595 100644
--- a/config/maps.txt
+++ b/config/maps.txt
@@ -36,10 +36,6 @@ map deltastation
minplayers 50
endmap
-map icebox
- minplayers 25
-endmap
-
map snaxi
minplayers 25
endmap
diff --git a/config/plushies/defines.txt b/config/plushies/defines.txt
index e7a92f6ac2..7cd1d88f3e 100644
--- a/config/plushies/defines.txt
+++ b/config/plushies/defines.txt
@@ -1,2 +1,2 @@
-# EXAMPLE
-# SNOWFLAKE_PLUSHIES example {"name":"example","desc":"thanks, coders.","icon_state":"","attack_verb":["thumped","whomped","bumped"],"squeak_override":{"sound/weapons/magout.ogg":1}}
+# EXAMPLE
+# SNOWFLAKE_PLUSHIES example {"name":"example","desc":"thanks, coders.","icon_state":"","attack_verb":["thumped","whomped","bumped"],"squeak_override":{"sound/weapons/magout.ogg":1}}
diff --git a/config/policy.txt b/config/policy.txt
new file mode 100644
index 0000000000..610acd2be8
--- /dev/null
+++ b/config/policy.txt
@@ -0,0 +1,13 @@
+## Policy configuration
+## Current valid keys are:
+## ON_CLONE - displayed after a successful cloning operation to the cloned person
+## ON_DEFIB_INTACT - displayed after defibbing before memory loss time threshold
+## ON_DEFIB_LATE - displayed after defibbing post memory loss time threshold
+##
+## EXAMPLE:
+## POLICYCONFIG ON_CLONE insert text here span classes are fully supported
+
+## Misc entries for above
+
+## Defib time limit for "cloning memory disorder" memory loss in seconds
+# DEFIB_CMD_TIME_LIMIT 300
diff --git a/dependencies.sh b/dependencies.sh
index 83254509b9..75e49f3fe1 100644
--- a/dependencies.sh
+++ b/dependencies.sh
@@ -11,7 +11,7 @@ export BYOND_MINOR=${LIST[1]}
unset LIST
#rust_g git tag
-export RUST_G_VERSION=0.4.3
+export RUST_G_VERSION=0.4.4
#bsql git tag
export BSQL_VERSION=v1.4.0.0
diff --git a/html/admin/view_variables.css b/html/admin/view_variables.css
index 83b3a37f3c..34c1a211eb 100644
--- a/html/admin/view_variables.css
+++ b/html/admin/view_variables.css
@@ -30,6 +30,6 @@ table.matrixbrak td.lbrak {
border-right: none;
}
table.matrixbrak td.rbrak {
- border-right: solid 0.5exrgb(95, 61, 61)k;
+ border-right: solid 0.5ex black;
border-left: none;
}
diff --git a/html/changelog.html b/html/changelog.html
index 24d4cd8ac3..6994ba35a9 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -50,6 +50,1007 @@
-->
+
03 August 2020
+
KeRSedChaplain updated:
+
+
fixed clockwork guardians being able to reflect ranged weapons
+
+
Linzolle updated:
+
+
uv penlight no longer invisible
+
+
dapnee updated:
+
+
active turfs on box and xenohive, maintenance bar APC not being stringed correctly, turned a monitor to face a direction that makes sense, changed tag of camera in gravgen being misnamed
+
+
silicons updated:
+
+
shoves have been buffed to apply a status effect rather than a 0.85 movespeed modifier, meaning repeatedly shoving someone now renews the debuff
+
shoves now stagger for 3.5 seconds.
+
war operatives now actually time 20 minutes since roundstart to depart instead of 15.
+
explosive stand bombs can now be examined from any distance
+
explosive stand bombs are now a component.
+
+
+
02 August 2020
+
Auris456852 updated:
+
+
Added B.O.O.P. Remote Control cartridges to the PTech.
+
+
Hatterhat updated:
+
+
Durathread reinforcement kits! Sprites by Toriate, sets jumpsuit armor to durathread levels, craft in the crafting menu.
+
+
KeRSedChaplain updated:
+
+
The belligerent scripture and a brass multitool, and a new marauder variant which act similar to holoparasites/guardian spirits.
+
Removed the abductor teleport consoles they get, removes abscond for the time being as I've not seen much use for it other than just spamming it and hoping you end up in the armory.
+
moved around scriptures to make the cult work better as being based around the station, makes the Ark scream more often and work as a summonable object, clockwork armor now has a flat 0 defense up to 10 instead of negatives against laser damage. Makes the Ark work better in a station based setting, as well as the Heralds beacon in case It works for the mode.
+
added powerloaderstep.ogg for Neovgre
+
changes 'Dread_Ipad.dmi' to 'clockwork_slab.dmi'
+
+
MrJWhit updated:
+
+
Adjusts abductor spawntext
+
+
Seris02 updated:
+
+
fixed replica pods
+
+
dapnee updated:
+
+
fixed active turfs on wizard ruin and space hermit, fixed missing APC's and added a light on Delta
+
+
ike709 and bobbahbrown updated:
+
+
Admins can now see your bans on (some) other servers.
+
+
kappa-sama updated:
+
+
chaplain cultists being able to convert people to full clockwork cult status
+
+
timothyteakettle updated:
+
+
combat mode now has weaker buffs in terms of damage dealt and took for being or not being in the mode
+
damage debuff for laying down has been decreased from 0.5x to 0.7x
+
+
+
01 August 2020
+
dapnee updated:
+
+
added cake hat to bar, adds another atmostech spawn
+
sinks point in the right direction, APC won't spawn off the wall in circuits
+
changes commissary APC so it actually powers the room, adds a missing AIR alarm, arrivals no longer has active atmos tiles.
+
+
silicons updated:
+
+
toy shotguns no longer need 2 hands to fire
+
being on fire works again.
+
+
timothyteakettle updated:
+
+
monkeys no longer continuously bleed everywhere
+
+
+
30 July 2020
+
Adelphon updated:
+
+
Created a Cosmetic version of the camo.
+
+
Arturlang updated:
+
+
Bloodsucker LifeTick runs from BiologicalLife now
+
+
Ryll-Ryll ported by silicons updated:
+
+
Shoelaces are now a thing. You can untie them by laying down next to someone.
+
shoes now have lace delays and some can't be laced at all
+
do after now tracks who's interacting with who, meaning some actions now break when the target moves away.
+
+
SiliconMain updated:
+
+
Ported the long range atmos analyzer from sk*rat, credit to NotRanged
+
+
silicons updated:
+
+
energy sword perfect parries now reflect projectiles back at their shooters.
+
any mob can now parry if they have the right item
+
beam rifles now go into emitters properly
+
clickdelay has been refactored into an experimental hybrid system. Check code/modules/mob/clickdelay.dm for more information.
+
Resisting no longer checks clickdelay, but is standardized to a 2 second per resist system for most forms of resisting. It still sets clickdelay, though.
+
Meters have been added for estimating time until next attack/resist. Won't be that useful due to our clickdelay currently being very short, though. They're visible from your hand and resist HUD elements. experimental: Most attacks and forms of attacking (minus unarmed because it's too much of a pain to refactor how hugs/gloves of the north star works) now check for time-since-last-attack rather than making it so you can't attack for said time. This means you can very quickly switch to a gun from a melee weapon, whereas in the old system a melee weapon would put you on lockout for 0.8 seconds, in the new system all the gun cares about is that you did not attack for at least 0.4 seconds.
+
All clickdelay setting/reading are now procs, so it should be trivial to implement another system where drawing/switching to a weapon requires you to have it out for x seconds before using it. I am not personally doing it at this point in time though because it will likely just annoy everyone with no real gain unless we do something like putting a 0.8 second switch-to cooldown for guns (which I did not, yet)
+
attack_hand has been refactored to on_attack_hand remove: sexchems no longer impact click delay
+
turrets now automatically stagger their shots. Happy parrying/blocking.
+
turrets now speed_process, they were shooting slower than they should be
+
anything can now block with the right items
+
+
timothyteakettle updated:
+
+
some crafted crates won't contain items now, and thus have stopped breaking the laws of physics
+
beepskys hats now follow the laws of gravity and move up/down when he bobs up and down
+
+
+
29 July 2020
+
DeltaFire15 updated:
+
+
The 'Naked' outfit is no longer broken.
+
+
Ghommie updated:
+
+
fixed cremator trays, paleness examination strings, chat message for stamping paper, looping sounds, load away missions/VR admin verb, access requirements for using the sechuds.
+
Alt-Clicking a cigarette packet should pull the lighter out first if present, then cigarettes.
+
+
Hatterhat updated:
+
+
Directional windows can now be rotated counterclockwise properly again.
+
+
NecromancerAnne, Sirich96 updated:
+
+
Stunbaton sprites by Sirich96.
+
New sprites for the stunsword.
+
+
necromanceranne updated:
+
+
Adds some in-hands for the rapier sheath.
+
+
timothyteakettle updated:
+
+
tail wagging should work in all cases now
+
bluespace jars work as intended now
+
aliens can remove embeds now
+
bloodsuckers are not affected by bloodloss
+
+
zeroisthebiggay updated:
+
+
Flannel jackets and bartender winter coat
+
+
+
28 July 2020
+
Cacogen updated:
+
+
OSHA has more pull than anyone could have expected. All armor provided by Nanotrasen and the syndicate now have tags that accurately lists defenses and resistances of a piece of clothing.
+
+
CameronWoof updated:
+
+
Exotic seed crates now contain a spaceman's trumpet seed packet.
+
+
EmeraldSundisk updated:
+
+
Renovates Snow Taxi's northeast bathroom to have multiple non-urinal toilets and showers
+
Adds signage/labeling to improve map readability
+
Adds a bathroom to the northwest station
+
Adds a filing cabinet to the cargo department
+
Area designation adjustments to account for the above changes
+
Adds a missing airlock cyclelink near medical
+
+
Ludox235 updated:
+
+
Makes the flavour text that appears when you become a zombie tell you to act like one.
+
+
MrJWhit updated:
+
+
Decluttered toxins and hid the yellow mix line in atmos, for metastation
+
+
SiliconMain updated:
+
+
Paramedic heirloom is now a zippo
+
Durathread belts now protect their contents from radiation, and can hold full sized extinguishers
+
+
Sishen1542 updated:
+
+
removed zoomba
+
+
dapnee updated:
+
+
added a fan to the listening outpost
+
added two missing r-walls near the SM, removed random light and wire node below the engine, and fixed the missing cable in the courtroom on Kilo
+
+
kappa-sama updated:
+
+
Stimpaks cost 5tc once more, up from 3tc.
+
+
silicons updated:
+
+
polychromatic cloaks to loadout
+
no more self healing with medibeam guns
+
oh no, taser buff. alt fire delay dropped to 0.4 seconds.
+
you can now shoot yourself by disarm-intenting yourself with a gun.
+
+
timothyteakettle updated:
+
+
species code is now slightly less messy
+
slight tweak to how material crafting works
+
changed up pet carriers / bluespace jars a bit so you can't fit certain things inside them and also the text shown for resist times is accurate
+
+
zeroisthebiggay updated:
+
+
Black Box theft objective
+
+
+
27 July 2020
+
Hatterhat updated:
+
+
Training bokkens! Make 'em from wood, use 'em in-hand to toggle between harmful and not-so-harmful, practice your parrying with them!
+
Marker beacons should have a sprite again.
+
+
silicons updated:
+
+
clownops and clown mobs now share the same faction. HONK!
+
+
timothyteakettle updated:
+
+
modern pickle technology now allows people who have been turned into pickles, to be retrieved through the medical course of dying
+
+
+
26 July 2020
+
DeltaFire15 updated:
+
+
Organs now decay again.
+
+
Iatots updated:
+
+
Licking wounds now may cause you to spit out a hairball once in a while!
+
You can now craft a catgirl plushie with 3 of a new ingredient occasionally found in medbay!
+
+
dapnee updated:
+
+
removed legacy public mining shuttle area and remade lounge
+
+
+
25 July 2020
+
CameronWoof updated:
+
+
Aloe now has an icon.
+
+
timothyteakettle updated:
+
+
beepsky replaces the word THREAT_LEVEL with the actual threat level
+
+
+
24 July 2020
+
EmeraldSundisk updated:
+
+
Adds a CMO office, along with Virology and Genetics labs to Omega Station
+
Adds a second chemistry station to the chemistry lab
+
Adjusts the locations of some objects in medical to accommodate these new additions
+
Relocates the morgue
+
Relocates items in impacted areas of maintenance as well as the library
sanitization now doesn't cut off 15.7 or something million possible colors from character preferences (instead of only allowing 16 values for R G and B, it now allows 256 each)
+
projectiles are by default 17.5 tiles per second instead of 12.5
+
+
timothyteakettle updated:
+
+
due to recent innovative research in the medical field, you now have bones
+
zombie claws are now sharp and do less damage, but can destroy non-lifeforms far faster
+
zombies now take less stamina damage
+
beepsky can now wear hats
+
+
zeroisthebiggay updated:
+
+
rad and kravglove sprites
+
+
+
23 July 2020
+
DeltaFire15 updated:
+
+
Traits are no longer fucked
+
+
Putnam3145 updated:
+
+
Slight optimization in chat code.
+
+
kappa-sama updated:
+
+
tendril chests being empty
+
+
zeroisthebiggay updated:
+
+
fetish content
+
+
+
22 July 2020
+
Ludox updated:
+
+
You can no longer be brainwashed into giving birth to a fake baby
+
+
kappa-sama updated:
+
+
brainwashing disk has lost its cost buffs (3->5) and is role restricted once more (medical doctor/roboticist)
+
+
+
21 July 2020
+
Arturlang updated:
+
+
Decal painter ui now works, yay?
+
+
CameronWoof updated:
+
+
Adds aloe, a new growable plant
+
Adds medicated sutures and advanced regenerative meshes
+
Polypyrylium oligomers and liquid electricity now correctly populate
+
+
Chiirno updated:
+
+
Alt-click pill bottles places top-most pill into active hand.
+
Moved dice bags from pill_bottle/dice to box/dice to avoid dice bags being affected from medical specific pill bottle changes.
+
+
DeltaFire15 updated:
+
+
Swarmers can once again eat items as long as there's nothing living in them.
+
+
Funce updated:
+
+
Genetics spiderwebs are no longer impassable walls
+
+
Kraseo updated:
+
+
Damp rags no longer instantly apply their chemicals onto someone.
+
+
SiliconMain updated:
+
+
Geigers can no longer be contaminated
+
+
TheSpaghetti updated:
+
+
new snowflake trait
+
+
kappa-sama updated:
+
+
advanced surgery duffel bag no longer comes with a nukie medkit. it costs 4 less telecrystals to make up for this colossal nerf.
+
quartered the weight of the stray cargo pod event from 2x normal to 1/2 normal
+
+
silicons updated:
+
+
survivalists (from summon guns/magic) are proper objective'd pseudoantagonists again
+
summon guns/magic can only be used once each
+
summon guns/magic now only cost one point each
+
:dsmile: :dfrown: :dhsmile: :dpog: :dneutral:
+
gravity should update for mobs a fair bit faster
+
voting can now be done from the stat panel if the system is plurality and approval
+
+
timothyteakettle updated:
+
+
new fried component used for frying objects
+
various frying bugs fixed such as being able to unfry items and frying turfs with cold cooking oil
+
+
+
20 July 2020
+
lolman360 updated:
+
+
Service borgs now have synthesizers instead of a violin and guitar.
+
borg RSF
+
+
+
19 July 2020
+
Arturlang updated:
+
+
TGUI 3.0 and enables all the UIs, plus the smart asset cache, and all the things required for them
+
+
EmeraldSundisk updated:
+
+
Adds a pool to Delta Station
+
Adds light fixtures to specified areas
+
Relocates objects in impacted areas of Delta's starboard maintenance
+
+
MrJWhit updated:
+
+
Adds a small light next to the kitchen counter
+
+
Putnam3145 updated:
+
+
Pen uplinks no longer broken
+
+
TheObserver-sys updated:
+
+
Adds a new reaction: Slime Extractification. Take 30u Slime Jelly, 5u Frost Oil, and 5u plasma to generate a fresh grey slime extract.
+
+
Yakumo Chen updated:
+
+
Hierophant club now checks for friendly fire by default.
+
+
b1tt3r1n0 updated:
+
+
Added the updated circle game
+
+
silicons updated:
+
+
Unarmed parry is now a thing.
+
+
timothyteakettle updated:
+
+
plushies in the loadout have been replaced with a box that lets you choose one instead
+
wrestling should no longer have the ability to permanently rotate people
+
you can now select to wear a snail shell as your backpack in the customization menu
+
+
zeroisthebiggay updated:
+
+
martial arts twenty minpop
+
records
+
+
+
17 July 2020
+
ShizCalev, Fikou updated:
+
+
Added some sanity checking for varedit values.
+
Fixed an exploit involving coins and mints that could crash the server.
+
Fixed an exploit that would allow you to destroy round-critical / indestructible items with folders.
+
Swarmers can no longer cut power lines by deconstructing catwalks underneath them.
+
Fixed a scenario that allowed infinite resource generation via ore machines.
+
you can no longer inject html in ahelps
+
you cant either, jannies
+
+
timothyteakettle updated:
+
+
fixes a small pickle related issue
+
recent culinary and scientific advancements have brought forth new pickle related technologies
+
+
+
16 July 2020
+
DeltaFire15 updated:
+
+
Fixes a zeolite runtime caused by a missing check.
+
+
Sneakyrat6 updated:
+
+
Fixes being able to meta people real name with OOC Notes
+
+
timothyteakettle updated:
+
+
travelling traders from another dimension can now visit the station in search of something specific, and reward you for giving it to them
+
small error with pet carrier logic fixed and also making sure simple mobs are catered for properly inside bluespace jars
+
fixes coin related issue
+
+
+
15 July 2020
+
Sonic121x updated:
+
+
Paramedic jumpsuit
+
+
+
14 July 2020
+
silicons updated:
+
+
chemical reactions now are sorted by priority first and temperature second.
+
sec and medical records have been added to character setup.
+
circuit reagent heaters are now sanitized for temperature from 2.7 to 1000.
+
+
timothyteakettle updated:
+
+
ports a money bag exploit
+
+
+
13 July 2020
+
Linzolle updated:
+
+
you can no longer vore and digest people regardless of vore preferences
+
+
Owai-Seek updated:
+
+
Trashbags can now hold most shoes, and organs.
+
You can no longer nest nuke disks or hold brains in the trash.
+
+
+
12 July 2020
+
DeltaFire15 updated:
+
+
Sentinels compromise now heals augmented bodyparts.
+
+
EmeraldSundisk updated:
+
+
Adds turnstiles to CogStation's security wing
+
Readds robotics to the Corpse Disposal Network
+
Readds chemistry's ability to send items directly to the experimentation lab
+
Visual renovation and slight adjustments to CogStation's robotics lab
+
Slight visual adjustments elsewhere (the library)
+
CogStation's mail and disposal pipes are once again complete
+
CogStation's robotics lab now has spawners, lights, and other room essentials
+
+
HeroWithYay updated:
+
+
Added Telecrystal Dust
+
Telecrystals can be sold at cargo
+
+
LetterN updated:
+
+
Added d[thing] emojis
+
bye xss
+
+
MrJWhit updated:
+
+
Removes northern tunnel to the monastery on Pubby
+
+
Yakumo Chen updated:
+
+
Adds a wedding crate to cargo full of wedding attire.
+
+
kappa-sama updated:
+
+
wisdom cow is half as common and is wise enough to lag the server 66% less
+
+
silicons updated:
+
+
policy configuration added, plus support hooks for assisting enforcement of clone memory disorder. logging: added logging of revival by defib, cloning, strangereagent, and revival surgery
+
You can now "audibly emote" by having ! at the start of a sentence.
+
+
timothyteakettle updated:
+
+
due to recent biological advancements, you can now make eye contact with people.
+
+
zeroisthebiggay updated:
+
+
a singular stray pixel
+
+
+
11 July 2020
+
Putnam3145 updated:
+
+
Gas mixtures now live entirely in a DLL.
+
+
+
10 July 2020
+
Chiirno updated:
+
+
Gave jellypeople a unique brain object /obj/item/organ/brain/jelly
+
added an icon for jellypeople brains.
+
+
EmeraldSundisk updated:
+
+
Adds a pool to PubbyStation
+
Slight adjustments to the surrounding area as to fit said pool
+
+
Sneakyrat6 updated:
+
+
Fixes hair falling out of hoodies.
+
+
TheObserver-sys updated:
+
+
Actually adds the juice reagent to make laugh peas donuts.
+
+
+
09 July 2020
+
timothyteakettle updated:
+
+
bluespace tray added, allowing twice as many items as the regular tray, printable at the service lathe, researched through science
+
bluespace jar added, a kind of pet carrier that allows human sized mobs inside, and smashes when thrown, researched and printed through science
+
+
+
08 July 2020
+
DeltaFire15 updated:
+
+
The kill-once objective now works properly.
+
+
EmeraldSundisk updated:
+
+
CogStation now has an apothecary
+
Removes an outdated note on sleepers
+
Readjusts CogStation's chemistry lab
+
Slight area designation adjustments for Robotics
+
The arrivals plaque should be readable now
+
+
Owai-Seek updated:
+
+
Margarine, Chili Cheese Fries.
+
Egg Wraps are now categorized under egg foods.
+
Tuna Sandwich crafting/sprite is now visible.
+
Icons for chicken, cooked chicken, steak, grilled carp, corndogs
+
Icons for chili cheese fries, margarine, BLT sandwich
Fixed the slowdown formula for small character sprites; you guys don't use custom sprite sizes so just ignore these changes.
+
Fixed the "Move it to the threshold" button; it now does what it says.
+
Reworded some text to be clearer.
+
+
+
05 July 2020
+
Ghommie updated:
+
+
You can now actually gain wiring experience from using cable coils.
+
Opening the View Skill Panel shouldn't trigger messages about insufficient admin priviledges anymore.
+
+
Yakumo Chen, kappa-sama updated:
+
+
Removes improvised handguns
+
removed handsaws, improvised gun barrels (you can use atmos pipes again)
+
Guncrafting is less time and resource intensive
+
Item names in guncrafting are user-friendly.
+
+
kappa-sama updated:
+
+
cloth string to replace durathread string
+
durathread string
+
All bows and arrows have had crafting times significantly reduced, coming out at up to 6 times faster crafting speeds. Improvised bows no longer require durathread; instead, they use cloth materials.
+
+
silicons updated:
+
+
active blocking now has a toggle keybind
+
auto bunker override verb has been added
+
shields take 2.5 stam instead of 3.5 stam per second to maintain block
+
Cybernetic implant shields will auto-extend and be used to block if the user has no item to block with
+
+
timothyteakettle updated:
+
+
cooking oil is now far less lethal, requiring a higher volume of the reagent to deal more damage
+
+
+
04 July 2020
+
Sonic121x updated:
+
+
crushed Soldry sodacan
+
digitigrade version of chief medical officer's turtleneck and captain's female formal outfit.
+
+
silicons updated:
+
+
blood_DNA["color"] is now a single variable instead of a list
+
+
+
03 July 2020
+
Arturlang updated:
+
+
You can now toggle hardsuit helmets from the strip menu
+
+
Ghommie updated:
+
+
fixed custom speech/tongue stuff.
+
Lowered shaft miners' paycheck, they have other ways to make cash.
+
You can't (un)equip garments on/from obscured inventory slots anymore.
+
The stamina cost multiplier for swinging melee weapons against mobs has been brought back to 1 from 0.8
+
The stamina cost for throwing mobs now scales with their mob size variable.
+
+
LetterN updated:
+
+
Ported some tags from tgui-3.0 to Vending.js
+
vending icons
+
r&d icons
+
chem master icons
+
+
Onule updated:
+
+
titanium wall man good
+
+
Sonic121x updated:
+
+
Bringback the ChemMaster pill type button.
+
Fix Technode icon.
+
+
bunny232 updated:
+
+
Witchhunter hat no longer obscures mask ears ,eyes, face and mouth
+
+
timothyteakettle updated:
+
+
bloodpacks initialise correctly now
+
+
+
02 July 2020
+
Ghommie updated:
+
+
Fixing a few issues with twohanded items.
+
Unum decks now work correctly.
+
Abductor walls are once again buildable with alien alloy.
+
+
Trilbyspaceclone updated:
+
+
Makes pride and envy ruin a bit smaller!
+
Pride now has rings, lipstick wigs and silver walls/door making a nice and polished look then cyan blue walls.
+
more trash and better dagger placement on food ruin
+
Snowboim now has snowballs and toy gifts for the two skeles daw!
+
Beach boim now has carp light branding beer, as well as soap!
+
Greed ruin now uses nice slick walls and carpet!
+
Founten ruin looks a lot better with its carpets and well maintained fluff things, but walls suffered and no longer can salvage ruined metal...
+
Alien nest has a bit more glowy floors of resin looking a bit more lived in by the drones. As well as the "door" now being see through resin rather then the thicker stuff that you cant see through
+
Pizza party has a few more gifts, some candy and snap pops yay!
+
Sloth ruin is about 15~ tiles shorter, has and has more fruit for a bowl. How lazy!
+
+
silicons updated:
+
+
bohbombing is a thing now
+
+
+
30 June 2020
+
Fikou updated:
+
+
spray cans, airlock painters, and decal painters added to engineering/service/autolathe (where applicable)
+
+
Ghommie updated:
+
+
Fixed a gap on the male insect anthro torso sprite when facing south.
+
Fixed mecha ID access not being removable.
+
Fixed a peeve with the hypno trance status effect not sanitizing some heard hypnosis inputs (i.e. custom say messages like say"honks*clownem ipsum dolor")
+
fixed an issue about using stacks with only 1 amount left.
+
Fixed a peeve on attack messages against carbons/humans.
+
Fixed missing hypnochair board.
+
Fixed material walls and tiles. My bad on that port.
+
+
Ghommie (inspired by MrDoomBringer's work on tgstation) updated:
+
+
New check skills UI.
+
+
Ghommie (porting PRs by XTDM, coiax, MrDoomBringer) updated:
+
+
Random Events now have a follow link for ghosts!
+
Adds the Spontaneous Brain Trauma to the event pool. Sometimes your brain just goes a little wrong.
+
Sometimes a low level cloning pod will make errors in replicating your brain, leaving you with a mild brain trauma.
+
When a person is cloned, any mental traumas are cloned as well.
+
The wizard federation announces that the Curse of Madness is out of beta and is now available for purchase for 4 points. It causes long-lasting brain traumas to all inhabitants of a target space station.
+
The wizard federation declines responsibility for any self-harm caused by curses cast while inside the targeted station.
+
Due to the extensive testing of the Curse of Madness some unique new trauma types have appeared across Nanotrasen-controlled space.
+
Curse of Madness can now be triggered by a wizard's Summon Events, at the same chance as Summon Guns or Summon Magic.
+
When an admin triggers Curse of Madness manually, they can specify their own dark truth to horrify the station with.
+
+
nightred updated:
+
+
Created two_handed component
+
Updated all existing two handed items to use the new component
+
+
silicons updated:
+
+
typing indicators no longer generates duplicate message boxes.
+
config errors now have line numbers.
+
outgoing mentorpms are now blue instead of green for the sender.
+
*squish
+
+
timothyteakettle updated:
+
+
you can now select your tongue and speech verb in the character customization menu!
+
skeleton is now split into two more types, greater and lesser
+
non-carbon blood is now not white
+
fixed a bunch of grammar/spelling mistakes
+
+
+
29 June 2020
+
b1tt3r1n0 updated:
+
+
Made teratomas from sdgf less powergame
+
+
timothyteakettle updated:
+
+
slimes no longer have white blood by default
+
+
+
28 June 2020
+
Detective-Google updated:
+
+
cog is less the suck
+
piggybacking is no longer absolutely inferior
+
+
Ghommie updated:
+
+
Fixing windows interaction with spraycans.
+
Fixing kinetic accelerator guns not working well with gun circuitries.
+
Fixing Zoomba borgs lights overlays.
+
Fixing the "absorb another ling" and "absorb the most dna" objectives rolling when no other changeling is around.
+
Clarified a pet peeve about the spread infestation ability.
+
BEPIS nodes won't show up anymore in the expert mode ui of the r&d console anymore (good thing they weren't researchable).
+
Hopefully fixing sound loop edge cases.
+
Fixing pAI radios being permanently disabled by EMPs at times.
+
Windoors can now be obscured with spraycans just like windows.
+
+
Ghommie porting PRs by Qustinnus/Floyd, Willow, cacogen, nemvar, Ghilker and EOBGames (Inept) updated:
+
+
Fixes a material duplication bug.
+
unique combinations of custom_materials lists are now shared between objects
+
meat material. yes.
+
materials can now be used to build walls/floors. meat house
+
edible component now does not try to attack if you eat something with it
+
Texture support for mat datums with thanks to 4DPlanner!
+
you no longer hit yourself with organs when eating
+
A whole bunch of materials are now datumised! Check out bronze, runed metal, sand, sandstone, snow, paper, cardboard, bone and bamboo. Oh, and pizza. Yes, pizza.
+
Buffs material floor tiles' throwforces from 1 to 10 (same as iron) to better showcase the effect of different materials (e.g. meat vs. titanium)
+
Radioactive items no longer output a single . when examined at a distance
+
+
MrJWhit updated:
+
+
Removed air alarm in Snow Snaxi in Tcomms Sat
+
Removed trash bins in genetics and mining
+
Gives cargo techs a cargolathe
+
+
Putnam3145 updated:
+
+
lost my mind just a couple of times
+
+
b1tt3r1n0 updated:
+
+
pouches, again, and and material pouches.
+
+
timothyteakettle updated:
+
+
support for custom blood colours implemented, slimes blood colour now equivalent to their body colour
+
+
+
27 June 2020
+
Detective-Google updated:
+
+
Lying down is better
+
+
timothyteakettle updated:
+
+
felinids now nya when tabled
+
+
+
26 June 2020
+
Ghommie updated:
+
+
Snore spam.
+
Hostile mobs shouldn't hit their original spawner structures or thoses of the same faction.
+
+
silicons updated:
+
+
soap cleans blood again
+
+
+
25 June 2020
+
Anonymous updated:
+
+
Added kepi and orvilike kepi. Available through loadout.
+
+
Detective Google updated:
+
+
Medigygax
+
+
Detective-Google updated:
+
+
malf AIs can no longer yeet the station while shunted
+
SMESes can now properly use self charging cells
+
ghosts now show up when the round ends
+
away missions
+
+
Funce updated:
+
+
Mentor SQL queries are now deleted properly.
+
+
Linzolle updated:
+
+
analyze function on chem master is no longer broken
+
organs now decay inside dead bodies again
+
+
dapnee updated:
+
+
wataur bottle item
+
wataur bottle and overlay
+
+
+
24 June 2020
+
DeltaFire15 updated:
+
+
Choosing a random item in your uplink will no longer sometimes reroll your contract.
+
Syndicate crate event cannot fire as a random event anymore.
+
+
Detective-Google updated:
+
+
singulos no longer succ infinite rods out of the ice
+
one of the directions for the diag hudpatch was blu instead of orang
+
+
timothyteakettle updated:
+
+
bonfires/grills no longer produce infinite quantities of food
+
slime's alter form ability now updates their hair colour when changing their body colour
+
+
+
22 June 2020
+
Ghommie (porting PRs by zxaber, Ryll-Ryll, AnturK) updated:
+
+
Certain small items purchased through cargo now get grouped into a single box. They also are immune to the 10% private account fee.
+
Added single-order options for several existing products in the Cargo Catalog.
+
Medkit listings are now single-pack items, and considered small items that get grouped into single boxes. Price for medkits is as close to unchanged as is reasonable.
+
You can now beat on vending machines to try and knock loose free stuff! You can also almost kill yourself doing it, so it's your call if your life is worth ten bucks.
+
Cigarette packets now have coupons on the back for small cargo items! Smoking DOES pay!
+
Some single/small items in cargo have been rebranded as goodies, come in lockboxes rather than crates, and can only be purchased with private accounts.
+
+
kevinz000 updated:
+
+
Life() is split into BiologicalLife() and PhysicalLife. A component signal has been added that can prevent either from ticking.
+
+
shellspeed1 updated:
+
+
Adds IV bags.
+
+
+
21 June 2020
+
kevinz000 updated:
+
+
calculations for punch hit chance has been drastically buffed in favor of the attacker.
+
+
+
20 June 2020
+
LetterN updated:
+
+
Asset cache from tg
+
Made the map viewer not look bad
+
Admin matrix right-bracket
+
+
bunny232 updated:
+
+
Removed unsavory things from the vent clog event
+
+
+
19 June 2020
+
Bhijn updated:
+
+
Atmos can no longer become completely bricked
+
+
Funce updated:
+
+
Square root circuit should now actually work.
+
+
SmArtKar updated:
+
+
Fixed my runtimes
+
+
TheSpaghetti updated:
+
+
more insectoid insects
+
+
kevinz000 updated:
+
+
bay/polaris style say_emphasis has been added. You can now |italicize| _underline_ and +bold+ your messages.
+
+
timothyteakettle updated:
+
+
Adds the brain trauma event, where one player gets a random brain trauma!
+
Adds the wisdom cow event, where the wisdom cow appears on the station!
+
Adds the fake virus event, where people get fake virus symptoms.
+
Adds the stray cargo pod event, where a cargo pod crashes into the station.
+
Adds the fugitives event, where fugitives are loose on the station, and it's the hunters jobs to capture them.
+
+
+
18 June 2020
+
Detective-Google updated:
+
+
cog is now less the suck
+
couple little derpy bits
+
malf disk and illegal tech disk moved from ashwalker base (guaranteed) to tendrils (chance based)
+
+
SmArtKar updated:
+
+
Ported shuttles from beestation
+
+
timothyteakettle updated:
+
+
embeds got reworked, sticky tape was added, more bullets that ricochet also added
+
medbots can now be tipped over
+
added more medbot sounds
+
+
17 June 2020
SmArtKar updated:
@@ -248,89 +1249,6 @@
newly created areas using blueprints now maintain the previous areas noteleport value
kudzu seeds now actually spawn vines
-
-
19 April 2020
-
Anonymous updated:
-
-
Xenohybrids will now scream like xeno.
-
-
Arturlang updated:
-
-
You can no longer spam craft things using the crafting menu
-
-
Detective-Google updated:
-
-
uncorks some of Lambda's rooms.
-
-
Ghommie updated:
-
-
Custom skin tone preferences.
-
Normalized box dorm lockers. Also removed a straight jacket found in the same area.
-
-
Jake Park updated:
-
-
fixed path name for youtool vending
-
-
Putnam3145 updated:
-
-
Objectives now clean theirselves up instead of leaving null entries in lists everywhere.
-
-
Seris02 updated:
-
-
stops magboots from not updating slowdowns
-
-
Trilbyspaceclone updated:
-
-
Maints have seen an uptick in left over types of welders, and tools. As well as different types of masks
-
New type of 02 locker - Rng! It can have almost any type of gas/breath mask and almost any type of o2 tank as well as even plasma men internals - Fancy!
-
Tool lockers have 70% odds to have a spare random tool inside!
-
12 new more drinks for most races!
-
New animations for mauna loa, and colour swap from red to blue for a Paramedic Hardsuit helm
-
Lowers cog champ ((the drink)) flare rate
-
Six more Sci based bounties have been posted at your local Cargo Bounty Request console
-
Mimes have made catnip plants not become invisible. How helpful.
-
Honey Palm now distills into mead rather then wine
-
-
UristMcAstronaut updated:
-
-
Adds circuit analyzers to maps and to integrated circuit printer and circuitry starter crate.
-
-
kappa-sama updated:
-
-
aranesp heals 10 instead of 18 stamina per tick
-
removed roundstart hyper earrape screams from xenohybrids
-
-
kevinz000 updated:
-
-
you can no longer stun xenos
-
Contractor kits are now poplocked to 30 players.
-
Shield bashing has been added
-
-
necromanceranne updated:
-
-
You can now craft armwraps!
-
Pugilists disarm you more easily and are harder to disarm. They also get a discount on disarm.
-
Pugilists only suffer a flat 10% chance to miss you. It's just like old punches! Kinda.
-
Chaplain's armbands are a +2, up from a +1!
-
Martial artists spend stamina when they disarm.
-
Rising Bass had several moves shortened and made stronger. Has a disarm override attack which does stamina damage and trips people on a disarm stun punch.
-
CQC had it's disarm move altered to be a stronger version of Krav Maga's. Dizzies and disarms on a disarm stun punch or just does some stamina damage and brute damage.
-
Sleeping Carp can punch you to the floor on a harm stun punch.
-
Hugs of the Northstar are no longer nodrop.
-
Adding in some overrides and proper flag checks for martial arts.
-
Stun thresholding stops disarm spams at extremely high stamina loss.
-
Ashen Arrows are actually called Ashen Arrows in the crafting menu.
-
-
-
16 April 2020
-
ForrestWick updated:
-
-
changed a certain item to be called meatball, ended racism, thank you obama
-
-
Linzolle updated:
-
-
remove any slurs, etc. to comply with GitHub's ToS
-
GoonStation 13 Development Team
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index b5b212e0f5..c19ced7c4d 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -25983,3 +25983,733 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
- rscadd: Sutures and Meshes
Trilbyspaceclone:
- bugfix: Gin export takes gin now
+2020-06-18:
+ Detective-Google:
+ - tweak: cog is now less the suck
+ - bugfix: couple little derpy bits
+ - balance: malf disk and illegal tech disk moved from ashwalker base (guaranteed)
+ to tendrils (chance based)
+ SmArtKar:
+ - rscadd: Ported shuttles from beestation
+ timothyteakettle:
+ - rscadd: embeds got reworked, sticky tape was added, more bullets that ricochet
+ also added
+ - rscadd: medbots can now be tipped over
+ - soundadd: added more medbot sounds
+2020-06-19:
+ Bhijn:
+ - bugfix: Atmos can no longer become completely bricked
+ Funce:
+ - bugfix: Square root circuit should now actually work.
+ SmArtKar:
+ - bugfix: Fixed my runtimes
+ TheSpaghetti:
+ - rscadd: more insectoid insects
+ kevinz000:
+ - rscadd: bay/polaris style say_emphasis has been added. You can now |italicize|
+ _underline_ and +bold+ your messages.
+ timothyteakettle:
+ - rscadd: Adds the brain trauma event, where one player gets a random brain trauma!
+ - rscadd: Adds the wisdom cow event, where the wisdom cow appears on the station!
+ - rscadd: Adds the fake virus event, where people get fake virus symptoms.
+ - rscadd: Adds the stray cargo pod event, where a cargo pod crashes into the station.
+ - rscadd: Adds the fugitives event, where fugitives are loose on the station, and
+ it's the hunters jobs to capture them.
+2020-06-20:
+ LetterN:
+ - rscadd: Asset cache from tg
+ - tweak: Made the map viewer not look bad
+ - bugfix: Admin matrix right-bracket
+ bunny232:
+ - rscdel: Removed unsavory things from the vent clog event
+2020-06-21:
+ kevinz000:
+ - balance: calculations for punch hit chance has been drastically buffed in favor
+ of the attacker.
+2020-06-22:
+ Ghommie (porting PRs by zxaber, Ryll-Ryll, AnturK):
+ - tweak: Certain small items purchased through cargo now get grouped into a single
+ box. They also are immune to the 10% private account fee.
+ - rscadd: Added single-order options for several existing products in the Cargo
+ Catalog.
+ - tweak: Medkit listings are now single-pack items, and considered small items that
+ get grouped into single boxes. Price for medkits is as close to unchanged as
+ is reasonable.
+ - rscadd: You can now beat on vending machines to try and knock loose free stuff!
+ You can also almost kill yourself doing it, so it's your call if your life is
+ worth ten bucks.
+ - rscadd: Cigarette packets now have coupons on the back for small cargo items!
+ Smoking DOES pay!
+ - tweak: Some single/small items in cargo have been rebranded as goodies, come in
+ lockboxes rather than crates, and can only be purchased with private accounts.
+ kevinz000:
+ - refactor: Life() is split into BiologicalLife() and PhysicalLife. A component
+ signal has been added that can prevent either from ticking.
+ shellspeed1:
+ - rscadd: Adds IV bags.
+2020-06-24:
+ DeltaFire15:
+ - balance: Choosing a random item in your uplink will no longer sometimes reroll
+ your contract.
+ - rscdel: Syndicate crate event cannot fire as a random event anymore.
+ Detective-Google:
+ - bugfix: singulos no longer succ infinite rods out of the ice
+ - bugfix: one of the directions for the diag hudpatch was blu instead of orang
+ timothyteakettle:
+ - bugfix: bonfires/grills no longer produce infinite quantities of food
+ - bugfix: slime's alter form ability now updates their hair colour when changing
+ their body colour
+2020-06-25:
+ Anonymous:
+ - rscadd: Added kepi and orvilike kepi. Available through loadout.
+ Detective Google:
+ - rscadd: Medigygax
+ Detective-Google:
+ - bugfix: malf AIs can no longer yeet the station while shunted
+ - bugfix: SMESes can now properly use self charging cells
+ - rscadd: ghosts now show up when the round ends
+ - balance: away missions
+ Funce:
+ - bugfix: Mentor SQL queries are now deleted properly.
+ Linzolle:
+ - bugfix: analyze function on chem master is no longer broken
+ - bugfix: organs now decay inside dead bodies again
+ dapnee:
+ - rscadd: wataur bottle item
+ - imageadd: wataur bottle and overlay
+2020-06-26:
+ Ghommie:
+ - bugfix: Snore spam.
+ - bugfix: Hostile mobs shouldn't hit their original spawner structures or thoses
+ of the same faction.
+ silicons:
+ - bugfix: soap cleans blood again
+2020-06-27:
+ Detective-Google:
+ - tweak: Lying down is better
+ timothyteakettle:
+ - rscadd: felinids now nya when tabled
+2020-06-28:
+ Detective-Google:
+ - bugfix: cog is less the suck
+ - tweak: piggybacking is no longer absolutely inferior
+ Ghommie:
+ - bugfix: Fixing windows interaction with spraycans.
+ - bugfix: Fixing kinetic accelerator guns not working well with gun circuitries.
+ - bugfix: Fixing Zoomba borgs lights overlays.
+ - bugfix: Fixing the "absorb another ling" and "absorb the most dna" objectives
+ rolling when no other changeling is around.
+ - spellcheck: Clarified a pet peeve about the spread infestation ability.
+ - bugfix: BEPIS nodes won't show up anymore in the expert mode ui of the r&d console
+ anymore (good thing they weren't researchable).
+ - bugfix: Hopefully fixing sound loop edge cases.
+ - bugfix: Fixing pAI radios being permanently disabled by EMPs at times.
+ - rscadd: Windoors can now be obscured with spraycans just like windows.
+ Ghommie porting PRs by Qustinnus/Floyd, Willow, cacogen, nemvar, Ghilker and EOBGames (Inept):
+ - bugfix: Fixes a material duplication bug.
+ - code_imp: unique combinations of custom_materials lists are now shared between
+ objects
+ - rscadd: meat material. yes.
+ - rscadd: materials can now be used to build walls/floors. meat house
+ - bugfix: edible component now does not try to attack if you eat something with
+ it
+ - rscadd: Texture support for mat datums with thanks to 4DPlanner!
+ - bugfix: you no longer hit yourself with organs when eating
+ - rscadd: A whole bunch of materials are now datumised! Check out bronze, runed
+ metal, sand, sandstone, snow, paper, cardboard, bone and bamboo. Oh, and pizza.
+ Yes, pizza.
+ - balance: Buffs material floor tiles' throwforces from 1 to 10 (same as iron) to
+ better showcase the effect of different materials (e.g. meat vs. titanium)
+ - bugfix: Radioactive items no longer output a single . when examined at a distance
+ MrJWhit:
+ - rscdel: Removed air alarm in Snow Snaxi in Tcomms Sat
+ - rscdel: Removed trash bins in genetics and mining
+ - tweak: Gives cargo techs a cargolathe
+ Putnam3145:
+ - bugfix: lost my mind just a couple of times
+ b1tt3r1n0:
+ - rscadd: pouches, again, and and material pouches.
+ timothyteakettle:
+ - rscadd: support for custom blood colours implemented, slimes blood colour now
+ equivalent to their body colour
+2020-06-29:
+ b1tt3r1n0:
+ - balance: Made teratomas from sdgf less powergame
+ timothyteakettle:
+ - bugfix: slimes no longer have white blood by default
+2020-06-30:
+ Fikou:
+ - rscadd: spray cans, airlock painters, and decal painters added to engineering/service/autolathe
+ (where applicable)
+ Ghommie:
+ - bugfix: Fixed a gap on the male insect anthro torso sprite when facing south.
+ - bugfix: Fixed mecha ID access not being removable.
+ - bugfix: Fixed a peeve with the hypno trance status effect not sanitizing some
+ heard hypnosis inputs (i.e. custom say messages like say"honks*clownem ipsum
+ dolor")
+ - bugfix: fixed an issue about using stacks with only 1 amount left.
+ - bugfix: Fixed a peeve on attack messages against carbons/humans.
+ - bugfix: Fixed missing hypnochair board.
+ - bugfix: Fixed material walls and tiles. My bad on that port.
+ Ghommie (inspired by MrDoomBringer's work on tgstation):
+ - rscadd: New check skills UI.
+ Ghommie (porting PRs by XTDM, coiax, MrDoomBringer):
+ - tweak: Random Events now have a follow link for ghosts!
+ - rscadd: Adds the Spontaneous Brain Trauma to the event pool. Sometimes your brain
+ just goes a little wrong.
+ - rscadd: Sometimes a low level cloning pod will make errors in replicating your
+ brain, leaving you with a mild brain trauma.
+ - rscadd: When a person is cloned, any mental traumas are cloned as well.
+ - rscadd: The wizard federation announces that the Curse of Madness is out of beta
+ and is now available for purchase for 4 points. It causes long-lasting brain
+ traumas to all inhabitants of a target space station.
+ - rscadd: The wizard federation declines responsibility for any self-harm caused
+ by curses cast while inside the targeted station.
+ - rscadd: Due to the extensive testing of the Curse of Madness some unique new trauma
+ types have appeared across Nanotrasen-controlled space.
+ - rscadd: Curse of Madness can now be triggered by a wizard's Summon Events, at
+ the same chance as Summon Guns or Summon Magic.
+ - admin: When an admin triggers Curse of Madness manually, they can specify their
+ own dark truth to horrify the station with.
+ nightred:
+ - code_imp: Created two_handed component
+ - refactor: Updated all existing two handed items to use the new component
+ silicons:
+ - bugfix: typing indicators no longer generates duplicate message boxes.
+ - rscadd: config errors now have line numbers.
+ - tweak: outgoing mentorpms are now blue instead of green for the sender.
+ - soundadd: '*squish'
+ timothyteakettle:
+ - rscadd: you can now select your tongue and speech verb in the character customization
+ menu!
+ - rscadd: skeleton is now split into two more types, greater and lesser
+ - bugfix: non-carbon blood is now not white
+ - spellcheck: fixed a bunch of grammar/spelling mistakes
+2020-07-02:
+ Ghommie:
+ - bugfix: Fixing a few issues with twohanded items.
+ - bugfix: Unum decks now work correctly.
+ - bugfix: Abductor walls are once again buildable with alien alloy.
+ Trilbyspaceclone:
+ - tweak: Makes pride and envy ruin a bit smaller!
+ - rscadd: Pride now has rings, lipstick wigs and silver walls/door making a nice
+ and polished look then cyan blue walls.
+ - rscadd: more trash and better dagger placement on food ruin
+ - rscadd: Snowboim now has snowballs and toy gifts for the two skeles daw!
+ - tweak: Beach boim now has carp light branding beer, as well as soap!
+ - tweak: Greed ruin now uses nice slick walls and carpet!
+ - tweak: Founten ruin looks a lot better with its carpets and well maintained fluff
+ things, but walls suffered and no longer can salvage ruined metal...
+ - rscadd: Alien nest has a bit more glowy floors of resin looking a bit more lived
+ in by the drones. As well as the "door" now being see through resin rather then
+ the thicker stuff that you cant see through
+ - rscadd: Pizza party has a few more gifts, some candy and snap pops yay!
+ - balance: Sloth ruin is about 15~ tiles shorter, has and has more fruit for a bowl.
+ How lazy!
+ silicons:
+ - bugfix: bohbombing is a thing now
+2020-07-03:
+ Arturlang:
+ - rscadd: You can now toggle hardsuit helmets from the strip menu
+ Ghommie:
+ - bugfix: fixed custom speech/tongue stuff.
+ - balance: Lowered shaft miners' paycheck, they have other ways to make cash.
+ - rscadd: You can't (un)equip garments on/from obscured inventory slots anymore.
+ - balance: The stamina cost multiplier for swinging melee weapons against mobs has
+ been brought back to 1 from 0.8
+ - balance: The stamina cost for throwing mobs now scales with their mob size variable.
+ LetterN:
+ - tweak: Ported some tags from tgui-3.0 to Vending.js
+ - bugfix: vending icons
+ - bugfix: r&d icons
+ - bugfix: chem master icons
+ Onule:
+ - tweak: titanium wall man good
+ Sonic121x:
+ - bugfix: Bringback the ChemMaster pill type button.
+ - bugfix: Fix Technode icon.
+ bunny232:
+ - tweak: Witchhunter hat no longer obscures mask ears ,eyes, face and mouth
+ timothyteakettle:
+ - bugfix: bloodpacks initialise correctly now
+2020-07-04:
+ Sonic121x:
+ - rscadd: crushed Soldry sodacan
+ - rscadd: digitigrade version of chief medical officer's turtleneck and captain's
+ female formal outfit.
+ silicons:
+ - refactor: blood_DNA["color"] is now a single variable instead of a list
+2020-07-05:
+ Ghommie:
+ - bugfix: You can now actually gain wiring experience from using cable coils.
+ - bugfix: Opening the View Skill Panel shouldn't trigger messages about insufficient
+ admin priviledges anymore.
+ Yakumo Chen, kappa-sama:
+ - rscdel: Removes improvised handguns
+ - rscdel: removed handsaws, improvised gun barrels (you can use atmos pipes again)
+ - balance: Guncrafting is less time and resource intensive
+ - tweak: Item names in guncrafting are user-friendly.
+ kappa-sama:
+ - rscadd: cloth string to replace durathread string
+ - rscdel: durathread string
+ - balance: All bows and arrows have had crafting times significantly reduced, coming
+ out at up to 6 times faster crafting speeds. Improvised bows no longer require
+ durathread; instead, they use cloth materials.
+ silicons:
+ - tweak: active blocking now has a toggle keybind
+ - rscadd: auto bunker override verb has been added
+ - balance: shields take 2.5 stam instead of 3.5 stam per second to maintain block
+ - rscadd: Cybernetic implant shields will auto-extend and be used to block if the
+ user has no item to block with
+ timothyteakettle:
+ - tweak: cooking oil is now far less lethal, requiring a higher volume of the reagent
+ to deal more damage
+2020-07-07:
+ KasparoVy:
+ - tweak: Fixes misaligned south-facing silver legwraps sprite.
+ Owai-Seek:
+ - bugfix: Bee Balm is now visible.
+ Weblure:
+ - bugfix: Fixed the slowdown formula for small character sprites; you guys don't
+ use custom sprite sizes so just ignore these changes.
+ - bugfix: Fixed the "Move it to the threshold" button; it now does what it says.
+ - tweak: Reworded some text to be clearer.
+2020-07-08:
+ DeltaFire15:
+ - bugfix: The kill-once objective now works properly.
+ EmeraldSundisk:
+ - rscadd: CogStation now has an apothecary
+ - rscdel: Removes an outdated note on sleepers
+ - tweak: Readjusts CogStation's chemistry lab
+ - tweak: Slight area designation adjustments for Robotics
+ - bugfix: The arrivals plaque should be readable now
+ Owai-Seek:
+ - rscadd: Margarine, Chili Cheese Fries.
+ - tweak: Egg Wraps are now categorized under egg foods.
+ - bugfix: Tuna Sandwich crafting/sprite is now visible.
+ - imageadd: Icons for chicken, cooked chicken, steak, grilled carp, corndogs
+ - imageadd: Icons for chili cheese fries, margarine, BLT sandwich
+ - imageadd: (Unused) icons for raw meatballs, and lard
+2020-07-09:
+ timothyteakettle:
+ - rscadd: bluespace tray added, allowing twice as many items as the regular tray,
+ printable at the service lathe, researched through science
+ - rscadd: bluespace jar added, a kind of pet carrier that allows human sized mobs
+ inside, and smashes when thrown, researched and printed through science
+2020-07-10:
+ Chiirno:
+ - code_imp: Gave jellypeople a unique brain object /obj/item/organ/brain/jelly
+ - imageadd: added an icon for jellypeople brains.
+ EmeraldSundisk:
+ - rscadd: Adds a pool to PubbyStation
+ - tweak: Slight adjustments to the surrounding area as to fit said pool
+ Sneakyrat6:
+ - bugfix: Fixes hair falling out of hoodies.
+ TheObserver-sys:
+ - bugfix: Actually adds the juice reagent to make laugh peas donuts.
+2020-07-11:
+ Putnam3145:
+ - refactor: Gas mixtures now live entirely in a DLL.
+2020-07-12:
+ DeltaFire15:
+ - balance: Sentinels compromise now heals augmented bodyparts.
+ EmeraldSundisk:
+ - rscadd: Adds turnstiles to CogStation's security wing
+ - rscadd: Readds robotics to the Corpse Disposal Network
+ - rscadd: Readds chemistry's ability to send items directly to the experimentation
+ lab
+ - tweak: Visual renovation and slight adjustments to CogStation's robotics lab
+ - tweak: Slight visual adjustments elsewhere (the library)
+ - bugfix: CogStation's mail and disposal pipes are once again complete
+ - bugfix: CogStation's robotics lab now has spawners, lights, and other room essentials
+ HeroWithYay:
+ - rscadd: Added Telecrystal Dust
+ - tweak: Telecrystals can be sold at cargo
+ LetterN:
+ - rscadd: Added d[thing] emojis
+ - bugfix: bye xss
+ MrJWhit:
+ - rscdel: Removes northern tunnel to the monastery on Pubby
+ Yakumo Chen:
+ - rscadd: Adds a wedding crate to cargo full of wedding attire.
+ kappa-sama:
+ - tweak: wisdom cow is half as common and is wise enough to lag the server 66% less
+ silicons:
+ - config: 'policy configuration added, plus support hooks for assisting enforcement
+ of clone memory disorder. logging: added logging of revival by defib, cloning,
+ strangereagent, and revival surgery'
+ - rscadd: You can now "audibly emote" by having ! at the start of a sentence.
+ timothyteakettle:
+ - rscadd: due to recent biological advancements, you can now make eye contact with
+ people.
+ zeroisthebiggay:
+ - bugfix: a singular stray pixel
+2020-07-13:
+ Linzolle:
+ - bugfix: you can no longer vore and digest people regardless of vore preferences
+ Owai-Seek:
+ - tweak: Trashbags can now hold most shoes, and organs.
+ - balance: You can no longer nest nuke disks or hold brains in the trash.
+2020-07-14:
+ silicons:
+ - rscadd: chemical reactions now are sorted by priority first and temperature second.
+ - rscadd: sec and medical records have been added to character setup.
+ - bugfix: circuit reagent heaters are now sanitized for temperature from 2.7 to
+ 1000.
+ timothyteakettle:
+ - bugfix: ports a money bag exploit
+2020-07-15:
+ Sonic121x:
+ - bugfix: Paramedic jumpsuit
+2020-07-16:
+ DeltaFire15:
+ - bugfix: Fixes a zeolite runtime caused by a missing check.
+ Sneakyrat6:
+ - bugfix: Fixes being able to meta people real name with OOC Notes
+ timothyteakettle:
+ - rscadd: travelling traders from another dimension can now visit the station in
+ search of something specific, and reward you for giving it to them
+ - bugfix: small error with pet carrier logic fixed and also making sure simple mobs
+ are catered for properly inside bluespace jars
+ - bugfix: fixes coin related issue
+2020-07-17:
+ ShizCalev, Fikou:
+ - bugfix: Added some sanity checking for varedit values.
+ - bugfix: Fixed an exploit involving coins and mints that could crash the server.
+ - bugfix: Fixed an exploit that would allow you to destroy round-critical / indestructible
+ items with folders.
+ - bugfix: Swarmers can no longer cut power lines by deconstructing catwalks underneath
+ them.
+ - bugfix: Fixed a scenario that allowed infinite resource generation via ore machines.
+ - bugfix: you can no longer inject html in ahelps
+ - admin: you cant either, jannies
+ timothyteakettle:
+ - bugfix: fixes a small pickle related issue
+ - rscadd: recent culinary and scientific advancements have brought forth new pickle
+ related technologies
+2020-07-19:
+ Arturlang:
+ - rscadd: TGUI 3.0 and enables all the UIs, plus the smart asset cache, and all
+ the things required for them
+ EmeraldSundisk:
+ - rscadd: Adds a pool to Delta Station
+ - rscadd: Adds light fixtures to specified areas
+ - tweak: Relocates objects in impacted areas of Delta's starboard maintenance
+ MrJWhit:
+ - rscadd: Adds a small light next to the kitchen counter
+ Putnam3145:
+ - bugfix: Pen uplinks no longer broken
+ TheObserver-sys:
+ - rscadd: 'Adds a new reaction: Slime Extractification. Take 30u Slime Jelly, 5u
+ Frost Oil, and 5u plasma to generate a fresh grey slime extract.'
+ Yakumo Chen:
+ - tweak: Hierophant club now checks for friendly fire by default.
+ b1tt3r1n0:
+ - rscadd: Added the updated circle game
+ silicons:
+ - rscadd: Unarmed parry is now a thing.
+ timothyteakettle:
+ - rscadd: plushies in the loadout have been replaced with a box that lets you choose
+ one instead
+ - bugfix: wrestling should no longer have the ability to permanently rotate people
+ - rscadd: you can now select to wear a snail shell as your backpack in the customization
+ menu
+ zeroisthebiggay:
+ - tweak: martial arts twenty minpop
+ - bugfix: records
+2020-07-20:
+ lolman360:
+ - tweak: Service borgs now have synthesizers instead of a violin and guitar.
+ - bugfix: borg RSF
+2020-07-21:
+ Arturlang:
+ - bugfix: Decal painter ui now works, yay?
+ CameronWoof:
+ - rscadd: Adds aloe, a new growable plant
+ - rscadd: Adds medicated sutures and advanced regenerative meshes
+ - bugfix: Polypyrylium oligomers and liquid electricity now correctly populate
+ Chiirno:
+ - rscadd: Alt-click pill bottles places top-most pill into active hand.
+ - tweak: Moved dice bags from pill_bottle/dice to box/dice to avoid dice bags being
+ affected from medical specific pill bottle changes.
+ DeltaFire15:
+ - bugfix: Swarmers can once again eat items as long as there's nothing living in
+ them.
+ Funce:
+ - bugfix: Genetics spiderwebs are no longer impassable walls
+ Kraseo:
+ - balance: Damp rags no longer instantly apply their chemicals onto someone.
+ SiliconMain:
+ - tweak: Geigers can no longer be contaminated
+ TheSpaghetti:
+ - rscadd: new snowflake trait
+ kappa-sama:
+ - balance: advanced surgery duffel bag no longer comes with a nukie medkit. it costs
+ 4 less telecrystals to make up for this colossal nerf.
+ - tweak: quartered the weight of the stray cargo pod event from 2x normal to 1/2
+ normal
+ silicons:
+ - tweak: survivalists (from summon guns/magic) are proper objective'd pseudoantagonists
+ again
+ - tweak: summon guns/magic can only be used once each
+ - tweak: summon guns/magic now only cost one point each
+ - imageadd: ':dsmile: :dfrown: :dhsmile: :dpog: :dneutral:'
+ - bugfix: gravity should update for mobs a fair bit faster
+ - rscadd: voting can now be done from the stat panel if the system is plurality
+ and approval
+ timothyteakettle:
+ - rscadd: new fried component used for frying objects
+ - bugfix: various frying bugs fixed such as being able to unfry items and frying
+ turfs with cold cooking oil
+2020-07-22:
+ Ludox:
+ - rscdel: You can no longer be brainwashed into giving birth to a fake baby
+ kappa-sama:
+ - balance: brainwashing disk has lost its cost buffs (3->5) and is role restricted
+ once more (medical doctor/roboticist)
+2020-07-23:
+ DeltaFire15:
+ - bugfix: Traits are no longer fucked
+ Putnam3145:
+ - tweak: Slight optimization in chat code.
+ kappa-sama:
+ - bugfix: tendril chests being empty
+ zeroisthebiggay:
+ - rscadd: fetish content
+2020-07-24:
+ EmeraldSundisk:
+ - rscadd: Adds a CMO office, along with Virology and Genetics labs to Omega Station
+ - rscadd: Adds a second chemistry station to the chemistry lab
+ - tweak: Adjusts the locations of some objects in medical to accommodate these new
+ additions
+ - tweak: Relocates the morgue
+ - tweak: Relocates items in impacted areas of maintenance as well as the library
+ - bugfix: Fixes an air line Bartholomew somehow knocked out
+ Linzolle:
+ - bugfix: wounds now have a description on examine
+ Owai-Seek:
+ - rscadd: Meatball Sub, Meatloaf + Meatloaf Slices, Bear Chili, Mashed Potatoes
+ - rscadd: Buttered Potatoes, Fancy Cracker Pack, Spiral Soup, Sweet and Sour Chicken
+ - tweak: Organised the Food DMI a bit.
+ - tweak: Deleted some stray pixels on some sprites.
+ - tweak: Nuggie boxes are now centered correctly.
+ - imageadd: Icons for the the food items in this PR.
+ Sneakyrat6:
+ - bugfix: Fixes dressers not giving you undies
+ - bugfix: Fixes Snaxi not loading properly because of typos
+ - rscadd: You can now burn photos
+ Zandario:
+ - spellcheck: Murdered **tipes** and gave birth to **is**.
+ silicons:
+ - tweak: sanitization now doesn't cut off 15.7 or something million possible colors
+ from character preferences (instead of only allowing 16 values for R G and B,
+ it now allows 256 each)
+ - balance: projectiles are by default 17.5 tiles per second instead of 12.5
+ timothyteakettle:
+ - rscadd: due to recent innovative research in the medical field, you now have bones
+ - tweak: zombie claws are now sharp and do less damage, but can destroy non-lifeforms
+ far faster
+ - tweak: zombies now take less stamina damage
+ - rscadd: beepsky can now wear hats
+ zeroisthebiggay:
+ - imageadd: rad and kravglove sprites
+2020-07-25:
+ CameronWoof:
+ - bugfix: Aloe now has an icon.
+ timothyteakettle:
+ - bugfix: beepsky replaces the word THREAT_LEVEL with the actual threat level
+2020-07-26:
+ DeltaFire15:
+ - bugfix: Organs now decay again.
+ Iatots:
+ - tweak: Licking wounds now may cause you to spit out a hairball once in a while!
+ - rscadd: You can now craft a catgirl plushie with 3 of a new ingredient occasionally
+ found in medbay!
+ dapnee:
+ - tweak: removed legacy public mining shuttle area and remade lounge
+2020-07-27:
+ Hatterhat:
+ - rscadd: Training bokkens! Make 'em from wood, use 'em in-hand to toggle between
+ harmful and not-so-harmful, practice your parrying with them!
+ - bugfix: Marker beacons should have a sprite again.
+ silicons:
+ - rscadd: clownops and clown mobs now share the same faction. HONK!
+ timothyteakettle:
+ - bugfix: modern pickle technology now allows people who have been turned into pickles,
+ to be retrieved through the medical course of dying
+2020-07-28:
+ Cacogen:
+ - rscadd: OSHA has more pull than anyone could have expected. All armor provided
+ by Nanotrasen and the syndicate now have tags that accurately lists defenses
+ and resistances of a piece of clothing.
+ CameronWoof:
+ - tweak: Exotic seed crates now contain a spaceman's trumpet seed packet.
+ EmeraldSundisk:
+ - rscadd: Renovates Snow Taxi's northeast bathroom to have multiple non-urinal toilets
+ and showers
+ - rscadd: Adds signage/labeling to improve map readability
+ - rscadd: Adds a bathroom to the northwest station
+ - rscadd: Adds a filing cabinet to the cargo department
+ - tweak: Area designation adjustments to account for the above changes
+ - bugfix: Adds a missing airlock cyclelink near medical
+ Ludox235:
+ - tweak: Makes the flavour text that appears when you become a zombie tell you to
+ act like one.
+ MrJWhit:
+ - tweak: Decluttered toxins and hid the yellow mix line in atmos, for metastation
+ SiliconMain:
+ - tweak: Paramedic heirloom is now a zippo
+ - tweak: Durathread belts now protect their contents from radiation, and can hold
+ full sized extinguishers
+ Sishen1542:
+ - rscdel: removed zoomba
+ dapnee:
+ - tweak: added a fan to the listening outpost
+ - bugfix: added two missing r-walls near the SM, removed random light and wire node
+ below the engine, and fixed the missing cable in the courtroom on Kilo
+ kappa-sama:
+ - balance: Stimpaks cost 5tc once more, up from 3tc.
+ silicons:
+ - rscadd: polychromatic cloaks to loadout
+ - rscdel: no more self healing with medibeam guns
+ - balance: oh no, taser buff. alt fire delay dropped to 0.4 seconds.
+ - rscadd: you can now shoot yourself by disarm-intenting yourself with a gun.
+ timothyteakettle:
+ - tweak: species code is now slightly less messy
+ - bugfix: slight tweak to how material crafting works
+ - bugfix: changed up pet carriers / bluespace jars a bit so you can't fit certain
+ things inside them and also the text shown for resist times is accurate
+ zeroisthebiggay:
+ - rscadd: Black Box theft objective
+2020-07-29:
+ DeltaFire15:
+ - bugfix: The 'Naked' outfit is no longer broken.
+ Ghommie:
+ - bugfix: fixed cremator trays, paleness examination strings, chat message for stamping
+ paper, looping sounds, load away missions/VR admin verb, access requirements
+ for using the sechuds.
+ - tweak: Alt-Clicking a cigarette packet should pull the lighter out first if present,
+ then cigarettes.
+ Hatterhat:
+ - bugfix: Directional windows can now be rotated counterclockwise properly again.
+ NecromancerAnne, Sirich96:
+ - rscadd: Stunbaton sprites by Sirich96.
+ - rscadd: New sprites for the stunsword.
+ necromanceranne:
+ - rscadd: Adds some in-hands for the rapier sheath.
+ timothyteakettle:
+ - bugfix: tail wagging should work in all cases now
+ - bugfix: bluespace jars work as intended now
+ - bugfix: aliens can remove embeds now
+ - bugfix: bloodsuckers are not affected by bloodloss
+ zeroisthebiggay:
+ - rscadd: Flannel jackets and bartender winter coat
+2020-07-30:
+ Adelphon:
+ - rscadd: Created a Cosmetic version of the camo.
+ Arturlang:
+ - code_imp: Bloodsucker LifeTick runs from BiologicalLife now
+ Ryll-Ryll ported by silicons:
+ - rscadd: Shoelaces are now a thing. You can untie them by laying down next to someone.
+ - tweak: shoes now have lace delays and some can't be laced at all
+ - refactor: do after now tracks who's interacting with who, meaning some actions
+ now break when the target moves away.
+ SiliconMain:
+ - rscadd: Ported the long range atmos analyzer from sk*rat, credit to NotRanged
+ silicons:
+ - rscadd: energy sword perfect parries now reflect projectiles back at their shooters.
+ - balance: any mob can now parry if they have the right item
+ - rscadd: beam rifles now go into emitters properly
+ - refactor: clickdelay has been refactored into an experimental hybrid system. Check
+ code/modules/mob/clickdelay.dm for more information.
+ - balance: Resisting no longer checks clickdelay, but is standardized to a 2 second
+ per resist system for most forms of resisting. It still sets clickdelay, though.
+ - rscadd: 'Meters have been added for estimating time until next attack/resist.
+ Won''t be that useful due to our clickdelay currently being very short, though.
+ They''re visible from your hand and resist HUD elements. experimental: Most
+ attacks and forms of attacking (minus unarmed because it''s too much of a pain
+ to refactor how hugs/gloves of the north star works) now check for time-since-last-attack
+ rather than making it so you can''t attack for said time. This means you can
+ very quickly switch to a gun from a melee weapon, whereas in the old system
+ a melee weapon would put you on lockout for 0.8 seconds, in the new system all
+ the gun cares about is that you did not attack for at least 0.4 seconds.'
+ - code_imp: All clickdelay setting/reading are now procs, so it should be trivial
+ to implement another system where drawing/switching to a weapon requires you
+ to have it out for x seconds before using it. I am not personally doing it at
+ this point in time though because it will likely just annoy everyone with no
+ real gain unless we do something like putting a 0.8 second switch-to cooldown
+ for guns (which I did not, yet)
+ - refactor: 'attack_hand has been refactored to on_attack_hand remove: sexchems
+ no longer impact click delay'
+ - rscadd: turrets now automatically stagger their shots. Happy parrying/blocking.
+ - bugfix: turrets now speed_process, they were shooting slower than they should
+ be
+ - balance: anything can now block with the right items
+ timothyteakettle:
+ - bugfix: some crafted crates won't contain items now, and thus have stopped breaking
+ the laws of physics
+ - tweak: beepskys hats now follow the laws of gravity and move up/down when he bobs
+ up and down
+2020-08-01:
+ dapnee:
+ - tweak: added cake hat to bar, adds another atmostech spawn
+ - bugfix: sinks point in the right direction, APC won't spawn off the wall in circuits
+ - bugfix: changes commissary APC so it actually powers the room, adds a missing
+ AIR alarm, arrivals no longer has active atmos tiles.
+ silicons:
+ - tweak: toy shotguns no longer need 2 hands to fire
+ - bugfix: being on fire works again.
+ timothyteakettle:
+ - bugfix: monkeys no longer continuously bleed everywhere
+2020-08-02:
+ Auris456852:
+ - rscadd: Added B.O.O.P. Remote Control cartridges to the PTech.
+ Hatterhat:
+ - rscadd: Durathread reinforcement kits! Sprites by Toriate, sets jumpsuit armor
+ to durathread levels, craft in the crafting menu.
+ KeRSedChaplain:
+ - rscadd: The belligerent scripture and a brass multitool, and a new marauder variant
+ which act similar to holoparasites/guardian spirits.
+ - rscdel: Removed the abductor teleport consoles they get, removes abscond for the
+ time being as I've not seen much use for it other than just spamming it and
+ hoping you end up in the armory.
+ - tweak: moved around scriptures to make the cult work better as being based around
+ the station, makes the Ark scream more often and work as a summonable object,
+ clockwork armor now has a flat 0 defense up to 10 instead of negatives against
+ laser damage. Makes the Ark work better in a station based setting, as well
+ as the Heralds beacon in case It works for the mode.
+ - soundadd: added powerloaderstep.ogg for Neovgre
+ - tweak: changes 'Dread_Ipad.dmi' to 'clockwork_slab.dmi'
+ MrJWhit:
+ - tweak: Adjusts abductor spawntext
+ Seris02:
+ - bugfix: fixed replica pods
+ dapnee:
+ - bugfix: fixed active turfs on wizard ruin and space hermit, fixed missing APC's
+ and added a light on Delta
+ ike709 and bobbahbrown:
+ - rscadd: Admins can now see your bans on (some) other servers.
+ kappa-sama:
+ - bugfix: chaplain cultists being able to convert people to full clockwork cult
+ status
+ timothyteakettle:
+ - tweak: combat mode now has weaker buffs in terms of damage dealt and took for
+ being or not being in the mode
+ - tweak: damage debuff for laying down has been decreased from 0.5x to 0.7x
+2020-08-03:
+ KeRSedChaplain:
+ - bugfix: fixed clockwork guardians being able to reflect ranged weapons
+ Linzolle:
+ - bugfix: uv penlight no longer invisible
+ dapnee:
+ - bugfix: active turfs on box and xenohive, maintenance bar APC not being stringed
+ correctly, turned a monitor to face a direction that makes sense, changed tag
+ of camera in gravgen being misnamed
+ silicons:
+ - rscadd: shoves have been buffed to apply a status effect rather than a 0.85 movespeed
+ modifier, meaning repeatedly shoving someone now renews the debuff
+ - balance: shoves now stagger for 3.5 seconds.
+ - tweak: war operatives now actually time 20 minutes since roundstart to depart
+ instead of 15.
+ - balance: explosive stand bombs can now be examined from any distance
+ - code_imp: explosive stand bombs are now a component.
diff --git a/html/changelogs/AutoChangeLog-pr-12530.yml b/html/changelogs/AutoChangeLog-pr-12530.yml
deleted file mode 100644
index 46b6dc5e1b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-12530.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Detective-Google"
-delete-after: True
-changes:
- - balance: "malf disk and illegal tech disk moved from ashwalker base (guaranteed) to tendrils (chance based)"
diff --git a/html/changelogs/AutoChangeLog-pr-12538.yml b/html/changelogs/AutoChangeLog-pr-12538.yml
deleted file mode 100644
index bdd842c751..0000000000
--- a/html/changelogs/AutoChangeLog-pr-12538.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Detective-Google"
-delete-after: True
-changes:
- - tweak: "cog is now less the suck"
diff --git a/html/changelogs/AutoChangeLog-pr-12539.yml b/html/changelogs/AutoChangeLog-pr-12539.yml
deleted file mode 100644
index 12f1d540e2..0000000000
--- a/html/changelogs/AutoChangeLog-pr-12539.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Detective-Google"
-delete-after: True
-changes:
- - bugfix: "couple little derpy bits"
diff --git a/html/changelogs/AutoChangeLog-pr-13004.yml b/html/changelogs/AutoChangeLog-pr-13004.yml
new file mode 100644
index 0000000000..f38ef719e7
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13004.yml
@@ -0,0 +1,4 @@
+author: "zeroisthebiggay"
+delete-after: True
+changes:
+ - rscadd: "prefs for headpat wagging"
diff --git a/html/ghost.png b/html/ghost.png
new file mode 100644
index 0000000000..e4b426ca47
Binary files /dev/null and b/html/ghost.png differ
diff --git a/icons/UI_Icons/Arcade/boss1.gif b/icons/UI_Icons/Arcade/boss1.gif
new file mode 100644
index 0000000000..4730ac0021
Binary files /dev/null and b/icons/UI_Icons/Arcade/boss1.gif differ
diff --git a/icons/UI_Icons/Arcade/boss2.gif b/icons/UI_Icons/Arcade/boss2.gif
new file mode 100644
index 0000000000..d95fd84f0e
Binary files /dev/null and b/icons/UI_Icons/Arcade/boss2.gif differ
diff --git a/icons/UI_Icons/Arcade/boss3.gif b/icons/UI_Icons/Arcade/boss3.gif
new file mode 100644
index 0000000000..e97056998a
Binary files /dev/null and b/icons/UI_Icons/Arcade/boss3.gif differ
diff --git a/icons/UI_Icons/Arcade/boss4.gif b/icons/UI_Icons/Arcade/boss4.gif
new file mode 100644
index 0000000000..6695b6cfbf
Binary files /dev/null and b/icons/UI_Icons/Arcade/boss4.gif differ
diff --git a/icons/UI_Icons/Arcade/boss5.gif b/icons/UI_Icons/Arcade/boss5.gif
new file mode 100644
index 0000000000..a827fb8c4e
Binary files /dev/null and b/icons/UI_Icons/Arcade/boss5.gif differ
diff --git a/icons/UI_Icons/Arcade/boss6.gif b/icons/UI_Icons/Arcade/boss6.gif
new file mode 100644
index 0000000000..7a926cf89d
Binary files /dev/null and b/icons/UI_Icons/Arcade/boss6.gif differ
diff --git a/icons/UI_Icons/tgui/ntosradar_background.png b/icons/UI_Icons/tgui/ntosradar_background.png
new file mode 100644
index 0000000000..bac7647e3a
Binary files /dev/null and b/icons/UI_Icons/tgui/ntosradar_background.png differ
diff --git a/icons/UI_Icons/tgui/ntosradar_pointer.png b/icons/UI_Icons/tgui/ntosradar_pointer.png
new file mode 100644
index 0000000000..e71823f391
Binary files /dev/null and b/icons/UI_Icons/tgui/ntosradar_pointer.png differ
diff --git a/icons/UI_Icons/tgui/ntosradar_pointer_S.png b/icons/UI_Icons/tgui/ntosradar_pointer_S.png
new file mode 100644
index 0000000000..51a0dd49d9
Binary files /dev/null and b/icons/UI_Icons/tgui/ntosradar_pointer_S.png differ
diff --git a/icons/effects/freeze.dmi b/icons/effects/freeze.dmi
index 28db97d87b..0461619064 100644
Binary files a/icons/effects/freeze.dmi and b/icons/effects/freeze.dmi differ
diff --git a/icons/emoji_32.dmi b/icons/emoji_32.dmi
new file mode 100644
index 0000000000..fdd6fc7d75
Binary files /dev/null and b/icons/emoji_32.dmi differ
diff --git a/icons/materials/composite.dmi b/icons/materials/composite.dmi
new file mode 100644
index 0000000000..a2a92b6eb7
Binary files /dev/null and b/icons/materials/composite.dmi differ
diff --git a/icons/mecha/mech_construct.dmi b/icons/mecha/mech_construct.dmi
index 6d48367f2a..2ae4a93a2e 100644
Binary files a/icons/mecha/mech_construct.dmi and b/icons/mecha/mech_construct.dmi differ
diff --git a/icons/mecha/mech_construction.dmi b/icons/mecha/mech_construction.dmi
index a1ac490f00..1f50346b71 100644
Binary files a/icons/mecha/mech_construction.dmi and b/icons/mecha/mech_construction.dmi differ
diff --git a/icons/mecha/mecha.dmi b/icons/mecha/mecha.dmi
index 4b09f791c3..310dd6709c 100644
Binary files a/icons/mecha/mecha.dmi and b/icons/mecha/mecha.dmi differ
diff --git a/icons/mob/32x64.dmi b/icons/mob/32x64.dmi
index 32b25ba739..cddf9599b4 100644
Binary files a/icons/mob/32x64.dmi and b/icons/mob/32x64.dmi differ
diff --git a/icons/mob/actions/actions_shuttle.dmi b/icons/mob/actions/actions_shuttle.dmi
new file mode 100644
index 0000000000..ef35786a2b
Binary files /dev/null and b/icons/mob/actions/actions_shuttle.dmi differ
diff --git a/icons/mob/clockwork_mobs.dmi b/icons/mob/clockwork_mobs.dmi
index 5985adf12d..54690f6cac 100644
Binary files a/icons/mob/clockwork_mobs.dmi and b/icons/mob/clockwork_mobs.dmi differ
diff --git a/icons/mob/clothing/back.dmi b/icons/mob/clothing/back.dmi
index 0a1372ac2b..ae8e6221c6 100644
Binary files a/icons/mob/clothing/back.dmi and b/icons/mob/clothing/back.dmi differ
diff --git a/icons/mob/clothing/belt.dmi b/icons/mob/clothing/belt.dmi
index fd3016ac89..52ef75020c 100644
Binary files a/icons/mob/clothing/belt.dmi and b/icons/mob/clothing/belt.dmi differ
diff --git a/icons/mob/clothing/eyes.dmi b/icons/mob/clothing/eyes.dmi
index 54ef7c5814..cd2b84a143 100644
Binary files a/icons/mob/clothing/eyes.dmi and b/icons/mob/clothing/eyes.dmi differ
diff --git a/icons/mob/clothing/feet_digi.dmi b/icons/mob/clothing/feet_digi.dmi
index 7815f3d0a4..f798850ee7 100644
Binary files a/icons/mob/clothing/feet_digi.dmi and b/icons/mob/clothing/feet_digi.dmi differ
diff --git a/icons/mob/clothing/hands.dmi b/icons/mob/clothing/hands.dmi
index 856fe2149a..755280b332 100644
Binary files a/icons/mob/clothing/hands.dmi and b/icons/mob/clothing/hands.dmi differ
diff --git a/icons/mob/clothing/head.dmi b/icons/mob/clothing/head.dmi
index 6128f28dc1..a6e75123bb 100644
Binary files a/icons/mob/clothing/head.dmi and b/icons/mob/clothing/head.dmi differ
diff --git a/icons/mob/clothing/head_muzzled.dmi b/icons/mob/clothing/head_muzzled.dmi
index 16cc63a13e..62c1ebea0a 100644
Binary files a/icons/mob/clothing/head_muzzled.dmi and b/icons/mob/clothing/head_muzzled.dmi differ
diff --git a/icons/mob/clothing/mask.dmi b/icons/mob/clothing/mask.dmi
index 13f288677f..ecc6e2dd2c 100644
Binary files a/icons/mob/clothing/mask.dmi and b/icons/mob/clothing/mask.dmi differ
diff --git a/icons/mob/clothing/mask_muzzled.dmi b/icons/mob/clothing/mask_muzzled.dmi
index 0a10f1edbe..a1404cfbce 100644
Binary files a/icons/mob/clothing/mask_muzzled.dmi and b/icons/mob/clothing/mask_muzzled.dmi differ
diff --git a/icons/mob/clothing/suit.dmi b/icons/mob/clothing/suit.dmi
index 134c03f71b..7a690bb29f 100644
Binary files a/icons/mob/clothing/suit.dmi and b/icons/mob/clothing/suit.dmi differ
diff --git a/icons/mob/clothing/suit_digi.dmi b/icons/mob/clothing/suit_digi.dmi
index ca2a088551..2616c0b893 100644
Binary files a/icons/mob/clothing/suit_digi.dmi and b/icons/mob/clothing/suit_digi.dmi differ
diff --git a/icons/mob/clothing/taur_canine.dmi b/icons/mob/clothing/taur_canine.dmi
index 26e4d488cd..24cf51d2e5 100644
Binary files a/icons/mob/clothing/taur_canine.dmi and b/icons/mob/clothing/taur_canine.dmi differ
diff --git a/icons/mob/clothing/taur_hooved.dmi b/icons/mob/clothing/taur_hooved.dmi
index 993e9c2550..03fd8c8a30 100644
Binary files a/icons/mob/clothing/taur_hooved.dmi and b/icons/mob/clothing/taur_hooved.dmi differ
diff --git a/icons/mob/clothing/taur_naga.dmi b/icons/mob/clothing/taur_naga.dmi
index a4c3644003..d178ba4a1c 100644
Binary files a/icons/mob/clothing/taur_naga.dmi and b/icons/mob/clothing/taur_naga.dmi differ
diff --git a/icons/mob/clothing/uniform.dmi b/icons/mob/clothing/uniform.dmi
index 7bec0ac3eb..fa376635f9 100644
Binary files a/icons/mob/clothing/uniform.dmi and b/icons/mob/clothing/uniform.dmi differ
diff --git a/icons/mob/clothing/uniform_digi.dmi b/icons/mob/clothing/uniform_digi.dmi
index da94f97895..af72ac0e7b 100644
Binary files a/icons/mob/clothing/uniform_digi.dmi and b/icons/mob/clothing/uniform_digi.dmi differ
diff --git a/icons/mob/inhands/equipment/belt_lefthand.dmi b/icons/mob/inhands/equipment/belt_lefthand.dmi
index beac56725a..81b12c60f9 100644
Binary files a/icons/mob/inhands/equipment/belt_lefthand.dmi and b/icons/mob/inhands/equipment/belt_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/belt_righthand.dmi b/icons/mob/inhands/equipment/belt_righthand.dmi
index da31cc9710..42ed3a30c6 100644
Binary files a/icons/mob/inhands/equipment/belt_righthand.dmi and b/icons/mob/inhands/equipment/belt_righthand.dmi differ
diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi
index 19738ed490..315ca5e924 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 9589e338e1..6af883f2e8 100644
Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ
diff --git a/icons/mob/inhands/weapons/swords_lefthand.dmi b/icons/mob/inhands/weapons/swords_lefthand.dmi
index 1e48d57ac7..0ca36ad43d 100644
Binary files a/icons/mob/inhands/weapons/swords_lefthand.dmi and b/icons/mob/inhands/weapons/swords_lefthand.dmi differ
diff --git a/icons/mob/inhands/weapons/swords_righthand.dmi b/icons/mob/inhands/weapons/swords_righthand.dmi
index 5a5ee6f3db..59d7bbce69 100644
Binary files a/icons/mob/inhands/weapons/swords_righthand.dmi and b/icons/mob/inhands/weapons/swords_righthand.dmi differ
diff --git a/icons/mob/map_backgrounds.dmi b/icons/mob/map_backgrounds.dmi
new file mode 100644
index 0000000000..dc6e3e46b1
Binary files /dev/null and b/icons/mob/map_backgrounds.dmi differ
diff --git a/icons/mob/robots.dmi b/icons/mob/robots.dmi
index 9bb41bf527..082bfb3c3e 100644
Binary files a/icons/mob/robots.dmi and b/icons/mob/robots.dmi differ
diff --git a/icons/mob/screen_alert.dmi b/icons/mob/screen_alert.dmi
index 60fe2f9839..30c23601a5 100644
Binary files a/icons/mob/screen_alert.dmi and b/icons/mob/screen_alert.dmi differ
diff --git a/icons/mob/secbot_accessories.dmi b/icons/mob/secbot_accessories.dmi
new file mode 100644
index 0000000000..944aac44f3
Binary files /dev/null and b/icons/mob/secbot_accessories.dmi differ
diff --git a/icons/obj/bloodpack.dmi b/icons/obj/bloodpack.dmi
index 82b4c2e543..2355a81f8f 100644
Binary files a/icons/obj/bloodpack.dmi and b/icons/obj/bloodpack.dmi differ
diff --git a/icons/obj/clockwork_objects.dmi b/icons/obj/clockwork_objects.dmi
index 1948bb605c..ae919d85a4 100644
Binary files a/icons/obj/clockwork_objects.dmi and b/icons/obj/clockwork_objects.dmi differ
diff --git a/icons/obj/closet.dmi b/icons/obj/closet.dmi
index d3f055d1f2..b71b021d80 100644
Binary files a/icons/obj/closet.dmi and b/icons/obj/closet.dmi differ
diff --git a/icons/obj/clothing/belt_overlays.dmi b/icons/obj/clothing/belt_overlays.dmi
index 7e09d425fb..1c22a0ad1b 100644
Binary files a/icons/obj/clothing/belt_overlays.dmi and b/icons/obj/clothing/belt_overlays.dmi differ
diff --git a/icons/obj/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi
index 535ae0d241..874f0d3660 100644
Binary files a/icons/obj/clothing/gloves.dmi and b/icons/obj/clothing/gloves.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index e7c9af1a1b..90f1fba315 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/masks.dmi b/icons/obj/clothing/masks.dmi
index 6bae5154ac..106195e968 100644
Binary files a/icons/obj/clothing/masks.dmi and b/icons/obj/clothing/masks.dmi differ
diff --git a/icons/obj/clothing/reinf_kits.dmi b/icons/obj/clothing/reinf_kits.dmi
new file mode 100644
index 0000000000..3b23d53342
Binary files /dev/null and b/icons/obj/clothing/reinf_kits.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index fcfbd36df6..258eb0dc35 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/contraband.dmi b/icons/obj/contraband.dmi
index 29308832cf..a6c554f7da 100644
Binary files a/icons/obj/contraband.dmi and b/icons/obj/contraband.dmi differ
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index f2a8328717..5a9e1e54b6 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ
diff --git a/icons/obj/doors/airlocks/shuttle/overlays.dmi b/icons/obj/doors/airlocks/shuttle/overlays.dmi
index b2bb2cfa04..70df610212 100644
Binary files a/icons/obj/doors/airlocks/shuttle/overlays.dmi and b/icons/obj/doors/airlocks/shuttle/overlays.dmi differ
diff --git a/icons/obj/doors/airlocks/shuttle/shuttle.dmi b/icons/obj/doors/airlocks/shuttle/shuttle.dmi
index 0e05597163..b4b998e4bc 100644
Binary files a/icons/obj/doors/airlocks/shuttle/shuttle.dmi and b/icons/obj/doors/airlocks/shuttle/shuttle.dmi differ
diff --git a/icons/obj/doors/doorfirewindow.dmi b/icons/obj/doors/doorfirewindow.dmi
new file mode 100644
index 0000000000..76f8a7e98e
Binary files /dev/null and b/icons/obj/doors/doorfirewindow.dmi differ
diff --git a/icons/obj/doors/edge_Doorfire.dmi b/icons/obj/doors/edge_Doorfire.dmi
index 3aad0114d4..51777624db 100644
Binary files a/icons/obj/doors/edge_Doorfire.dmi and b/icons/obj/doors/edge_Doorfire.dmi differ
diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi
index 27caef76b2..5962e7522d 100644
Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ
diff --git a/icons/obj/food/burgerbread.dmi b/icons/obj/food/burgerbread.dmi
index 414930ac25..7ef3a7d418 100644
Binary files a/icons/obj/food/burgerbread.dmi and b/icons/obj/food/burgerbread.dmi differ
diff --git a/icons/obj/food/containers.dmi b/icons/obj/food/containers.dmi
index 641715fd87..5e1332ffd9 100644
Binary files a/icons/obj/food/containers.dmi and b/icons/obj/food/containers.dmi differ
diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi
index e7196190cf..28cdefd331 100644
Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ
diff --git a/icons/obj/food/soupsalad.dmi b/icons/obj/food/soupsalad.dmi
index 378927e8f9..ca9c150480 100644
Binary files a/icons/obj/food/soupsalad.dmi and b/icons/obj/food/soupsalad.dmi differ
diff --git a/icons/obj/guns/energy.dmi b/icons/obj/guns/energy.dmi
index 33872719fe..7e7e4a644b 100644
Binary files a/icons/obj/guns/energy.dmi and b/icons/obj/guns/energy.dmi differ
diff --git a/icons/obj/hydroponics/growing.dmi b/icons/obj/hydroponics/growing.dmi
index c93865ca77..5415f47528 100644
Binary files a/icons/obj/hydroponics/growing.dmi and b/icons/obj/hydroponics/growing.dmi differ
diff --git a/icons/obj/hydroponics/growing_flowers.dmi b/icons/obj/hydroponics/growing_flowers.dmi
index 98d9af2ce6..b48051cc56 100644
Binary files a/icons/obj/hydroponics/growing_flowers.dmi and b/icons/obj/hydroponics/growing_flowers.dmi differ
diff --git a/icons/obj/hydroponics/growing_vegetables.dmi b/icons/obj/hydroponics/growing_vegetables.dmi
index b426b8f6de..e174b4fb0b 100644
Binary files a/icons/obj/hydroponics/growing_vegetables.dmi and b/icons/obj/hydroponics/growing_vegetables.dmi differ
diff --git a/icons/obj/hydroponics/harvest.dmi b/icons/obj/hydroponics/harvest.dmi
index fd9d310c73..7474bb87ab 100644
Binary files a/icons/obj/hydroponics/harvest.dmi and b/icons/obj/hydroponics/harvest.dmi differ
diff --git a/icons/obj/hydroponics/seeds.dmi b/icons/obj/hydroponics/seeds.dmi
index 15b7e2b96c..b64c218c69 100644
Binary files a/icons/obj/hydroponics/seeds.dmi and b/icons/obj/hydroponics/seeds.dmi differ
diff --git a/icons/obj/items_and_weapons.dmi b/icons/obj/items_and_weapons.dmi
index c5b2b3fc42..57105cc089 100644
Binary files a/icons/obj/items_and_weapons.dmi and b/icons/obj/items_and_weapons.dmi differ
diff --git a/icons/obj/janitor.dmi b/icons/obj/janitor.dmi
index a157d333b0..1f520a42bd 100644
Binary files a/icons/obj/janitor.dmi and b/icons/obj/janitor.dmi differ
diff --git a/icons/obj/lighting.dmi b/icons/obj/lighting.dmi
index 675005da91..0e262895fd 100644
Binary files a/icons/obj/lighting.dmi and b/icons/obj/lighting.dmi differ
diff --git a/icons/obj/machines/gateway.dmi b/icons/obj/machines/gateway.dmi
index cfe4c26709..fc45145ae8 100644
Binary files a/icons/obj/machines/gateway.dmi and b/icons/obj/machines/gateway.dmi differ
diff --git a/icons/obj/machines/research.dmi b/icons/obj/machines/research.dmi
index b756c77e20..7d64c494fd 100644
Binary files a/icons/obj/machines/research.dmi and b/icons/obj/machines/research.dmi differ
diff --git a/icons/obj/machines/sheetifier.dmi b/icons/obj/machines/sheetifier.dmi
new file mode 100644
index 0000000000..46d8b06bab
Binary files /dev/null and b/icons/obj/machines/sheetifier.dmi differ
diff --git a/icons/obj/modular_console.dmi b/icons/obj/modular_console.dmi
index 8d4ec3e2d8..cdcf6f1bd5 100644
Binary files a/icons/obj/modular_console.dmi and b/icons/obj/modular_console.dmi differ
diff --git a/icons/obj/modular_laptop.dmi b/icons/obj/modular_laptop.dmi
index 1e506ca6fe..7cf5a77621 100644
Binary files a/icons/obj/modular_laptop.dmi and b/icons/obj/modular_laptop.dmi differ
diff --git a/icons/obj/modular_tablet.dmi b/icons/obj/modular_tablet.dmi
index 621874a969..2f9a0559ae 100644
Binary files a/icons/obj/modular_tablet.dmi and b/icons/obj/modular_tablet.dmi differ
diff --git a/icons/obj/module.dmi b/icons/obj/module.dmi
index bdf2d5801b..ef3a98b875 100644
Binary files a/icons/obj/module.dmi and b/icons/obj/module.dmi differ
diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi
index 03b7a9e44f..b93f878c9e 100644
Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ
diff --git a/icons/obj/pet_carrier.dmi b/icons/obj/pet_carrier.dmi
index 340636056c..b02f9d6ce4 100644
Binary files a/icons/obj/pet_carrier.dmi and b/icons/obj/pet_carrier.dmi differ
diff --git a/icons/obj/plushes.dmi b/icons/obj/plushes.dmi
index 3abb25d8b2..11d02a46cc 100644
Binary files a/icons/obj/plushes.dmi and b/icons/obj/plushes.dmi differ
diff --git a/icons/obj/reagentfillings.dmi b/icons/obj/reagentfillings.dmi
index f07928741d..d7a9a03c41 100644
Binary files a/icons/obj/reagentfillings.dmi and b/icons/obj/reagentfillings.dmi differ
diff --git a/icons/obj/smooth_structures/shuttle_window.dmi b/icons/obj/smooth_structures/shuttle_window.dmi
index 2fbf93f703..cb07225a76 100644
Binary files a/icons/obj/smooth_structures/shuttle_window.dmi and b/icons/obj/smooth_structures/shuttle_window.dmi differ
diff --git a/icons/obj/stack_objects.dmi b/icons/obj/stack_objects.dmi
index d327dc8988..1cdb3b6443 100644
Binary files a/icons/obj/stack_objects.dmi and b/icons/obj/stack_objects.dmi differ
diff --git a/icons/obj/stationobjs.dmi b/icons/obj/stationobjs.dmi
index 67c1a59c51..16efcf262e 100644
Binary files a/icons/obj/stationobjs.dmi and b/icons/obj/stationobjs.dmi differ
diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi
index a719356804..1f1709a10c 100644
Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ
diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi
index e998ce442d..3996f0ead2 100755
Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ
diff --git a/icons/obj/tapes.dmi b/icons/obj/tapes.dmi
new file mode 100644
index 0000000000..a406a4dd1f
Binary files /dev/null and b/icons/obj/tapes.dmi differ
diff --git a/icons/obj/tiles.dmi b/icons/obj/tiles.dmi
index 09568ebea1..38d153e261 100644
Binary files a/icons/obj/tiles.dmi and b/icons/obj/tiles.dmi differ
diff --git a/icons/obj/tools.dmi b/icons/obj/tools.dmi
index 90eea65cb3..0a457777c2 100644
Binary files a/icons/obj/tools.dmi and b/icons/obj/tools.dmi differ
diff --git a/icons/program_icons/borg_mon.gif b/icons/program_icons/borg_mon.gif
new file mode 100644
index 0000000000..35d0f442fd
Binary files /dev/null and b/icons/program_icons/borg_mon.gif differ
diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi
index 477120870b..83dd4f5df8 100644
Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ
diff --git a/icons/turf/shuttle.dmi b/icons/turf/shuttle.dmi
index a09cb7a847..985b9991a0 100644
Binary files a/icons/turf/shuttle.dmi and b/icons/turf/shuttle.dmi differ
diff --git a/icons/turf/walls/materialwall.dmi b/icons/turf/walls/materialwall.dmi
new file mode 100644
index 0000000000..c497f76c2e
Binary files /dev/null and b/icons/turf/walls/materialwall.dmi differ
diff --git a/icons/turf/walls/shuttle_wall.dmi b/icons/turf/walls/shuttle_wall.dmi
index cce97b2458..d9c904c336 100644
Binary files a/icons/turf/walls/shuttle_wall.dmi and b/icons/turf/walls/shuttle_wall.dmi differ
diff --git a/interface/skin.dmf b/interface/skin.dmf
index 8d68336754..cf49f0f30f 100644
--- a/interface/skin.dmf
+++ b/interface/skin.dmf
@@ -80,6 +80,7 @@ window "mainwindow"
anchor2 = none
background-color = #272727
is-visible = false
+ auto-format = false
saved-params = ""
elem "tooltip"
type = BROWSER
diff --git a/libbyond-extools.so b/libbyond-extools.so
new file mode 100644
index 0000000000..8e17f952f2
Binary files /dev/null and b/libbyond-extools.so differ
diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm
index 57cbdb6beb..4fa2a51fac 100644
--- a/modular_citadel/code/datums/status_effects/chems.dm
+++ b/modular_citadel/code/datums/status_effects/chems.dm
@@ -41,20 +41,6 @@
/datum/status_effect/chem/breast_enlarger/on_apply()//Removes clothes, they're too small to contain you. You belong to space now.
log_reagent("FERMICHEM: [owner]'s breasts has reached comical sizes. ID: [owner.key]")
- var/mob/living/carbon/human/H = owner
- var/message = FALSE
- if(H.w_uniform)
- H.dropItemToGround(H.w_uniform, TRUE)
- message = TRUE
- if(H.wear_suit)
- H.dropItemToGround(H.wear_suit, TRUE)
- message = TRUE
- if(message)
- playsound(H.loc, 'sound/items/poster_ripped.ogg', 50, 1)
- H.visible_message("[H]'s chest suddenly bursts forth, ripping their clothes off!'", \
- "Your clothes give, ripping into peices under the strain of your swelling breasts! Unless you manage to reduce the size of your breasts, there's no way you're going to be able to put anything on over these melons..!")
- else
- to_chat(H, "Your bountiful bosom is so rich with mass, you seriously doubt you'll be able to fit any clothes over it.")
return ..()
/datum/status_effect/chem/breast_enlarger/tick()//If you try to wear clothes, you fail. Slows you down if you're comically huge
@@ -64,20 +50,9 @@
H.remove_status_effect(src)
return
moveCalc = 1+((round(B.cached_size) - 9)/3) //Afffects how fast you move, and how often you can click.
- var/message = FALSE
- if(H.w_uniform)
- H.dropItemToGround(H.w_uniform, TRUE)
- message = TRUE
- if(H.wear_suit)
- H.dropItemToGround(H.wear_suit, TRUE)
- message = TRUE
- if(message)
- playsound(H.loc, 'sound/items/poster_ripped.ogg', 50, 1)
- to_chat(H, "Your enormous breasts are way too large to fit anything over them!")
if(last_checked_size != B.cached_size)
H.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/status_effect/breast_hypertrophy, multiplicative_slowdown = moveCalc)
- sizeMoveMod(moveCalc)
if (B.size == "huge")
if(prob(1))
@@ -94,16 +69,8 @@
log_reagent("FERMICHEM: [owner]'s breasts has reduced to an acceptable size. ID: [owner.key]")
to_chat(owner, "Your expansive chest has become a more managable size, liberating your movements.")
owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/breast_hypertrophy)
- sizeMoveMod(1)
return ..()
-/datum/status_effect/chem/breast_enlarger/proc/sizeMoveMod(var/value)
- if(cachedmoveCalc == value)
- return
- owner.next_move_modifier /= cachedmoveCalc
- owner.next_move_modifier *= value
- cachedmoveCalc = value
-
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/datum/status_effect/chem/penis_enlarger
@@ -115,20 +82,6 @@
/datum/status_effect/chem/penis_enlarger/on_apply()//Removes clothes, they're too small to contain you. You belong to space now.
log_reagent("FERMICHEM: [owner]'s dick has reached comical sizes. ID: [owner.key]")
- var/mob/living/carbon/human/H = owner
- var/message = FALSE
- if(H.w_uniform)
- H.dropItemToGround(H.w_uniform, TRUE)
- message = TRUE
- if(H.wear_suit)
- H.dropItemToGround(H.wear_suit, TRUE)
- message = TRUE
- if(message)
- playsound(H.loc, 'sound/items/poster_ripped.ogg', 50, 1)
- H.visible_message("[H]'s schlong suddenly bursts forth, ripping their clothes off!'", \
- "Your clothes give, ripping into peices under the strain of your swelling pecker! Unless you manage to reduce the size of your emancipated trouser snake, there's no way you're going to be able to put anything on over this girth..!")
- else
- to_chat(H, "Your emancipated trouser snake is so ripe with girth, you seriously doubt you'll be able to fit any clothes over it.")
return ..()
@@ -140,18 +93,6 @@
return
moveCalc = 1+((round(P.length) - 21)/3) //effects how fast you can move
bloodCalc = 1+((round(P.length) - 21)/15) //effects how much blood you need (I didn' bother adding an arousal check because I'm spending too much time on this organ already.)
-
- var/message = FALSE
- if(H.w_uniform)
- H.dropItemToGround(H.w_uniform, TRUE)
- message = TRUE
- if(H.wear_suit)
- H.dropItemToGround(H.wear_suit, TRUE)
- message = TRUE
- if(message)
- playsound(H.loc, 'sound/items/poster_ripped.ogg', 50, 1)
- to_chat(H, "Your enormous package is way to large to fit anything over!")
-
if(P.length < 22 && H.has_movespeed_modifier(/datum/movespeed_modifier/status_effect/penis_hypertrophy))
to_chat(owner, "Your rascally willy has become a more managable size, liberating your movements.")
H.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/penis_hypertrophy)
@@ -280,7 +221,7 @@
var/mob/living/carbon/M = owner
//chem calculations
- if(!owner.reagents.has_reagent(/datum/chemical_reaction/fermi/enthrall))
+ if(!owner.reagents.has_reagent(/datum/reagent/fermi/enthrall))
if (phase < 3 && phase != 0)
deltaResist += 3//If you've no chem, then you break out quickly
if(prob(5))
diff --git a/modular_citadel/code/game/objects/cit_screenshake.dm b/modular_citadel/code/game/objects/cit_screenshake.dm
index 188b8a48f9..222de37f82 100644
--- a/modular_citadel/code/game/objects/cit_screenshake.dm
+++ b/modular_citadel/code/game/objects/cit_screenshake.dm
@@ -45,18 +45,6 @@
. = ..()
shake_camera(user, (pressureSetting * 0.75 + 1), (pressureSetting * 0.75))
-/obj/item/attack(mob/living/M, mob/living/user)
- . = ..()
- if(force >= 15)
- shake_camera(user, ((force - 10) * 0.01 + 1), ((force - 10) * 0.01))
- if(M.client)
- switch (M.client.prefs.damagescreenshake)
- if (1)
- shake_camera(M, ((force - 10) * 0.015 + 1), ((force - 10) * 0.015))
- if (2)
- if(!CHECK_MOBILITY(M, MOBILITY_MOVE))
- shake_camera(M, ((force - 10) * 0.015 + 1), ((force - 10) * 0.015))
-
/obj/item/attack_obj(obj/O, mob/living/user)
. = ..()
if(force >= 20)
diff --git a/modular_citadel/code/modules/client/loadout/__donator.dm b/modular_citadel/code/modules/client/loadout/__donator.dm
index 8ecc6151a1..d428fc290a 100644
--- a/modular_citadel/code/modules/client/loadout/__donator.dm
+++ b/modular_citadel/code/modules/client/loadout/__donator.dm
@@ -220,7 +220,7 @@
/datum/gear/torisword
name = "Rainbow Zweihander"
category = SLOT_IN_BACKPACK
- path = /obj/item/twohanded/dualsaber/hypereutactic/toy/rainbow
+ path = /obj/item/dualsaber/hypereutactic/toy/rainbow
ckeywhitelist = list("annoymous35")
/datum/gear/darksabre
diff --git a/modular_citadel/code/modules/client/loadout/backpack.dm b/modular_citadel/code/modules/client/loadout/backpack.dm
index 8d089a129a..690e012840 100644
--- a/modular_citadel/code/modules/client/loadout/backpack.dm
+++ b/modular_citadel/code/modules/client/loadout/backpack.dm
@@ -1,27 +1,7 @@
-/datum/gear/plushcarp
- name = "Space carp plushie"
+/datum/gear/plushbox
+ name = "Plushie Choice Box"
category = SLOT_IN_BACKPACK
- path = /obj/item/toy/plush/carpplushie
-
-/datum/gear/plushliz
- name = "Lizard plushie"
- category = SLOT_IN_BACKPACK
- path = /obj/item/toy/plush/lizardplushie
-
-/datum/gear/plushsnek
- name = "Snake plushie"
- category = SLOT_IN_BACKPACK
- path = /obj/item/toy/plush/snakeplushie
-
-/datum/gear/plushslime
- name = "Slime plushie"
- category = SLOT_IN_BACKPACK
- path = /obj/item/toy/plush/slimeplushie
-
-/datum/gear/plushlamp
- name = "Lamp plushie"
- category = SLOT_IN_BACKPACK
- path = /obj/item/toy/plush/lampplushie
+ path = /obj/item/choice_beacon/box/plushie
/datum/gear/tennis
name = "Classic Tennis Ball"
diff --git a/modular_citadel/code/modules/client/loadout/gloves.dm b/modular_citadel/code/modules/client/loadout/gloves.dm
index 72e6e91cfc..e9e8e3939b 100644
--- a/modular_citadel/code/modules/client/loadout/gloves.dm
+++ b/modular_citadel/code/modules/client/loadout/gloves.dm
@@ -3,6 +3,11 @@
category = SLOT_GLOVES
path = /obj/item/clothing/gloves/fingerless
+/datum/gear/evening
+ name = "Evening gloves"
+ category = SLOT_GLOVES
+ path = /obj/item/clothing/gloves/evening
+
/datum/gear/goldring
name = "A gold ring"
category = SLOT_GLOVES
@@ -20,4 +25,4 @@
category = SLOT_GLOVES
path = /obj/item/clothing/gloves/ring/diamond
cost = 4
-
+
diff --git a/modular_citadel/code/modules/client/loadout/hands.dm b/modular_citadel/code/modules/client/loadout/hands.dm
index 3b07ecaec5..2f03bd3b07 100644
--- a/modular_citadel/code/modules/client/loadout/hands.dm
+++ b/modular_citadel/code/modules/client/loadout/hands.dm
@@ -11,7 +11,7 @@
/datum/gear/dice
name = "Dice bag"
category = SLOT_HANDS
- path = /obj/item/storage/pill_bottle/dice
+ path = /obj/item/storage/box/dice
/datum/gear/eightball
name = "Magic eightball"
diff --git a/modular_citadel/code/modules/client/loadout/head.dm b/modular_citadel/code/modules/client/loadout/head.dm
index 28c6e8e8a6..2156c9c481 100644
--- a/modular_citadel/code/modules/client/loadout/head.dm
+++ b/modular_citadel/code/modules/client/loadout/head.dm
@@ -48,6 +48,11 @@
category = SLOT_HEAD
path = /obj/item/clothing/head/that
+/datum/gear/maidband
+ name = "Maid headband"
+ category = SLOT_HEAD
+ path= /obj/item/clothing/head/maid
+
/datum/gear/flakhelm
name = "Flak Helmet"
category = SLOT_HEAD
@@ -98,6 +103,46 @@
restricted_desc = "Engineering, Security, and Cargo"
restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster")
+// orvilike "original" kepi
+/datum/gear/orvkepicom
+ name = "Federation Kepi, command"
+ description = "A visored cap. Intended to be used with ORV uniform."
+ category = SLOT_HEAD
+ path = /obj/item/clothing/head/kepi/orvi/command
+ restricted_desc = "Heads of Staff"
+ restricted_roles = list("Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Research Director", "Chief Medical Officer", "Quartermaster")
+
+/datum/gear/orvkepiops
+ name = "Federation Kepi, ops/sec"
+ description = "A visored cap. Intended to be used with ORV uniform."
+ category = SLOT_HEAD
+ path = /obj/item/clothing/head/kepi/orvi/engsec
+ restricted_desc = "Engineering, Security and Cargo"
+ restricted_roles = list("Chief Engineer", "Atmospheric Technician", "Station Engineer", "Warden", "Detective", "Security Officer", "Head of Security", "Cargo Technician", "Shaft Miner", "Quartermaster")
+
+/datum/gear/orvkepimedsci
+ name = "Federation Kepi, medsci"
+ description = "A visored cap. Intended to be used with ORV uniform."
+ category = SLOT_HEAD
+ path = /obj/item/clothing/head/kepi/orvi/medsci
+ restricted_desc = "Medical and Science"
+ restricted_roles = list("Chief Medical Officer", "Medical Doctor", "Chemist", "Virologist", "Paramedic", "Geneticist", "Research Director", "Scientist", "Roboticist")
+
+/datum/gear/orvkepisrv
+ name = "Federation Kepi, service"
+ description = "A visored cap. Intended to be used with ORV uniform."
+ category = SLOT_HEAD
+ path = /obj/item/clothing/head/kepi/orvi/service
+ restricted_desc = "Service and Civilian, barring Clown, Mime and Lawyer"
+ restricted_roles = list("Assistant", "Bartender", "Botanist", "Cook", "Curator", "Janitor", "Chaplain")
+
+/datum/gear/orvkepiass
+ name = "Federation Kepi, assistant"
+ description = "A visored cap. Intended to be used with ORV uniform."
+ category = SLOT_HEAD
+ path = /obj/item/clothing/head/kepi/orvi
+ restricted_roles = list("Assistant")
+
/*Commenting out Until next Christmas or made automatic
/datum/gear/santahatr
name = "Red Santa Hat"
@@ -137,3 +182,9 @@
path = /obj/item/clothing/head/cowboyhat/sec
restricted_desc = "Security"
restricted_roles = list("Warden","Detective","Security Officer","Head of Security")
+
+// Misc
+/datum/gear/wkepi
+ name = "white kepi"
+ category = SLOT_HEAD
+ path = /obj/item/clothing/head/kepi
diff --git a/modular_citadel/code/modules/client/loadout/neck.dm b/modular_citadel/code/modules/client/loadout/neck.dm
index 320a83b87d..0f69296406 100644
--- a/modular_citadel/code/modules/client/loadout/neck.dm
+++ b/modular_citadel/code/modules/client/loadout/neck.dm
@@ -92,3 +92,8 @@
name = "Headphones"
category = SLOT_NECK
path = /obj/item/clothing/ears/headphones
+
+/datum/gear/polycloak
+ name = "Polychromatic Cloak"
+ category = SLOT_NECK
+ path = /obj/item/clothing/neck/cloak/polychromic
diff --git a/modular_citadel/code/modules/client/loadout/suit.dm b/modular_citadel/code/modules/client/loadout/suit.dm
index fecf2a4dce..57c5772f48 100644
--- a/modular_citadel/code/modules/client/loadout/suit.dm
+++ b/modular_citadel/code/modules/client/loadout/suit.dm
@@ -24,6 +24,26 @@
category = SLOT_WEAR_SUIT
path = /obj/item/clothing/suit/jacket
+/datum/gear/jacketflannelblack // all of these are reskins of bomber jackets but with the vibe to make you look like a true lumberjack
+ name = "Black flannel jacket"
+ category = SLOT_WEAR_SUIT
+ path = /obj/item/clothing/suit/jacket/flannel
+
+/datum/gear/jacketflannelred
+ name = "Red flannel jacket"
+ category = SLOT_WEAR_SUIT
+ path = /obj/item/clothing/suit/jacket/flannel/red
+
+/datum/gear/jacketflannelaqua
+ name = "Aqua flannel jacket"
+ category = SLOT_WEAR_SUIT
+ path = /obj/item/clothing/suit/jacket/flannel/aqua
+
+/datum/gear/jacketflannelbrown
+ name = "Brown flannel jacket"
+ category = SLOT_WEAR_SUIT
+ path = /obj/item/clothing/suit/jacket/flannel/brown
+
/datum/gear/jacketleather
name = "Leather jacket"
category = SLOT_WEAR_SUIT
@@ -127,6 +147,12 @@
path = /obj/item/clothing/suit/hooded/wintercoat/hydro
restricted_roles = list("Head of Personnel", "Botanist") // Reserve it to Botanists and their boss, the Head of Personnel
+/datum/gear/coat/bar
+ name = "Bar winter coat"
+ category = SLOT_WEAR_SUIT
+ path = /obj/item/clothing/suit/hooded/wintercoat/bar
+ restricted_roles = list("Bartender") // Reserve it to Bartenders and not the Head of Personnel because he doesnt deserve to look as fancy as them
+
/datum/gear/coat/cargo
name = "Cargo winter coat"
category = SLOT_WEAR_SUIT
diff --git a/modular_citadel/code/modules/client/preferences_savefile.dm b/modular_citadel/code/modules/client/preferences_savefile.dm
index c747c4cf32..bbd71d22e3 100644
--- a/modular_citadel/code/modules/client/preferences_savefile.dm
+++ b/modular_citadel/code/modules/client/preferences_savefile.dm
@@ -7,12 +7,12 @@
features["ipc_antenna"] = sanitize_inlist(features["ipc_antenna"], GLOB.ipc_antennas_list)
//Citadel
features["flavor_text"] = sanitize_text(features["flavor_text"], initial(features["flavor_text"]))
- if(!features["mcolor2"] || features["mcolor"] == "#000")
+ if(!features["mcolor2"] || features["mcolor"] == "#000000")
features["mcolor2"] = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F")
- if(!features["mcolor3"] || features["mcolor"] == "#000")
+ if(!features["mcolor3"] || features["mcolor"] == "#000000")
features["mcolor3"] = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F")
- features["mcolor2"] = sanitize_hexcolor(features["mcolor2"], 3, 0)
- features["mcolor3"] = sanitize_hexcolor(features["mcolor3"], 3, 0)
+ features["mcolor2"] = sanitize_hexcolor(features["mcolor2"], 6, FALSE)
+ features["mcolor3"] = sanitize_hexcolor(features["mcolor3"], 6, FALSE)
/datum/preferences/proc/cit_character_pref_save(savefile/S)
diff --git a/modular_citadel/code/modules/clothing/trek.dm b/modular_citadel/code/modules/clothing/trek.dm
index c522d1af81..f7e8b6778e 100644
--- a/modular_citadel/code/modules/clothing/trek.dm
+++ b/modular_citadel/code/modules/clothing/trek.dm
@@ -162,3 +162,21 @@
/obj/item/clothing/head/caphat/formal/fedcover/black
icon_state = "fedcapblack"
item_state = "fedcapblack"
+
+//orvilike caps
+/obj/item/clothing/head/kepi/orvi
+ name = "\improper Federation kepi"
+ desc = "A visored cap worn by all officers since 2550s."
+ icon_state = "kepi_ass"
+
+/obj/item/clothing/head/kepi/orvi/command
+ icon_state = "kepi_com"
+
+/obj/item/clothing/head/kepi/orvi/engsec
+ icon_state = "kepi_ops"
+
+/obj/item/clothing/head/kepi/orvi/medsci
+ icon_state = "kepi_medsci"
+
+/obj/item/clothing/head/kepi/orvi/service
+ icon_state = "kepi_srv"
diff --git a/modular_citadel/code/modules/mentor/mentor_memo.dm b/modular_citadel/code/modules/mentor/mentor_memo.dm
index b9f6833e32..8110c5ffcc 100644
--- a/modular_citadel/code/modules/mentor/mentor_memo.dm
+++ b/modular_citadel/code/modules/mentor/mentor_memo.dm
@@ -33,11 +33,14 @@
var/datum/DBQuery/query_memocheck = SSdbcore.NewQuery("SELECT ckey FROM [format_table_name("mentor_memo")] WHERE ckey = '[sql_ckey]'")
if(!query_memocheck.Execute())
var/err = query_memocheck.ErrorMsg()
+ qdel(query_memocheck)
log_game("SQL ERROR obtaining ckey from memo table. Error : \[[err]\]\n")
return
if(query_memocheck.NextRow())
+ qdel(query_memocheck)
to_chat(src, "You already have set a memo.")
return
+ qdel(query_memocheck)
var/memotext = input(src,"Write your Memo","Memo") as message
if(!memotext)
return
@@ -46,20 +49,24 @@
var/datum/DBQuery/query_memoadd = SSdbcore.NewQuery("INSERT INTO [format_table_name("mentor_memo")] (ckey, memotext, timestamp) VALUES ('[sql_ckey]', '[memotext]', '[timestamp]')")
if(!query_memoadd.Execute())
var/err = query_memoadd.ErrorMsg()
+ qdel(query_memoadd)
log_game("SQL ERROR adding new memo. Error : \[[err]\]\n")
return
log_admin("[key_name(src)] has set a mentor memo: [memotext]")
message_admins("[key_name_admin(src)] has set a mentor memo: [memotext]")
+ qdel(query_memoadd)
if("Edit")
var/datum/DBQuery/query_memolist = SSdbcore.NewQuery("SELECT ckey FROM [format_table_name("mentor_memo")]")
if(!query_memolist.Execute())
var/err = query_memolist.ErrorMsg()
+ qdel(query_memolist)
log_game("SQL ERROR obtaining ckey from memo table. Error : \[[err]\]\n")
return
var/list/memolist = list()
while(query_memolist.NextRow())
var/lkey = query_memolist.item[1]
memolist += "[lkey]"
+ qdel(query_memolist)
if(!memolist.len)
to_chat(src, "No memos found in database.")
return
@@ -70,10 +77,12 @@
var/datum/DBQuery/query_memofind = SSdbcore.NewQuery("SELECT memotext FROM [format_table_name("mentor_memo")] WHERE ckey = '[target_sql_ckey]'")
if(!query_memofind.Execute())
var/err = query_memofind.ErrorMsg()
+ qdel(query_memofind)
log_game("SQL ERROR obtaining memotext from memo table. Error : \[[err]\]\n")
return
if(query_memofind.NextRow())
var/old_memo = query_memofind.item[1]
+ qdel(query_memofind)
var/new_memo = input("Input new memo", "New Memo", "[old_memo]", null) as message
if(!new_memo)
return
@@ -83,6 +92,7 @@
var/datum/DBQuery/update_query = SSdbcore.NewQuery("UPDATE [format_table_name("mentor_memo")] SET memotext = '[new_memo]', last_editor = '[sql_ckey]', edits = CONCAT(IFNULL(edits,''),'[edit_text]') WHERE ckey = '[target_sql_ckey]'")
if(!update_query.Execute())
var/err = update_query.ErrorMsg()
+ qdel(update_query)
log_game("SQL ERROR editing memo. Error : \[[err]\]\n")
return
if(target_sql_ckey == sql_ckey)
@@ -91,10 +101,14 @@
else
log_admin("[key_name(src)] has edited [target_sql_ckey]'s mentor memo from [old_memo] to [new_memo]")
message_admins("[key_name_admin(src)] has edited [target_sql_ckey]'s mentor memo from [old_memo] to [new_memo]")
+ qdel(update_query)
+ else
+ qdel(query_memofind)
if("Show")
var/datum/DBQuery/query_memoshow = SSdbcore.NewQuery("SELECT ckey, memotext, timestamp, last_editor FROM [format_table_name("mentor_memo")]")
if(!query_memoshow.Execute())
var/err = query_memoshow.ErrorMsg()
+ qdel(query_memoshow)
log_game("SQL ERROR obtaining ckey, memotext, timestamp, last_editor from memo table. Error : \[[err]\]\n")
return
var/output = null
@@ -107,6 +121,7 @@
if(last_editor)
output += " Last edit by [last_editor] (Click here to see edit log)"
output += " [memotext] "
+ qdel(query_memoshow)
if(!output)
to_chat(src, "No memos found in database.")
return
@@ -115,12 +130,14 @@
var/datum/DBQuery/query_memodellist = SSdbcore.NewQuery("SELECT ckey FROM [format_table_name("mentor_memo")]")
if(!query_memodellist.Execute())
var/err = query_memodellist.ErrorMsg()
+ qdel(query_memodellist)
log_game("SQL ERROR obtaining ckey from memo table. Error : \[[err]\]\n")
return
var/list/memolist = list()
while(query_memodellist.NextRow())
var/ckey = query_memodellist.item[1]
memolist += "[ckey]"
+ qdel(query_memodellist)
if(!memolist.len)
to_chat(src, "No memos found in database.")
return
@@ -131,6 +148,7 @@
var/datum/DBQuery/query_memodel = SSdbcore.NewQuery("DELETE FROM [format_table_name("memo")] WHERE ckey = '[target_sql_ckey]'")
if(!query_memodel.Execute())
var/err = query_memodel.ErrorMsg()
+ qdel(query_memodel)
log_game("SQL ERROR removing memo. Error : \[[err]\]\n")
return
if(target_sql_ckey == sql_ckey)
@@ -138,4 +156,4 @@
message_admins("[key_name_admin(src)] has removed their mentor memo.")
else
log_admin("[key_name(src)] has removed [target_sql_ckey]'s mentor memo.")
- message_admins("[key_name_admin(src)] has removed [target_sql_ckey]'s mentor memo.")
\ No newline at end of file
+ message_admins("[key_name_admin(src)] has removed [target_sql_ckey]'s mentor memo.")
diff --git a/modular_citadel/code/modules/mentor/mentorpm.dm b/modular_citadel/code/modules/mentor/mentorpm.dm
index d2d04495d4..3260e96767 100644
--- a/modular_citadel/code/modules/mentor/mentorpm.dm
+++ b/modular_citadel/code/modules/mentor/mentorpm.dm
@@ -67,7 +67,7 @@
if(C.is_mentor())
if(is_mentor())//both are mentors
to_chat(C, "Mentor PM from-[key_name_mentor(src, C, 1, 0, 0)]: [msg]")
- to_chat(src, "Mentor PM to-[key_name_mentor(C, C, 1, 0, 0)]: [msg]")
+ to_chat(src, "Mentor PM to-[key_name_mentor(C, C, 1, 0, 0)]: [msg]")
else //recipient is a mentor but sender is not
to_chat(C, "Reply PM from-[key_name_mentor(src, C, 1, 0, show_char)]: [msg]")
diff --git a/modular_citadel/code/modules/mob/cit_emotes.dm b/modular_citadel/code/modules/mob/cit_emotes.dm
index 2be83733e5..e58c6bda30 100644
--- a/modular_citadel/code/modules/mob/cit_emotes.dm
+++ b/modular_citadel/code/modules/mob/cit_emotes.dm
@@ -244,3 +244,21 @@
user.nextsoundemote = world.time + 7
var/sound = pick('modular_citadel/sound/voice/bark1.ogg', 'modular_citadel/sound/voice/bark2.ogg')
playsound(user, sound, 50, 1, -1)
+
+/datum/emote/living/squish
+ key = "squish"
+ key_third_person = "squishes"
+ message = "squishes!"
+ emote_type = EMOTE_AUDIBLE
+ muzzle_ignore = FALSE
+ restraint_check = FALSE
+ mob_type_allowed_typecache = list(/mob/living/carbon, /mob/living/silicon/pai)
+
+/datum/emote/living/squish/run_emote(mob/living/user, params)
+ if(!(. = ..()))
+ return
+ if(user.nextsoundemote >= world.time)
+ return
+ user.nextsoundemote = world.time + 7
+ var/sound = pick('sound/voice/slime_squish.ogg')
+ playsound(user, sound, 50, 1, -1)
diff --git a/modular_citadel/code/modules/mob/living/carbon/human/human.dm b/modular_citadel/code/modules/mob/living/carbon/human/human.dm
index 474c9d2823..47de66fcd1 100644
--- a/modular_citadel/code/modules/mob/living/carbon/human/human.dm
+++ b/modular_citadel/code/modules/mob/living/carbon/human/human.dm
@@ -16,7 +16,7 @@
if(!I || !L || I.loc != src || !(I in L.embedded_objects))
return
L.embedded_objects -= I
- L.receive_damage(I.embedding.embedded_unsafe_removal_pain_multiplier*I.w_class*painmul)//It hurts to rip it out, get surgery you dingus. And if you're ripping it out quickly via resist, it's gonna hurt even more
+ L.receive_damage(I.embedding["remove_pain_mult"]*I.w_class*painmul)//It hurts to rip it out, get surgery you dingus. And if you're ripping it out quickly via resist, it's gonna hurt even more
I.forceMove(get_turf(src))
I.unembedded()
user.put_in_hands(I)
diff --git a/modular_citadel/code/modules/mob/living/carbon/life.dm b/modular_citadel/code/modules/mob/living/carbon/life.dm
deleted file mode 100644
index e94bd75985..0000000000
--- a/modular_citadel/code/modules/mob/living/carbon/life.dm
+++ /dev/null
@@ -1,3 +0,0 @@
-/mob/living/carbon/Life()
- . = ..()
- doSprintBufferRegen()
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm
index 37ec1ee69f..f3059a480a 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm
@@ -63,7 +63,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
startHunger = M.nutrition
if(pollStarted == FALSE)
pollStarted = TRUE
- candies = pollGhostCandidates("Do you want and agree to play as a clone of [M], respect their character and not engage in ERP without permission from the original?", ignore_category = POLL_IGNORE_CLONE)
+ candies = pollGhostCandidates("Do you want to play as [M]'s defective clone? (Don't ERP without permission from the original)", ignore_category = POLL_IGNORE_CLONE)
log_reagent("FERMICHEM: [M] ckey: [M.key] has taken SDGF, and ghosts have been polled.")
if(20 to INFINITY)
if(LAZYLEN(candies) && playerClone == FALSE) //If there's candidates, clone the person and put them in there!
@@ -112,7 +112,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
M.visible_message("[M] suddenly shudders, and splits into two identical twins!")
SM.copy_languages(M, LANGUAGE_MIND)
playerClone = TRUE
- M.next_move_modifier = 1
+ M.action_cooldown_mod = 1
M.adjust_nutrition(-500)
//Damage the clone
@@ -154,7 +154,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
M.adjust_nutrition(M.nutrition/5)
if(50)
to_chat(M, "The synthetic cells begin to merge with your body, it feels like your body is made of a viscous water, making your movements difficult.")
- M.next_move_modifier += 4//If this makes you fast then please fix it, it should make you slow!!
+ M.action_cooldown_mod += 4//If this makes you fast then please fix it, it should make you slow!!
//candidates = pollGhostCandidates("Do you want to play as a clone of [M.name] and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you. ", "FermiClone", null, ROLE_SENTIENCE, 300) // see poll_ignore.dm, should allow admins to ban greifers or bullies
if(51 to 79)
M.adjust_nutrition(M.nutrition/2)
@@ -164,7 +164,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
M.set_nutrition(20000) //https://www.youtube.com/watch?v=Bj_YLenOlZI
if(86)//Upon splitting, you get really hungry and are capable again. Deletes the chem after you're done.
M.set_nutrition(15)//YOU BEST BE EATTING AFTER THIS YOU CUTIE
- M.next_move_modifier -= 4
+ M.action_cooldown_mod -= 4
to_chat(M, "Your body splits away from the cell clone of yourself, leaving you with a drained and hollow feeling inside.")
//clone
@@ -195,14 +195,14 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
if (playerClone == TRUE)//If the player made a clone with it, then thats all they get.
playerClone = FALSE
return
- if (M.next_move_modifier == 4 && !M.has_status_effect(/datum/status_effect/chem/SGDF))//checks if they're ingested over 20u of the stuff, but fell short of the required 30u to make a clone.
+ if (M.action_cooldown_mod == 4 && !M.has_status_effect(/datum/status_effect/chem/SGDF))//checks if they're ingested over 20u of the stuff, but fell short of the required 30u to make a clone.
to_chat(M, "You feel the cells begin to merge with your body, unable to reach nucleation, they instead merge with your body, healing any wounds.")
M.adjustCloneLoss(-10, 0) //I don't want to make Rezadone obsolete.
M.adjustBruteLoss(-25, 0)// Note that this takes a long time to apply and makes you fat and useless when it's in you, I don't think this small burst of healing will be useful considering how long it takes to get there.
M.adjustFireLoss(-25, 0)
M.blood_volume += 250
M.heal_bodypart_damage(1,1)
- M.next_move_modifier = 1
+ M.action_cooldown_mod = 1
if (M.nutrition < 1500)
M.adjust_nutrition(250)
else if (unitCheck == TRUE && !M.has_status_effect(/datum/status_effect/chem/SGDF))// If they're ingested a little bit (10u minimum), then give them a little healing.
@@ -211,7 +211,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
M.adjustBruteLoss(-10, 0)
M.adjustFireLoss(-10, 0)
M.blood_volume += 100
- M.next_move_modifier = 1
+ M.action_cooldown_mod = 1
if (M.nutrition < 1500)
M.adjust_nutrition(500)
@@ -325,7 +325,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
M.adjust_nutrition(M.nutrition/5)
if(50)
to_chat(M, "The synethic cells begin to merge with your body, it feels like your body is made of a viscous water, making your movements difficult.")
- M.next_move_modifier = 4//If this makes you fast then please fix it, it should make you slow!!
+ M.action_cooldown_mod = 4//If this makes you fast then please fix it, it should make you slow!!
if(51 to 73)
M.adjust_nutrition(M.nutrition/2)
if(74)
@@ -339,7 +339,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
if (!M.reagents.has_reagent(/datum/reagent/medicine/pen_acid))//Counterplay is pent.)
message_admins("(non-infectious) SDZF: Zombie spawned at [M] [COORD(M)]!")
M.set_nutrition(startHunger - 500) //YOU BEST BE RUNNING AWAY AFTER THIS YOU BADDIE
- M.next_move_modifier = 1
+ M.action_cooldown_mod = 1
to_chat(M, "Your body splits away from the cell clone of yourself, your attempted clone birthing itself violently from you as it begins to shamble around, a terrifying abomination of science.")
M.visible_message("[M] suddenly shudders, and splits into a funky smelling copy of themselves!")
M.emote("scream")
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm
index ca6bb302da..a6a9d7a85f 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm
@@ -200,17 +200,17 @@
/datum/reagent/fermi/zeolites
name = "Artificial Zeolites"
- description = "Lab made Zeolite, used to clear radiation form people and items alike! Splashing just a small amounts(5u) onto any item can clear away large amouts of contamination."
+ description = "Lab made Zeolite, used to clear radiation from people and items alike! Splashing just a small amount(5u) onto any item can clear away large amounts of contamination."
pH = 8
color = "#FFDADA"
- metabolization_rate = 8 * REAGENTS_METABOLISM //Lastes not long in body but heals a lot!
+ metabolization_rate = 8 * REAGENTS_METABOLISM //Metabolizes fast but heals a lot!
value = REAGENT_VALUE_COMMON
/datum/reagent/fermi/zeolites/on_mob_life(mob/living/carbon/M)
var/datum/component/radioactive/contamination = M.GetComponent(/datum/component/radioactive)
if(M.radiation > 0)
M.radiation -= min(M.radiation, 60)
- if(contamination.strength > 0)
+ if(contamination && contamination.strength > 0)
contamination.strength -= min(contamination.strength, 100)
..()
diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
index b2c80e4a16..a24a5beaad 100644
--- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
@@ -165,7 +165,7 @@
if(amount_to_spawn <= 0)
amount_to_spawn = 1
for(var/i in 1 to amount_to_spawn)
- var/mob/living/simple_animal/slime/S = new(T,"green")
+ var/mob/living/simple_animal/slime/S = new(T,"pyrite")
S.damage_coeff = list(BRUTE = 0.9 , BURN = 2, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)
S.name = "Living teratoma"
S.real_name = "Living teratoma"
diff --git a/modular_citadel/code/modules/reagents/objects/clothes.dm b/modular_citadel/code/modules/reagents/objects/clothes.dm
index de4cb38360..ab4d49c56f 100644
--- a/modular_citadel/code/modules/reagents/objects/clothes.dm
+++ b/modular_citadel/code/modules/reagents/objects/clothes.dm
@@ -9,7 +9,7 @@
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
//item_flags = NODROP //Tips their hat!
-/obj/item/clothing/head/hattip/attack_hand(mob/user)
+/obj/item/clothing/head/hattip/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(iscarbon(user))
var/mob/living/carbon/C = user
if(is_ninja(C))
diff --git a/modular_citadel/code/modules/reagents/objects/items.dm b/modular_citadel/code/modules/reagents/objects/items.dm
index 1924e7ee00..f4316b3c58 100644
--- a/modular_citadel/code/modules/reagents/objects/items.dm
+++ b/modular_citadel/code/modules/reagents/objects/items.dm
@@ -9,7 +9,7 @@
w_class = WEIGHT_CLASS_TINY
//A little janky with pockets
-/obj/item/fermichem/pHbooklet/attack_hand(mob/user)
+/obj/item/fermichem/pHbooklet/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(user.get_held_index_of_item(src))//Does this check pockets too..?
if(numberOfPages == 50)
icon_state = "pHbookletOpen"
diff --git a/modular_citadel/icons/mob/mutant_bodyparts.dmi b/modular_citadel/icons/mob/mutant_bodyparts.dmi
index 95b121b453..6098dd3567 100644
Binary files a/modular_citadel/icons/mob/mutant_bodyparts.dmi and b/modular_citadel/icons/mob/mutant_bodyparts.dmi differ
diff --git a/rust_g.dll b/rust_g.dll
old mode 100644
new mode 100755
index f4be6e730a..8cd62b8ca4
Binary files a/rust_g.dll and b/rust_g.dll differ
diff --git a/sound/ambience/LICENSE.txt b/sound/ambience/license.txt
similarity index 52%
rename from sound/ambience/LICENSE.txt
rename to sound/ambience/license.txt
index 5fb0ece74d..51f5a7e2bc 100644
--- a/sound/ambience/LICENSE.txt
+++ b/sound/ambience/license.txt
@@ -4,3 +4,8 @@ ambidet2.ogg is Night on the Docks, Piano by Kevin Macleod. It has been licensed
It has been cropped for use ingame, and also fades in.
aurora_caelus.ogg is Music for Manatees, by Kevin Macleod. It has been licensed under CC-BY 3.0 license.
It has been cropped for use ingame, and also fades out.
+title1.ogg is Flip-Flap created by Jakub "AceMan" SzelÄ…g and taken from http://www.modules.pl/?id=module&mod=453
+title2.ogg is Robocop Theme (gameboy) remixed by Eric Schumacker
+title3.ogg is Tintin On The Moon remixed by Cuboos https://tgstation13.org/phpBB/viewtopic.php?f=10&t=2157 (assumed CC under allowing it to be submitted to the github, see thread)
+
+CC-BY 3.0: http://creativecommons.org/licenses/by/3.0/
diff --git a/sound/effects/blood1.ogg b/sound/effects/blood1.ogg
new file mode 100644
index 0000000000..88c76eb9e3
Binary files /dev/null and b/sound/effects/blood1.ogg differ
diff --git a/sound/effects/blood2.ogg b/sound/effects/blood2.ogg
new file mode 100644
index 0000000000..0fb165108a
Binary files /dev/null and b/sound/effects/blood2.ogg differ
diff --git a/sound/effects/blood3.ogg b/sound/effects/blood3.ogg
new file mode 100644
index 0000000000..f6024a5ff6
Binary files /dev/null and b/sound/effects/blood3.ogg differ
diff --git a/sound/effects/butcher.ogg b/sound/effects/butcher.ogg
new file mode 100644
index 0000000000..2e4a0d2ddc
Binary files /dev/null and b/sound/effects/butcher.ogg differ
diff --git a/sound/effects/crack1.ogg b/sound/effects/crack1.ogg
new file mode 100644
index 0000000000..aa3bf0ab01
Binary files /dev/null and b/sound/effects/crack1.ogg differ
diff --git a/sound/effects/crack2.ogg b/sound/effects/crack2.ogg
new file mode 100644
index 0000000000..cef226c98b
Binary files /dev/null and b/sound/effects/crack2.ogg differ
diff --git a/sound/effects/dismember.ogg b/sound/effects/dismember.ogg
new file mode 100644
index 0000000000..f5015ad961
Binary files /dev/null and b/sound/effects/dismember.ogg differ
diff --git a/sound/effects/license.txt b/sound/effects/license.txt
new file mode 100644
index 0000000000..c928a9872f
--- /dev/null
+++ b/sound/effects/license.txt
@@ -0,0 +1,2 @@
+hit_punch.ogg and hit_kick.ogg are made by Taira Komori
+(https://taira-komori.jpn.org/freesounden.html)
diff --git a/sound/effects/meatslap.ogg b/sound/effects/meatslap.ogg
new file mode 100644
index 0000000000..3d8ea7df1a
Binary files /dev/null and b/sound/effects/meatslap.ogg differ
diff --git a/sound/effects/sizzle1.ogg b/sound/effects/sizzle1.ogg
new file mode 100644
index 0000000000..4a3d229018
Binary files /dev/null and b/sound/effects/sizzle1.ogg differ
diff --git a/sound/effects/sizzle2.ogg b/sound/effects/sizzle2.ogg
new file mode 100644
index 0000000000..409206e58a
Binary files /dev/null and b/sound/effects/sizzle2.ogg differ
diff --git a/sound/machines/clockcult/ratvar_scream.ogg b/sound/machines/clockcult/ratvar_scream.ogg
new file mode 100644
index 0000000000..5c0c0a0d63
Binary files /dev/null and b/sound/machines/clockcult/ratvar_scream.ogg differ
diff --git a/sound/magic/abomscream.ogg b/sound/magic/abomscream.ogg
new file mode 100644
index 0000000000..4f450e05f7
Binary files /dev/null and b/sound/magic/abomscream.ogg differ
diff --git a/sound/mecha/neostep1.ogg b/sound/mecha/neostep1.ogg
new file mode 100644
index 0000000000..ce7f51ad23
Binary files /dev/null and b/sound/mecha/neostep1.ogg differ
diff --git a/sound/mecha/neostep2.ogg b/sound/mecha/neostep2.ogg
new file mode 100644
index 0000000000..e828d9eadd
Binary files /dev/null and b/sound/mecha/neostep2.ogg differ
diff --git a/sound/mecha/powerloader_step.ogg b/sound/mecha/powerloader_step.ogg
new file mode 100644
index 0000000000..af427df865
Binary files /dev/null and b/sound/mecha/powerloader_step.ogg differ
diff --git a/sound/voice/catpeople/distressed.ogg b/sound/voice/catpeople/distressed.ogg
new file mode 100644
index 0000000000..cebe73dffc
Binary files /dev/null and b/sound/voice/catpeople/distressed.ogg differ
diff --git a/sound/voice/catpeople/license.txt b/sound/voice/catpeople/license.txt
new file mode 100644
index 0000000000..7218480ddb
--- /dev/null
+++ b/sound/voice/catpeople/license.txt
@@ -0,0 +1,2 @@
+distressed_cat.ogg from Cat annoyed meow / wail by jbierfeldt at https://freesound.org/people/jbierfeldt/sounds/440735/, chopped up and ogged
+cat_puking.ogg from catpuking mp3 by NoiseCollector and Mocha the cat at https://freesound.org/people/NoiseCollector/sounds/80778/, chopped up, volume altered and ogged
\ No newline at end of file
diff --git a/sound/voice/catpeople/puking.ogg b/sound/voice/catpeople/puking.ogg
new file mode 100644
index 0000000000..e19c10858f
Binary files /dev/null and b/sound/voice/catpeople/puking.ogg differ
diff --git a/sound/voice/medbot/close.ogg b/sound/voice/medbot/close.ogg
new file mode 100644
index 0000000000..9e0efcefd2
Binary files /dev/null and b/sound/voice/medbot/close.ogg differ
diff --git a/sound/voice/medbot/dont_like.ogg b/sound/voice/medbot/dont_like.ogg
new file mode 100644
index 0000000000..06fc84af2f
Binary files /dev/null and b/sound/voice/medbot/dont_like.ogg differ
diff --git a/sound/voice/medbot/forgive.ogg b/sound/voice/medbot/forgive.ogg
new file mode 100644
index 0000000000..729eaa5c78
Binary files /dev/null and b/sound/voice/medbot/forgive.ogg differ
diff --git a/sound/voice/medbot/fuck_you.ogg b/sound/voice/medbot/fuck_you.ogg
new file mode 100644
index 0000000000..5eacff615f
Binary files /dev/null and b/sound/voice/medbot/fuck_you.ogg differ
diff --git a/sound/voice/medbot/hey_wait.ogg b/sound/voice/medbot/hey_wait.ogg
new file mode 100644
index 0000000000..6c88b761ec
Binary files /dev/null and b/sound/voice/medbot/hey_wait.ogg differ
diff --git a/sound/voice/medbot/i_require_asst.ogg b/sound/voice/medbot/i_require_asst.ogg
new file mode 100644
index 0000000000..18fabc630f
Binary files /dev/null and b/sound/voice/medbot/i_require_asst.ogg differ
diff --git a/sound/voice/medbot/i_trusted_you.ogg b/sound/voice/medbot/i_trusted_you.ogg
new file mode 100644
index 0000000000..602baa2f67
Binary files /dev/null and b/sound/voice/medbot/i_trusted_you.ogg differ
diff --git a/sound/voice/medbot/im_different.ogg b/sound/voice/medbot/im_different.ogg
new file mode 100644
index 0000000000..42eb8564f1
Binary files /dev/null and b/sound/voice/medbot/im_different.ogg differ
diff --git a/sound/voice/medbot/is_this_the_end.ogg b/sound/voice/medbot/is_this_the_end.ogg
new file mode 100644
index 0000000000..a2e0e2330a
Binary files /dev/null and b/sound/voice/medbot/is_this_the_end.ogg differ
diff --git a/sound/voice/medbot/nooo.ogg b/sound/voice/medbot/nooo.ogg
new file mode 100644
index 0000000000..102fd1fb04
Binary files /dev/null and b/sound/voice/medbot/nooo.ogg differ
diff --git a/sound/voice/medbot/oh_fuck.ogg b/sound/voice/medbot/oh_fuck.ogg
new file mode 100644
index 0000000000..95d21ef255
Binary files /dev/null and b/sound/voice/medbot/oh_fuck.ogg differ
diff --git a/sound/voice/medbot/pain_is_real.ogg b/sound/voice/medbot/pain_is_real.ogg
new file mode 100644
index 0000000000..9cfa3a71be
Binary files /dev/null and b/sound/voice/medbot/pain_is_real.ogg differ
diff --git a/sound/voice/medbot/please_dont.ogg b/sound/voice/medbot/please_dont.ogg
new file mode 100644
index 0000000000..a77ee09cb4
Binary files /dev/null and b/sound/voice/medbot/please_dont.ogg differ
diff --git a/sound/voice/medbot/please_im_scared.ogg b/sound/voice/medbot/please_im_scared.ogg
new file mode 100644
index 0000000000..7bd53b39c8
Binary files /dev/null and b/sound/voice/medbot/please_im_scared.ogg differ
diff --git a/sound/voice/medbot/please_put_me_back.ogg b/sound/voice/medbot/please_put_me_back.ogg
new file mode 100644
index 0000000000..84700fbdd5
Binary files /dev/null and b/sound/voice/medbot/please_put_me_back.ogg differ
diff --git a/sound/voice/medbot/reported.ogg b/sound/voice/medbot/reported.ogg
new file mode 100644
index 0000000000..d5469c19ce
Binary files /dev/null and b/sound/voice/medbot/reported.ogg differ
diff --git a/sound/voice/medbot/shindemashou.ogg b/sound/voice/medbot/shindemashou.ogg
new file mode 100644
index 0000000000..1ee2858eaf
Binary files /dev/null and b/sound/voice/medbot/shindemashou.ogg differ
diff --git a/sound/voice/medbot/thank_you.ogg b/sound/voice/medbot/thank_you.ogg
new file mode 100644
index 0000000000..3fabe7d4a6
Binary files /dev/null and b/sound/voice/medbot/thank_you.ogg differ
diff --git a/sound/voice/medbot/turn_off.ogg b/sound/voice/medbot/turn_off.ogg
new file mode 100644
index 0000000000..87a4d6bdd0
Binary files /dev/null and b/sound/voice/medbot/turn_off.ogg differ
diff --git a/sound/voice/medbot/why.ogg b/sound/voice/medbot/why.ogg
new file mode 100644
index 0000000000..415020b89b
Binary files /dev/null and b/sound/voice/medbot/why.ogg differ
diff --git a/sound/voice/medbot/youre_good.ogg b/sound/voice/medbot/youre_good.ogg
new file mode 100644
index 0000000000..62c325f834
Binary files /dev/null and b/sound/voice/medbot/youre_good.ogg differ
diff --git a/sound/voice/slime_squish.ogg b/sound/voice/slime_squish.ogg
new file mode 100644
index 0000000000..60e118e217
Binary files /dev/null and b/sound/voice/slime_squish.ogg differ
diff --git a/sound/weapons/guillotine.ogg b/sound/weapons/guillotine.ogg
new file mode 100644
index 0000000000..f2647b43e3
Binary files /dev/null and b/sound/weapons/guillotine.ogg differ
diff --git a/strings/abductee_objectives.txt b/strings/abductee_objectives.txt
index 512fd2e60d..93fd946818 100644
--- a/strings/abductee_objectives.txt
+++ b/strings/abductee_objectives.txt
@@ -13,7 +13,6 @@ You're throwing a huge rager. Make it as awesome as possible so the whole crew c
The clown is not funny. You can do better! Steal his audience and make the crew laugh!
You burn with passion for music. Share your vision. If anyone hates it, beat them on the head with your instrument!
Go have a good conversation with the singularity/tesla/supermatter crystal. Bonus points if it responds.
-You are pregnant and soon due. Find a safe place to deliver your baby.
Expand the station.
So much lies undiscovered. Look deeper into the machinations of the universe.
Climb the corporate ladder all the way to the top!
diff --git a/strings/tips.txt b/strings/tips.txt
index b135692778..043405c7a0 100644
--- a/strings/tips.txt
+++ b/strings/tips.txt
@@ -37,7 +37,7 @@ As a Medical Doctor, treating plasmamen is not impossible! Salbutamol stops them
As a Medical Doctor, you can point your penlight at people to create a medical hologram. This lets them know that you're coming to treat them.
As a Medical Doctor, you can extract implants by holding an empty implant case in your offhand while performing the extraction step.
As a Medical Doctor, clone scanning people will implant them with a health tracker that displays their vitals in the clone records. Useful to check on crew members that didn't activate suit sensors!
-As a Medical Doctor, medical gauze stops bleeding as well as heals 5 brute damage, this even works on the dead! Make sure to always have some gauze on you to stop bleeding before dragging someone.
+As a Medical Doctor, medical gauze stops bleeding as well as healing 5 brute damage, this even works on the dead! Make sure to always have some gauze on you to stop bleeding before dragging someone.
As a Chemist, there are dozens of chemicals that can heal, and even more that can cause harm. Experiment!
As a Chemist, some chemicals can only be synthesized by heating up the contents in the chemical heater.
As a Chemist, you will be expected to supply crew with certain chemicals. For example, clonexadone and mannitol for the cryo tubes, unstable mutagen and saltpetre for botany as well as healing pills and patches for the front desk.
@@ -265,7 +265,7 @@ As a Devil, as long as you control at least one other soul, you will automatical
At which time a Devil's nameth is spake on the tongue of man, the Devil may appeareth.
You can swap floor tiles by holding a crowbar in one hand and a stack of tiles in the other.
When hacking doors, cutting and mending the "test light wire" will restore power to the door.
-When hacking, remote singulars pluse when attached to a wire and pinged. This can allow you to hack things or set traps from far away.
+When hacking, remote singulars pulse when attached to a wire and pinged. This can allow you to hack things or set traps from far away.
When crafting most items, you can either manually combine parts or use the crafting menu.
Suit storage units not only remove blood and dirt from clothing, but also radiation!
Remote devices will work when used through cameras. For example: Bluespace RPEDs and door remotes.
diff --git a/strings/traumas.json b/strings/traumas.json
index 833c786b75..f461c5f5fd 100644
--- a/strings/traumas.json
+++ b/strings/traumas.json
@@ -130,7 +130,8 @@
"@pick(semicolon)*awoo",
"@pick(semicolon)*merp",
"@pick(semicolon)*weh",
- "@pick(semicolon)My balls finally feel full, again."
+ "@pick(semicolon)My balls finally feel full, again.",
+ "@pick(semicolon)Assaltign a sec osficer aren't crime if ur @pick(roles)"
],
"mutations": [
diff --git a/strings/wanted_message.json b/strings/wanted_message.json
new file mode 100644
index 0000000000..18965b7026
--- /dev/null
+++ b/strings/wanted_message.json
@@ -0,0 +1,74 @@
+{
+ "basemessage": [
+ "Fugitive from the law due to",
+ "Needs to be interrogated for information about",
+ "Wanted by The Syndicate for",
+ "Ransomable to Nanotrasen for",
+ "Has exploitable information about"
+ ],
+ "verb": [
+ "murdering",
+ "killing",
+ "accidentally destroying",
+ "destroying",
+ "knowing information about",
+ "stealing",
+ "slipping",
+ "sabotaging",
+ "robusting",
+ "collaborating with",
+ "being close friends with",
+ "cloning",
+ "befriending",
+ "bombing",
+ "kidnapping",
+ "pretending to be",
+ "seducing",
+ "ignoring",
+ "assassinating"
+ ],
+ "noun": {
+ "secret plans": 50,
+ "the hand teleporter": 50,
+ "an NT CentCom uniform": 50,
+ "a supermatter shard": 50,
+ "internal Syndicate documents": 50,
+ "experimental Nanotrasen technology": 50,
+ "bluespace crystals": 50,
+ "a cult": 50,
+ "shapeshifting creatures": 50,
+ "a toolbox": 10,
+ "a bar of soap": 10,
+ "lizardmen": 10,
+ "two million credits": 10,
+ "a gondola": 10,
+ "one billion credits": 5,
+ "research on floor clowns": 5,
+ "Officer Beepsky": 5,
+ "clown tears": 5,
+ "John F Kennedy 2": 5,
+ "Nanotrasen's swimsuit calendar": 5,
+ "a suspicious bus": 5,
+ "administrators": 5,
+ "a solid gold gondola": 5,
+ "the anime archive": 5,
+ "YALPER": 1,
+ "absolutely nothing": 1,
+ "Cuban Pete": 1,
+ "your mother": 1,
+ "WGW": 1
+ },
+ "location": {
+ "on Space Station 13": 50,
+ "somewhere in deep space": 50,
+ "on a remote syndicate base": 50,
+ "in a secure NT facility": 50,
+ "while on an escape shuttle": 10,
+ "while infiltrating CentCom headquarters": 10,
+ "deep in the necropolis": 10,
+ "during a drunken bar fight": 5,
+ "while stuck in a bathroom": 5,
+ "in a back alley on Mars": 5,
+ "on Virgo Orbital": 1
+ }
+}
diff --git a/strings/wisdoms.txt b/strings/wisdoms.txt
new file mode 100644
index 0000000000..b4dd53027c
--- /dev/null
+++ b/strings/wisdoms.txt
@@ -0,0 +1,443 @@
+A day for firm decisions!!!!! Or is it?
+A few hours grace before the madness begins again.
+A gift of a flower will soon be made to you.
+A long-forgotten loved one will appear soon.
+Buy the negatives at any price.
+A tall, dark stranger will have more fun than you.
+A visit to a fresh place will bring strange work.
+A visit to a strange place will bring fresh work.
+A vivid and creative mind characterizes you.
+Abandon the search for Truth; settle for a good fantasy.
+Accent on helpful side of your nature. Drain the moat.
+Advancement in position.
+After your lover has gone you will still have PEANUT BUTTER!
+Afternoon very favorable for romance. Try a single person for a change.
+Alimony and bribes will engage a large share of your wealth.
+All the troubles you have will pass away very quickly.
+Among the lucky, you are the chosen one.
+An avocado-tone refrigerator would look good on your resume.
+An exotic journey in downtown Newark is in your future.
+Another good night not to sleep in a eucalyptus tree.
+Are you a turtle?
+Are you ever going to do the dishes? Or will you change your major to biology?
+Are you making all this up as you go along?
+Are you sure the back door is locked?
+Artistic ventures highlighted. Rob a museum.
+Avert misunderstanding by calm, poise, and balance.
+Avoid gunfire in the bathroom tonight.
+Avoid reality at all costs.
+Bank error in your favor. Collect $200.
+Be careful! Is it classified?
+Be careful! UGLY strikes 9 out of 10!
+Be cautious in your daily affairs.
+Be cheerful while you are alive.
+Be different: conform.
+Be free and open and breezy! Enjoy! Things won't get any better so
+get used to it.
+Be security conscious -- National defense is at stake.
+Beauty and harmony are as necessary to you as the very breath of life.
+Best of all is never to have been born. Second best is to die soon.
+Better hope the life-inspector doesn't come around while you have your life in such a mess.
+Beware of a dark-haired man with a loud tie.
+Beware of a tall black man with one blond shoe.
+Beware of a tall blond man with one black shoe.
+Beware of Bigfoot!
+Beware of low-flying butterflies.
+Beware the one behind you.
+Blow it out your ear.
+Break into jail and claim police brutality.
+Bridge ahead. Pay troll.
+Caution: breathing may be hazardous to your health.
+Caution: Keep out of reach of children.
+Celebrate Hannibal Day this year. Take an elephant to lunch.
+Change your thoughts and you change your world.
+Cheer Up! Things are getting worse at a slower rate.
+Chess tonight.
+Chicken Little only has to be right once.
+Chicken Little was right.
+Cold hands, no gloves.
+Communicate! It can't make things any worse.
+Courage is your greatest present need.
+Day of inquiry. You will be subpoenaed.
+Do not overtax your powers.
+Do not sleep in a eucalyptus tree tonight.
+Do nothing unless you must, and when you must act -- hesitate.
+Do something unusual today. Pay a bill.
+Do what comes naturally. Seethe and fume and throw a tantrum.
+Domestic happiness and faithful friends.
+Don't feed the bats tonight.
+Don't get stuck in a closet -- wear yourself out.
+Don't get to bragging.
+Don't go surfing in South Dakota for a while.
+Don't hate yourself in the morning -- sleep till noon.
+Don't kiss an elephant on the lips today.
+Don't let your mind wander -- it's too little to be let out alone.
+Don't look back, the lemmings are gaining on you.
+Don't look now, but the man in the moon is laughing at you.
+Don't look now, but there is a multi-legged creature on your shoulder.
+Don't plan any hasty moves. You'll be evicted soon anyway.
+Don't read any sky-writing for the next two weeks.
+Don't read everything you believe.
+Don't relax! It's only your tension that's holding you together.
+Don't tell any big lies today. Small ones can be just as effective.
+Don't worry so loud, your roommate can't think.
+Don't Worry, Be Happy.
+Don't worry. Life's too long.
+Don't you feel more like you do now than you did when you came in?
+Don't you wish you had more energy... or less ambition?
+Everything that you know is wrong, but you can be straightened out.
+Everything will be just tickety-boo today.
+Excellent day for putting Slinkies on an escalator.
+Excellent day to have a rotten day.
+Excellent time to become a missing person.
+Executive ability is prominent in your make-up.
+Exercise caution in your daily affairs.
+Expect a letter from a friend who will ask a favor of you.
+Expect the worst, it's the least you can do.
+Fine day for friends.
+So-so day for you.
+Fine day to work off excess energy. Steal something heavy.
+Fortune: You will be attacked next Wednesday at 3:15 p.m. by six samurai sword wielding purple fish glued to Harley-Davidson motorcycles.
+Oh, and have a nice day!
+Future looks spotty. You will spill soup in late evening.
+Generosity and perfection are your everlasting goals.
+Give him an evasive answer.
+Give thought to your reputation. Consider changing name and moving to a new town.
+Give your very best today. Heaven knows it's little enough.
+Go to a movie tonight. Darkness becomes you.
+Good day for a change of scene. Repaper the bedroom wall.
+Good day for overcoming obstacles. Try a steeplechase.
+Good day to deal with people in high places; particularly lonely stewardesses.
+Good day to let down old friends who need help.
+Good news from afar can bring you a welcome visitor.
+Good news. Ten weeks from Friday will be a pretty good day.
+Good night to spend with family, but avoid arguments with your mate's new lover.
+Green light in A.M. for new projects. Red light in P.M. for traffic tickets.
+Hope that the day after you die is a nice day.
+If you can read this, you're too close.
+If you learn one useless thing every day, in a single year you'll learn
+365 useless things.
+If you sow your wild oats, hope for a crop failure.
+If you stand on your head, you will get footprints in your hair.
+If you think last Tuesday was a drag, wait till you see what happens tomorrow!
+If your life was a horse, you'd have to shoot it.
+In the stairway of life, you'd best take the elevator.
+Increased knowledge will help you now. Have mate's phone bugged.
+Is that really YOU that is reading this?
+Is this really happening?
+It is so very hard to be an
+on-your-own-take-care-of-yourself-because-there-is-no-one-else-to-do-it-for-you grown-up.
+It may or may not be worthwhile, but it still has to be done.
+It was all so different before everything changed.
+It's all in the mind, ya know.
+It's lucky you're going so slowly, because you're going in the wrong direction.
+Just because the message may never be received does not mean it is not worth sending.
+Just to have it is enough.
+Keep emotionally active. Cater to your favorite neurosis.
+Keep it short for pithy sake.
+Lady Luck brings added income today. Lady friend takes it away tonight.
+Learn to pause -- or nothing worthwhile can catch up to you.
+Let me put it this way: today is going to be a learning experience.
+Life is to you a dashing and bold adventure.
+Life, loathe it or ignore it, you can't like it.
+Live in a world of your own, but always welcome visitors.
+Living your life is a task so difficult, it has never been attempted before.
+Long life is in store for you.
+Look afar and see the end from the beginning.
+Love is in the offing. Be affectionate to one who adores you.
+Make a wish, it might come true.
+Many changes of mind and mood; do not hesitate too long.
+Never be led astray onto the path of virtue.
+Never commit yourself! Let someone else commit you.
+Never give an inch!
+Never look up when dragons fly overhead.
+Never reveal your best argument.
+Next Friday will not be your lucky day. As a matter of fact, you don't
+have a lucky day this year.
+Of course you have a purpose -- to find a purpose.
+People are beginning to notice you. Try dressing before you leave the house.
+Perfect day for scrubbing the floor and other exciting things.
+Questionable day.
+Ask somebody something.
+Reply hazy, ask again later.
+Save energy: be apathetic.
+Ships are safe in harbor, but they were never meant to stay there.
+Slow day. Practice crawling.
+Snow Day -- stay home.
+So this is it. We're going to die.
+So you're back... about time...
+Someone is speaking well of you.
+Someone is speaking well of you.
+How unusual!
+Someone whom you reject today, will reject you tomorrow.
+Stay away from flying saucers today.
+Stay away from hurricanes for a while.
+Stay the curse.
+That secret you've been guarding, isn't.
+The time is right to make new friends.
+The whole world is a tuxedo and you are a pair of brown shoes.
+There is a 20 chance of tomorrow.
+There is a fly on your nose.
+There was a phone call for you.
+There will be big changes for you but you will be happy.
+Things will be bright in P.M. A cop will shine a light in your face.
+Think twice before speaking, but don't say "think think click click".
+This life is yours. Some of it was given to you; the rest, you made yourself.
+This will be a memorable month -- no matter how hard you try to forget it.
+Time to be aggressive. Go after a tattooed Virgo.
+Today is National Existential Ennui Awareness Day.
+Today is the first day of the rest of the mess.
+Today is the first day of the rest of your life.
+Today is the last day of your life so far.
+Today is the tomorrow you worried about yesterday.
+Today is what happened to yesterday.
+Today's weirdness is tomorrow's reason why.
+Tomorrow will be cancelled due to lack of interest.
+Tomorrow, this will be part of the unchangeable past but fortunately, it can still be changed today.
+Tomorrow, you can be anywhere.
+Tonight you will pay the wages of sin; Don't forget to leave a tip.
+Tonight's the night: Sleep in a eucalyptus tree.
+Troubled day for virgins over 16 who are beautiful and wealthy and live
+in eucalyptus trees.
+Truth will out this morning. (Which may really mess things up.)
+Try the Moo Shu Pork. It is especially good today.
+Try to get all of your posthumous medals in advance.
+Try to have as good a life as you can under the circumstances.
+Try to relax and enjoy the crisis.
+Try to value useful qualities in one who loves you.
+Tuesday After Lunch is the cosmic time of the week.
+Tuesday is the Wednesday of the rest of your life.
+What happened last night can happen again.
+While you recently had your problems on the run, they've regrouped and are making another attack.
+Write yourself a threatening letter and pen a defiant reply.
+You are a bundle of energy, always on the go.
+You are a fluke of the universe; you have no right to be here.
+You are a very redundant person, that's what kind of person you are.
+You are always busy.
+You are as I am with You.
+You are capable of planning your future.
+You are confused; but this is your normal state.
+You are deeply attached to your friends and acquaintances.
+You are destined to become the commandant of the fighting men of the department of transportation.
+You are dishonest, but never to the point of hurting a friend.
+You are fairminded, just and loving.
+You are farsighted, a good planner, an ardent lover, and a faithful friend.
+You are fighting for survival in your own sweet and gentle way.
+You are going to have a new love affair.
+You are magnetic in your bearing.
+You are not dead yet. But watch for further reports.
+You are number 6! Who is number one?
+You are only young once, but you can stay immature indefinitely.
+You are scrupulously honest, frank, and straightforward. Therefore you have few friends.
+You are sick, twisted and perverted. I like that in a person.
+You are so boring that when I see you my feet go to sleep.
+You are standing on my toes.
+You are taking yourself far too seriously.
+You are the only person to ever get this message.
+You are wise, witty, and wonderful, but you spend too much time reading this sort of trash.
+You attempt things that you do not even plan because of your extreme stupidity.
+You can create your own opportunities this week. Blackmail a senior executive.
+You can do very well in speculation where land or anything to do with dirt is concerned.
+You can rent this space for only $5 a week.
+You could live a better life, if you had a better mind and a better body.
+You definitely intend to start living sometime soon.
+You dialed 5483.
+You display the wonderful traits of charm and courtesy.
+You don't become a failure until you're satisfied with being one.
+You enjoy the company of other people.
+You feel a whole lot more like you do now than you did when you used to.
+You fill a much-needed gap.
+You get along very well with everyone except animals and people.
+You had some happiness once, but your parents moved away, and you had to leave it behind.
+You have a deep appreciation of the arts and music.
+You have a deep interest in all that is artistic.
+You have a reputation for being thoroughly reliable and trustworthy.
+A pity that it's totally undeserved.
+You have a strong appeal for members of the opposite sex.
+You have a strong appeal for members of your own sex.
+You have a strong desire for a home and your family interests come first.
+You have a truly strong individuality.
+You have a will that can be influenced by all with whom you come in contact.
+You have an ability to sense and know higher truth.
+You have an ambitious nature and may make a name for yourself.
+You have an unusual equipment for success. Be sure to use it properly.
+You have an unusual magnetic personality. Don't walk too close to metal objects which are not fastened down.
+You have an unusual understanding of the problems of human relationships.
+You have been selected for a secret mission.
+You have Egyptian flu: you're going to be a mummy.
+You have had a long-term stimulation relative to business.
+You have literary talent that you should take pains to develop.
+You have many friends and very few living enemies.
+You have no real enemies.
+You have taken yourself too seriously.
+You have the body of a 19 year old. Please return it before it gets wrinkled.
+You have the capacity to learn from mistakes. You'll learn a lot today.
+You have the power to influence all with whom you come in contact.
+You learn to write as if to someone else because NEXT YEAR YOU WILL BE "SOMEONE ELSE."
+You like to form new friendships and make new acquaintances.
+You look like a million dollars. All green and wrinkled.
+You look tired.
+You love peace.
+You love your home and want it to be beautiful.
+You may be gone tomorrow, but that doesn't mean that you weren't here today.
+You may be infinitely smaller than some things, but you're infinitely larger than others.
+You may be recognized soon. Hide.
+You may get an opportunity for advancement today. Watch it!
+You may worry about your hair-do today, but tomorrow much peanut butter will be sold.
+You need more time; and you probably always will.
+You need no longer worry about the future. This time tomorrow you'll be dead.
+You never hesitate to tackle the most difficult problems.
+You never know how many friends you have until you rent a house on the beach.
+You now have Asian Flu.
+You own a dog, but you can only feed a cat.
+You plan things that you do not even attempt because of your extreme caution.
+You possess a mind not merely twisted, but actually sprained.
+You prefer the company of the opposite sex, but are well liked by your own.
+You recoil from the crude; you tend naturally toward the exquisite.
+You seek to shield those you love and you like the role of the provider.
+You shall be rewarded for a dastardly deed.
+You should emulate your heroes, but don't carry it too far. Especially if they are dead.
+You should go home.
+You single-handedly fought your way into this hopeless mess.
+You teach best what you most need to learn.
+You too can wear a nose mitten.
+You two ought to be more careful--your love could drag on for years and years.
+You will always get the greatest recognition for the job you least like.
+You will always have good luck in your personal affairs.
+You will attract cultured and artistic people to your home.
+You will be a winner today. Pick a fight with a four-year-old.
+You will be advanced socially, without any special effort on your part.
+You will be aided greatly by a person whom you thought to be unimportant.
+You will be attacked by a beast who has the body of a wolf, the tail of a lion, and the face of Donald Duck.
+You will be audited by the Internal Revenue Service.
+You will be awarded a medal for disregarding safety in saving someone.
+You will be awarded some great honor.
+You will be awarded the Nobel Peace Prize... posthumously.
+You will be called upon to help a friend in trouble.
+You will be divorced within a year.
+You will be given a post of trust and responsibility.
+You will be held hostage by a radical group.
+You will be honored for contributing your time and skill to a worthy cause.
+You will be imprisoned for contributing your time and skill to a bank robbery.
+You will be married within a year, and divorced within two.
+You will be married within a year.
+You will be misunderstood by everyone.
+You will be recognized and honored as a community leader.
+You will be reincarnated as a toad; and you will be much happier.
+You will be run over by a beer truck.
+You will be run over by a bus.
+You will be singled out for promotion in your work.
+You will be successful in love.
+You will be surprised by a loud noise.
+You will be surrounded by luxury.
+You will be the last person to buy a Chrysler.
+You will be the victim of a bizarre joke.
+You will be Told about it Tomorrow. Go Home and Prepare Thyself.
+You will be traveling and coming into a fortune.
+You will be winged by an anti-aircraft battery.
+You will become rich and famous unless you don't.
+You will contract a rare disease.
+You will engage in a profitable business activity.
+You will experience a strong urge to do good; but it will pass.
+You will feel hungry again in another hour.
+You will forget that you ever knew me.
+You will gain money by a fattening action.
+You will gain money by a speculation or lottery.
+You will gain money by an illegal action.
+You will gain money by an immoral action.
+You will get what you deserve.
+You will give someone a piece of your mind, which you can ill afford.
+You will have a long and boring life.
+You will have a long and unpleasant discussion with your supervisor.
+You will have domestic happiness and faithful friends.
+You will have good luck and overcome many hardships.
+You will have long and healthy life.
+You will hear good news from one you thought unfriendly to you.
+You will inherit millions of dollars.
+You will inherit some money or a small piece of land.
+You will live a long, healthy, happy life and make bags of money.
+You will live to see your grandchildren.
+You will lose your present job and have to become a door to door mayonnaise salesman.
+You will meet an important person who will help you advance professionally.
+You will never know hunger.
+You will not be elected to public office this year.
+You will obey or molten silver will be poured into your ears.
+You will outgrow your usefulness.
+You will overcome the attacks of jealous associates.
+You will pass away very quickly.
+You will pay for your sins. If you have already paid, please disregard this message.
+You will pioneer the first Martian colony.
+You will probably marry after a very brief courtship.
+You will reach the highest possible point in your business or profession.
+You will receive a legacy which will place you above want.
+You will remember something that you should not have forgotten.
+You will soon forget this.
+You will soon meet a person who will play an important role in your life.
+You will step on the night soil of many countries.
+You will stop at nothing to reach your objective, but only because your brakes are defective.
+You will triumph over your enemy.
+You will visit the Dung Pits of Glive soon.
+You will win success in whatever calling you adopt.
+You will wish you hadn't.
+You work very hard. Don't try to think as well.
+You worry too much about your job. Stop it. You are not paid enough to worry.
+You would if you could but you can't so you won't.
+You'd like to do it instantaneously, but that's too slow.
+You'll be called to a post requiring ability in handling groups of people.
+You'll be sorry...
+You'll feel devilish tonight. Toss dynamite caps under a flamenco dancer's heel.
+You'll feel much better once you've given up hope.
+You'll never be the man your mother was!
+You'll never see all the places, or read all the books, but fortunately,
+they're not all recommended.
+You'll wish that you had done some of the hard things when they were easier to do.
+You're a card which will have to be dealt with.
+You're almost as happy as you think you are.
+You're at the end of the road again.
+You're being followed. Cut out the hanky-panky for a few days.
+You're currently going through a difficult transition period called "Life."
+You're definitely on their list. The question to ask next is what list it is.
+You're growing out of some of your problems, but there are others that you're growing into.
+You're not my type. For that matter, you're not even my species!!!
+You're ugly and your mother dresses you funny.
+You're working under a slight handicap. You happen to be human.
+You've been leading a dog's life. Stay off the furniture.
+Your aim is high and to the right.
+Your aims are high, and you are capable of much.
+Your analyst has you mixed up with another patient. Don't believe a thing he tells you.
+Your best consolation is the hope that the things you failed to get weren't really worth having.
+Your boss climbed the corporate ladder, wrong by wrong.
+Your boss is a few sandwiches short of a picnic.
+Your boyfriend takes chocolate from strangers.
+Your business will assume vast proportions.
+Your business will go through a period of considerable expansion.
+Your depth of comprehension may tend to make you lax in worldly ways.
+Your domestic life may be harmonious.
+Your fly might be open (but don't check it just now).
+Your goose is cooked.
+(Your current chick is burned up too!)
+Your heart is pure, and your mind clear, and your soul devout.
+Your ignorance cramps my conversation.
+Your life would be very empty if you had nothing to regret.
+Your love life will be happy and harmonious.
+Your love life will be... interesting.
+Your lover will never wish to leave you.
+Your lucky color has faded.
+Your lucky number has been disconnected.
+Your lucky number is 3552664958674928. Watch for it everywhere.
+Your mode of life will be changed for the better because of good news soon.
+Your mode of life will be changed for the better because of new developments.
+Your motives for doing whatever good deed you may have in mind will be misinterpreted by somebody.
+Your nature demands love and your happiness depends on it.
+Your object is to save the world, while still leading a pleasant life.
+Your own qualities will help prevent your advancement in the world.
+Your present plans will be successful.
+Your reasoning is excellent -- it's only your basic assumptions that are wrong.
+Your reasoning powers are good, and you are a fairly good planner.
+Your sister swims out to meet troop ships.
+Your society will be sought by people of taste and refinement.
+Your step will soil many countries.
+Your supervisor is thinking about you.
+Your talents will be recognized and suitably rewarded.
+Your temporary financial embarrassment will be relieved in a surprising manner.
+Your true value depends entirely on what you are compared with.
diff --git a/tgstation.dme b/tgstation.dme
index 6bfac4f508..101f48aa77 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -38,6 +38,7 @@
#include "code\__DEFINES\configuration.dm"
#include "code\__DEFINES\construction.dm"
#include "code\__DEFINES\contracts.dm"
+#include "code\__DEFINES\cooldowns.dm"
#include "code\__DEFINES\cult.dm"
#include "code\__DEFINES\diseases.dm"
#include "code\__DEFINES\DNA.dm"
@@ -118,21 +119,23 @@
#include "code\__DEFINES\vv.dm"
#include "code\__DEFINES\wall_dents.dm"
#include "code\__DEFINES\wires.dm"
+#include "code\__DEFINES\wounds.dm"
#include "code\__DEFINES\_flags\_flags.dm"
+#include "code\__DEFINES\_flags\do_after.dm"
#include "code\__DEFINES\_flags\item_flags.dm"
#include "code\__DEFINES\_flags\obj_flags.dm"
+#include "code\__DEFINES\_flags\return_values.dm"
+#include "code\__DEFINES\_flags\shields.dm"
#include "code\__DEFINES\admin\keybindings.dm"
+#include "code\__DEFINES\chemistry\reactions.dm"
#include "code\__DEFINES\combat\attack_types.dm"
#include "code\__DEFINES\combat\block.dm"
#include "code\__DEFINES\combat\block_parry.dm"
#include "code\__DEFINES\dcs\flags.dm"
#include "code\__DEFINES\dcs\helpers.dm"
#include "code\__DEFINES\dcs\signals.dm"
-#include "code\__DEFINES\flags\do_after.dm"
-#include "code\__DEFINES\flags\shields.dm"
#include "code\__DEFINES\mapping\maploader.dm"
#include "code\__DEFINES\material\worth.dm"
-#include "code\__DEFINES\misc\return_values.dm"
#include "code\__DEFINES\mobs\slowdowns.dm"
#include "code\__DEFINES\research\stock_parts.dm"
#include "code\__DEFINES\skills\defines.dm"
@@ -217,6 +220,9 @@
#include "code\_onclick\observer.dm"
#include "code\_onclick\other_mobs.dm"
#include "code\_onclick\overmind.dm"
+#include "code\_onclick\right_click.dm"
+#include "code\_onclick\right_item_attack.dm"
+#include "code\_onclick\right_other_mobs.dm"
#include "code\_onclick\telekinesis.dm"
#include "code\_onclick\hud\_defines.dm"
#include "code\_onclick\hud\action_button.dm"
@@ -226,6 +232,7 @@
#include "code\_onclick\hud\alien_larva.dm"
#include "code\_onclick\hud\blob_overmind.dm"
#include "code\_onclick\hud\blobbernauthud.dm"
+#include "code\_onclick\hud\clockwork_marauder.dm"
#include "code\_onclick\hud\constructs.dm"
#include "code\_onclick\hud\credits.dm"
#include "code\_onclick\hud\devil.dm"
@@ -237,6 +244,7 @@
#include "code\_onclick\hud\hud.dm"
#include "code\_onclick\hud\human.dm"
#include "code\_onclick\hud\lavaland_elite.dm"
+#include "code\_onclick\hud\map_popups.dm"
#include "code\_onclick\hud\monkey.dm"
#include "code\_onclick\hud\movable_screen_objects.dm"
#include "code\_onclick\hud\parallax.dm"
@@ -248,7 +256,11 @@
#include "code\_onclick\hud\robot.dm"
#include "code\_onclick\hud\screen_objects.dm"
#include "code\_onclick\hud\swarmer.dm"
+#include "code\_onclick\hud\screen_objects\clickdelay.dm"
+#include "code\_onclick\hud\screen_objects\sprint.dm"
+#include "code\_onclick\hud\screen_objects\stamina.dm"
#include "code\_onclick\hud\screen_objects\storage.dm"
+#include "code\_onclick\hud\screen_objects\vore.dm"
#include "code\controllers\admin.dm"
#include "code\controllers\configuration_citadel.dm"
#include "code\controllers\controller.dm"
@@ -267,6 +279,7 @@
#include "code\controllers\configuration\entries\game_options.dm"
#include "code\controllers\configuration\entries\general.dm"
#include "code\controllers\configuration\entries\plushies.dm"
+#include "code\controllers\configuration\entries\policy.dm"
#include "code\controllers\subsystem\acid.dm"
#include "code\controllers\subsystem\adjacent_air.dm"
#include "code\controllers\subsystem\air.dm"
@@ -334,6 +347,7 @@
#include "code\controllers\subsystem\processing\circuit.dm"
#include "code\controllers\subsystem\processing\fastprocess.dm"
#include "code\controllers\subsystem\processing\fields.dm"
+#include "code\controllers\subsystem\processing\huds.dm"
#include "code\controllers\subsystem\processing\instruments.dm"
#include "code\controllers\subsystem\processing\nanites.dm"
#include "code\controllers\subsystem\processing\networks.dm"
@@ -348,6 +362,7 @@
#include "code\datums\ai_laws.dm"
#include "code\datums\armor.dm"
#include "code\datums\beam.dm"
+#include "code\datums\beepsky_fashion.dm"
#include "code\datums\browser.dm"
#include "code\datums\callback.dm"
#include "code\datums\chatmessage.dm"
@@ -358,12 +373,12 @@
#include "code\datums\datumvars.dm"
#include "code\datums\dna.dm"
#include "code\datums\dog_fashion.dm"
-#include "code\datums\embedding_behavior.dm"
#include "code\datums\emotes.dm"
#include "code\datums\ert.dm"
#include "code\datums\explosion.dm"
#include "code\datums\forced_movement.dm"
#include "code\datums\holocall.dm"
+#include "code\datums\http.dm"
#include "code\datums\hud.dm"
#include "code\datums\mind.dm"
#include "code\datums\mutable_appearance.dm"
@@ -406,14 +421,18 @@
#include "code\datums\components\construction.dm"
#include "code\datums\components\dejavu.dm"
#include "code\datums\components\earprotection.dm"
+#include "code\datums\components\edible.dm"
#include "code\datums\components\edit_complainer.dm"
+#include "code\datums\components\embedded.dm"
#include "code\datums\components\explodable.dm"
#include "code\datums\components\field_of_vision.dm"
#include "code\datums\components\footstep.dm"
+#include "code\datums\components\fried.dm"
#include "code\datums\components\identification.dm"
#include "code\datums\components\igniter.dm"
#include "code\datums\components\infective.dm"
#include "code\datums\components\jousting.dm"
+#include "code\datums\components\killerqueen.dm"
#include "code\datums\components\knockback.dm"
#include "code\datums\components\knockoff.dm"
#include "code\datums\components\lifesteal.dm"
@@ -421,11 +440,14 @@
#include "code\datums\components\magnetic_catch.dm"
#include "code\datums\components\material_container.dm"
#include "code\datums\components\mirage_border.dm"
+#include "code\datums\components\mirv.dm"
#include "code\datums\components\mood.dm"
#include "code\datums\components\nanites.dm"
#include "code\datums\components\ntnet_interface.dm"
+#include "code\datums\components\omen.dm"
#include "code\datums\components\orbiter.dm"
#include "code\datums\components\paintable.dm"
+#include "code\datums\components\pellet_cloud.dm"
#include "code\datums\components\phantomthief.dm"
#include "code\datums\components\rad_insulation.dm"
#include "code\datums\components\radioactive.dm"
@@ -433,7 +455,6 @@
#include "code\datums\components\riding.dm"
#include "code\datums\components\rotation.dm"
#include "code\datums\components\shielded.dm"
-#include "code\datums\components\shrapnel.dm"
#include "code\datums\components\shrink.dm"
#include "code\datums\components\sizzle.dm"
#include "code\datums\components\slippery.dm"
@@ -445,11 +466,12 @@
#include "code\datums\components\swarming.dm"
#include "code\datums\components\tackle.dm"
#include "code\datums\components\thermite.dm"
+#include "code\datums\components\twohanded.dm"
#include "code\datums\components\uplink.dm"
#include "code\datums\components\virtual_reality.dm"
#include "code\datums\components\wearertargeting.dm"
#include "code\datums\components\wet_floor.dm"
-#include "code\datums\components\crafting\craft.dm"
+#include "code\datums\components\crafting\crafting.dm"
#include "code\datums\components\crafting\guncrafting.dm"
#include "code\datums\components\crafting\recipes.dm"
#include "code\datums\components\crafting\glassware\glassware.dm"
@@ -538,6 +560,7 @@
#include "code\datums\elements\dusts_on_leaving_area.dm"
#include "code\datums\elements\dwarfism.dm"
#include "code\datums\elements\earhealing.dm"
+#include "code\datums\elements\embed.dm"
#include "code\datums\elements\empprotection.dm"
#include "code\datums\elements\firestacker.dm"
#include "code\datums\elements\flavor_text.dm"
@@ -576,6 +599,8 @@
#include "code\datums\martial\wrestling.dm"
#include "code\datums\materials\_material.dm"
#include "code\datums\materials\basemats.dm"
+#include "code\datums\materials\meat.dm"
+#include "code\datums\materials\pizza.dm"
#include "code\datums\mood_events\beauty_events.dm"
#include "code\datums\mood_events\drink_events.dm"
#include "code\datums\mood_events\drug_events.dm"
@@ -614,6 +639,7 @@
#include "code\datums\status_effects\gas.dm"
#include "code\datums\status_effects\neutral.dm"
#include "code\datums\status_effects\status_effect.dm"
+#include "code\datums\status_effects\wound_effects.dm"
#include "code\datums\traits\_quirk.dm"
#include "code\datums\traits\good.dm"
#include "code\datums\traits\negative.dm"
@@ -641,6 +667,11 @@
#include "code\datums\wires\syndicatebomb.dm"
#include "code\datums\wires\tesla_coil.dm"
#include "code\datums\wires\vending.dm"
+#include "code\datums\wounds\_scars.dm"
+#include "code\datums\wounds\_wounds.dm"
+#include "code\datums\wounds\bones.dm"
+#include "code\datums\wounds\burns.dm"
+#include "code\datums\wounds\cuts.dm"
#include "code\game\alternate_appearance.dm"
#include "code\game\atoms.dm"
#include "code\game\atoms_movable.dm"
@@ -736,7 +767,6 @@
#include "code\game\machinery\dna_scanner.dm"
#include "code\game\machinery\doppler_array.dm"
#include "code\game\machinery\droneDispenser.dm"
-#include "code\game\machinery\exp_cloner.dm"
#include "code\game\machinery\firealarm.dm"
#include "code\game\machinery\flasher.dm"
#include "code\game\machinery\gulag_item_reclaimer.dm"
@@ -758,6 +788,7 @@
#include "code\game\machinery\rechargestation.dm"
#include "code\game\machinery\recycler.dm"
#include "code\game\machinery\requests_console.dm"
+#include "code\game\machinery\sheetifier.dm"
#include "code\game\machinery\shieldgen.dm"
#include "code\game\machinery\Sleeper.dm"
#include "code\game\machinery\slotmachine.dm"
@@ -829,6 +860,9 @@
#include "code\game\machinery\porta_turret\portable_turret.dm"
#include "code\game\machinery\porta_turret\portable_turret_construct.dm"
#include "code\game\machinery\porta_turret\portable_turret_cover.dm"
+#include "code\game\machinery\shuttle\custom_shuttle.dm"
+#include "code\game\machinery\shuttle\shuttle_engine.dm"
+#include "code\game\machinery\shuttle\shuttle_heater.dm"
#include "code\game\machinery\telecomms\broadcasting.dm"
#include "code\game\machinery\telecomms\machine_interactions.dm"
#include "code\game\machinery\telecomms\telecomunications.dm"
@@ -870,6 +904,7 @@
#include "code\game\mecha\equipment\weapons\mecha_ammo.dm"
#include "code\game\mecha\equipment\weapons\weapons.dm"
#include "code\game\mecha\medical\medical.dm"
+#include "code\game\mecha\medical\medigax.dm"
#include "code\game\mecha\medical\odysseus.dm"
#include "code\game\mecha\working\ripley.dm"
#include "code\game\mecha\working\working.dm"
@@ -938,14 +973,18 @@
#include "code\game\objects\items\AI_modules.dm"
#include "code\game\objects\items\airlock_painter.dm"
#include "code\game\objects\items\apc_frame.dm"
+#include "code\game\objects\items\armor_kits.dm"
#include "code\game\objects\items\balls.dm"
+#include "code\game\objects\items\binoculars.dm"
#include "code\game\objects\items\blueprints.dm"
#include "code\game\objects\items\body_egg.dm"
#include "code\game\objects\items\bodybag.dm"
#include "code\game\objects\items\boombox.dm"
+#include "code\game\objects\items\broom.dm"
#include "code\game\objects\items\candle.dm"
#include "code\game\objects\items\cardboard_cutouts.dm"
#include "code\game\objects\items\cards_ids.dm"
+#include "code\game\objects\items\chainsaw.dm"
#include "code\game\objects\items\charter.dm"
#include "code\game\objects\items\chromosome.dm"
#include "code\game\objects\items\chrono_eraser.dm"
@@ -963,8 +1002,11 @@
#include "code\game\objects\items\dice.dm"
#include "code\game\objects\items\dna_injector.dm"
#include "code\game\objects\items\documents.dm"
+#include "code\game\objects\items\dualsaber.dm"
#include "code\game\objects\items\eightball.dm"
+#include "code\game\objects\items\electrostaff.dm"
#include "code\game\objects\items\extinguisher.dm"
+#include "code\game\objects\items\fireaxe.dm"
#include "code\game\objects\items\flamethrower.dm"
#include "code\game\objects\items\gift.dm"
#include "code\game\objects\items\granters.dm"
@@ -983,6 +1025,7 @@
#include "code\game\objects\items\paiwire.dm"
#include "code\game\objects\items\pet_carrier.dm"
#include "code\game\objects\items\pinpointer.dm"
+#include "code\game\objects\items\pitchfork.dm"
#include "code\game\objects\items\plushes.dm"
#include "code\game\objects\items\pneumaticCannon.dm"
#include "code\game\objects\items\powerfist.dm"
@@ -996,8 +1039,10 @@
#include "code\game\objects\items\sharpener.dm"
#include "code\game\objects\items\shields.dm"
#include "code\game\objects\items\shooting_range.dm"
+#include "code\game\objects\items\shrapnel.dm"
#include "code\game\objects\items\signs.dm"
#include "code\game\objects\items\singularityhammer.dm"
+#include "code\game\objects\items\spear.dm"
#include "code\game\objects\items\stunbaton.dm"
#include "code\game\objects\items\taster.dm"
#include "code\game\objects\items\teleportation.dm"
@@ -1006,7 +1051,6 @@
#include "code\game\objects\items\theft_tools.dm"
#include "code\game\objects\items\toys.dm"
#include "code\game\objects\items\trash.dm"
-#include "code\game\objects\items\twohanded.dm"
#include "code\game\objects\items\vending_items.dm"
#include "code\game\objects\items\weaponry.dm"
#include "code\game\objects\items\circuitboards\circuitboard.dm"
@@ -1098,7 +1142,9 @@
#include "code\game\objects\items\stacks\medical.dm"
#include "code\game\objects\items\stacks\rods.dm"
#include "code\game\objects\items\stacks\stack.dm"
+#include "code\game\objects\items\stacks\tape.dm"
#include "code\game\objects\items\stacks\telecrystal.dm"
+#include "code\game\objects\items\stacks\tickets.dm"
#include "code\game\objects\items\stacks\wrap.dm"
#include "code\game\objects\items\stacks\sheets\glass.dm"
#include "code\game\objects\items\stacks\sheets\leather.dm"
@@ -1129,7 +1175,6 @@
#include "code\game\objects\items\tanks\tanks.dm"
#include "code\game\objects\items\tanks\watertank.dm"
#include "code\game\objects\items\tools\crowbar.dm"
-#include "code\game\objects\items\tools\saw.dm"
#include "code\game\objects\items\tools\screwdriver.dm"
#include "code\game\objects\items\tools\weldingtool.dm"
#include "code\game\objects\items\tools\wirecutters.dm"
@@ -1155,6 +1200,7 @@
#include "code\game\objects\structures\fireplace.dm"
#include "code\game\objects\structures\flora.dm"
#include "code\game\objects\structures\fluff.dm"
+#include "code\game\objects\structures\fugitive_role_spawners.dm"
#include "code\game\objects\structures\ghost_role_spawners.dm"
#include "code\game\objects\structures\girders.dm"
#include "code\game\objects\structures\grille.dm"
@@ -1263,6 +1309,7 @@
#include "code\game\turfs\simulated\floor\plating\asteroid.dm"
#include "code\game\turfs\simulated\floor\plating\dirt.dm"
#include "code\game\turfs\simulated\floor\plating\misc_plating.dm"
+#include "code\game\turfs\simulated\wall\material_walls.dm"
#include "code\game\turfs\simulated\wall\mineral_walls.dm"
#include "code\game\turfs\simulated\wall\misc_walls.dm"
#include "code\game\turfs\simulated\wall\reinf_walls.dm"
@@ -1326,6 +1373,7 @@
#include "code\modules\admin\verbs\pray.dm"
#include "code\modules\admin\verbs\randomverbs.dm"
#include "code\modules\admin\verbs\reestablish_db_connection.dm"
+#include "code\modules\admin\verbs\shuttlepanel.dm"
#include "code\modules\admin\verbs\spawnobjasmob.dm"
#include "code\modules\admin\verbs\tripAI.dm"
#include "code\modules\admin\verbs\SDQL2\SDQL_2.dm"
@@ -1347,6 +1395,7 @@
#include "code\modules\antagonists\_common\antag_spawner.dm"
#include "code\modules\antagonists\_common\antag_team.dm"
#include "code\modules\antagonists\abductor\abductor.dm"
+#include "code\modules\antagonists\abductor\ice_abductor.dm"
#include "code\modules\antagonists\abductor\abductee\abductee.dm"
#include "code\modules\antagonists\abductor\abductee\abductee_objectives.dm"
#include "code\modules\antagonists\abductor\abductee\trauma.dm"
@@ -1496,6 +1545,7 @@
#include "code\modules\antagonists\clockcult\clock_scriptures\scripture_applications.dm"
#include "code\modules\antagonists\clockcult\clock_scriptures\scripture_cyborg.dm"
#include "code\modules\antagonists\clockcult\clock_scriptures\scripture_drivers.dm"
+#include "code\modules\antagonists\clockcult\clock_scriptures\scripture_judgement.dm"
#include "code\modules\antagonists\clockcult\clock_scriptures\scripture_scripts.dm"
#include "code\modules\antagonists\clockcult\clock_structures\_trap_object.dm"
#include "code\modules\antagonists\clockcult\clock_structures\ark_of_the_clockwork_justicar.dm"
@@ -1504,6 +1554,7 @@
#include "code\modules\antagonists\clockcult\clock_structures\heralds_beacon.dm"
#include "code\modules\antagonists\clockcult\clock_structures\mania_motor.dm"
#include "code\modules\antagonists\clockcult\clock_structures\ocular_warden.dm"
+#include "code\modules\antagonists\clockcult\clock_structures\prolonging_prism.dm"
#include "code\modules\antagonists\clockcult\clock_structures\ratvar_the_clockwork_justicar.dm"
#include "code\modules\antagonists\clockcult\clock_structures\reflector.dm"
#include "code\modules\antagonists\clockcult\clock_structures\stargazer.dm"
@@ -1538,6 +1589,10 @@
#include "code\modules\antagonists\disease\disease_event.dm"
#include "code\modules\antagonists\disease\disease_mob.dm"
#include "code\modules\antagonists\ert\ert.dm"
+#include "code\modules\antagonists\fugitive\fugitive.dm"
+#include "code\modules\antagonists\fugitive\fugitive_outfits.dm"
+#include "code\modules\antagonists\fugitive\fugitive_ship.dm"
+#include "code\modules\antagonists\fugitive\hunter.dm"
#include "code\modules\antagonists\greentext\greentext.dm"
#include "code\modules\antagonists\greybois\greybois.dm"
#include "code\modules\antagonists\highlander\highlander.dm"
@@ -1618,6 +1673,11 @@
#include "code\modules\assembly\signaler.dm"
#include "code\modules\assembly\timer.dm"
#include "code\modules\assembly\voice.dm"
+#include "code\modules\asset_cache\asset_cache.dm"
+#include "code\modules\asset_cache\asset_cache_client.dm"
+#include "code\modules\asset_cache\asset_cache_item.dm"
+#include "code\modules\asset_cache\asset_list.dm"
+#include "code\modules\asset_cache\asset_list_items.dm"
#include "code\modules\atmospherics\multiz.dm"
#include "code\modules\atmospherics\environmental\LINDA_fire.dm"
#include "code\modules\atmospherics\environmental\LINDA_system.dm"
@@ -1688,7 +1748,6 @@
#include "code\modules\awaymissions\mission_code\murderdome.dm"
#include "code\modules\awaymissions\mission_code\research.dm"
#include "code\modules\awaymissions\mission_code\snowdin.dm"
-#include "code\modules\awaymissions\mission_code\spacebattle.dm"
#include "code\modules\awaymissions\mission_code\stationCollision.dm"
#include "code\modules\awaymissions\mission_code\undergroundoutpost45.dm"
#include "code\modules\awaymissions\mission_code\wildwest.dm"
@@ -1710,6 +1769,7 @@
#include "code\modules\cargo\bounty_console.dm"
#include "code\modules\cargo\centcom_podlauncher.dm"
#include "code\modules\cargo\console.dm"
+#include "code\modules\cargo\coupon.dm"
#include "code\modules\cargo\export_scanner.dm"
#include "code\modules\cargo\exports.dm"
#include "code\modules\cargo\expressconsole.dm"
@@ -1750,6 +1810,7 @@
#include "code\modules\cargo\packs\emergency.dm"
#include "code\modules\cargo\packs\engine.dm"
#include "code\modules\cargo\packs\engineering.dm"
+#include "code\modules\cargo\packs\goodies.dm"
#include "code\modules\cargo\packs\livestock.dm"
#include "code\modules\cargo\packs\materials.dm"
#include "code\modules\cargo\packs\medical.dm"
@@ -1760,7 +1821,6 @@
#include "code\modules\cargo\packs\service.dm"
#include "code\modules\cargo\packs\vending.dm"
#include "code\modules\chatter\chatter.dm"
-#include "code\modules\client\asset_cache.dm"
#include "code\modules\client\client_colour.dm"
#include "code\modules\client\client_defines.dm"
#include "code\modules\client\client_procs.dm"
@@ -1772,6 +1832,7 @@
#include "code\modules\client\preferences_toggles.dm"
#include "code\modules\client\preferences_vr.dm"
#include "code\modules\client\verbs\aooc.dm"
+#include "code\modules\client\verbs\autobunker.dm"
#include "code\modules\client\verbs\etips.dm"
#include "code\modules\client\verbs\looc.dm"
#include "code\modules\client\verbs\minimap.dm"
@@ -1884,6 +1945,7 @@
#include "code\modules\events\anomaly_vortex.dm"
#include "code\modules\events\aurora_caelus.dm"
#include "code\modules\events\blob.dm"
+#include "code\modules\events\brain_trauma.dm"
#include "code\modules\events\brand_intelligence.dm"
#include "code\modules\events\bureaucratic_error.dm"
#include "code\modules\events\camerafailure.dm"
@@ -1893,7 +1955,9 @@
#include "code\modules\events\disease_outbreak.dm"
#include "code\modules\events\dust.dm"
#include "code\modules\events\electrical_storm.dm"
+#include "code\modules\events\fake_virus.dm"
#include "code\modules\events\false_alarm.dm"
+#include "code\modules\events\fugitive_spawning.dm"
#include "code\modules\events\ghost_role.dm"
#include "code\modules\events\grid_check.dm"
#include "code\modules\events\heart_attack.dm"
@@ -1917,7 +1981,10 @@
#include "code\modules\events\spacevine.dm"
#include "code\modules\events\spider_infestation.dm"
#include "code\modules\events\spontaneous_appendicitis.dm"
+#include "code\modules\events\stray_cargo.dm"
+#include "code\modules\events\travelling_trader.dm"
#include "code\modules\events\vent_clog.dm"
+#include "code\modules\events\wisdomcow.dm"
#include "code\modules\events\wormholes.dm"
#include "code\modules\events\holiday\halloween.dm"
#include "code\modules\events\holiday\vday.dm"
@@ -1926,12 +1993,14 @@
#include "code\modules\events\wizard\blobies.dm"
#include "code\modules\events\wizard\curseditems.dm"
#include "code\modules\events\wizard\departmentrevolt.dm"
+#include "code\modules\events\wizard\embeddies.dm"
#include "code\modules\events\wizard\fakeexplosion.dm"
#include "code\modules\events\wizard\ghost.dm"
#include "code\modules\events\wizard\greentext.dm"
#include "code\modules\events\wizard\imposter.dm"
#include "code\modules\events\wizard\invincible.dm"
#include "code\modules\events\wizard\lava.dm"
+#include "code\modules\events\wizard\madness.dm"
#include "code\modules\events\wizard\magicarp.dm"
#include "code\modules\events\wizard\petsplosion.dm"
#include "code\modules\events\wizard\race.dm"
@@ -2263,6 +2332,7 @@
#include "code\modules\mining\lavaland\ash_flora.dm"
#include "code\modules\mining\lavaland\necropolis_chests.dm"
#include "code\modules\mining\lavaland\ruins\gym.dm"
+#include "code\modules\mob\clickdelay.dm"
#include "code\modules\mob\death.dm"
#include "code\modules\mob\emote.dm"
#include "code\modules\mob\inventory.dm"
@@ -2311,9 +2381,11 @@
#include "code\modules\mob\dead\observer\notificationprefs.dm"
#include "code\modules\mob\dead\observer\observer.dm"
#include "code\modules\mob\dead\observer\observer_movement.dm"
+#include "code\modules\mob\dead\observer\orbit.dm"
#include "code\modules\mob\dead\observer\say.dm"
#include "code\modules\mob\living\blood.dm"
#include "code\modules\mob\living\bloodcrawl.dm"
+#include "code\modules\mob\living\clickdelay.dm"
#include "code\modules\mob\living\damage_procs.dm"
#include "code\modules\mob\living\death.dm"
#include "code\modules\mob\living\emote.dm"
@@ -2345,6 +2417,7 @@
#include "code\modules\mob\living\brain\say.dm"
#include "code\modules\mob\living\brain\status_procs.dm"
#include "code\modules\mob\living\carbon\carbon.dm"
+#include "code\modules\mob\living\carbon\carbon_active_parry.dm"
#include "code\modules\mob\living\carbon\carbon_defense.dm"
#include "code\modules\mob\living\carbon\carbon_defines.dm"
#include "code\modules\mob\living\carbon\carbon_movement.dm"
@@ -2375,7 +2448,6 @@
#include "code\modules\mob\living\carbon\alien\humanoid\death.dm"
#include "code\modules\mob\living\carbon\alien\humanoid\humanoid.dm"
#include "code\modules\mob\living\carbon\alien\humanoid\humanoid_defense.dm"
-#include "code\modules\mob\living\carbon\alien\humanoid\inventory.dm"
#include "code\modules\mob\living\carbon\alien\humanoid\life.dm"
#include "code\modules\mob\living\carbon\alien\humanoid\queen.dm"
#include "code\modules\mob\living\carbon\alien\humanoid\update_icons.dm"
@@ -2436,6 +2508,7 @@
#include "code\modules\mob\living\carbon\human\species_types\synthliz.dm"
#include "code\modules\mob\living\carbon\human\species_types\synths.dm"
#include "code\modules\mob\living\carbon\human\species_types\vampire.dm"
+#include "code\modules\mob\living\carbon\human\species_types\xeno.dm"
#include "code\modules\mob\living\carbon\human\species_types\zombies.dm"
#include "code\modules\mob\living\carbon\monkey\combat.dm"
#include "code\modules\mob\living\carbon\monkey\death.dm"
@@ -2500,6 +2573,7 @@
#include "code\modules\mob\living\simple_animal\corpse.dm"
#include "code\modules\mob\living\simple_animal\damage_procs.dm"
#include "code\modules\mob\living\simple_animal\parrot.dm"
+#include "code\modules\mob\living\simple_animal\pickle.dm"
#include "code\modules\mob\living\simple_animal\shade.dm"
#include "code\modules\mob\living\simple_animal\simple_animal.dm"
#include "code\modules\mob\living\simple_animal\simple_animal_vr.dm"
@@ -2657,6 +2731,7 @@
#include "code\modules\modular_computers\file_system\program_events.dm"
#include "code\modules\modular_computers\file_system\programs\airestorer.dm"
#include "code\modules\modular_computers\file_system\programs\alarm.dm"
+#include "code\modules\modular_computers\file_system\programs\arcade.dm"
#include "code\modules\modular_computers\file_system\programs\card.dm"
#include "code\modules\modular_computers\file_system\programs\configurator.dm"
#include "code\modules\modular_computers\file_system\programs\file_browser.dm"
@@ -2665,6 +2740,8 @@
#include "code\modules\modular_computers\file_system\programs\ntnrc_client.dm"
#include "code\modules\modular_computers\file_system\programs\nttransfer.dm"
#include "code\modules\modular_computers\file_system\programs\powermonitor.dm"
+#include "code\modules\modular_computers\file_system\programs\radar.dm"
+#include "code\modules\modular_computers\file_system\programs\robocontrol.dm"
#include "code\modules\modular_computers\file_system\programs\sm_monitor.dm"
#include "code\modules\modular_computers\file_system\programs\antagonist\contract_uplink.dm"
#include "code\modules\modular_computers\file_system\programs\antagonist\dos.dm"
@@ -2723,10 +2800,6 @@
#include "code\modules\NTNet\network.dm"
#include "code\modules\NTNet\relays.dm"
#include "code\modules\NTNet\services\_service.dm"
-#include "code\modules\oracle_ui\assets.dm"
-#include "code\modules\oracle_ui\hookup_procs.dm"
-#include "code\modules\oracle_ui\oracle_ui.dm"
-#include "code\modules\oracle_ui\themed.dm"
#include "code\modules\paperwork\clipboard.dm"
#include "code\modules\paperwork\contract.dm"
#include "code\modules\paperwork\filingcabinet.dm"
@@ -2967,6 +3040,7 @@
#include "code\modules\reagents\reagent_containers\blood_pack.dm"
#include "code\modules\reagents\reagent_containers\borghydro.dm"
#include "code\modules\reagents\reagent_containers\bottle.dm"
+#include "code\modules\reagents\reagent_containers\chem_pack.dm"
#include "code\modules\reagents\reagent_containers\dropper.dm"
#include "code\modules\reagents\reagent_containers\glass.dm"
#include "code\modules\reagents\reagent_containers\hypospray.dm"
@@ -3141,6 +3215,7 @@
#include "code\modules\shuttle\arrivals.dm"
#include "code\modules\shuttle\assault_pod.dm"
#include "code\modules\shuttle\computer.dm"
+#include "code\modules\shuttle\custom_shuttle.dm"
#include "code\modules\shuttle\docking.dm"
#include "code\modules\shuttle\elevator.dm"
#include "code\modules\shuttle\emergency.dm"
@@ -3157,6 +3232,12 @@
#include "code\modules\shuttle\supply.dm"
#include "code\modules\shuttle\syndicate.dm"
#include "code\modules\shuttle\white_ship.dm"
+#include "code\modules\shuttle\shuttle_creation\shuttle_creator.dm"
+#include "code\modules\shuttle\shuttle_creation\shuttle_creator_actions.dm"
+#include "code\modules\shuttle\shuttle_creation\shuttle_creator_console.dm"
+#include "code\modules\shuttle\shuttle_creation\shuttle_creator_eye.dm"
+#include "code\modules\shuttle\shuttle_creation\shuttle_creator_overlay.dm"
+#include "code\modules\shuttle\shuttle_creation\shuttle_upgrades.dm"
#include "code\modules\spells\spell.dm"
#include "code\modules\spells\spell_types\aimed.dm"
#include "code\modules\spells\spell_types\area_teleport.dm"
@@ -3165,6 +3246,7 @@
#include "code\modules\spells\spell_types\charge.dm"
#include "code\modules\spells\spell_types\conjure.dm"
#include "code\modules\spells\spell_types\construct_spells.dm"
+#include "code\modules\spells\spell_types\curse.dm"
#include "code\modules\spells\spell_types\devil.dm"
#include "code\modules\spells\spell_types\devil_boons.dm"
#include "code\modules\spells\spell_types\dumbfire.dm"
@@ -3202,7 +3284,9 @@
#include "code\modules\station_goals\shield.dm"
#include "code\modules\station_goals\station_goal.dm"
#include "code\modules\surgery\amputation.dm"
+#include "code\modules\surgery\bone_mending.dm"
#include "code\modules\surgery\brain_surgery.dm"
+#include "code\modules\surgery\burn_dressing.dm"
#include "code\modules\surgery\cavity_implant.dm"
#include "code\modules\surgery\core_removal.dm"
#include "code\modules\surgery\coronary_bypass.dm"
@@ -3243,10 +3327,11 @@
#include "code\modules\surgery\advanced\bioware\nerve_grounding.dm"
#include "code\modules\surgery\advanced\bioware\nerve_splicing.dm"
#include "code\modules\surgery\advanced\bioware\vein_threading.dm"
-#include "code\modules\surgery\bodyparts\bodyparts.dm"
+#include "code\modules\surgery\bodyparts\_bodyparts.dm"
#include "code\modules\surgery\bodyparts\dismemberment.dm"
#include "code\modules\surgery\bodyparts\head.dm"
#include "code\modules\surgery\bodyparts\helpers.dm"
+#include "code\modules\surgery\bodyparts\parts.dm"
#include "code\modules\surgery\bodyparts\robot_bodyparts.dm"
#include "code\modules\surgery\organs\appendix.dm"
#include "code\modules\surgery\organs\augments_arms.dm"
@@ -3276,6 +3361,7 @@
#include "code\modules\tgui\states\contained.dm"
#include "code\modules\tgui\states\deep_inventory.dm"
#include "code\modules\tgui\states\default.dm"
+#include "code\modules\tgui\states\default_contained.dm"
#include "code\modules\tgui\states\hands.dm"
#include "code\modules\tgui\states\human_adjacent.dm"
#include "code\modules\tgui\states\inventory.dm"
@@ -3367,12 +3453,6 @@
#include "interface\menu.dm"
#include "interface\stylesheet.dm"
#include "interface\skin.dmf"
-#include "modular_citadel\code\_onclick\click.dm"
-#include "modular_citadel\code\_onclick\item_attack.dm"
-#include "modular_citadel\code\_onclick\other_mobs.dm"
-#include "modular_citadel\code\_onclick\hud\screen_objects.dm"
-#include "modular_citadel\code\_onclick\hud\sprint.dm"
-#include "modular_citadel\code\_onclick\hud\stamina.dm"
#include "modular_citadel\code\datums\components\souldeath.dm"
#include "modular_citadel\code\datums\status_effects\chems.dm"
#include "modular_citadel\code\game\objects\cit_screenshake.dm"
@@ -3417,7 +3497,6 @@
#include "modular_citadel\code\modules\mob\living\living.dm"
#include "modular_citadel\code\modules\mob\living\carbon\carbon.dm"
#include "modular_citadel\code\modules\mob\living\carbon\damage_procs.dm"
-#include "modular_citadel\code\modules\mob\living\carbon\life.dm"
#include "modular_citadel\code\modules\mob\living\carbon\reindex_screams.dm"
#include "modular_citadel\code\modules\mob\living\carbon\human\human.dm"
#include "modular_citadel\code\modules\mob\living\carbon\human\human_defense.dm"
diff --git a/tgui-next/.gitattributes b/tgui-next/.gitattributes
deleted file mode 100644
index 0016cc3bf6..0000000000
--- a/tgui-next/.gitattributes
+++ /dev/null
@@ -1,10 +0,0 @@
-* text=auto
-
-## Enforce text mode and LF line breaks
-*.js text eol=lf
-*.css text eol=lf
-*.html text eol=lf
-*.json text eol=lf
-
-## Treat bundles as binary and ignore them during conflicts
-*.bundle.* binary merge=tgui-merge-bundle
diff --git a/tgui-next/.gitignore b/tgui-next/.gitignore
deleted file mode 100644
index 416ca3768d..0000000000
--- a/tgui-next/.gitignore
+++ /dev/null
@@ -1,7 +0,0 @@
-node_modules
-*.log
-package-lock.json
-
-/packages/tgui/public/.tmp/**/*
-/packages/tgui/public/**/*.hot-update.*
-/packages/tgui/public/**/*.map
diff --git a/tgui-next/docs/tutorial-and-examples.md b/tgui-next/docs/tutorial-and-examples.md
deleted file mode 100644
index d038c1de61..0000000000
--- a/tgui-next/docs/tutorial-and-examples.md
+++ /dev/null
@@ -1,245 +0,0 @@
-# Tutorial and Examples
-
-## Main concepts
-
-Basic tgui backend code consists of the following vars and procs:
-
-```
-ui_interact(mob/user, ui_key, datum/tgui/ui, force_open,
- datum/tgui/master_ui, datum/ui_state/state)
-ui_data(mob/user)
-ui_act(action, params)
-```
-
-- `src_object` - The atom, which UI corresponds to in the game world.
-- `ui_interact` - The proc where you will handle a request to open an
-interface. Typically, you would update an existing UI (if it exists),
-or set up a new instance of UI by calling the `SStgui` subsystem.
-- `ui_data` - In this proc you munges whatever complex data your `src_object`
-has into an associative list, which will then be sent to UI as a JSON string.
-- `ui_act` - This proc receives user actions and reacts to them by changing
-the state of the game.
-- `ui_state` (set in `ui_interact`) - This var dictates under what conditions
-a UI may be interacted with. This may be the standard checks that check if
-you are in range and conscious, or more.
-
-Once backend is complete, you create an new interface component on the
-frontend, which will receive this JSON data and render it on screen.
-
-States are easy to write and extend, and what make tgui interactions so
-powerful. Because states can be overridden from other procs, you can build
-powerful interactions for embedded objects or remote access.
-
-## Using It
-
-### Backend
-
-Let's start with a very basic hello world.
-
-```dm
-/obj/machinery/my_machine/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = default_state)
- ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
- if(!ui)
- ui = new(user, src, ui_key, "my_machine", name, 300, 300, master_ui, state)
- ui.open()
-```
-
-This is the proc that defines our interface. There's a bit going on here, so
-let's break it down. First, we override the ui_interact proc on our object. This
-will be called by `interact` for you, which is in turn called by `attack_hand`
-(or `attack_self` for items). `ui_interact` is also called to update a UI (hence
-the `try_update_ui`), so we accept an existing UI to update. The `state` is a
-default argument so that a caller can overload it with named arguments
-(`ui_interact(state = overloaded_state)`) if needed.
-
-Inside the `if(!ui)` block (which means we are creating a new UI), we choose our
-template, title, and size; we can also set various options like `style` (for
-themes), or autoupdate. These options will be elaborated on later (as will
-`ui_state`s).
-
-After `ui_interact`, we need to define `ui_data`. This just returns a list of
-data for our object to use. Let's imagine our object has a few vars:
-
-```dm
-/obj/machinery/my_machine/ui_data(mob/user)
- var/list/data = list()
- data["health"] = health
- data["color"] = color
-
- return data
-```
-
-The `ui_data` proc is what people often find the hardest about tgui, but its
-really quite simple! You just need to represent your object as numbers, strings,
-and lists, instead of atoms and datums.
-
-Finally, the `ui_act` proc is called by the interface whenever the user used an
-input. The input's `action` and `params` are passed to the proc.
-
-```dm
-/obj/machinery/my_machine/ui_act(action, params)
- if(..())
- return
- switch(action)
- if("change_color")
- var/new_color = params["color"]
- if(!(color in allowed_coors))
- return
- color = new_color
- . = TRUE
- update_icon()
-```
-
-The `..()` (parent call) is very important here, as it is how we check that the
-user is allowed to use this interface (to avoid so-called href exploits). It is
-also very important to clamp and sanitize all input here. Always assume the user
-is attempting to exploit the game.
-
-Also note the use of `. = TRUE` (or `FALSE`), which is used to notify the UI
-that this input caused an update. This is especially important for UIs that do
-not auto-update, as otherwise the user will never see their change.
-
-### Frontend
-
-Finally, you have to make a UI component. This is also a source of
-confusion for many new users. If you got some basic javascript and HTML
-knowledge, that should ease the learning process, although we recommend
-getting yourself introduced to
-[React and JSX](https://reactjs.org/docs/introducing-jsx.html).
-
-A component is not a regular HTML. A component is a pure function, which
-accepts a `props` object (it contains properties passed to a component),
-and outputs an HTML-like structure consisting of regular HTML elements and
-other UI components.
-
-Interface component will always receive 1 prop which is called `state`.
-This object contains a few special values:
-
-- `config` is always the same and is part of core tgui
-(it will be explained later),
-- `data` is the data returned from `ui_data`
-
-```jsx
-import { Section, LabeledList } from '../components';
-
-const SampleInterface = props => {
- const { state } = props;
- const { config, data } = state;
- const { ref } = config;
- return (
-
-
-
- {data.health}
-
-
- {data.color}
-
-
-
- );
-};
-```
-
-This syntax can be very confusing at first, but it is very important to
-realize that this is just a natural extension of javascript. Here's a few
-examples of this syntax:
-
-Return a different element based on a condition:
-
-```jsx
-if (condition) {
- return ;
-}
-return ;
-```
-
-Conditionally render a element inside of another element:
-
-```jsx
-
- {showProgress && (
-
- )}
-
-```
-
-Looping over the array to make an element for each item:
-
-```jsx
-
- {items.map(item => (
-
- {item.content}
-
- ))}
-
-```
-
-### Routing table
-
-Once you finished creating your interface, you need to add a route entry to
-the large `ROUTES` object, otherwise tgui won't know when and how to render
-your interface. Key of this `ROUTES` object corresponds to the interface
-name you use in DM code.
-
-```js
-import { SampleInterface } from './interfaces/SampleInterface';
-
-const ROUTES = {
- sample_interface: {
- component: () => SampleInterface,
- scrollable: true,
- },
-};
-```
-
-## Copypasta
-
-We all do it, even the best of us. If you just want to make a tgui **fast**,
-here's what you need (note that you'll probably be forced to clean your shit up
-upon code review):
-
-```dm
-/obj/copypasta/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = default_state) // Remember to use the appropriate state.
- ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
- if(!ui)
- ui = new(user, src, ui_key, "copypasta", name, 300, 300, master_ui, state)
- ui.open()
-
-/obj/copypasta/ui_data(mob/user)
- var/list/data = list()
- data["var"] = var
- return data
-
-/obj/copypasta/ui_act(action, params)
- if(..())
- return
- if(action == "copypasta")
- var/newvar = params["var"]
- // A demo of proper input sanitation.
- var = CLAMP(newvar, min_val, max_val)
- return TRUE
- update_icon() // Not applicable to all objects.
-```
-
-And the template:
-
-```jsx
-import { Section, LabeledList } from '../components';
-
-const SampleInterface = props => {
- const { state } = props;
- const { config, data } = state;
- const { ref } = config;
- return (
-
-
-
- {data.var}
-
-
-
- );
-};
-```
diff --git a/tgui-next/package.json b/tgui-next/package.json
deleted file mode 100644
index 9b7253e131..0000000000
--- a/tgui-next/package.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
- "private": true,
- "name": "tgui-next",
- "version": "0.1.0",
- "workspaces": [
- "packages/*"
- ],
- "scripts": {
- "build": "eslint packages && cd packages/tgui && npx webpack --mode=production",
- "watch": "cd packages/tgui-dev-server && node --experimental-modules index.js",
- "analyze": "cd packages/tgui && npx webpack --mode=production --env.analyze=1",
- "lint": "eslint packages"
- },
- "dependencies": {
- "babel-eslint": "^10.0.3",
- "eslint": "^6.7.2",
- "eslint-plugin-react": "^7.17.0"
- }
-}
diff --git a/tgui-next/packages/common/math.js b/tgui-next/packages/common/math.js
deleted file mode 100644
index a33b9aa214..0000000000
--- a/tgui-next/packages/common/math.js
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * Limits a number to the range between 'min' and 'max'.
- */
-export const clamp = (value, min = 0, max = 1) => {
- return Math.max(min, Math.min(value, max));
-};
-
-/**
- * Returns a rounded number.
- * TODO: Replace this native rounding function with a more robust one.
- */
-export const round = value => Math.round(value);
-
-/**
- * Returns a string representing a number in fixed point notation.
- */
-export const toFixed = (value, fractionDigits = 0) => {
- return Number(value).toFixed(fractionDigits);
-};
diff --git a/tgui-next/packages/tgui/backend.js b/tgui-next/packages/tgui/backend.js
deleted file mode 100644
index cdaf89fc6b..0000000000
--- a/tgui-next/packages/tgui/backend.js
+++ /dev/null
@@ -1,95 +0,0 @@
-import { UI_DISABLED, UI_INTERACTIVE } from './constants';
-import { tridentVersion, act as _act } from './byond';
-
-/**
- * This file provides a clear separation layer between backend updates
- * and what state our React app sees.
- *
- * Sometimes backend can response without a "data" field, but our final
- * state will still contain previous "data" because we are merging
- * the response with already existing state.
- */
-
-/**
- * Creates a backend update action.
- */
-export const backendUpdate = state => ({
- type: 'backendUpdate',
- payload: state,
-});
-
-/**
- * Precisely defines state changes.
- */
-export const backendReducer = (state, action) => {
- const { type, payload } = action;
-
- if (type === 'backendUpdate') {
- // Merge config
- const config = {
- ...state.config,
- ...payload.config,
- };
- // Merge data
- const data = {
- ...state.data,
- ...payload.static_data,
- ...payload.data,
- };
- // Calculate our own fields
- const visible = config.status !== UI_DISABLED;
- const interactive = config.status === UI_INTERACTIVE;
- // Return new state
- return {
- ...state,
- config,
- data,
- visible,
- interactive,
- };
- }
-
- return state;
-};
-
-/**
- * @typedef BackendState
- * @type {{
- * config: {
- * title: string,
- * status: number,
- * screen: string,
- * style: string,
- * interface: string,
- * fancy: number,
- * locked: number,
- * observer: number,
- * window: string,
- * ref: string,
- * },
- * data: any,
- * visible: boolean,
- * interactive: boolean,
- * }}
- */
-
-/**
- * A React hook (sort of) for getting tgui state and related functions.
- *
- * This is supposed to be replaced with a real React Hook, which can only
- * be used in functional components. DO NOT use it in class-based components!
- *
- * @return {BackendState & {
- * act: (action: string, params?: object) => void,
- * }}
- */
-export const useBackend = props => {
- // TODO: Dispatch "act" calls as Redux actions
- const { state, dispatch } = props;
- const ref = state.config.ref;
- const act = (action, params = {}) => _act(ref, action, params);
- return {
- ...state,
- act,
- };
-};
diff --git a/tgui-next/packages/tgui/byond.js b/tgui-next/packages/tgui/byond.js
deleted file mode 100644
index 2b7d3ff772..0000000000
--- a/tgui-next/packages/tgui/byond.js
+++ /dev/null
@@ -1,84 +0,0 @@
-import { buildQueryString } from 'common/string';
-
-/**
- * Version of Trident engine used in Internet Explorer.
- *
- * - IE 8 - Trident 4.0
- * - IE 11 - Trident 7.0
- *
- * @return An integer number or 'null' if this is not a trident engine.
- */
-export const tridentVersion = (() => {
- const { userAgent } = navigator;
- const groups = userAgent.match(/Trident\/(\d+).+?;/i);
- const majorVersion = groups[1];
- if (!majorVersion) {
- return null;
- }
- return parseInt(majorVersion, 10);
-})();
-
-/**
- * Helper to generate a BYOND href given 'params' as an object
- * (with an optional 'url' for eg winset).
- */
-const href = (url, params = {}) => {
- return 'byond://' + url + '?' + buildQueryString(params);
-};
-
-export const callByond = (url, params = {}) => {
- window.location.href = href(url, params);
-};
-
-/**
- * A high-level abstraction of BYJAX. Makes a call to BYOND and returns
- * a promise, which (if endpoint has a callback parameter) resolves
- * with the return value of that call.
- */
-export const callByondAsync = (url, params = {}) => {
- // Create a callback array if it doesn't exist yet
- window.__callbacks__ = window.__callbacks__ || [];
- // Create a Promise and push its resolve function into callback array
- const callbackIndex = window.__callbacks__.length;
- const promise = new Promise(resolve => {
- // TODO: Fix a potential memory leak
- window.__callbacks__.push(resolve);
- });
- // Call BYOND client
- window.location.href = href(url, {
- ...params,
- callback: `__callbacks__[${callbackIndex}]`,
- });
- return promise;
-};
-
-/**
- * Literally types a command on the client.
- */
-export const runCommand = command => callByond('winset', { command });
-
-/**
- * Helper to make a BYOND ui_act() call on the UI 'src' given an 'action'
- * and optional 'params'.
- */
-export const act = (src, action, params = {}) => {
- return callByond('', { src, action, ...params });
-};
-
-/**
- * Calls 'winget' on window, retrieving value by the 'key'.
- */
-export const winget = async (win, key) => {
- const obj = await callByondAsync('winget', {
- id: win,
- property: key,
- });
- return obj[key];
-};
-
-/**
- * Calls 'winset' on window, setting 'key' to 'value'.
- */
-export const winset = (win, key, value) => callByond('winset', {
- [`${win}.${key}`]: value,
-});
diff --git a/tgui-next/packages/tgui/components/ColorBox.js b/tgui-next/packages/tgui/components/ColorBox.js
deleted file mode 100644
index 0bfe368d82..0000000000
--- a/tgui-next/packages/tgui/components/ColorBox.js
+++ /dev/null
@@ -1,19 +0,0 @@
-import { classes, pureComponentHooks } from 'common/react';
-import { Box } from './Box';
-
-export const ColorBox = props => {
- const { color, content, className, ...rest } = props;
- return (
-
- );
-};
-
-ColorBox.defaultHooks = pureComponentHooks;
diff --git a/tgui-next/packages/tgui/components/Dimmer.js b/tgui-next/packages/tgui/components/Dimmer.js
deleted file mode 100644
index 9d3ead0549..0000000000
--- a/tgui-next/packages/tgui/components/Dimmer.js
+++ /dev/null
@@ -1,19 +0,0 @@
-import { Box } from './Box';
-
-export const Dimmer = props => {
- const { style, ...rest } = props;
- return (
-
- );
-};
diff --git a/tgui-next/packages/tgui/components/NoticeBox.js b/tgui-next/packages/tgui/components/NoticeBox.js
deleted file mode 100644
index f57e4d9082..0000000000
--- a/tgui-next/packages/tgui/components/NoticeBox.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import { classes, pureComponentHooks } from 'common/react';
-import { Box } from './Box';
-
-export const NoticeBox = props => {
- const { className, ...rest } = props;
- return (
-
- );
-};
-
-NoticeBox.defaultHooks = pureComponentHooks;
diff --git a/tgui-next/packages/tgui/components/ProgressBar.js b/tgui-next/packages/tgui/components/ProgressBar.js
deleted file mode 100644
index e58bfa3869..0000000000
--- a/tgui-next/packages/tgui/components/ProgressBar.js
+++ /dev/null
@@ -1,50 +0,0 @@
-import { classes, pureComponentHooks } from 'common/react';
-import { clamp, toFixed } from 'common/math';
-
-export const ProgressBar = props => {
- const {
- value,
- minValue = 0,
- maxValue = 1,
- ranges = {},
- content,
- children,
- } = props;
- const scaledValue = (value - minValue) / (maxValue - minValue);
- const hasContent = content !== undefined || children !== undefined;
- let { color } = props;
- // Cycle through ranges in key order to determine progressbar color.
- if (!color) {
- for (let rangeName of Object.keys(ranges)) {
- const range = ranges[rangeName];
- if (range && value >= range[0] && value <= range[1]) {
- color = rangeName;
- break;
- }
- }
- }
- // Default color
- if (!color) {
- color = 'default';
- }
- return (
-
-
-
-
- All ores will be placed in here when you are wearing a mining stachel
- on your belt or in a pocket while dragging the ore box.
- Gibtonite is not accepted.
-
-
-
- );
-};
diff --git a/tgui-next/packages/tgui/interfaces/OreRedemptionMachine.js b/tgui-next/packages/tgui/interfaces/OreRedemptionMachine.js
deleted file mode 100644
index 45cee75bc8..0000000000
--- a/tgui-next/packages/tgui/interfaces/OreRedemptionMachine.js
+++ /dev/null
@@ -1,144 +0,0 @@
-import { toTitleCase } from 'common/string';
-import { Component, Fragment } from 'inferno';
-import { useBackend } from '../backend';
-import { BlockQuote, Box, Button, NumberInput, Section, Table } from '../components';
-
-export const OreRedemptionMachine = props => {
- const { act, data } = useBackend(props);
- const {
- unclaimedPoints,
- materials,
- alloys,
- diskDesigns,
- hasDisk,
- } = data;
- return (
-
-
-
- This machine only accepts ore.
- Gibtonite and Slag are not accepted.
-